$ErrorActionPreference = 'Stop'
$TimeServer = "http://timestamp.sectigo.com"
$signToolSearchPath = "${env:ProgramFiles(x86)}\Windows Kits\10\bin\*\x64\signtool.exe"
[string]$signtool = Get-ChildItem $signToolSearchPath -ErrorAction SilentlyContinue `
| Sort-Object -Property FullName `
| Select-Object -Last 1
if (!$signtool) {
Write-Warning "SignTool.exe not found. You need to install a Windows SDK."
exit 1
}
$certFile = Get-ChildItem "$PSScriptRoot\*.pfx" `
| Sort-Object -Property Name `
| Select-Object -First 1
if (!$certFile) {
Write-Warning "No PFX file found in the project root."
Write-Host "This script needs a certificate with private key as a PFX file in the project root to work."
exit 1
}
# $certFile = Read-Host "Path of certificate with private key (PFX)"
# if (!(Test-Path $certFile)) {
# Write-Warning "Could not find the PFX file"
# exit 1
# }
function ConvertFrom-SecureToPlain {
param([Parameter(Mandatory=$true)][System.Security.SecureString] $SecurePassword)
# Create a "password pointer"
$passwordPointer = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecurePassword)
# Get the plain text version of the password
$plainTextPassword = [Runtime.InteropServices.Marshal]::PtrToStringAuto($passwordPointer)
# Free the pointer
[Runtime.InteropServices.Marshal]::ZeroFreeBSTR($passwordPointer)
# Return the plain text password
$plainTextPassword
}
$pfxPassword = Read-Host -AsSecureString "PFX Password"
$jobs = @(
@{
"arch" = "x86"
"src" = "$PSScriptRoot\target\i686-pc-windows-msvc\release\boom.exe"
}
@{
"arch" = "x64"
"src" = "$PSScriptRoot\target\x86_64-pc-windows-msvc\release\boom.exe"
}
)
Write-Output "Signing and zipping EXE files..."
$releaseRoot = "$PSScriptRoot\release"
if (!(Test-Path $releaseRoot)) { mkdir $releaseRoot -Force | Out-Null }
foreach ($exe in $jobs) {
if (!(Test-Path $exe.src)) {
Write-Warning "Could not find '$($exe.src)'"
exit 1
}
Write-Output "- Architecture: $($exe.arch)"
$releaseDir = "$releaseRoot\$($exe.arch)"
if (!(Test-Path $releaseDir)) { mkdir $releaseDir -Force | Out-Null }
$releaseFile = "$releaseDir\boom.exe"
$releaseZip = "$releaseRoot\boom_$($exe.arch).zip"
if (Test-Path $releaseFile) { Remove-Item $releaseFile }
if (Test-Path $releaseZip) { Remove-Item $releaseZip }
Copy-Item $exe.src $releaseFile
& $signtool sign `
/f $certFile /p $(ConvertFrom-SecureToPlain $pfxPassword) `
/fd sha256 /td sha256 /tr $TimeServer `
$releaseFile
if ($LASTEXITCODE) {
Write-Warning "Signing failed."
exit 1
}
Compress-Archive -Path $releaseFile -DestinationPath $releaseZip -CompressionLevel Optimal
}