Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
ukstv committed Nov 24, 2023
1 parent 64c8fed commit 158ad76
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 138 deletions.
101 changes: 0 additions & 101 deletions packages/varsig/src/__tests__/canons/eip712.test.ts
Original file line number Diff line number Diff line change
@@ -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: [
Expand Down Expand Up @@ -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)
Expand All @@ -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<string, any> = {
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'))
})
60 changes: 60 additions & 0 deletions packages/varsig/src/__tests__/eip712-secp256k1.test.ts
Original file line number Diff line number Diff line change
@@ -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<CID>
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)
}
}
})
36 changes: 0 additions & 36 deletions packages/varsig/src/__tests__/eip712.test.ts

This file was deleted.

2 changes: 1 addition & 1 deletion packages/varsig/src/__tests__/gen-vectors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Binary file modified packages/varsig/src/__tests__/vectors/eip712-secp256k1.car
Binary file not shown.

0 comments on commit 158ad76

Please sign in to comment.