diff --git a/src/index.ts b/src/index.ts index 235a2f4..7439abc 100644 --- a/src/index.ts +++ b/src/index.ts @@ -15,6 +15,11 @@ export const ecParams = { G, n } export type UserSecretData = { a: BigNumber, b: BigNumber, f: Point } export type UnblindedSignature = { s: BigNumber, f: Point } +export function messageToBigNumber(message: string) { + const msg = Buffer.from(message, 'utf8') + return new BigNumber(msg) +} + export function hashBigNumber(m: BigNumber) { const mHex = m.toString(16) @@ -24,10 +29,14 @@ export function hashBigNumber(m: BigNumber) { return keccak256('0x0' + mHex).slice(2) // Trim 0x } -export function bigNumberFromString(s: string) { +export function stringToBigNumber(s: string) { return new BigNumber(s) } +export function decodePoint(hexPoint: string): Point { + return secp256k1.keyFromPublic(Buffer.from(hexPoint, "hex")).getPublic() +} + function random(bytes: number) { let k: BigNumber do { @@ -96,7 +105,7 @@ export function verify(m: BigNumber, s: UnblindedSignature, q: Point) { const sG = G.mul(s.s) const hHex = hashBigNumber(m) - + const h = new BigNumber(Buffer.from(hHex, "hex")) const rx = s.f.getX().mod(n) diff --git a/test/index.test.ts b/test/index.test.ts index fd7c29b..df67dd5 100644 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -1,7 +1,9 @@ import * as assert from 'assert' import { - bigNumberFromString, + stringToBigNumber, + messageToBigNumber, + decodePoint, ecParams, newKeyPair, newRequestParameters, @@ -15,26 +17,31 @@ import { } from "../src/index" describe("keccak256", function () { - it("keccak256", async () => { - const msg = Buffer.from("test", 'utf8') - const m = new BigNumber(msg) + it("should hash strings and big numbers", async () => { + const m = messageToBigNumber("test") + assert.strictEqual('1952805748', m.toString()) + const hHex = hashBigNumber(m) assert.strictEqual(hHex, '9c22ff5f21f0b81b113e63f7db6da94fedef11b2119b4088b89664fb9a3cb658') const h = new BigNumber(Buffer.from(hHex, "hex")) assert.strictEqual(h.toString(), '70622639689279718371527342103894932928233838121221666359043189029713682937432') }) + + it("should decode points in the secp256k1 curve", () => { + const tokenR = "7cfe4af054e13b4e7231d876d23205fb5f939ac8185271ca6b64c635a365faae259fb8cabdb06dde39d1ebeada3cb75cb9739621a79c61a8cf1e9a38abaf782a" + const point = decodePoint("04" + tokenR) + assert.strictEqual(point.getX().toString(16), tokenR.substr(0, 64)) + assert.strictEqual(point.getY().toString(16), tokenR.substr(64)) + }) }) -describe("test blind", function () { - it("should blind", async () => { +describe("blind signatures", function () { + it("should blind, unblind and verify", async () => { const { sk, pk } = newKeyPair() const { k, signerR } = newRequestParameters() - const msg = new BigNumber( - Buffer.from("test", 'utf8') - ) - assert.strictEqual('1952805748', msg.toString()) + const msg = messageToBigNumber("test") const { mBlinded, userSecretData } = blind(msg, signerR)