twindows builds: sign the windows-signed files with gpg - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit fa6c213d5ff02abfdfd253fa4b29da73b258054f DIR parent 1dc7ee7ac695c2668813f03e7dc1e8dc71a5edf7 HTML Author: ThomasV <thomasv@electrum.org> Date: Sat, 30 Jun 2018 10:38:01 +0200 windows builds: sign the windows-signed files with gpg Diffstat: M contrib/build-wine/sign.sh | 34 ++++++------------------------- M contrib/build-wine/unsign.sh | 59 +++++++++++++++++-------------- 2 files changed, 38 insertions(+), 55 deletions(-) --- DIR diff --git a/contrib/build-wine/sign.sh b/contrib/build-wine/sign.sh t@@ -4,7 +4,6 @@ here=$(dirname "$0") test -n "$here" -a -d "$here" || exit cd $here - CERT_FILE=${CERT_FILE:-~/codesigning/cert.pem} KEY_FILE=${KEY_FILE:-~/codesigning/key.pem} if [[ ! -f "$CERT_FILE" ]]; then t@@ -16,32 +15,11 @@ if ! which osslsigncode > /dev/null 2>&1; then echo "Please install osslsigncode" fi -mkdir -p ./signed/dist >/dev/null 2>&1 +mkdir -p signed >/dev/null 2>&1 -echo "Found $(ls dist/*.exe | wc -w) files to sign." -for f in $(ls dist/*.exe); do - echo "Checking GPG signatures for $f..." - bad=0 - good=0 - for sig in $(ls $f.*.asc); do - if gpg --verify $sig $f > /dev/null 2>&1; then - (( good++ )) - else - (( bad++ )) - fi - done - echo "$good good signature(s) for $f". - if (( bad > 0 )); then - echo "WARNING: $bad bad signature(s)" - for sig in $(ls $f.*.asc); do - gpg --verify $sig $f - gpg --list-packets --verbose $sig - done - read -p "Do you want to continue (y/n)? " answer - if [ "$answer" != "y" ]; then - exit - fi - fi +cd dist +echo "Found $(ls *.exe | wc -w) files to sign." +for f in $(ls *.exe); do echo "Signing $f..." osslsigncode sign \ -certs "$CERT_FILE" \ t@@ -50,6 +28,6 @@ for f in $(ls dist/*.exe); do -i "https://electrum.org/" \ -t "http://timestamp.digicert.com/" \ -in "$f" \ - -out "signed/$f" - ls signed/$f -lah + -out "../signed/$f" + ls ../signed/$f -lah done DIR diff --git a/contrib/build-wine/unsign.sh b/contrib/build-wine/unsign.sh t@@ -8,40 +8,45 @@ if ! which osslsigncode > /dev/null 2>&1; then exit fi -if [ $# -ne 2 ]; then - echo "Usage: $0 signed_binary unsigned_binary" - exit -fi - -out="$1-stripped.exe" - -set -ex - -echo "Step 1: Remove PE signature from signed binary" -osslsigncode remove-signature -in $1 -out $out - -echo "Step 2: Remove checksum from signed binary" -python3 <<EOF +# exit if command fails +set -e + +mkdir -p stripped >/dev/null 2>&1 + +cd signed + +echo "Found $(ls *.exe | wc -w) files to verify." +for signed in $(ls *.exe); do + echo $signed + mine="../dist/$signed" + out="../stripped/$signed" + size=$( wc -c < $mine ) + # Step 1: Remove PE signature from signed binary + osslsigncode remove-signature -in $signed -out $out + # Step 2: Remove checksum and padding from signed binary + python3 <<EOF pe_file = "$out" +size= $size with open(pe_file, "rb") as f: binary = bytearray(f.read()) - pe_offset = int.from_bytes(binary[0x3c:0x3c+4], byteorder="little") checksum_offset = pe_offset + 88 - for b in range(4): binary[checksum_offset + b] = 0 - +l = len(binary) +n = l - size +if n > 0: + assert binary[-n:] == bytearray(n) + print("removing %d null bytes"% n) + binary = binary[:size] with open(pe_file, "wb") as f: f.write(binary) EOF - -bytes=$( wc -c < $2 ) -bytes=$((8 - ($bytes%8))) -bytes=$(($bytes % 8)) - -echo "Step 3: Appending $bytes null bytes to unsigned binary" - -truncate -s +$bytes $2 - -diff $out $2 && echo "Success!" + chmod +x $out + if [ ! $(diff $out $mine) ]; then + echo "Success!" + gpg --sign --armor --detach $signed + else + echo "failure" + fi +done