arnaucube
arnaucube/blindsecp256k1-jsPublic Self-hosted repository
blindsecp256k1-js/test/index.test.ts
test/index.test.tsRaw
 1import * as assert from 'assert'
 2
 3import {
 4	stringToBigNumber,
 5	messageToBigNumber,
 6	decodePoint,
 7	ecParams,
 8	newKeyPair,
 9	newRequestParameters,
10	blind,
11	blindSign,
12	unblind,
13	verify,
14	hashBigNumber,
15	Point,
16	BigNumber,
17	signatureToHex,
18	signatureFromHex
19} from "../src/index"
20
21describe("keccak256", function () {
22	it("should hash strings and big numbers", async () => {
23		const m = messageToBigNumber("test")
24		assert.strictEqual('1952805748', m.toString())
25
26		const hHex = hashBigNumber(m)
27		assert.strictEqual(hHex, '9c22ff5f21f0b81b113e63f7db6da94fedef11b2119b4088b89664fb9a3cb658')
28		const h = new BigNumber(Buffer.from(hHex, "hex"))
29		assert.strictEqual(h.toString(), '70622639689279718371527342103894932928233838121221666359043189029713682937432')
30	})
31
32	it("should decode points in the secp256k1 curve", () => {
33		const tokenR = "7cfe4af054e13b4e7231d876d23205fb5f939ac8185271ca6b64c635a365faae259fb8cabdb06dde39d1ebeada3cb75cb9739621a79c61a8cf1e9a38abaf782a"
34		const point = decodePoint("04" + tokenR)
35		assert.strictEqual(point.getX().toString(16), tokenR.substr(0, 64))
36		assert.strictEqual(point.getY().toString(16), tokenR.substr(64))
37	})
38})
39
40describe("blind signatures", function () {
41	it("should blind, unblind and verify", async () => {
42		const { sk, pk } = newKeyPair()
43
44		const { k, signerR } = newRequestParameters()
45
46		const msg = messageToBigNumber("test")
47
48		const { mBlinded, userSecretData } = blind(msg, signerR)
49
50		const sBlind = blindSign(sk, mBlinded, k)
51
52		const sig = unblind(sBlind, userSecretData)
53
54		const verified = verify(msg, sig, pk)
55		assert(verified)
56	})
57})
58
59describe("encoding", () => {
60	it("should encode and decode signatures", () => {
61		const { sk } = newKeyPair()
62		const { k, signerR } = newRequestParameters()
63		const msg = messageToBigNumber("test")
64		const { mBlinded, userSecretData } = blind(msg, signerR)
65		const sBlind = blindSign(sk, mBlinded, k)
66		const sig = unblind(sBlind, userSecretData)
67
68		const hexSignature = signatureToHex(sig)
69		assert.strictEqual(hexSignature.length, 192)
70
71		const decodedSig = signatureFromHex(hexSignature)
72		assert.strictEqual(decodedSig.f.encode("hex", false).length, 130)
73
74		assert.strictEqual(signatureToHex(signatureFromHex(hexSignature)), hexSignature)
75
76		// explicit values
77		const hexSignature2 = "089a89f07bd41560454b1640fd30e51ee088d1be8355275a88e38a38f2e7a3af9e80fcc14af9c47c8066c6726e7d3cac9370494d5c67936b2978d6cecf5a4d21bf3ef00b060c47ba874c0764d662eff2d0e9daa8ba766f4aa6a2be8ec3d37523"
78
79		const decodedSig2 = signatureFromHex(hexSignature2)
80		assert.strictEqual(decodedSig2.s.toString("hex"), "afa3e7f2388ae3885a275583bed188e01ee530fd40164b456015d47bf0899a08")
81		assert.strictEqual(decodedSig2.f.encode("hex", false).substr(2), "9e80fcc14af9c47c8066c6726e7d3cac9370494d5c67936b2978d6cecf5a4d21bf3ef00b060c47ba874c0764d662eff2d0e9daa8ba766f4aa6a2be8ec3d37523")
82
83		assert.strictEqual(signatureToHex(signatureFromHex(hexSignature2)), hexSignature2)
84
85		// swapEndianness(s) starting with 0
86		const hexSignature3 = "089a89f07bd41560454b1640fd30e51ee088d1be8355275a88e38a38f2e7a30f9e80fcc14af9c47c8066c6726e7d3cac9370494d5c67936b2978d6cecf5a4d21bf3ef00b060c47ba874c0764d662eff2d0e9daa8ba766f4aa6a2be8ec3d37523"
87
88		const decodedSig3 = signatureFromHex(hexSignature3)
89		assert.strictEqual(decodedSig3.s.toString("hex"), /* 0 */ "fa3e7f2388ae3885a275583bed188e01ee530fd40164b456015d47bf0899a08")
90		assert.strictEqual(decodedSig3.f.encode("hex", false).substr(2), "9e80fcc14af9c47c8066c6726e7d3cac9370494d5c67936b2978d6cecf5a4d21bf3ef00b060c47ba874c0764d662eff2d0e9daa8ba766f4aa6a2be8ec3d37523")
91
92		assert.strictEqual(signatureToHex(signatureFromHex(hexSignature3)), hexSignature3)
93	})
94})