Skip to content

Commit

Permalink
API: verifyTealSign utility function (#735)
Browse files Browse the repository at this point in the history
  • Loading branch information
M-Picco authored Jan 17, 2023
1 parent e411146 commit 6435d24
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 15 deletions.
23 changes: 23 additions & 0 deletions src/logicsig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -495,6 +495,29 @@ export function tealSign(
return nacl.sign(toBeSigned, sk);
}

/**
* verifyTealSign verifies a signature as would the ed25519verify opcode
* @param data - buffer with original signed data
* @param programHash - string representation of teal program hash (= contract address for LogicSigs)
* @param sig - uint8array with the signature to verify (produced by tealSign/tealSignFromProgram)
* @param pk - uint8array with public key to verify against
*/
export function verifyTealSign(
data: Uint8Array | Buffer,
programHash: string,
sig: Uint8Array,
pk: Uint8Array
) {
const parts = utils.concatArrays(
address.decodeAddress(programHash).publicKey,
data
);
const toBeSigned = Buffer.from(
utils.concatArrays(SIGN_PROGRAM_DATA_PREFIX, parts)
);
return nacl.verify(toBeSigned, sig, pk);
}

/**
* tealSignFromProgram creates a signature compatible with ed25519verify opcode from raw program bytes
* @param sk - uint8array with secret key
Expand Down
1 change: 1 addition & 0 deletions src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,7 @@ export {
logicSigFromByte,
tealSign,
tealSignFromProgram,
verifyTealSign,
} from './logicsig';
export {
signMultisigTransaction,
Expand Down
40 changes: 25 additions & 15 deletions tests/7.AlgoSDK.js
Original file line number Diff line number Diff line change
Expand Up @@ -967,22 +967,18 @@ describe('Algosdk (AKA end to end)', () => {
});

describe('tealSign', () => {
it('should produce verifiable signature', () => {
const data = Buffer.from('Ux8jntyBJQarjKGF8A==', 'base64');
const seed = Buffer.from(
'5Pf7eGMA52qfMT4R4/vYCt7con/7U3yejkdXkrcb26Q=',
'base64'
);
const prog = Buffer.from('ASABASI=', 'base64');
const data = Buffer.from('Ux8jntyBJQarjKGF8A==', 'base64');
const prog = Buffer.from('ASABASI=', 'base64');
const addr = new algosdk.LogicSig(prog).address();

const keys = nacl.keyPairFromSeed(seed);
const pk = keys.publicKey;
const sk = keys.secretKey;
const addr = new algosdk.LogicSig(prog).address();
const sig1 = algosdk.tealSign(sk, data, addr);
const sig2 = algosdk.tealSignFromProgram(sk, data, prog);
const seed = Buffer.from(
'5Pf7eGMA52qfMT4R4/vYCt7con/7U3yejkdXkrcb26Q=',
'base64'
);
const { publicKey: pk, secretKey: sk } = nacl.keyPairFromSeed(seed);

assert.deepStrictEqual(sig1, sig2);
it('should produce a verifiable signature', () => {
const sig = algosdk.tealSign(sk, data, addr);

const parts = utils.concatArrays(
algosdk.decodeAddress(addr).publicKey,
Expand All @@ -991,7 +987,21 @@ describe('Algosdk (AKA end to end)', () => {
const toBeVerified = Buffer.from(
utils.concatArrays(Buffer.from('ProgData'), parts)
);
const verified = nacl.verify(toBeVerified, sig1, pk);
const verified = nacl.verify(toBeVerified, sig, pk);
assert.equal(verified, true);
});

it('should produce a verifiable signature from a program', () => {
const sig1 = algosdk.tealSign(sk, data, addr);
const sig2 = algosdk.tealSignFromProgram(sk, data, prog);

assert.deepStrictEqual(sig1, sig2);
});

it('should verify a valid signature', () => {
const sig = algosdk.tealSign(sk, data, addr);

const verified = algosdk.verifyTealSign(data, addr, sig, pk);
assert.equal(verified, true);
});
});
Expand Down

0 comments on commit 6435d24

Please sign in to comment.