From 64c8fedcdb32420f8a116e95812c2231b4a02796 Mon Sep 17 00:00:00 2001 From: Joel Thorstensson Date: Fri, 24 Nov 2023 13:25:35 +0300 Subject: [PATCH] Full api --- .../src/__tests__/canonicalization.test.ts | 14 +++++-- .../src/__tests__/canons/eip712.test.ts | 22 +++++------ .../varsig/src/__tests__/parse-eip712.test.ts | 19 ++-------- packages/varsig/src/canons/eip712.ts | 38 +------------------ packages/varsig/src/varsig.ts | 2 + 5 files changed, 29 insertions(+), 66 deletions(-) diff --git a/packages/varsig/src/__tests__/canonicalization.test.ts b/packages/varsig/src/__tests__/canonicalization.test.ts index a4b9f284..9398eca8 100644 --- a/packages/varsig/src/__tests__/canonicalization.test.ts +++ b/packages/varsig/src/__tests__/canonicalization.test.ts @@ -5,7 +5,7 @@ import { concat, toString } from 'uint8arrays' import { encode } from 'varintes/encode' import { HashingAlgo } from '../hashing.js' import { SigningKind } from '../signing.js' -import { fromEip712A } from '../canons/eip712.js' +import { fromOriginal } from '../canons/eip712.js' const TEST_DATA = { types: { @@ -75,18 +75,24 @@ const TEST_DATA = { contents: 'Hello, Bob!', attachment: '0xababababababababababa83459873459873459873498575986734359', }, + signature: + '0x0c095239e4d3d2cc0b7aa28110f42abcdefe47656bbde7048244471e701331ec3f94adfe7959b0ed0efec533d511f9e1e11b3e47242d82341870dc31fbc2146d1b', } as const test('EIP712', () => { - const a = fromEip712A({ + const node = fromOriginal({ // @ts-ignore types: TEST_DATA.types, domain: TEST_DATA.domain, primaryType: TEST_DATA.primaryType, message: TEST_DATA.message, + signature: TEST_DATA.signature, }) - const bytes = concat([encode(0xe712)[0], a.params]) - const tape = new BytesTape(bytes) + const tape = new BytesTape(node._sig) + tape.readVarint() // skip varsig sigil + tape.readVarint() // skip key sigil + tape.read(1) + tape.readVarint() // skip hash sigil const canonicalization = CanonicalizationDecoder.read( tape, HashingAlgo.KECCAK256, diff --git a/packages/varsig/src/__tests__/canons/eip712.test.ts b/packages/varsig/src/__tests__/canons/eip712.test.ts index bbe84cd0..cef2f30a 100644 --- a/packages/varsig/src/__tests__/canons/eip712.test.ts +++ b/packages/varsig/src/__tests__/canons/eip712.test.ts @@ -1,4 +1,4 @@ -import { fromEip712, prepareCanonicalization } from '../../canons/eip712.js' +import { fromOriginal, prepareCanonicalization } from '../../canons/eip712.js' import { BytesTape } from '../../bytes-tape.js' import * as uint8arrays from 'uint8arrays' import { privateKeyToAccount } from 'viem/accounts' @@ -95,17 +95,17 @@ const easData = { }, } -test('Encode eip712 message', () => { +test('Encode eip712 message', async () => { // @ts-ignore - const node = fromEip712(testData) + const node = fromOriginal(testData) expect(node._sig.length).toEqual(268) expect(node.attachment instanceof Uint8Array).toBeTruthy() }) -test('Canonicalize ipld eip712 object', () => { +test('Canonicalize ipld eip712 object', async () => { // @ts-ignore - const node = fromEip712(testData) + const node = fromOriginal(testData) const tape = new BytesTape(node._sig) tape.readVarint() // skip sigil tape.readVarint() // skip key type @@ -139,9 +139,9 @@ test.skip('Generate test vectors', async () => { const car = new CARFactory().build() const entries = [] // @ts-ignore - entries.push(putEntry(car, testData, fromEip712(testData))) + entries.push(putEntry(car, testData, fromOriginal(testData))) // @ts-ignore - entries.push(putEntry(car, easData, fromEip712(easData))) + entries.push(putEntry(car, easData, fromOriginal(easData))) // invalid stuff const invalidData1 = { ...testData, @@ -149,18 +149,18 @@ test.skip('Generate test vectors', async () => { '0x0c095239e4d3d2cc0b7aa28110f42abcdefe47656bbde7048244471e701331ec3f94adfe7959b0ed0efec533d511f9e1e1187623487682341870dc31fbc2146d1b', } // @ts-ignore - entries.push(putEntry(car, invalidData1, fromEip712(invalidData1), 'Invalid signature')) + entries.push(putEntry(car, invalidData1, fromOriginal(invalidData1), 'Invalid signature')) // @ts-ignore - const invalidNode1 = fromEip712(testData) + const invalidNode1 = fromOriginal(testData) invalidNode1._sig.set([0xec], 1) entries.push(putEntry(car, null, invalidNode1, 'Unsupported key type')) // @ts-ignore - const invalidNode2 = fromEip712(testData) + const invalidNode2 = fromOriginal(testData) invalidNode2._sig.set([0x00], 2) entries.push(putEntry(car, null, invalidNode2, 'Missing recovery bit')) // @ts-ignore - const invalidNode3 = fromEip712(testData) + const invalidNode3 = fromOriginal(testData) invalidNode3._sig.set([0x12], 3) entries.push(putEntry(car, null, invalidNode3, 'Unsupported hash type')) diff --git a/packages/varsig/src/__tests__/parse-eip712.test.ts b/packages/varsig/src/__tests__/parse-eip712.test.ts index cfa42643..6381a25c 100644 --- a/packages/varsig/src/__tests__/parse-eip712.test.ts +++ b/packages/varsig/src/__tests__/parse-eip712.test.ts @@ -4,7 +4,7 @@ import * as uint8arrays from 'uint8arrays' import { privateKeyToAccount } from 'viem/accounts' import { BytesTape } from '../bytes-tape.js' import { CanonicalizationKind } from '../canonicalization.js' -import { fromEip712A } from '../canons/eip712' +import { fromOriginal } from '../canons/eip712' import { Decoder } from '../decoder.js' import { hex } from './hex.util.js' @@ -88,26 +88,15 @@ test('712 flow', async () => { primaryType: testData.primaryType, message: testData.message, }) - const signatureBytes = uint8arrays.fromString( - stringSignature.toLowerCase().replace(/^0x/, ''), - 'hex' - ) - const a = fromEip712A({ + const node = fromOriginal({ // @ts-ignore types: testData.types, domain: testData.domain, primaryType: testData.primaryType, message: testData.message, + signature: stringSignature }) - const varsig = uint8arrays.concat([ - hex(0x34), - varintes.encode(0xe7)[0], - signatureBytes.subarray(64), - varintes.encode(0x1b)[0], - varintes.encode(CanonicalizationKind.EIP712)[0], - a.params, - signatureBytes.subarray(0, 64), - ]) + const varsig = node._sig const decoder = new Decoder(new BytesTape(varsig)).read() if (decoder.canonicalization.kind !== CanonicalizationKind.EIP712) throw new Error(`Not 712`) const input = decoder.canonicalization(testData.message) diff --git a/packages/varsig/src/canons/eip712.ts b/packages/varsig/src/canons/eip712.ts index 85b650b7..724b800a 100644 --- a/packages/varsig/src/canons/eip712.ts +++ b/packages/varsig/src/canons/eip712.ts @@ -196,19 +196,7 @@ export function prepareCanonicalization( return canonicalization } -export const Eip712 = { SIGIL, prepareCanonicalization } - -// function parameterizeCanonicalizer({ types, primaryType, domain }: Eip712): Canonicalize { -// return (node: IpldNode) => { -// const message = ipldNodeToMessage(node) -// // @ts-ignore -// const hexHash = hashTypedData({ types, primaryType, domain, message }) -// return { -// digest: uint8arrays.fromString(hexHash.slice(2), 'base16'), -// decoded: { types, primaryType, domain, message }, -// } -// } -// } +export const Eip712 = { SIGIL, prepareCanonicalization, fromOriginal } function ipldNodeToMessage(node: IpldNode): Record { const message = {} @@ -244,7 +232,7 @@ function extractSignature(signature: string | SignatureComponents) { } } -export function fromEip712({ +export function fromOriginal({ types, domain, primaryType, @@ -274,28 +262,6 @@ export function fromEip712({ return node as IpldNodeSigned } -export function fromEip712A({ types, domain, primaryType, message }: Omit): { - params: Uint8Array -} { - const metadata = JSON.stringify([compressTypes(types), primaryType, compressDomain(domain)]) - const metadataBytes = uint8arrays.fromString(metadata) - const metadataLength = varintes.encode(metadataBytes.length)[0] - const varsig = uint8arrays.concat([ - // new Uint8Array([0x34]), // varsig sigil - // varintes.encode(0xe7)[0], // key type - // varintes.encode(0x1b)[0], // hash type - // varintes.encode(0xe712)[0], // canonicalizer codec - metadataLength, - metadataBytes, - ]) - if (!message) throw new Error(`No message passsed`) - const node = messageToIpld(message, types, primaryType) - node._sig = varsig - return { - params: varsig, - } -} - function messageToIpld( message: Record, types: Eip712Types, diff --git a/packages/varsig/src/varsig.ts b/packages/varsig/src/varsig.ts index e1eca8b3..314657a0 100644 --- a/packages/varsig/src/varsig.ts +++ b/packages/varsig/src/varsig.ts @@ -1,5 +1,7 @@ import { Decoder } from './decoder' +export { Eip712 } from './canons/eip712' + interface VarsigNode { _sig: Uint8Array [key: string]: any