|
| 1 | +/** |
| 2 | + * multisign_spec tests module multisign |
| 3 | + * @module multiSignSpec |
| 4 | + */ |
| 5 | + |
| 6 | +'use strict'; |
| 7 | + |
| 8 | +import { Buffer } from 'buffer'; |
| 9 | +import Axlsign from 'axlsign'; |
| 10 | +import bs58 from 'bs58'; |
| 11 | +import * as jv from '../src/index.js'; |
| 12 | + |
| 13 | +const PRI_KEY_1 = 'EV9ADJzYKZpk4MjxEkXxDSfRRSzBFnA9LEQNbepKZRFc'; |
| 14 | +const PRI_KEY_2 = '3hQRGJkqKFbks77cZ12ugHxDtbweH3EZjhfVzfr4RqPs'; |
| 15 | + |
| 16 | +const MSG = Buffer.from('test'); |
| 17 | +const RAND = Buffer.from('b298c9d1947fcb8373a200232b6f6c79f7854814c74e66613b2ea0c843bdad50cb3c8373942f0a8a0aaada8c238c011279554f7459bab560b6eb43992aaf3886', 'hex'); |
| 18 | + |
| 19 | +const MULPK1 = new jv.MultiSignPriKey(Buffer.from(bs58.decode(PRI_KEY_1))); |
| 20 | +const MULPK2 = new jv.MultiSignPriKey(Buffer.from(bs58.decode(PRI_KEY_2))); |
| 21 | + |
| 22 | +describe('Test multisign', function() { |
| 23 | + it('should work with one key', () => { |
| 24 | + const A = MULPK1.A; |
| 25 | + const allAs = [A]; |
| 26 | + |
| 27 | + const xA = MULPK1.getxA([A]); |
| 28 | + const xAs = [xA]; |
| 29 | + const unionA = jv.MultiSign.getUnionA(xAs); |
| 30 | + |
| 31 | + const R = MULPK1.getR(MSG, RAND); |
| 32 | + const Rs = [R]; |
| 33 | + const unionR = jv.MultiSign.getUnionR(Rs); |
| 34 | + |
| 35 | + const subSig = MULPK1.sign(MSG, RAND, unionA, unionR, allAs); |
| 36 | + const mulSig = jv.MultiSign.getSig(unionA, unionR, [subSig]); |
| 37 | + |
| 38 | + const bpA = MULPK1.getbpA(allAs); |
| 39 | + const bpAs = [bpA]; |
| 40 | + const mulPub = jv.MultiSign.getPub(bpAs); |
| 41 | + |
| 42 | + const rawSig = Buffer.from(Axlsign.sign(MULPK1.priKey, MSG, RAND)); |
| 43 | + |
| 44 | + expect(rawSig.equals(mulSig)).toBeTrue(); |
| 45 | + |
| 46 | + const rawPub = Buffer.from(Axlsign.derivePublicKey(MULPK1.priKey)); |
| 47 | + expect(rawPub.equals(mulPub)).toBeTrue(); |
| 48 | + |
| 49 | + const valid = Axlsign.verify(mulPub, MSG, mulSig); |
| 50 | + expect(valid).toBeTrue(); |
| 51 | + }); |
| 52 | + |
| 53 | + it('should work with two keys', () => { |
| 54 | + const A1 = MULPK1.A; |
| 55 | + const A2 = MULPK2.A; |
| 56 | + |
| 57 | + const allAs = [A1, A2]; |
| 58 | + |
| 59 | + const xA1 = MULPK1.getxA(allAs); |
| 60 | + const xA2 = MULPK2.getxA(allAs); |
| 61 | + const xAs = [xA1, xA2]; |
| 62 | + const unionA = jv.MultiSign.getUnionA(xAs); |
| 63 | + |
| 64 | + const R1 = MULPK1.getR(MSG, RAND); |
| 65 | + const R2 = MULPK2.getR(MSG, RAND); |
| 66 | + const Rs = [R1, R2]; |
| 67 | + const unionR = jv.MultiSign.getUnionR(Rs); |
| 68 | + |
| 69 | + const subSig1 = MULPK1.sign(MSG, RAND, unionA, unionR, allAs); |
| 70 | + const subSig2 = MULPK2.sign(MSG, RAND, unionA, unionR, allAs); |
| 71 | + const sigs = [subSig1, subSig2]; |
| 72 | + const mulSig = jv.MultiSign.getSig(unionA, unionR, sigs); |
| 73 | + |
| 74 | + const bpA1 = MULPK1.getbpA(allAs); |
| 75 | + const bpA2 = MULPK2.getbpA(allAs); |
| 76 | + const bpAs = [bpA1, bpA2]; |
| 77 | + const mulPub = jv.MultiSign.getPub(bpAs); |
| 78 | + |
| 79 | + const valid = Axlsign.verify(mulPub, MSG, mulSig); |
| 80 | + expect(valid).toBeTrue(); |
| 81 | + }); |
| 82 | +}); |
0 commit comments