123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- #
- # Copyright (c) Contributors to the Open 3D Engine Project.
- # For complete copyright and license terms please see the LICENSE at the root of this distribution.
- #
- # SPDX-License-Identifier: Apache-2.0 OR MIT
- #
- #
- param (
- [String[]] $exePath,
- [String[]] $packagePath,
- [String[]] $bootstrapPath,
- [String[]] $certificate
- )
- # Get prerequisites, certs, and paths ready
- $tempPath = [System.IO.Path]::GetTempPath() # Order of operations defined here: https://docs.microsoft.com/en-us/dotnet/api/system.io.path.gettemppath?view=net-5.0&tabs=windows#remarks
- $certThumbprint = Get-ChildItem -Path Cert:LocalMachine\MY -CodeSigningCert -ErrorAction Stop | Select-Object -ExpandProperty Thumbprint # Grab first certificate from local machine store
- if ($certificate) {
- Write-Output "Checking certificate thumbprint $certificate"
- Get-ChildItem -Path Cert:LocalMachine\MY -ErrorAction SilentlyContinue | Where-Object {$_.Thumbprint -eq $certificate} # Prints certificate Thumbprint and Subject if found
- if($?) {
- $certThumbprint = $certificate
- }
- else {
- Write-Error "$certificate thumbprint not found, using $certThumbprint thumbprint instead"
- }
- }
- Try {
- $signtoolPath = Resolve-Path "C:\Program Files*\Windows Kits\10\bin\*\x64\signtool.exe" -ErrorAction Stop | Select-Object -Last 1 -ExpandProperty Path
- $insigniaPath = Resolve-Path "C:\Program Files*\WiX*\bin\insignia.exe" -ErrorAction Stop | Select-Object -Last 1 -ExpandProperty Path
- }
- Catch {
- Write-Error "Signtool or Wix insignia not found! Exiting."
- }
- function Write-Signature {
- param (
- $signtool,
- $thumbprint,
- $filename
- )
- $attempts = 2
- $sleepSec = 5
- Do {
- $attempts--
- Try {
- & $signtool sign /tr http://timestamp.digicert.com /td sha256 /fd sha256 /sha1 $thumbprint /sm $filename
- & $signtool verify /pa /v $filename
- return
- }
- Catch {
- Write-Error $_.Exception.InnerException.Message -ErrorAction Continue
- Start-Sleep -Seconds $sleepSec
- }
- } while ($attempts -lt 0)
- throw "Failed to sign $filename" # Bypassed in try block if the command is successful
- }
- # Looping through each path insteaad of globbing to prevent hitting maximum command string length limit
- if ($exePath) {
- Write-Output "### Signing EXE files ###"
- $files = @(Get-ChildItem $exePath -Recurse *.exe | % { $_.FullName })
- foreach ($file in $files) {
- Write-Signature -signtool $signtoolPath -thumbprint $certThumbprint -filename $file
- }
- }
- if ($packagePath) {
- Write-Output "### Signing CAB files ###"
- $files = @(Get-ChildItem $packagePath -Recurse *.cab | % { $_.FullName })
- foreach ($file in $files) {
- Write-Signature -signtool $signtoolPath -thumbprint $certThumbprint -filename $file
- }
- Write-Output "### Signing MSI files ###"
- $files = @(Get-ChildItem $packagePath -Recurse *.msi | % { $_.FullName })
- foreach ($file in $files) {
- & $insigniaPath -im $files
- Write-Signature -signtool $signtoolPath -thumbprint $certThumbprint -filename $file
- }
- }
- if ($bootstrapPath) {
- Write-Output "### Signing bootstrapper EXE ###"
- $files = @(Get-ChildItem $bootstrapPath -Recurse *.exe | % { $_.FullName })
- foreach ($file in $files) {
- & $insigniaPath -ib $file -o $tempPath\engine.exe
- Write-Signature -signtool $signtoolPath -thumbprint $certThumbprint -filename $tempPath\engine.exe
- & $insigniaPath -ab $tempPath\engine.exe $file -o $file
- Write-Signature -signtool $signtoolPath -thumbprint $certThumbprint -filename $file
- Remove-Item -Force $tempPath\engine.exe
- }
- }
|