From 158ad761902707fd172dc6190809a23e6d4013ce Mon Sep 17 00:00:00 2001 From: Sergey Ukustov Date: Fri, 24 Nov 2023 14:05:40 +0300 Subject: [PATCH] wip --- .../src/__tests__/canons/eip712.test.ts | 101 ------------------ .../src/__tests__/eip712-secp256k1.test.ts | 60 +++++++++++ packages/varsig/src/__tests__/eip712.test.ts | 36 ------- packages/varsig/src/__tests__/gen-vectors.ts | 2 +- .../__tests__/vectors/eip712-secp256k1.car | Bin 7341 -> 7341 bytes 5 files changed, 61 insertions(+), 138 deletions(-) create mode 100644 packages/varsig/src/__tests__/eip712-secp256k1.test.ts delete mode 100644 packages/varsig/src/__tests__/eip712.test.ts diff --git a/packages/varsig/src/__tests__/canons/eip712.test.ts b/packages/varsig/src/__tests__/canons/eip712.test.ts index cef2f30a..b36c89df 100644 --- a/packages/varsig/src/__tests__/canons/eip712.test.ts +++ b/packages/varsig/src/__tests__/canons/eip712.test.ts @@ -1,16 +1,8 @@ import { fromOriginal, prepareCanonicalization } from '../../canons/eip712.js' import { BytesTape } from '../../bytes-tape.js' import * as uint8arrays from 'uint8arrays' -import { privateKeyToAccount } from 'viem/accounts' -import * as fs from 'node:fs' -import { pipeline } from 'node:stream/promises' -import { CARFactory, type CAR } from 'cartonne' import { CanonicalizationKind } from '../../canonicalization.js' -const account = privateKeyToAccount( - '0x9727992a9c7d4e4b7c3b2d8d3c4b5b2e9d6e9c0a3a0e0d0c0b0a090807060504' -) - const testData = { types: { EIP712Domain: [ @@ -58,43 +50,6 @@ const expectedHash = uint8arrays.fromString( 'base16' ) -const easData = { - domain: { - name: 'EAS Attestation', - version: '0.26', - chainId: 1, - verifyingContract: '0xA1207F3BBa224E2c9c3c6D5aF63D0eb1582Ce587', - }, - primaryType: 'Attest', - message: { - schema: '0xc59265615401143689cbfe73046a922c975c99d97e4c248070435b1104b2dea7', - recipient: '0x17640d0D8C93bF710b6Ee4208997BB727B5B7bc2', - refUID: '0x0000000000000000000000000000000000000000000000000000000000000000', - data: '0x0000000000000000000000000000000000000000000000000000000000000001', - time: 1699288761, - revocable: true, - expirationTime: 0, - version: 1, - }, - types: { - Attest: [ - { name: 'version', type: 'uint16' }, - { name: 'schema', type: 'bytes32' }, - { name: 'recipient', type: 'address' }, - { name: 'time', type: 'uint64' }, - { name: 'expirationTime', type: 'uint64' }, - { name: 'revocable', type: 'bool' }, - { name: 'refUID', type: 'bytes32' }, - { name: 'data', type: 'bytes' }, - ], - }, - signature: { - v: 27, - r: '0x65f777899dddd381d138eb0e1350071a6bcb6430a3a58c1c232eaf5db4292af7', - s: '0x7f225138ccfc901f85d4dc88bd199de57f13fc144272ba75b5459a2a14629b1e', - }, -} - test('Encode eip712 message', async () => { // @ts-ignore const node = fromOriginal(testData) @@ -120,59 +75,3 @@ test('Canonicalize ipld eip712 object', async () => { const sigInput = can(node) expect(sigInput).toEqual(expectedHash) }) - -test.skip('Generate test vectors', async () => { - // @ts-ignore - const signature = await account.signTypedData(testData) - console.log('sig', signature) - - function putEntry(car: CAR, eip712: any, node: any, error?: string) { - const entry: Record = { - valid: !error, - data: eip712 ? car.put(eip712) : null, - node: node ? car.put(node) : null, - } - if (error) entry.error = error - return car.put(entry) - } - - const car = new CARFactory().build() - const entries = [] - // @ts-ignore - entries.push(putEntry(car, testData, fromOriginal(testData))) - // @ts-ignore - entries.push(putEntry(car, easData, fromOriginal(easData))) - // invalid stuff - const invalidData1 = { - ...testData, - signature: - '0x0c095239e4d3d2cc0b7aa28110f42abcdefe47656bbde7048244471e701331ec3f94adfe7959b0ed0efec533d511f9e1e1187623487682341870dc31fbc2146d1b', - } - // @ts-ignore - entries.push(putEntry(car, invalidData1, fromOriginal(invalidData1), 'Invalid signature')) - - // @ts-ignore - const invalidNode1 = fromOriginal(testData) - invalidNode1._sig.set([0xec], 1) - entries.push(putEntry(car, null, invalidNode1, 'Unsupported key type')) - // @ts-ignore - const invalidNode2 = fromOriginal(testData) - invalidNode2._sig.set([0x00], 2) - entries.push(putEntry(car, null, invalidNode2, 'Missing recovery bit')) - // @ts-ignore - const invalidNode3 = fromOriginal(testData) - invalidNode3._sig.set([0x12], 3) - entries.push(putEntry(car, null, invalidNode3, 'Unsupported hash type')) - - car.put( - { - canonicalization: 'eip712', - signature: 'secp256k1', - hash: 'keccak256', - entries, - }, - { isRoot: true } - ) - - await pipeline(car, fs.createWriteStream('./eip712-secp256k1.car')) -}) diff --git a/packages/varsig/src/__tests__/eip712-secp256k1.test.ts b/packages/varsig/src/__tests__/eip712-secp256k1.test.ts new file mode 100644 index 00000000..072fc6b1 --- /dev/null +++ b/packages/varsig/src/__tests__/eip712-secp256k1.test.ts @@ -0,0 +1,60 @@ +import { readFile } from 'node:fs/promises' +import { expect, test } from '@jest/globals' +import { CARFactory } from 'cartonne' +import { CID } from 'multiformats/cid' +import { BytesTape } from '../bytes-tape' +import { Decoder } from '../decoder' +import * as uint8arrays from 'uint8arrays' +import { CanonicalizationKind } from '../canonicalization.js' + +const factory = new CARFactory() + +test('eip712-secp256k1.car', async () => { + const carFilepath = new URL('./vectors/eip712-secp256k1.car', import.meta.url) + const carBytes = await readFile(carFilepath) + const car = factory.fromBytes(carBytes) + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + const root = car.get(car.roots[0]) + if (!root) throw new Error(`Empty root`) + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + const entries = root.entries as Array + for (const entryCID of entries) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + const entry = car.get(entryCID) + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access + if (!entry['data']) continue + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment + const data = car.get(entry.data) + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment + const node = car.get(entry.node) + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment + const varsig = new Decoder(new BytesTape(node._sig)).read() + if (varsig.canonicalization.kind !== CanonicalizationKind.EIP712) throw new Error(`Not 712`) + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment + const input = varsig.canonicalization(data.message) + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment + const signer = entry.signer + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment + if (signer.publicKey) { + const verificationResult = await varsig.signing.verify( + input, + varsig.signature, + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument,@typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access + uint8arrays.fromString(signer.publicKey.replace(/^0x/, ''), 'hex') + ) + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,jest/no-conditional-expect + expect(verificationResult).toEqual(entry.valid) + } + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + if (signer.address) { + const verificationResult = await varsig.signing.verify( + input, + varsig.signature, + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument,@typescript-eslint/no-unsafe-member-access + signer.address + ) + // eslint-disable-next-line jest/no-conditional-expect,@typescript-eslint/no-unsafe-member-access + expect(verificationResult).toEqual(entry.valid) + } + } +}) diff --git a/packages/varsig/src/__tests__/eip712.test.ts b/packages/varsig/src/__tests__/eip712.test.ts deleted file mode 100644 index 157e728e..00000000 --- a/packages/varsig/src/__tests__/eip712.test.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { readFile } from 'node:fs/promises' -import { test } from '@jest/globals' -import { CARFactory } from 'cartonne' -// import { Decoder } from '../decoder' -// import { BytesTape } from '../bytes-tape' -// import { CanonicalizationKind } from '../canonicalization' -// import { secp256k1 } from '@noble/curves/secp256k1' - -const factory = new CARFactory() - -test.skip('eip712-secp256k1.car', async () => { - const carFilepath = new URL('../../test/__vectors__/eip712-secp256k1.car', import.meta.url) - const carBytes = await readFile(carFilepath) - const car = factory.fromBytes(carBytes) - const root = car.get(car.roots[0]) - if (!root) throw new Error(`Empty root`) - for (const entryCID of root.entries) { - const a = car.get(entryCID) - if (a.valid) { - const dataCID = a.data - const nodeCID = a.node - const data = car.get(dataCID) - const node = car.get(nodeCID) - // const varsig = new Decoder(new BytesTape(node._sig)).read() - // if (varsig.canonicalization.kind !== CanonicalizationKind.EIP712) throw new Error(`Not 712`) - // const input = varsig.canonicalization(data.message) - // let signature = secp256k1.Signature.fromCompact(varsig.signature) - // varsig.signing.verify(input, varsig.signature, ) - // if (varsig.signing.recoveryBit) { - // signature = signature.addRecoveryBit(varsig.signing.recoveryBit - 27) - // } - // console.log('pub.1', signature.recoverPublicKey(input).toHex(false)) - console.log('pub.0', data, node) - } - } -}) diff --git a/packages/varsig/src/__tests__/gen-vectors.ts b/packages/varsig/src/__tests__/gen-vectors.ts index 5ba72121..47180039 100644 --- a/packages/varsig/src/__tests__/gen-vectors.ts +++ b/packages/varsig/src/__tests__/gen-vectors.ts @@ -106,7 +106,7 @@ async function main() { entries.push(putEntry(car, TEST_DATA, fromEip712(TEST_DATA), { publicKey: ACCOUNT.publicKey })) entries.push( putEntry(car, EAS_DATA, fromEip712(EAS_DATA), { - address: '0x7821B4697401EdC27aB2719FF4d7a6A7737D28C3', + address: '0x3e95B8E249c4536FE1db2E4ce5476010767C0A05', }) ) // invalid stuff diff --git a/packages/varsig/src/__tests__/vectors/eip712-secp256k1.car b/packages/varsig/src/__tests__/vectors/eip712-secp256k1.car index 635593f017ad11c99217a739c7c0853033c01e1c..3c3041a046b6beaf621752881f63b7452f680eb1 100644 GIT binary patch delta 216 zcmZ2$xz^IiYEf!Yett=D;|;9{RR+dFAq7_du!*%zp^kgCzZ`wVZ}2&3AvzKf9c1#%ATK2aiuK