verify_sig.spec.ts 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. // SPDX-License-Identifier: Apache-2.0
  2. import { Keypair, Ed25519Program, SYSVAR_INSTRUCTIONS_PUBKEY, PublicKey } from '@solana/web3.js';
  3. import expect from 'expect';
  4. import nacl from 'tweetnacl';
  5. import { loadContractAndCallConstructor } from './setup';
  6. import { Program } from '@coral-xyz/anchor';
  7. describe('Signature Check', function () {
  8. this.timeout(150000);
  9. let program: Program;
  10. let storage: Keypair;
  11. let payer: Keypair;
  12. before(async function () {
  13. ({ program, storage, payer } = await loadContractAndCallConstructor('verify_sig'));
  14. });
  15. it('check valid signature', async function () {
  16. const message = Buffer.from('Foobar');
  17. const signature = nacl.sign.detached(message, payer.secretKey);
  18. let instr1 = Ed25519Program.createInstructionWithPublicKey({
  19. publicKey: payer.publicKey.toBytes(),
  20. message,
  21. signature,
  22. instructionIndex: 0
  23. });
  24. const result = await program.methods.verify(payer.publicKey, message, Buffer.from(signature))
  25. .preInstructions([instr1])
  26. .accounts({
  27. SysvarInstruction: SYSVAR_INSTRUCTIONS_PUBKEY
  28. })
  29. .view();
  30. expect(result).toEqual(true);
  31. });
  32. it('check invalid signature', async function () {
  33. const message = Buffer.from('Foobar');
  34. const signature = nacl.sign.detached(message, payer.secretKey);
  35. const broken_signature = Buffer.from(signature);
  36. broken_signature[1] ^= 1;
  37. let instr1 = Ed25519Program.createInstructionWithPublicKey({
  38. publicKey: payer.publicKey.toBytes(),
  39. message,
  40. signature,
  41. instructionIndex: 0
  42. });
  43. const result = await program.methods.verify(payer.publicKey, message, Buffer.from(broken_signature))
  44. .preInstructions([instr1])
  45. .accounts({
  46. SysvarInstruction: SYSVAR_INSTRUCTIONS_PUBKEY
  47. })
  48. .view();
  49. expect(result).toEqual(false);
  50. });
  51. });