Skip to content

Commit

Permalink
Full api
Browse files Browse the repository at this point in the history
  • Loading branch information
oed committed Nov 24, 2023
1 parent 5801310 commit 64c8fed
Show file tree
Hide file tree
Showing 5 changed files with 29 additions and 66 deletions.
14 changes: 10 additions & 4 deletions packages/varsig/src/__tests__/canonicalization.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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: {
Expand Down Expand Up @@ -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,
Expand Down
22 changes: 11 additions & 11 deletions packages/varsig/src/__tests__/canons/eip712.test.ts
Original file line number Diff line number Diff line change
@@ -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'
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -139,28 +139,28 @@ 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,
signature:
'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'))

Expand Down
19 changes: 4 additions & 15 deletions packages/varsig/src/__tests__/parse-eip712.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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'

Expand Down Expand Up @@ -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)
Expand Down
38 changes: 2 additions & 36 deletions packages/varsig/src/canons/eip712.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<string, any> {
const message = {}
Expand Down Expand Up @@ -244,7 +232,7 @@ function extractSignature(signature: string | SignatureComponents) {
}
}

export function fromEip712({
export function fromOriginal({
types,
domain,
primaryType,
Expand Down Expand Up @@ -274,28 +262,6 @@ export function fromEip712({
return node as IpldNodeSigned
}

export function fromEip712A({ types, domain, primaryType, message }: Omit<Eip712, 'signature'>): {
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<string, any>,
types: Eip712Types,
Expand Down
2 changes: 2 additions & 0 deletions packages/varsig/src/varsig.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import { Decoder } from './decoder'

export { Eip712 } from './canons/eip712'

interface VarsigNode {
_sig: Uint8Array
[key: string]: any
Expand Down

0 comments on commit 64c8fed

Please sign in to comment.