This demo:
- generates a keypair
- generates a message from ethereum block metadata
- signs message with key
- Steganographically encodes signature into image from disk
- hashes vessel_img
The vessel_img should be kept private. The vessel_img_hash can be aggregated and published to a blockchain. Verification of identity happens off chain. The published vessel_img hash can be attached to any message as a loose claim of identity.
When verifing the identity:
- verifier request image matching hash.
- prover provides image
- if image fails to satisfy verifier -verification stops else:
- -prover provides location of signature in image and message
- -verifier provides nonce
- -prover sends signed nonce
- Verifier confirms the pubkey of signature and signed_nonce match.
At this point Verifier knows whatever it needs to know about Prover and cannot impersonate Prover when given a new 5 because they will be unable to generate the corresponding 6. Furthermore, if the verifier tampers with the image, it will no longer match the published hash.
This protocol allows for the prover to add aditional security by encoding multiple signatures into the same Vessel image. Using the naive techniques of this demo thousands of sigs could be embedded in the sample vessel image. BLS 1-of-n multisig would allow for many magnitudes more. BPCS Steganography would allow for more still.
(Not sure if Steganography is any better than a fix-location embedding but we will hide the key location to start.)