#!/bin/zsh parseAndVerifyQR () { local schema=$(echo $1 | cut -f1 -d:) local qrtype=$(echo $1 | cut -f2 -d:) local version=$(echo $1 | cut -f3 -d:) local signatureBase32NoPad=$(echo $1 | cut -f4 -d:) local pubKeyLink=$(echo $1 | cut -f5 -d:) local payload=$(echo $1 | cut -f6 -d:) echo -e Parsed QR '\t' $schema $qrtype $version $signatureBase32NoPad $pubKeyLink $payload # Add Padding Elements to the Base32 signature local signatureSize=${#signatureBase32NoPad} case $(($signatureSize%8)) in 2) signatureBase32=$(echo -n $signatureBase32NoPad"======") ;; 4) signatureBase32=$(echo -n $signatureBase32NoPad"====") ;; 5) signatureBase32=$(echo -n $signatureBase32NoPad"===") ;; 7) signatureBase32=$(echo -n $signatureBase32NoPad"=") ;; *) signatureBase32=$(echo -n $signatureBase32NoPad) ;; esac # No need to convert to UTF-8 echo -e "Payload Bytes\t" $payload # Using files because Scripts tend to not work well with Binary content. echo $signatureBase32 | base32 -d --wrap=0 > /tmp/signature-verify.bin # Debug Info local printableSignatureDER=$(od -An -v -t u1 /tmp/signature-verify.bin) echo -e "Signature DER\n"$printableSignatureDER # Downloading PUBKey from DNS record local pubkey=$(dig -t txt $pubKeyLink +short) local pubKeyNewLine=${pubkey//\\n/\n} local pubKeyNoQuotes=${pubKeyNewLine//\"/} if [[ ! $pubKeyNoQuotes == "-----BEGIN PUBLIC KEY-----"* ]]; then pubKeyNoQuotes=$(echo -n "-----BEGIN PUBLIC KEY-----\n"$pubKeyNoQuotes"\n-----END PUBLIC KEY-----\n") fi echo $pubKeyNoQuotes > /tmp/pubkey.pem # Verifying local verified=$(echo -n $payload | openssl dgst -verify /tmp/pubkey.pem -signature /tmp/signature-verify.bin) echo -e "\nVerify Payload\t" $verified } signAndFormatQR () { local signatureBase32=$(echo -n $5 | openssl dgst -sign keys/ecdsa_private_key | base32 --wrap=0 | sed s/=//g) newQR=$(echo "$1:$2:$3:$signatureBase32:$4:$5") } qr='CRED:STATUS:2:GBCAEIAHV2J6PWDSYVLI67RN55WVHIMUTKLFF5GZ4NPHPZ7ZSIJE4MP5M4BCAU6QVDHUP4RQCPXW6XJDAM54VMZ7XURUN34WFT2RWL5ETTZDNHUF:KEYS.PATHCHECK.ORG:1/BUQHHANUB4Z5KHBZTYCWMNI4RQ6CP5WFVVQCUXYHCQVY5WLDDFPA/' echo echo "Loading hardcoded QR" echo parseAndVerifyQR $qr echo echo "Resigning same payload" echo schema=$(echo $qr | cut -f1 -d:) qrtype=$(echo $qr | cut -f2 -d:) version=$(echo $qr | cut -f3 -d:) pubKeyLink=$(echo $qr | cut -f5 -d:) payload=$(echo $qr | cut -f6 -d:) signAndFormatQR $schema $qrtype $version $pubKeyLink $payload echo -e "New QR Signed\t" $newQR echo "" parseAndVerifyQR $newQR