verify_sig.spec.ts 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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. dataAccount: storage.publicKey,
  28. SysvarInstruction: SYSVAR_INSTRUCTIONS_PUBKEY
  29. })
  30. .view();
  31. expect(result).toEqual(true);
  32. });
  33. it('check invalid signature', async function () {
  34. const message = Buffer.from('Foobar');
  35. const signature = nacl.sign.detached(message, payer.secretKey);
  36. const broken_signature = Buffer.from(signature);
  37. broken_signature[1] ^= 1;
  38. let instr1 = Ed25519Program.createInstructionWithPublicKey({
  39. publicKey: payer.publicKey.toBytes(),
  40. message,
  41. signature,
  42. instructionIndex: 0
  43. });
  44. const result = await program.methods.verify(payer.publicKey, message, Buffer.from(broken_signature))
  45. .preInstructions([instr1])
  46. .accounts({
  47. dataAccount: storage.publicKey,
  48. SysvarInstruction: SYSVAR_INSTRUCTIONS_PUBKEY
  49. })
  50. .view();
  51. expect(result).toEqual(false);
  52. });
  53. });