From 872607a9669249f7022b96398f058f2ee185b913 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20=27birdy=27=20Danjou?= Date: Mon, 22 Apr 2024 14:57:51 +0200 Subject: [PATCH 01/15] feat: add proof for all encryption --- src/sdk/encrypt.ts | 56 +++++++++++++++++++++++++++++++++------------- 1 file changed, 41 insertions(+), 15 deletions(-) diff --git a/src/sdk/encrypt.ts b/src/sdk/encrypt.ts index c78a214..1bbe3c2 100644 --- a/src/sdk/encrypt.ts +++ b/src/sdk/encrypt.ts @@ -1,23 +1,37 @@ import { TfheCompactPublicKey, - CompactFheBoolList, - CompactFheUint4List, - CompactFheUint8List, - CompactFheUint16List, - CompactFheUint32List, - CompactFheUint64List, - CompactFheUint160List, + CompactPkeCrs, + ProvenCompactFheBoolList, + ProvenCompactFheUint4List, + ProvenCompactFheUint8List, + ProvenCompactFheUint16List, + ProvenCompactFheUint32List, + ProvenCompactFheUint64List, + ProvenCompactFheUint160List, + ShortintParameters, + ShortintParametersName, + ZkComputeLoad, } from 'node-tfhe'; -import { fromHexString } from '../utils'; + +const crs = CompactPkeCrs.from_parameters( + new ShortintParameters( + ShortintParametersName.PARAM_MESSAGE_1_CARRY_2_COMPACT_PK_KS_PBS_TUNIFORM_2M40, + ), + 1, +); + +const publicZkParams = crs.public_params(); export const encrypt4 = ( value: number, publicKey: TfheCompactPublicKey, ): Uint8Array => { const uint8Array = new Uint8Array([value]); - const encrypted = CompactFheUint4List.encrypt_with_compact_public_key( + const encrypted = ProvenCompactFheUint4List.encrypt_with_compact_public_key( uint8Array, + publicZkParams, publicKey, + ZkComputeLoad.Proof, ); return encrypted.serialize(); }; @@ -26,9 +40,11 @@ export const encryptBool = ( value: boolean, publicKey: TfheCompactPublicKey, ): Uint8Array => { - const encrypted = CompactFheBoolList.encrypt_with_compact_public_key( + const encrypted = ProvenCompactFheBoolList.encrypt_with_compact_public_key( [value], + publicZkParams, publicKey, + ZkComputeLoad.Proof, ); return encrypted.serialize(); }; @@ -38,9 +54,11 @@ export const encrypt8 = ( publicKey: TfheCompactPublicKey, ): Uint8Array => { const uint8Array = new Uint8Array([value]); - const encrypted = CompactFheUint8List.encrypt_with_compact_public_key( + const encrypted = ProvenCompactFheUint8List.encrypt_with_compact_public_key( uint8Array, + publicZkParams, publicKey, + ZkComputeLoad.Proof, ); return encrypted.serialize(); }; @@ -50,9 +68,11 @@ export const encrypt16 = ( publicKey: TfheCompactPublicKey, ): Uint8Array => { const uint16Array = new Uint16Array([value]); - const encrypted = CompactFheUint16List.encrypt_with_compact_public_key( + const encrypted = ProvenCompactFheUint16List.encrypt_with_compact_public_key( uint16Array, + publicZkParams, publicKey, + ZkComputeLoad.Proof, ); return encrypted.serialize(); }; @@ -62,9 +82,11 @@ export const encrypt32 = ( publicKey: TfheCompactPublicKey, ): Uint8Array => { const uint32Array = new Uint32Array([value]); - const encrypted = CompactFheUint32List.encrypt_with_compact_public_key( + const encrypted = ProvenCompactFheUint32List.encrypt_with_compact_public_key( uint32Array, + publicZkParams, publicKey, + ZkComputeLoad.Proof, ); return encrypted.serialize(); }; @@ -74,9 +96,11 @@ export const encrypt64 = ( publicKey: TfheCompactPublicKey, ): Uint8Array => { const uint64Array = new BigUint64Array([BigInt(value)]); - const encrypted = CompactFheUint64List.encrypt_with_compact_public_key( + const encrypted = ProvenCompactFheUint64List.encrypt_with_compact_public_key( uint64Array, + publicZkParams, publicKey, + ZkComputeLoad.Proof, ); return encrypted.serialize(); }; @@ -86,9 +110,11 @@ export const encryptAddress = ( publicKey: TfheCompactPublicKey, ): Uint8Array => { // value is something like 0x8ba1f109551bd432803012645ac136ddd64dba72 - const encrypted = CompactFheUint160List.encrypt_with_compact_public_key( + const encrypted = ProvenCompactFheUint160List.encrypt_with_compact_public_key( [BigInt(value)], + publicZkParams, publicKey, + ZkComputeLoad.Proof, ); return encrypted.serialize(); }; From 8e402116d1ccf3f9d05766f0421b35b75c81af3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20=27birdy=27=20Danjou?= Date: Tue, 21 May 2024 17:31:32 +0200 Subject: [PATCH 02/15] feat: rework inputs and start reencrypt --- bin/fhevm.js | 1 + src/kms/README.md | 65 ++ src/kms/kms_lib.d.ts | 293 +++++++ src/kms/kms_lib.js | 1608 ++++++++++++++++++++++++++++++++++ src/kms/kms_lib_bg.wasm | Bin 0 -> 555130 bytes src/kms/kms_lib_bg.wasm.d.ts | 87 ++ src/kms/package.json | 11 + src/sdk/decrypt.test.ts | 75 -- src/sdk/decrypt.ts | 41 - src/sdk/encrypt.test.ts | 201 +---- src/sdk/encrypt.ts | 242 ++--- src/sdk/index.test.ts | 352 +------- src/sdk/index.ts | 302 ++----- src/sdk/keypair.test.ts | 50 ++ src/sdk/keypair.ts | 69 ++ src/sdk/network.test.ts | 30 + src/sdk/network.ts | 89 ++ src/sdk/publicKey.test.ts | 45 - src/sdk/publicKey.ts | 78 -- src/sdk/reencrypt.test.ts | 16 + src/sdk/reencrypt.ts | 29 + src/sdk/types.ts | 9 - 22 files changed, 2575 insertions(+), 1118 deletions(-) create mode 100644 src/kms/README.md create mode 100644 src/kms/kms_lib.d.ts create mode 100644 src/kms/kms_lib.js create mode 100644 src/kms/kms_lib_bg.wasm create mode 100644 src/kms/kms_lib_bg.wasm.d.ts create mode 100644 src/kms/package.json delete mode 100644 src/sdk/decrypt.test.ts delete mode 100644 src/sdk/decrypt.ts create mode 100644 src/sdk/keypair.test.ts create mode 100644 src/sdk/keypair.ts create mode 100644 src/sdk/network.test.ts create mode 100644 src/sdk/network.ts delete mode 100644 src/sdk/publicKey.test.ts delete mode 100644 src/sdk/publicKey.ts create mode 100644 src/sdk/reencrypt.test.ts create mode 100644 src/sdk/reencrypt.ts delete mode 100644 src/sdk/types.ts diff --git a/bin/fhevm.js b/bin/fhevm.js index c203960..9dc46ec 100755 --- a/bin/fhevm.js +++ b/bin/fhevm.js @@ -28,6 +28,7 @@ const getInstance = async (provider) => { // first four bytes of keccak256('fhePubKey(bytes1)') + 1 byte for library data: '0xd9d47bb001', }); + // console.log(ret); const decoded = AbiCoder.defaultAbiCoder().decode(['bytes'], ret); const publicKey = decoded[0]; _instance = await createInstance({ chainId, publicKey }); diff --git a/src/kms/README.md b/src/kms/README.md new file mode 100644 index 0000000..ba4a8e9 --- /dev/null +++ b/src/kms/README.md @@ -0,0 +1,65 @@ +# Key Management System + +[![CI](https://github.com/zama-ai/kms/workflows/CI/badge.svg)](https://github.com/zama-ai/kms/actions) +[![image-badge](https://ghcr-badge.egpl.dev/zama-ai/kms/tags?trim=major)](https://github.com/zama-ai/kms/pkgs/container/kms) +[![image-size-badge](https://ghcr-badge.egpl.dev/zama-ai/kms/size)](https://github.com/zama-ai/kms/pkgs/container/kms) +[![license-badge](https://img.shields.io/badge/License-BSD-blue)](LICENSE) + + +https://github.com/zama-ai/kms/actions/workflows/publish-docker-image.yml + +This repository hosts the code for the Zama Key Management System prototypes. + +## MVP Specification + +The full KMS specification is currently under review. What follows describes a KMS minimal viable product. + +### Description +It is assumed that neither decryptions nor reencryptions happen during transactions. Instead, transactions *mark* ciphertexts as decryptable or reencryptable. +Subsequently, full nodes may issue decryption and reencryption requests to the KMS for ciphertexts which have been marked as decryptable or reencryptable. Usually, this happens upon reception of a request from a user or wallet. + +### Sequence Diagram (reencryption) + +```mermaid +sequenceDiagram + actor Wallet + Wallet->>+Full Node: View function request + Full Node->>Full Node: Execute view function (encounter `TFHE.reencrypt(ct, pubkey)`) + Full Node->>Full Node: Generate `proof` for {`ct`, `pubkey`} + Full Node->>+KMS: Reencryption request ({`ct`, `pubkey`, `proof`, `height`}) + KMS->>+Light Client: Get state root at height `height` + Light Client->>-KMS: `root` + KMS->>KMS: Verify `proof` against `root` + KMS->>KMS: Decrypt + KMS->>KMS: Encrypt result under `pubkey` + KMS->>KMS: Sign encrypted result + KMS->>-Full Node: {`reencryped_ciphertext`, `sig`} + Full Node->>Full Node: Verify `sig` + Full Node->>-Wallet: `reencryped_ciphertext` + Wallet->>Wallet: Decrypt +``` +The process for decryptions is analogous. + +For the time being, the light client is assumed to provide valid state roots to the KMS service. + +In practice, the light client relies on any full node that is live and up to date with the blockchain. +Once the trusted setup is done at genesis, the light client can be trusted to provide valid state roots for any block, as long as the full node it connects to does not engage in byzantine behavior. + +## Implementation + +The KMS is iplemented as a gRPC service using the [tonic](https://github.com/hyperium/tonic) crate. +Communication between full nodes and the KMS service is defined by [protobuf](/proto/kms.proto) messages. +The rest of the communication is defined by existing standards and uses JSON-RPC. +For the light client, we currently use CometBFT's [light](https://pkg.go.dev/github.com/cometbft/cometbft/light) package, which provides a service that connects to any CometBFT full node to serve trusted state roots on-demand. +The light client package handles the logic of sequentially verifying block headers. + +## Next steps +- [ ] Full Node ->> KMS Reencryption request should contain user signature on `pubkey` and an `ACL` object. +- [ ] KMS should verify the user signature on `pubkey` against the values of permissible decryptors in `ACL`. + + +## Contribution + +See [CONTRIBUTING.md](CONTRIBUTING.md). + + diff --git a/src/kms/kms_lib.d.ts b/src/kms/kms_lib.d.ts new file mode 100644 index 0000000..dca1618 --- /dev/null +++ b/src/kms/kms_lib.d.ts @@ -0,0 +1,293 @@ +/* tslint:disable */ +/* eslint-disable */ +/** +* @param {(PublicSigKey)[]} server_pks +* @param {PublicSigKey} client_pk +* @param {number} shares_needed +* @param {string} params_json +* @returns {Client} +*/ +export function new_client(server_pks: (PublicSigKey)[], client_pk: PublicSigKey, shares_needed: number, params_json: string): Client; +/** +* @returns {PrivateEncKey} +*/ +export function cryptobox_keygen(): PrivateEncKey; +/** +* @param {PrivateEncKey} sk +* @returns {PublicEncKey} +*/ +export function cryptobox_get_pk(sk: PrivateEncKey): PublicEncKey; +/** +* @param {PublicEncKey} pk +* @returns {Uint8Array} +*/ +export function cryptobox_pk_to_u8vec(pk: PublicEncKey): Uint8Array; +/** +* @param {PrivateEncKey} sk +* @returns {Uint8Array} +*/ +export function cryptobox_sk_to_u8vec(sk: PrivateEncKey): Uint8Array; +/** +* @param {Uint8Array} v +* @returns {PublicEncKey} +*/ +export function u8vec_to_cryptobox_pk(v: Uint8Array): PublicEncKey; +/** +* @param {Uint8Array} v +* @returns {PrivateEncKey} +*/ +export function u8vec_to_cryptobox_sk(v: Uint8Array): PrivateEncKey; +/** +* @param {Uint8Array} msg +* @param {PublicEncKey} their_pk +* @param {PrivateEncKey} my_sk +* @returns {CryptoBoxCt} +*/ +export function cryptobox_encrypt(msg: Uint8Array, their_pk: PublicEncKey, my_sk: PrivateEncKey): CryptoBoxCt; +/** +* @param {CryptoBoxCt} ct +* @param {PrivateEncKey} my_sk +* @param {PublicEncKey} their_pk +* @returns {Uint8Array} +*/ +export function cryptobox_decrypt(ct: CryptoBoxCt, my_sk: PrivateEncKey, their_pk: PublicEncKey): Uint8Array; +/** +* This function assembles [ReencryptionRequest] +* from a signature and other metadata. +* The signature is on the ephemeral public key +* signed by the client's private key +* following the EIP712 standard. +* @param {Client} client +* @param {Uint8Array} signature +* @param {PublicEncKey} enc_pk +* @param {FheType} fhe_type +* @param {RequestId} key_id +* @param {Uint8Array} ciphertext_digest +* @param {Eip712DomainMsg} domain +* @returns {ReencryptionRequest} +*/ +export function make_reencryption_req(client: Client, signature: Uint8Array, enc_pk: PublicEncKey, fhe_type: FheType, key_id: RequestId, ciphertext_digest: Uint8Array, domain: Eip712DomainMsg): ReencryptionRequest; +/** +* This function takes [AggregatedReencryptionResponse] normally +* but wasm does not support HashMap so we need to take two parameters: +* `agg_resp` and `agg_resp_id`. +* @param {Client} client +* @param {ReencryptionRequest | undefined} request +* @param {(ReencryptionResponse)[]} agg_resp +* @param {Uint32Array} agg_resp_ids +* @param {PublicEncKey} enc_pk +* @param {PrivateEncKey} enc_sk +* @returns {number} +*/ +export function process_reencryption_resp(client: Client, request: ReencryptionRequest | undefined, agg_resp: (ReencryptionResponse)[], agg_resp_ids: Uint32Array, enc_pk: PublicEncKey, enc_sk: PrivateEncKey): number; +/** +* The plaintext types that can be encrypted in a fhevm ciphertext. +*/ +export enum FheType { + Bool = 0, + Euint4 = 1, + Euint8 = 2, + Euint16 = 3, + Euint32 = 4, + Euint64 = 5, + Euint128 = 6, + Euint160 = 7, +} +/** +* Simple client to interact with the KMS servers. This can be seen as a proof-of-concept +* and reference code for validating the KMS. The logic supplied by the client will be +* distributed accross the aggregator/proxy and smart contracts. +* TODO should probably aggregate the KmsEndpointClient to void having two client code bases +* exposed in tests and MVP +* +* client_sk is optional because sometimes the private signing key is kept +* in a secure location, e.g., hardware wallet. Calling functions that requires +* client_sk when it is None will return an error. +*/ +export class Client { + free(): void; +} +/** +*/ +export class CryptoBoxCt { + free(): void; +} +/** +* +* eventually chain_id, verifying_contract and salt will be parsed in to solidity types +*/ +export class Eip712DomainMsg { + free(): void; +/** +*/ + chain_id: Uint8Array; +/** +*/ + name: string; +/** +*/ + salt: Uint8Array; +/** +*/ + verifying_contract: string; +/** +*/ + version: string; +} +/** +*/ +export class Plaintext { + free(): void; +/** +*/ + higest_bits: number; +/** +*/ + lowest_bits: bigint; +/** +*/ + middle_bits: bigint; +} +/** +*/ +export class PrivateEncKey { + free(): void; +} +/** +*/ +export class PrivateSigKey { + free(): void; +} +/** +*/ +export class PublicEncKey { + free(): void; +} +/** +*/ +export class PublicSigKey { + free(): void; +} +/** +*/ +export class ReencryptionRequest { + free(): void; +/** +*/ + domain?: Eip712DomainMsg; +/** +*/ + payload?: ReencryptionRequestPayload; +/** +* The ID that identifies this request. +* Future queries for the result must use this request ID. +*/ + request_id?: RequestId; +/** +* Signature of the ASN1 DER serialization of \[ReencryptionRequestPayload\]. +*/ + signature: Uint8Array; +} +/** +*/ +export class ReencryptionRequestPayload { + free(): void; +/** +* The actual ciphertext to decrypt, taken directly from the fhevm. +* When creating the payload, this field may be empty, +* it is the responsibility of the gateway to fetch the +* ciphertext for the given digest below. +*/ + ciphertext?: Uint8Array; +/** +* The SHA3 digest of the ciphertext above. +*/ + ciphertext_digest: Uint8Array; +/** +* Encoding of the user's public encryption key for this request. +* Encoding using the default encoding of libsodium, i.e. the 32 bytes of a +* Montgomery point. +*/ + enc_key: Uint8Array; +/** +* The type of plaintext encrypted. +*/ + fhe_type: number; +/** +* The key id to use for decryption. Will be the request_id used during key generation +*/ + key_id?: RequestId; +/** +* Randomness specified in the request to ensure EU-CMA of the signed response. +* TODO check that we don't need two types of randomness. One for the reuqest and one for the response +* TODO also check potential risk with repeated calls +*/ + randomness: Uint8Array; +/** +* The amount of shares needed to recombine the result. +* This implies the threshold used. +* Needed to avoid a single malicious server taking over a request that should +* have been distributed. +*/ + servers_needed: number; +/** +* The server's signature verification key. +* Encoded using SEC1. +* TODO not needed in the request! Should be removed +*/ + verification_key: Uint8Array; +/** +* Version of the request format. +*/ + version: number; +} +/** +*/ +export class ReencryptionResponse { + free(): void; +/** +* Digest of the request validated. +* Needed to ensure that the response is for the expected request. +*/ + digest: Uint8Array; +/** +* The type of plaintext encrypted. +*/ + fhe_type: number; +/** +* Servers_needed are not really needed since there is a link to the +* digest, however, it seems better to be able to handle a response without +* getting data from the request as well. but this is also a security issue +* since it is possible to get meaning from the response without directly +* linking it to a request +* +* The amount of shares needed to recombine the result. +* This implies the threshold used. +*/ + servers_needed: number; +/** +* The signcrypted payload, using a hybrid encryption approach in +* sign-then-encrypt. +*/ + signcrypted_ciphertext: Uint8Array; +/** +* The server's signature verification key. +* Encoded using SEC1. +* Needed to validate the response, but MUST also be linked to a list of +* trusted keys. +*/ + verification_key: Uint8Array; +/** +* Version of the response format. +*/ + version: number; +} +/** +* Simple response to return an ID, to be used to retrieve the computed result later on. +*/ +export class RequestId { + free(): void; +/** +*/ + request_id: string; +} diff --git a/src/kms/kms_lib.js b/src/kms/kms_lib.js new file mode 100644 index 0000000..c22113b --- /dev/null +++ b/src/kms/kms_lib.js @@ -0,0 +1,1608 @@ +let imports = {}; +imports['__wbindgen_placeholder__'] = module.exports; +let wasm; +const { TextDecoder, TextEncoder } = require(`util`); + +const heap = new Array(128).fill(undefined); + +heap.push(undefined, null, true, false); + +function getObject(idx) { return heap[idx]; } + +let heap_next = heap.length; + +function dropObject(idx) { + if (idx < 132) return; + heap[idx] = heap_next; + heap_next = idx; +} + +function takeObject(idx) { + const ret = getObject(idx); + dropObject(idx); + return ret; +} + +let cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }); + +cachedTextDecoder.decode(); + +let cachedUint8Memory0 = null; + +function getUint8Memory0() { + if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) { + cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8Memory0; +} + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); +} + +function addHeapObject(obj) { + if (heap_next === heap.length) heap.push(heap.length + 1); + const idx = heap_next; + heap_next = heap[idx]; + + heap[idx] = obj; + return idx; +} + +let cachedInt32Memory0 = null; + +function getInt32Memory0() { + if (cachedInt32Memory0 === null || cachedInt32Memory0.byteLength === 0) { + cachedInt32Memory0 = new Int32Array(wasm.memory.buffer); + } + return cachedInt32Memory0; +} + +let WASM_VECTOR_LEN = 0; + +let cachedTextEncoder = new TextEncoder('utf-8'); + +const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' + ? function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +} + : function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length + }; +}); + +function passStringToWasm0(arg, malloc, realloc) { + + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8Memory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8Memory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +function getArrayU8FromWasm0(ptr, len) { + ptr = ptr >>> 0; + return getUint8Memory0().subarray(ptr / 1, ptr / 1 + len); +} + +function passArray8ToWasm0(arg, malloc) { + const ptr = malloc(arg.length * 1, 1) >>> 0; + getUint8Memory0().set(arg, ptr / 1); + WASM_VECTOR_LEN = arg.length; + return ptr; +} + +function isLikeNone(x) { + return x === undefined || x === null; +} + +function _assertClass(instance, klass) { + if (!(instance instanceof klass)) { + throw new Error(`expected instance of ${klass.name}`); + } + return instance.ptr; +} + +let cachedUint32Memory0 = null; + +function getUint32Memory0() { + if (cachedUint32Memory0 === null || cachedUint32Memory0.byteLength === 0) { + cachedUint32Memory0 = new Uint32Array(wasm.memory.buffer); + } + return cachedUint32Memory0; +} + +function passArrayJsValueToWasm0(array, malloc) { + const ptr = malloc(array.length * 4, 4) >>> 0; + const mem = getUint32Memory0(); + for (let i = 0; i < array.length; i++) { + mem[ptr / 4 + i] = addHeapObject(array[i]); + } + WASM_VECTOR_LEN = array.length; + return ptr; +} +/** +* @param {(PublicSigKey)[]} server_pks +* @param {PublicSigKey} client_pk +* @param {number} shares_needed +* @param {string} params_json +* @returns {Client} +*/ +module.exports.new_client = function(server_pks, client_pk, shares_needed, params_json) { + const ptr0 = passArrayJsValueToWasm0(server_pks, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + _assertClass(client_pk, PublicSigKey); + var ptr1 = client_pk.__destroy_into_raw(); + const ptr2 = passStringToWasm0(params_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len2 = WASM_VECTOR_LEN; + const ret = wasm.new_client(ptr0, len0, ptr1, shares_needed, ptr2, len2); + return Client.__wrap(ret); +}; + +/** +* @returns {PrivateEncKey} +*/ +module.exports.cryptobox_keygen = function() { + const ret = wasm.cryptobox_keygen(); + return PrivateEncKey.__wrap(ret); +}; + +/** +* @param {PrivateEncKey} sk +* @returns {PublicEncKey} +*/ +module.exports.cryptobox_get_pk = function(sk) { + _assertClass(sk, PrivateEncKey); + const ret = wasm.cryptobox_get_pk(sk.__wbg_ptr); + return PublicEncKey.__wrap(ret); +}; + +/** +* @param {PublicEncKey} pk +* @returns {Uint8Array} +*/ +module.exports.cryptobox_pk_to_u8vec = function(pk) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + _assertClass(pk, PublicEncKey); + wasm.cryptobox_pk_to_u8vec(retptr, pk.__wbg_ptr); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + var r3 = getInt32Memory0()[retptr / 4 + 3]; + if (r3) { + throw takeObject(r2); + } + var v1 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 1, 1); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +}; + +/** +* @param {PrivateEncKey} sk +* @returns {Uint8Array} +*/ +module.exports.cryptobox_sk_to_u8vec = function(sk) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + _assertClass(sk, PrivateEncKey); + wasm.cryptobox_sk_to_u8vec(retptr, sk.__wbg_ptr); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + var r3 = getInt32Memory0()[retptr / 4 + 3]; + if (r3) { + throw takeObject(r2); + } + var v1 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 1, 1); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +}; + +/** +* @param {Uint8Array} v +* @returns {PublicEncKey} +*/ +module.exports.u8vec_to_cryptobox_pk = function(v) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + const ptr0 = passArray8ToWasm0(v, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + wasm.u8vec_to_cryptobox_pk(retptr, ptr0, len0); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return PublicEncKey.__wrap(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +}; + +/** +* @param {Uint8Array} v +* @returns {PrivateEncKey} +*/ +module.exports.u8vec_to_cryptobox_sk = function(v) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + const ptr0 = passArray8ToWasm0(v, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + wasm.u8vec_to_cryptobox_sk(retptr, ptr0, len0); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return PrivateEncKey.__wrap(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +}; + +/** +* @param {Uint8Array} msg +* @param {PublicEncKey} their_pk +* @param {PrivateEncKey} my_sk +* @returns {CryptoBoxCt} +*/ +module.exports.cryptobox_encrypt = function(msg, their_pk, my_sk) { + const ptr0 = passArray8ToWasm0(msg, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + _assertClass(their_pk, PublicEncKey); + _assertClass(my_sk, PrivateEncKey); + const ret = wasm.cryptobox_encrypt(ptr0, len0, their_pk.__wbg_ptr, my_sk.__wbg_ptr); + return CryptoBoxCt.__wrap(ret); +}; + +/** +* @param {CryptoBoxCt} ct +* @param {PrivateEncKey} my_sk +* @param {PublicEncKey} their_pk +* @returns {Uint8Array} +*/ +module.exports.cryptobox_decrypt = function(ct, my_sk, their_pk) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + _assertClass(ct, CryptoBoxCt); + _assertClass(my_sk, PrivateEncKey); + _assertClass(their_pk, PublicEncKey); + wasm.cryptobox_decrypt(retptr, ct.__wbg_ptr, my_sk.__wbg_ptr, their_pk.__wbg_ptr); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var v1 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 1, 1); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +}; + +/** +* This function assembles [ReencryptionRequest] +* from a signature and other metadata. +* The signature is on the ephemeral public key +* signed by the client's private key +* following the EIP712 standard. +* @param {Client} client +* @param {Uint8Array} signature +* @param {PublicEncKey} enc_pk +* @param {FheType} fhe_type +* @param {RequestId} key_id +* @param {Uint8Array} ciphertext_digest +* @param {Eip712DomainMsg} domain +* @returns {ReencryptionRequest} +*/ +module.exports.make_reencryption_req = function(client, signature, enc_pk, fhe_type, key_id, ciphertext_digest, domain) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + _assertClass(client, Client); + const ptr0 = passArray8ToWasm0(signature, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + _assertClass(enc_pk, PublicEncKey); + var ptr1 = enc_pk.__destroy_into_raw(); + _assertClass(key_id, RequestId); + var ptr2 = key_id.__destroy_into_raw(); + const ptr3 = passArray8ToWasm0(ciphertext_digest, wasm.__wbindgen_malloc); + const len3 = WASM_VECTOR_LEN; + _assertClass(domain, Eip712DomainMsg); + var ptr4 = domain.__destroy_into_raw(); + wasm.make_reencryption_req(retptr, client.__wbg_ptr, ptr0, len0, ptr1, fhe_type, ptr2, ptr3, len3, ptr4); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return ReencryptionRequest.__wrap(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +}; + +function passArray32ToWasm0(arg, malloc) { + const ptr = malloc(arg.length * 4, 4) >>> 0; + getUint32Memory0().set(arg, ptr / 4); + WASM_VECTOR_LEN = arg.length; + return ptr; +} +/** +* This function takes [AggregatedReencryptionResponse] normally +* but wasm does not support HashMap so we need to take two parameters: +* `agg_resp` and `agg_resp_id`. +* @param {Client} client +* @param {ReencryptionRequest | undefined} request +* @param {(ReencryptionResponse)[]} agg_resp +* @param {Uint32Array} agg_resp_ids +* @param {PublicEncKey} enc_pk +* @param {PrivateEncKey} enc_sk +* @returns {number} +*/ +module.exports.process_reencryption_resp = function(client, request, agg_resp, agg_resp_ids, enc_pk, enc_sk) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + _assertClass(client, Client); + let ptr0 = 0; + if (!isLikeNone(request)) { + _assertClass(request, ReencryptionRequest); + ptr0 = request.__destroy_into_raw(); + } + const ptr1 = passArrayJsValueToWasm0(agg_resp, wasm.__wbindgen_malloc); + const len1 = WASM_VECTOR_LEN; + const ptr2 = passArray32ToWasm0(agg_resp_ids, wasm.__wbindgen_malloc); + const len2 = WASM_VECTOR_LEN; + _assertClass(enc_pk, PublicEncKey); + _assertClass(enc_sk, PrivateEncKey); + wasm.process_reencryption_resp(retptr, client.__wbg_ptr, ptr0, ptr1, len1, ptr2, len2, enc_pk.__wbg_ptr, enc_sk.__wbg_ptr); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return r0; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +}; + +function handleError(f, args) { + try { + return f.apply(this, args); + } catch (e) { + wasm.__wbindgen_exn_store(addHeapObject(e)); + } +} +/** +* The plaintext types that can be encrypted in a fhevm ciphertext. +*/ +module.exports.FheType = Object.freeze({ Bool:0,"0":"Bool",Euint4:1,"1":"Euint4",Euint8:2,"2":"Euint8",Euint16:3,"3":"Euint16",Euint32:4,"4":"Euint32",Euint64:5,"5":"Euint64",Euint128:6,"6":"Euint128",Euint160:7,"7":"Euint160", }); + +const ClientFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_client_free(ptr >>> 0)); +/** +* Simple client to interact with the KMS servers. This can be seen as a proof-of-concept +* and reference code for validating the KMS. The logic supplied by the client will be +* distributed accross the aggregator/proxy and smart contracts. +* TODO should probably aggregate the KmsEndpointClient to void having two client code bases +* exposed in tests and MVP +* +* client_sk is optional because sometimes the private signing key is kept +* in a secure location, e.g., hardware wallet. Calling functions that requires +* client_sk when it is None will return an error. +*/ +class Client { + + static __wrap(ptr) { + ptr = ptr >>> 0; + const obj = Object.create(Client.prototype); + obj.__wbg_ptr = ptr; + ClientFinalization.register(obj, obj.__wbg_ptr, obj); + return obj; + } + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + ClientFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_client_free(ptr); + } +} +module.exports.Client = Client; + +const CryptoBoxCtFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_cryptoboxct_free(ptr >>> 0)); +/** +*/ +class CryptoBoxCt { + + static __wrap(ptr) { + ptr = ptr >>> 0; + const obj = Object.create(CryptoBoxCt.prototype); + obj.__wbg_ptr = ptr; + CryptoBoxCtFinalization.register(obj, obj.__wbg_ptr, obj); + return obj; + } + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + CryptoBoxCtFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_cryptoboxct_free(ptr); + } +} +module.exports.CryptoBoxCt = CryptoBoxCt; + +const Eip712DomainMsgFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_eip712domainmsg_free(ptr >>> 0)); +/** +* +* eventually chain_id, verifying_contract and salt will be parsed in to solidity types +*/ +class Eip712DomainMsg { + + static __wrap(ptr) { + ptr = ptr >>> 0; + const obj = Object.create(Eip712DomainMsg.prototype); + obj.__wbg_ptr = ptr; + Eip712DomainMsgFinalization.register(obj, obj.__wbg_ptr, obj); + return obj; + } + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + Eip712DomainMsgFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_eip712domainmsg_free(ptr); + } + /** + * @returns {string} + */ + get name() { + let deferred1_0; + let deferred1_1; + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.__wbg_get_eip712domainmsg_name(retptr, this.__wbg_ptr); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + deferred1_0 = r0; + deferred1_1 = r1; + return getStringFromWasm0(r0, r1); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } + } + /** + * @param {string} arg0 + */ + set name(arg0) { + const ptr0 = passStringToWasm0(arg0, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + wasm.__wbg_set_eip712domainmsg_name(this.__wbg_ptr, ptr0, len0); + } + /** + * @returns {string} + */ + get version() { + let deferred1_0; + let deferred1_1; + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.__wbg_get_eip712domainmsg_version(retptr, this.__wbg_ptr); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + deferred1_0 = r0; + deferred1_1 = r1; + return getStringFromWasm0(r0, r1); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } + } + /** + * @param {string} arg0 + */ + set version(arg0) { + const ptr0 = passStringToWasm0(arg0, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + wasm.__wbg_set_eip712domainmsg_version(this.__wbg_ptr, ptr0, len0); + } + /** + * @returns {Uint8Array} + */ + get chain_id() { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.__wbg_get_eip712domainmsg_chain_id(retptr, this.__wbg_ptr); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var v1 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 1, 1); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * @param {Uint8Array} arg0 + */ + set chain_id(arg0) { + const ptr0 = passArray8ToWasm0(arg0, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + wasm.__wbg_set_eip712domainmsg_chain_id(this.__wbg_ptr, ptr0, len0); + } + /** + * @returns {string} + */ + get verifying_contract() { + let deferred1_0; + let deferred1_1; + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.__wbg_get_eip712domainmsg_verifying_contract(retptr, this.__wbg_ptr); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + deferred1_0 = r0; + deferred1_1 = r1; + return getStringFromWasm0(r0, r1); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } + } + /** + * @param {string} arg0 + */ + set verifying_contract(arg0) { + const ptr0 = passStringToWasm0(arg0, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + wasm.__wbg_set_eip712domainmsg_verifying_contract(this.__wbg_ptr, ptr0, len0); + } + /** + * @returns {Uint8Array} + */ + get salt() { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.__wbg_get_eip712domainmsg_salt(retptr, this.__wbg_ptr); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var v1 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 1, 1); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * @param {Uint8Array} arg0 + */ + set salt(arg0) { + const ptr0 = passArray8ToWasm0(arg0, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + wasm.__wbg_set_eip712domainmsg_salt(this.__wbg_ptr, ptr0, len0); + } +} +module.exports.Eip712DomainMsg = Eip712DomainMsg; + +const PlaintextFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_plaintext_free(ptr >>> 0)); +/** +*/ +class Plaintext { + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + PlaintextFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_plaintext_free(ptr); + } + /** + * @returns {bigint} + */ + get lowest_bits() { + const ret = wasm.__wbg_get_plaintext_lowest_bits(this.__wbg_ptr); + return BigInt.asUintN(64, ret); + } + /** + * @param {bigint} arg0 + */ + set lowest_bits(arg0) { + wasm.__wbg_set_plaintext_lowest_bits(this.__wbg_ptr, arg0); + } + /** + * @returns {bigint} + */ + get middle_bits() { + const ret = wasm.__wbg_get_plaintext_middle_bits(this.__wbg_ptr); + return BigInt.asUintN(64, ret); + } + /** + * @param {bigint} arg0 + */ + set middle_bits(arg0) { + wasm.__wbg_set_plaintext_middle_bits(this.__wbg_ptr, arg0); + } + /** + * @returns {number} + */ + get higest_bits() { + const ret = wasm.__wbg_get_plaintext_higest_bits(this.__wbg_ptr); + return ret >>> 0; + } + /** + * @param {number} arg0 + */ + set higest_bits(arg0) { + wasm.__wbg_set_plaintext_higest_bits(this.__wbg_ptr, arg0); + } +} +module.exports.Plaintext = Plaintext; + +const PrivateEncKeyFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_privateenckey_free(ptr >>> 0)); +/** +*/ +class PrivateEncKey { + + static __wrap(ptr) { + ptr = ptr >>> 0; + const obj = Object.create(PrivateEncKey.prototype); + obj.__wbg_ptr = ptr; + PrivateEncKeyFinalization.register(obj, obj.__wbg_ptr, obj); + return obj; + } + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + PrivateEncKeyFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_privateenckey_free(ptr); + } +} +module.exports.PrivateEncKey = PrivateEncKey; + +const PrivateSigKeyFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_privatesigkey_free(ptr >>> 0)); +/** +*/ +class PrivateSigKey { + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + PrivateSigKeyFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_privatesigkey_free(ptr); + } +} +module.exports.PrivateSigKey = PrivateSigKey; + +const PublicEncKeyFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_publicenckey_free(ptr >>> 0)); +/** +*/ +class PublicEncKey { + + static __wrap(ptr) { + ptr = ptr >>> 0; + const obj = Object.create(PublicEncKey.prototype); + obj.__wbg_ptr = ptr; + PublicEncKeyFinalization.register(obj, obj.__wbg_ptr, obj); + return obj; + } + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + PublicEncKeyFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_publicenckey_free(ptr); + } +} +module.exports.PublicEncKey = PublicEncKey; + +const PublicSigKeyFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_publicsigkey_free(ptr >>> 0)); +/** +*/ +class PublicSigKey { + + static __unwrap(jsValue) { + if (!(jsValue instanceof PublicSigKey)) { + return 0; + } + return jsValue.__destroy_into_raw(); + } + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + PublicSigKeyFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_publicsigkey_free(ptr); + } +} +module.exports.PublicSigKey = PublicSigKey; + +const ReencryptionRequestFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_reencryptionrequest_free(ptr >>> 0)); +/** +*/ +class ReencryptionRequest { + + static __wrap(ptr) { + ptr = ptr >>> 0; + const obj = Object.create(ReencryptionRequest.prototype); + obj.__wbg_ptr = ptr; + ReencryptionRequestFinalization.register(obj, obj.__wbg_ptr, obj); + return obj; + } + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + ReencryptionRequestFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_reencryptionrequest_free(ptr); + } + /** + * Signature of the ASN1 DER serialization of \[ReencryptionRequestPayload\]. + * @returns {Uint8Array} + */ + get signature() { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.__wbg_get_reencryptionrequest_signature(retptr, this.__wbg_ptr); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var v1 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 1, 1); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Signature of the ASN1 DER serialization of \[ReencryptionRequestPayload\]. + * @param {Uint8Array} arg0 + */ + set signature(arg0) { + const ptr0 = passArray8ToWasm0(arg0, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + wasm.__wbg_set_eip712domainmsg_name(this.__wbg_ptr, ptr0, len0); + } + /** + * @returns {ReencryptionRequestPayload | undefined} + */ + get payload() { + const ret = wasm.__wbg_get_reencryptionrequest_payload(this.__wbg_ptr); + return ret === 0 ? undefined : ReencryptionRequestPayload.__wrap(ret); + } + /** + * @param {ReencryptionRequestPayload | undefined} [arg0] + */ + set payload(arg0) { + let ptr0 = 0; + if (!isLikeNone(arg0)) { + _assertClass(arg0, ReencryptionRequestPayload); + ptr0 = arg0.__destroy_into_raw(); + } + wasm.__wbg_set_reencryptionrequest_payload(this.__wbg_ptr, ptr0); + } + /** + * @returns {Eip712DomainMsg | undefined} + */ + get domain() { + const ret = wasm.__wbg_get_reencryptionrequest_domain(this.__wbg_ptr); + return ret === 0 ? undefined : Eip712DomainMsg.__wrap(ret); + } + /** + * @param {Eip712DomainMsg | undefined} [arg0] + */ + set domain(arg0) { + let ptr0 = 0; + if (!isLikeNone(arg0)) { + _assertClass(arg0, Eip712DomainMsg); + ptr0 = arg0.__destroy_into_raw(); + } + wasm.__wbg_set_reencryptionrequest_domain(this.__wbg_ptr, ptr0); + } + /** + * The ID that identifies this request. + * Future queries for the result must use this request ID. + * @returns {RequestId | undefined} + */ + get request_id() { + const ret = wasm.__wbg_get_reencryptionrequest_request_id(this.__wbg_ptr); + return ret === 0 ? undefined : RequestId.__wrap(ret); + } + /** + * The ID that identifies this request. + * Future queries for the result must use this request ID. + * @param {RequestId | undefined} [arg0] + */ + set request_id(arg0) { + let ptr0 = 0; + if (!isLikeNone(arg0)) { + _assertClass(arg0, RequestId); + ptr0 = arg0.__destroy_into_raw(); + } + wasm.__wbg_set_reencryptionrequest_request_id(this.__wbg_ptr, ptr0); + } +} +module.exports.ReencryptionRequest = ReencryptionRequest; + +const ReencryptionRequestPayloadFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_reencryptionrequestpayload_free(ptr >>> 0)); +/** +*/ +class ReencryptionRequestPayload { + + static __wrap(ptr) { + ptr = ptr >>> 0; + const obj = Object.create(ReencryptionRequestPayload.prototype); + obj.__wbg_ptr = ptr; + ReencryptionRequestPayloadFinalization.register(obj, obj.__wbg_ptr, obj); + return obj; + } + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + ReencryptionRequestPayloadFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_reencryptionrequestpayload_free(ptr); + } + /** + * Version of the request format. + * @returns {number} + */ + get version() { + const ret = wasm.__wbg_get_reencryptionrequestpayload_version(this.__wbg_ptr); + return ret >>> 0; + } + /** + * Version of the request format. + * @param {number} arg0 + */ + set version(arg0) { + wasm.__wbg_set_reencryptionrequestpayload_version(this.__wbg_ptr, arg0); + } + /** + * The amount of shares needed to recombine the result. + * This implies the threshold used. + * Needed to avoid a single malicious server taking over a request that should + * have been distributed. + * @returns {number} + */ + get servers_needed() { + const ret = wasm.__wbg_get_reencryptionrequestpayload_servers_needed(this.__wbg_ptr); + return ret >>> 0; + } + /** + * The amount of shares needed to recombine the result. + * This implies the threshold used. + * Needed to avoid a single malicious server taking over a request that should + * have been distributed. + * @param {number} arg0 + */ + set servers_needed(arg0) { + wasm.__wbg_set_reencryptionrequestpayload_servers_needed(this.__wbg_ptr, arg0); + } + /** + * The server's signature verification key. + * Encoded using SEC1. + * TODO not needed in the request! Should be removed + * @returns {Uint8Array} + */ + get verification_key() { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.__wbg_get_reencryptionrequest_signature(retptr, this.__wbg_ptr); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var v1 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 1, 1); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * The server's signature verification key. + * Encoded using SEC1. + * TODO not needed in the request! Should be removed + * @param {Uint8Array} arg0 + */ + set verification_key(arg0) { + const ptr0 = passArray8ToWasm0(arg0, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + wasm.__wbg_set_eip712domainmsg_name(this.__wbg_ptr, ptr0, len0); + } + /** + * Randomness specified in the request to ensure EU-CMA of the signed response. + * TODO check that we don't need two types of randomness. One for the reuqest and one for the response + * TODO also check potential risk with repeated calls + * @returns {Uint8Array} + */ + get randomness() { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.__wbg_get_reencryptionrequestpayload_randomness(retptr, this.__wbg_ptr); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var v1 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 1, 1); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Randomness specified in the request to ensure EU-CMA of the signed response. + * TODO check that we don't need two types of randomness. One for the reuqest and one for the response + * TODO also check potential risk with repeated calls + * @param {Uint8Array} arg0 + */ + set randomness(arg0) { + const ptr0 = passArray8ToWasm0(arg0, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + wasm.__wbg_set_eip712domainmsg_version(this.__wbg_ptr, ptr0, len0); + } + /** + * Encoding of the user's public encryption key for this request. + * Encoding using the default encoding of libsodium, i.e. the 32 bytes of a + * Montgomery point. + * @returns {Uint8Array} + */ + get enc_key() { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.__wbg_get_eip712domainmsg_chain_id(retptr, this.__wbg_ptr); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var v1 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 1, 1); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Encoding of the user's public encryption key for this request. + * Encoding using the default encoding of libsodium, i.e. the 32 bytes of a + * Montgomery point. + * @param {Uint8Array} arg0 + */ + set enc_key(arg0) { + const ptr0 = passArray8ToWasm0(arg0, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + wasm.__wbg_set_eip712domainmsg_chain_id(this.__wbg_ptr, ptr0, len0); + } + /** + * The type of plaintext encrypted. + * @returns {number} + */ + get fhe_type() { + const ret = wasm.__wbg_get_reencryptionrequestpayload_fhe_type(this.__wbg_ptr); + return ret; + } + /** + * The type of plaintext encrypted. + * @param {number} arg0 + */ + set fhe_type(arg0) { + wasm.__wbg_set_reencryptionrequestpayload_fhe_type(this.__wbg_ptr, arg0); + } + /** + * The key id to use for decryption. Will be the request_id used during key generation + * @returns {RequestId | undefined} + */ + get key_id() { + const ret = wasm.__wbg_get_reencryptionrequestpayload_key_id(this.__wbg_ptr); + return ret === 0 ? undefined : RequestId.__wrap(ret); + } + /** + * The key id to use for decryption. Will be the request_id used during key generation + * @param {RequestId | undefined} [arg0] + */ + set key_id(arg0) { + let ptr0 = 0; + if (!isLikeNone(arg0)) { + _assertClass(arg0, RequestId); + ptr0 = arg0.__destroy_into_raw(); + } + wasm.__wbg_set_reencryptionrequestpayload_key_id(this.__wbg_ptr, ptr0); + } + /** + * The actual ciphertext to decrypt, taken directly from the fhevm. + * When creating the payload, this field may be empty, + * it is the responsibility of the gateway to fetch the + * ciphertext for the given digest below. + * @returns {Uint8Array | undefined} + */ + get ciphertext() { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.__wbg_get_reencryptionrequestpayload_ciphertext(retptr, this.__wbg_ptr); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + let v1; + if (r0 !== 0) { + v1 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 1, 1); + } + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * The actual ciphertext to decrypt, taken directly from the fhevm. + * When creating the payload, this field may be empty, + * it is the responsibility of the gateway to fetch the + * ciphertext for the given digest below. + * @param {Uint8Array | undefined} [arg0] + */ + set ciphertext(arg0) { + var ptr0 = isLikeNone(arg0) ? 0 : passArray8ToWasm0(arg0, wasm.__wbindgen_malloc); + var len0 = WASM_VECTOR_LEN; + wasm.__wbg_set_reencryptionrequestpayload_ciphertext(this.__wbg_ptr, ptr0, len0); + } + /** + * The SHA3 digest of the ciphertext above. + * @returns {Uint8Array} + */ + get ciphertext_digest() { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.__wbg_get_reencryptionrequestpayload_ciphertext_digest(retptr, this.__wbg_ptr); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var v1 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 1, 1); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * The SHA3 digest of the ciphertext above. + * @param {Uint8Array} arg0 + */ + set ciphertext_digest(arg0) { + const ptr0 = passArray8ToWasm0(arg0, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + wasm.__wbg_set_eip712domainmsg_verifying_contract(this.__wbg_ptr, ptr0, len0); + } +} +module.exports.ReencryptionRequestPayload = ReencryptionRequestPayload; + +const ReencryptionResponseFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_reencryptionresponse_free(ptr >>> 0)); +/** +*/ +class ReencryptionResponse { + + static __unwrap(jsValue) { + if (!(jsValue instanceof ReencryptionResponse)) { + return 0; + } + return jsValue.__destroy_into_raw(); + } + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + ReencryptionResponseFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_reencryptionresponse_free(ptr); + } + /** + * Version of the response format. + * @returns {number} + */ + get version() { + const ret = wasm.__wbg_get_reencryptionresponse_version(this.__wbg_ptr); + return ret >>> 0; + } + /** + * Version of the response format. + * @param {number} arg0 + */ + set version(arg0) { + wasm.__wbg_set_reencryptionresponse_version(this.__wbg_ptr, arg0); + } + /** + * Servers_needed are not really needed since there is a link to the + * digest, however, it seems better to be able to handle a response without + * getting data from the request as well. but this is also a security issue + * since it is possible to get meaning from the response without directly + * linking it to a request + * + * The amount of shares needed to recombine the result. + * This implies the threshold used. + * @returns {number} + */ + get servers_needed() { + const ret = wasm.__wbg_get_reencryptionresponse_servers_needed(this.__wbg_ptr); + return ret >>> 0; + } + /** + * Servers_needed are not really needed since there is a link to the + * digest, however, it seems better to be able to handle a response without + * getting data from the request as well. but this is also a security issue + * since it is possible to get meaning from the response without directly + * linking it to a request + * + * The amount of shares needed to recombine the result. + * This implies the threshold used. + * @param {number} arg0 + */ + set servers_needed(arg0) { + wasm.__wbg_set_reencryptionresponse_servers_needed(this.__wbg_ptr, arg0); + } + /** + * The server's signature verification key. + * Encoded using SEC1. + * Needed to validate the response, but MUST also be linked to a list of + * trusted keys. + * @returns {Uint8Array} + */ + get verification_key() { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.__wbg_get_reencryptionrequest_signature(retptr, this.__wbg_ptr); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var v1 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 1, 1); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * The server's signature verification key. + * Encoded using SEC1. + * Needed to validate the response, but MUST also be linked to a list of + * trusted keys. + * @param {Uint8Array} arg0 + */ + set verification_key(arg0) { + const ptr0 = passArray8ToWasm0(arg0, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + wasm.__wbg_set_eip712domainmsg_name(this.__wbg_ptr, ptr0, len0); + } + /** + * Digest of the request validated. + * Needed to ensure that the response is for the expected request. + * @returns {Uint8Array} + */ + get digest() { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.__wbg_get_reencryptionrequestpayload_randomness(retptr, this.__wbg_ptr); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var v1 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 1, 1); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Digest of the request validated. + * Needed to ensure that the response is for the expected request. + * @param {Uint8Array} arg0 + */ + set digest(arg0) { + const ptr0 = passArray8ToWasm0(arg0, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + wasm.__wbg_set_eip712domainmsg_version(this.__wbg_ptr, ptr0, len0); + } + /** + * The type of plaintext encrypted. + * @returns {number} + */ + get fhe_type() { + const ret = wasm.__wbg_get_reencryptionresponse_fhe_type(this.__wbg_ptr); + return ret; + } + /** + * The type of plaintext encrypted. + * @param {number} arg0 + */ + set fhe_type(arg0) { + wasm.__wbg_set_reencryptionresponse_fhe_type(this.__wbg_ptr, arg0); + } + /** + * The signcrypted payload, using a hybrid encryption approach in + * sign-then-encrypt. + * @returns {Uint8Array} + */ + get signcrypted_ciphertext() { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.__wbg_get_eip712domainmsg_chain_id(retptr, this.__wbg_ptr); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var v1 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 1, 1); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * The signcrypted payload, using a hybrid encryption approach in + * sign-then-encrypt. + * @param {Uint8Array} arg0 + */ + set signcrypted_ciphertext(arg0) { + const ptr0 = passArray8ToWasm0(arg0, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + wasm.__wbg_set_eip712domainmsg_chain_id(this.__wbg_ptr, ptr0, len0); + } +} +module.exports.ReencryptionResponse = ReencryptionResponse; + +const RequestIdFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_requestid_free(ptr >>> 0)); +/** +* Simple response to return an ID, to be used to retrieve the computed result later on. +*/ +class RequestId { + + static __wrap(ptr) { + ptr = ptr >>> 0; + const obj = Object.create(RequestId.prototype); + obj.__wbg_ptr = ptr; + RequestIdFinalization.register(obj, obj.__wbg_ptr, obj); + return obj; + } + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + RequestIdFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_requestid_free(ptr); + } + /** + * @returns {string} + */ + get request_id() { + let deferred1_0; + let deferred1_1; + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.__wbg_get_eip712domainmsg_name(retptr, this.__wbg_ptr); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + deferred1_0 = r0; + deferred1_1 = r1; + return getStringFromWasm0(r0, r1); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } + } + /** + * @param {string} arg0 + */ + set request_id(arg0) { + const ptr0 = passStringToWasm0(arg0, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + wasm.__wbg_set_eip712domainmsg_name(this.__wbg_ptr, ptr0, len0); + } +} +module.exports.RequestId = RequestId; + +module.exports.__wbg_reencryptionresponse_unwrap = function(arg0) { + const ret = ReencryptionResponse.__unwrap(takeObject(arg0)); + return ret; +}; + +module.exports.__wbindgen_object_drop_ref = function(arg0) { + takeObject(arg0); +}; + +module.exports.__wbindgen_error_new = function(arg0, arg1) { + const ret = new Error(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); +}; + +module.exports.__wbg_publicsigkey_unwrap = function(arg0) { + const ret = PublicSigKey.__unwrap(takeObject(arg0)); + return ret; +}; + +module.exports.__wbg_new_abda76e883ba8a5f = function() { + const ret = new Error(); + return addHeapObject(ret); +}; + +module.exports.__wbg_stack_658279fe44541cf6 = function(arg0, arg1) { + const ret = getObject(arg1).stack; + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getInt32Memory0()[arg0 / 4 + 1] = len1; + getInt32Memory0()[arg0 / 4 + 0] = ptr1; +}; + +module.exports.__wbg_error_f851667af71bcfc6 = function(arg0, arg1) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.error(getStringFromWasm0(arg0, arg1)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + } +}; + +module.exports.__wbg_crypto_1d1f22824a6a080c = function(arg0) { + const ret = getObject(arg0).crypto; + return addHeapObject(ret); +}; + +module.exports.__wbindgen_is_object = function(arg0) { + const val = getObject(arg0); + const ret = typeof(val) === 'object' && val !== null; + return ret; +}; + +module.exports.__wbg_process_4a72847cc503995b = function(arg0) { + const ret = getObject(arg0).process; + return addHeapObject(ret); +}; + +module.exports.__wbg_versions_f686565e586dd935 = function(arg0) { + const ret = getObject(arg0).versions; + return addHeapObject(ret); +}; + +module.exports.__wbg_node_104a2ff8d6ea03a2 = function(arg0) { + const ret = getObject(arg0).node; + return addHeapObject(ret); +}; + +module.exports.__wbindgen_is_string = function(arg0) { + const ret = typeof(getObject(arg0)) === 'string'; + return ret; +}; + +module.exports.__wbg_msCrypto_eb05e62b530a1508 = function(arg0) { + const ret = getObject(arg0).msCrypto; + return addHeapObject(ret); +}; + +module.exports.__wbg_require_cca90b1a94a0255b = function() { return handleError(function () { + const ret = module.require; + return addHeapObject(ret); +}, arguments) }; + +module.exports.__wbindgen_is_function = function(arg0) { + const ret = typeof(getObject(arg0)) === 'function'; + return ret; +}; + +module.exports.__wbindgen_string_new = function(arg0, arg1) { + const ret = getStringFromWasm0(arg0, arg1); + return addHeapObject(ret); +}; + +module.exports.__wbg_randomFillSync_5c9c955aa56b6049 = function() { return handleError(function (arg0, arg1) { + getObject(arg0).randomFillSync(takeObject(arg1)); +}, arguments) }; + +module.exports.__wbg_getRandomValues_3aa56aa6edec874c = function() { return handleError(function (arg0, arg1) { + getObject(arg0).getRandomValues(getObject(arg1)); +}, arguments) }; + +module.exports.__wbg_newnoargs_e258087cd0daa0ea = function(arg0, arg1) { + const ret = new Function(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); +}; + +module.exports.__wbg_call_27c0f87801dedf93 = function() { return handleError(function (arg0, arg1) { + const ret = getObject(arg0).call(getObject(arg1)); + return addHeapObject(ret); +}, arguments) }; + +module.exports.__wbindgen_object_clone_ref = function(arg0) { + const ret = getObject(arg0); + return addHeapObject(ret); +}; + +module.exports.__wbg_self_ce0dbfc45cf2f5be = function() { return handleError(function () { + const ret = self.self; + return addHeapObject(ret); +}, arguments) }; + +module.exports.__wbg_window_c6fb939a7f436783 = function() { return handleError(function () { + const ret = window.window; + return addHeapObject(ret); +}, arguments) }; + +module.exports.__wbg_globalThis_d1e6af4856ba331b = function() { return handleError(function () { + const ret = globalThis.globalThis; + return addHeapObject(ret); +}, arguments) }; + +module.exports.__wbg_global_207b558942527489 = function() { return handleError(function () { + const ret = global.global; + return addHeapObject(ret); +}, arguments) }; + +module.exports.__wbindgen_is_undefined = function(arg0) { + const ret = getObject(arg0) === undefined; + return ret; +}; + +module.exports.__wbg_call_b3ca7c6051f9bec1 = function() { return handleError(function (arg0, arg1, arg2) { + const ret = getObject(arg0).call(getObject(arg1), getObject(arg2)); + return addHeapObject(ret); +}, arguments) }; + +module.exports.__wbg_buffer_12d079cc21e14bdb = function(arg0) { + const ret = getObject(arg0).buffer; + return addHeapObject(ret); +}; + +module.exports.__wbg_newwithbyteoffsetandlength_aa4a17c33a06e5cb = function(arg0, arg1, arg2) { + const ret = new Uint8Array(getObject(arg0), arg1 >>> 0, arg2 >>> 0); + return addHeapObject(ret); +}; + +module.exports.__wbg_new_63b92bc8671ed464 = function(arg0) { + const ret = new Uint8Array(getObject(arg0)); + return addHeapObject(ret); +}; + +module.exports.__wbg_set_a47bac70306a19a7 = function(arg0, arg1, arg2) { + getObject(arg0).set(getObject(arg1), arg2 >>> 0); +}; + +module.exports.__wbg_newwithlength_e9b4878cebadb3d3 = function(arg0) { + const ret = new Uint8Array(arg0 >>> 0); + return addHeapObject(ret); +}; + +module.exports.__wbg_subarray_a1f73cd4b5b42fe1 = function(arg0, arg1, arg2) { + const ret = getObject(arg0).subarray(arg1 >>> 0, arg2 >>> 0); + return addHeapObject(ret); +}; + +module.exports.__wbindgen_throw = function(arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); +}; + +module.exports.__wbindgen_memory = function() { + const ret = wasm.memory; + return addHeapObject(ret); +}; + +const path = require('path').join(__dirname, 'kms_lib_bg.wasm'); +const bytes = require('fs').readFileSync(path); + +const wasmModule = new WebAssembly.Module(bytes); +const wasmInstance = new WebAssembly.Instance(wasmModule, imports); +wasm = wasmInstance.exports; +module.exports.__wasm = wasm; + diff --git a/src/kms/kms_lib_bg.wasm b/src/kms/kms_lib_bg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..88cc3768ac65d48f143d10bc961a64f9bda872c0 GIT binary patch literal 555130 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¾t-3-78N5ufqL^SyEiUmIu1X*7@w2;|5Tp$lp| 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

{>T^Lm2#@S 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 { - beforeAll(async () => { - await sodium.ready; - }); - - it('decrypts a hex value', async () => { - const keypair = sodium.crypto_box_keypair(); - - const value = BigInt(28482); - const ciphertext = sodium.crypto_box_seal( - bigIntToBytes(value), - keypair.publicKey, - 'hex', - ); - const cleartext = decrypt(keypair, ciphertext); - expect(cleartext.toString()).toBe(`${value}`); - }); - - it('decrypts a Uint8Array value', async () => { - const keypair = sodium.crypto_box_keypair(); - - const value = BigInt('10000939393388484938938389392929298383'); - const ciphertext = sodium.crypto_box_seal( - bigIntToBytes(value), - keypair.publicKey, - ); - const cleartext = decrypt(keypair, ciphertext); - expect(cleartext.toString()).toBe(value.toString()); - }); - - it('decrypts an address Uint8Array value', async () => { - const keypair = sodium.crypto_box_keypair(); - - const value = BigInt('0x8ba1f109551bd432803012645ac136ddd64dba72'); - const ciphertext = sodium.crypto_box_seal( - bigIntToBytes(value), - keypair.publicKey, - ); - const cleartext = decryptAddress(keypair, ciphertext); - expect(cleartext).toBe(getAddress(value.toString(16))); - }); - - it('decrypts an address Uint8Array value bigger than 160 bits', async () => { - const keypair = sodium.crypto_box_keypair(); - const address = '0x9b8a8ba1f109551bd432803012645ac136ddd64dba72'; - // Must truncate to 40-digit - const expected = '0x8ba1f109551bd432803012645ac136ddd64dba72'; - const value = BigInt(address); - const ciphertext = sodium.crypto_box_seal( - bigIntToBytes(value), - keypair.publicKey, - ); - const cleartext = decryptAddress(keypair, ciphertext); - expect(cleartext).toBe(getAddress(expected)); - }); - - it('decrypts an address Uint8Array value lower than 160 bits', async () => { - const keypair = sodium.crypto_box_keypair(); - const address = '0x8ba1f109551bd432803012645ac136ddd64d'; - // Must add padding until to 40-digit - const expected = '0x00008ba1f109551bd432803012645ac136ddd64d'; - const value = BigInt(address); - const ciphertext = sodium.crypto_box_seal( - bigIntToBytes(value), - keypair.publicKey, - ); - const cleartext = decryptAddress(keypair, ciphertext); - expect(cleartext).toBe(getAddress(expected)); - }); -}); diff --git a/src/sdk/decrypt.ts b/src/sdk/decrypt.ts deleted file mode 100644 index 46572c1..0000000 --- a/src/sdk/decrypt.ts +++ /dev/null @@ -1,41 +0,0 @@ -import sodium from 'libsodium-wrappers'; -import { bytesToBigInt, fromHexString, bytesToHex } from '../utils'; -import { ContractKeypair } from './types'; -import { getAddress } from 'ethers'; - -export const decrypt = ( - keypair: ContractKeypair, - ciphertext: string | Uint8Array, -): bigint => { - const toDecrypt = - typeof ciphertext === 'string' ? fromHexString(ciphertext) : ciphertext; - const decrypted = sodium.crypto_box_seal_open( - toDecrypt, - keypair.publicKey, - keypair.privateKey, - ); - return bytesToBigInt(decrypted); -}; - -export const decryptAddress = ( - keypair: ContractKeypair, - ciphertext: string | Uint8Array, -): string => { - const toDecrypt = - typeof ciphertext === 'string' ? fromHexString(ciphertext) : ciphertext; - const decrypted = sodium.crypto_box_seal_open( - toDecrypt, - keypair.publicKey, - keypair.privateKey, - ); - - let hexString = bytesToHex(decrypted); - // Ensure hexString forms a valid 40-digit Ethereum address. - // Truncate or pad with leading zeros as necessary to correct length issues. - if (hexString.length > 40) { - hexString = hexString.substring(hexString.length - 40); - } else { - hexString = hexString.slice(2).padStart(40, '0'); - } - return getAddress(hexString); -}; diff --git a/src/sdk/encrypt.test.ts b/src/sdk/encrypt.test.ts index 3abbeaa..39ddce0 100644 --- a/src/sdk/encrypt.test.ts +++ b/src/sdk/encrypt.test.ts @@ -1,29 +1,11 @@ import { - FheBool, - FheUint4, - FheUint8, - FheUint16, - FheUint32, - FheUint64, - CompactFheUint4List, - CompactFheUint8List, - CompactFheUint16List, - CompactFheUint32List, - CompactFheUint64List, + FheUint160, CompactFheUint160List, TfheCompactPublicKey, TfheClientKey, } from 'node-tfhe'; import { createTfheKeypair } from '../tfhe'; -import { - encryptBool, - encrypt4, - encrypt8, - encrypt16, - encrypt32, - encrypt64, - encryptAddress, -} from './encrypt'; +import { createEncryptedInput } from './encrypt'; describe('encrypt', () => { let clientKey: TfheClientKey; @@ -35,160 +17,55 @@ describe('encrypt', () => { publicKey = keypair.publicKey; }); - it('encrypt/decrypt 0 bool', async () => { - const buffer = encryptBool(false, publicKey); - const compactList = CompactFheUint4List.deserialize(buffer); - let encryptedList = compactList.expand(); - encryptedList.forEach((v: FheBool) => { - const decrypted = v.decrypt(clientKey); - expect(decrypted).toBe(0); - }); - }); - - it('encrypt/decrypt bool', async () => { - const buffer = encryptBool(true, publicKey); - const compactList = CompactFheUint4List.deserialize(buffer); - let encryptedList = compactList.expand(); - encryptedList.forEach((v: FheBool) => { - const decrypted = v.decrypt(clientKey); - expect(decrypted).toBe(1); - }); - }); - - it('encrypt/decrypt 0 4bits', async () => { - const buffer = encrypt4(0, publicKey); - const compactList = CompactFheUint4List.deserialize(buffer); - let encryptedList = compactList.expand(); - encryptedList.forEach((v: FheUint4) => { - const decrypted = v.decrypt(clientKey); - expect(decrypted).toBe(0); - }); - }); - - it('encrypt/decrypt 4bits', async () => { - const buffer = encrypt4(7, publicKey); - const compactList = CompactFheUint4List.deserialize(buffer); - let encryptedList = compactList.expand(); - encryptedList.forEach((v: FheUint4) => { - const decrypted = v.decrypt(clientKey); - expect(decrypted).toBe(7); - }); - }); - - it('encrypt/decrypt 0 8bits', async () => { - const buffer = encrypt8(0, publicKey); - const compactList = CompactFheUint8List.deserialize(buffer); - let encryptedList = compactList.expand(); - encryptedList.forEach((v: FheUint8) => { - const decrypted = v.decrypt(clientKey); - expect(decrypted).toBe(0); - }); - }); - - it('encrypt/decrypt 8bits', async () => { - const buffer = encrypt8(34, publicKey); - const compactList = CompactFheUint8List.deserialize(buffer); - let encryptedList = compactList.expand(); - encryptedList.forEach((v: FheUint8) => { - const decrypted = v.decrypt(clientKey); - expect(decrypted).toBe(34); - }); - }); - - it('encrypt/decrypt 0 16bits', async () => { - const buffer = encrypt16(0, publicKey); - const compactList = CompactFheUint8List.deserialize(buffer); - let encryptedList = compactList.expand(); - encryptedList.forEach((v: FheUint8) => { - const decrypted = v.decrypt(clientKey); - expect(decrypted).toBe(0); - }); - }); - - it('encrypt/decrypt 16bits', async () => { - const buffer = encrypt16(434, publicKey); - const compactList = CompactFheUint16List.deserialize(buffer); - let encryptedList = compactList.expand(); - encryptedList.forEach((v: FheUint16) => { - const decrypted = v.decrypt(clientKey); - expect(decrypted).toBe(434); - }); - }); - - it('encrypt/decrypt 0 32bits', async () => { - const buffer = encrypt32(0, publicKey); - const compactList = CompactFheUint8List.deserialize(buffer); - let encryptedList = compactList.expand(); - encryptedList.forEach((v: FheUint8) => { - const decrypted = v.decrypt(clientKey); - expect(decrypted).toBe(0); - }); - }); - - it('encrypt/decrypt 32bits', async () => { - const buffer = encrypt32(30210, publicKey); - const compactList = CompactFheUint32List.deserialize(buffer); - let encryptedList = compactList.expand(); - encryptedList.forEach((v: FheUint32) => { - const decrypted = v.decrypt(clientKey); - expect(decrypted).toBe(30210); - }); - }); - - it('encrypt/decrypt 0 64bits', async () => { - const buffer = encrypt64(0, publicKey); - const compactList = CompactFheUint64List.deserialize(buffer); - let encryptedList = compactList.expand(); - encryptedList.forEach((v: FheUint64) => { - const decrypted = v.decrypt(clientKey); - expect(decrypted.toString()).toBe('0'); - }); - }); - - it('encrypt/decrypt 64bits', async () => { - const buffer = encrypt64(3021094839202949, publicKey); - const compactList = CompactFheUint64List.deserialize(buffer); - let encryptedList = compactList.expand(); - encryptedList.forEach((v: FheUint64) => { - const decrypted = v.decrypt(clientKey); - expect(decrypted.toString()).toBe('3021094839202949'); - }); - }); - - it('encrypt/decrypt bigint 64bits', async () => { - const buffer = encrypt64(BigInt('18446744073709551615'), publicKey); - const compactList = CompactFheUint64List.deserialize(buffer); - let encryptedList = compactList.expand(); - encryptedList.forEach((v: FheUint64) => { - const decrypted = v.decrypt(clientKey); - expect(decrypted.toString()).toBe('18446744073709551615'); - }); - }); - it('encrypt/decrypt 0x000... 160bits', async () => { - const buffer = encryptAddress( - '0x0000000000000000000000000000000000000000', - publicKey, + it('encrypt/decrypt', async () => { + const input = createEncryptedInput(publicKey)( + '0x8ba1f109551bd432803012645ac136ddd64dba72', + '0x8ba1f109551bd432803012645ac136ddd64dba72', ); + input.addBool(false); + input.add4(2); + input.add8(BigInt(43)); + input.add32(BigInt(2339389323)); + const buffer = input.encrypt(); const compactList = CompactFheUint160List.deserialize(buffer); let encryptedList = compactList.expand(); - encryptedList.forEach((v: FheUint64) => { + expect(encryptedList.length).toBe(4); + encryptedList.forEach((v: FheUint160, i: number) => { const decrypted = v.decrypt(clientKey); - expect(decrypted.toString()).toBe('0'); + switch (i) { + case 0: + expect(decrypted.toString()).toBe('0'); + break; + case 1: + expect(decrypted.toString()).toBe('2'); + break; + case 2: + expect(decrypted.toString()).toBe('43'); + break; + case 3: + expect(decrypted.toString()).toBe('2339389323'); + break; + } }); }); - it('encrypt/decrypt 160bits', async () => { - const buffer = encryptAddress( + it('encrypt/decrypt one 0 value', async () => { + const input = createEncryptedInput(publicKey)( + '0x8ba1f109551bd432803012645ac136ddd64dba72', '0x8ba1f109551bd432803012645ac136ddd64dba72', - publicKey, ); + input.add128(BigInt(0)); + const buffer = input.encrypt(); const compactList = CompactFheUint160List.deserialize(buffer); let encryptedList = compactList.expand(); - encryptedList.forEach((v: FheUint64) => { + expect(encryptedList.length).toBe(1); + encryptedList.forEach((v: FheUint160, i: number) => { const decrypted = v.decrypt(clientKey); - expect(decrypted.toString()).toBe( - '797161134358056856230896843146392277790002887282', - ); + switch (i) { + case 0: + expect(decrypted.toString()).toBe('0'); + break; + } }); }); }); diff --git a/src/sdk/encrypt.ts b/src/sdk/encrypt.ts index 1bbe3c2..0a295a6 100644 --- a/src/sdk/encrypt.ts +++ b/src/sdk/encrypt.ts @@ -1,120 +1,138 @@ -import { - TfheCompactPublicKey, - CompactPkeCrs, - ProvenCompactFheBoolList, - ProvenCompactFheUint4List, - ProvenCompactFheUint8List, - ProvenCompactFheUint16List, - ProvenCompactFheUint32List, - ProvenCompactFheUint64List, - ProvenCompactFheUint160List, - ShortintParameters, - ShortintParametersName, - ZkComputeLoad, -} from 'node-tfhe'; +import { isAddress } from 'ethers'; +import { TfheCompactPublicKey, CompactFheUint160List } from 'node-tfhe'; -const crs = CompactPkeCrs.from_parameters( - new ShortintParameters( - ShortintParametersName.PARAM_MESSAGE_1_CARRY_2_COMPACT_PK_KS_PBS_TUNIFORM_2M40, - ), - 1, -); +// const publicZkParams = CompactPkePublicParams.deserialize(crsBuffer); -const publicZkParams = crs.public_params(); - -export const encrypt4 = ( - value: number, - publicKey: TfheCompactPublicKey, -): Uint8Array => { - const uint8Array = new Uint8Array([value]); - const encrypted = ProvenCompactFheUint4List.encrypt_with_compact_public_key( - uint8Array, - publicZkParams, - publicKey, - ZkComputeLoad.Proof, - ); - return encrypted.serialize(); -}; - -export const encryptBool = ( - value: boolean, - publicKey: TfheCompactPublicKey, -): Uint8Array => { - const encrypted = ProvenCompactFheBoolList.encrypt_with_compact_public_key( - [value], - publicZkParams, - publicKey, - ZkComputeLoad.Proof, - ); - return encrypted.serialize(); -}; - -export const encrypt8 = ( - value: number, - publicKey: TfheCompactPublicKey, -): Uint8Array => { - const uint8Array = new Uint8Array([value]); - const encrypted = ProvenCompactFheUint8List.encrypt_with_compact_public_key( - uint8Array, - publicZkParams, - publicKey, - ZkComputeLoad.Proof, - ); - return encrypted.serialize(); +export type ZKInput = { + addBool: (value: boolean) => ZKInput; + add4: (value: number | bigint) => ZKInput; + add8: (value: number | bigint) => ZKInput; + add16: (value: number | bigint) => ZKInput; + add32: (value: number | bigint) => ZKInput; + add64: (value: number | bigint) => ZKInput; + add128: (value: number | bigint) => ZKInput; + addAddress: (value: string) => ZKInput; + getValues: () => bigint[]; + getBits: () => number[]; + resetValues: (value: string) => ZKInput; + encrypt: () => Uint8Array; }; -export const encrypt16 = ( - value: number, - publicKey: TfheCompactPublicKey, -): Uint8Array => { - const uint16Array = new Uint16Array([value]); - const encrypted = ProvenCompactFheUint16List.encrypt_with_compact_public_key( - uint16Array, - publicZkParams, - publicKey, - ZkComputeLoad.Proof, - ); - return encrypted.serialize(); +const checkEncryptedValue = (value: number | bigint, bits: number) => { + if (value == null) throw new Error('Missing value'); + const limit = BigInt(Math.pow(2, bits)); + if (typeof value !== 'number' && typeof value !== 'bigint') + throw new Error('Value must be a number or a bigint.'); + if (value >= limit) { + throw new Error( + `The value exceeds the limit for ${bits}bits integer (${( + limit - BigInt(1) + ).toString()}).`, + ); + } }; -export const encrypt32 = ( - value: number, - publicKey: TfheCompactPublicKey, -): Uint8Array => { - const uint32Array = new Uint32Array([value]); - const encrypted = ProvenCompactFheUint32List.encrypt_with_compact_public_key( - uint32Array, - publicZkParams, - publicKey, - ZkComputeLoad.Proof, - ); - return encrypted.serialize(); -}; +export const createEncryptedInput = + (tfheCompactPublicKey?: TfheCompactPublicKey) => + (contractAddress: string, userAddress: string) => { + if (!tfheCompactPublicKey) + throw new Error( + 'Your instance has been created without the public blockchain key.', + ); -export const encrypt64 = ( - value: number | bigint, - publicKey: TfheCompactPublicKey, -): Uint8Array => { - const uint64Array = new BigUint64Array([BigInt(value)]); - const encrypted = ProvenCompactFheUint64List.encrypt_with_compact_public_key( - uint64Array, - publicZkParams, - publicKey, - ZkComputeLoad.Proof, - ); - return encrypted.serialize(); -}; + if (!isAddress(contractAddress)) { + throw new Error('Contract address is not a valid address.'); + } -export const encryptAddress = ( - value: string, - publicKey: TfheCompactPublicKey, -): Uint8Array => { - // value is something like 0x8ba1f109551bd432803012645ac136ddd64dba72 - const encrypted = ProvenCompactFheUint160List.encrypt_with_compact_public_key( - [BigInt(value)], - publicZkParams, - publicKey, - ZkComputeLoad.Proof, - ); - return encrypted.serialize(); -}; + const publicKey: TfheCompactPublicKey = tfheCompactPublicKey; + const values: bigint[] = []; + const bits: number[] = []; + return { + addBool(value: boolean) { + if (value == null) throw new Error('Missing value'); + if ( + typeof value !== 'boolean' && + typeof value !== 'number' && + typeof value !== 'bigint' + ) + throw new Error('Value must be a boolean, a number or a bigint.'); + if ( + (typeof value !== 'bigint' || typeof value !== 'number') && + Number(value) > 1 + ) + throw new Error('Value must be 1 or 0.'); + values.push(BigInt(value)); + bits.push(1); + return this; + }, + add4(value: number | bigint) { + checkEncryptedValue(value, 4); + values.push(BigInt(value)); + bits.push(4); + return this; + }, + add8(value: number | bigint) { + checkEncryptedValue(value, 8); + values.push(BigInt(value)); + bits.push(8); + return this; + }, + add16(value: number | bigint) { + checkEncryptedValue(value, 16); + values.push(BigInt(value)); + bits.push(16); + return this; + }, + add32(value: number | bigint) { + checkEncryptedValue(value, 32); + values.push(BigInt(value)); + bits.push(32); + return this; + }, + add64(value: number | bigint) { + checkEncryptedValue(value, 64); + values.push(BigInt(value)); + bits.push(64); + return this; + }, + add128(value: number | bigint) { + checkEncryptedValue(value, 128); + values.push(BigInt(value)); + bits.push(128); + return this; + }, + addAddress(value: string) { + if (!isAddress(value)) { + throw new Error('Value must be a valid address.'); + } + checkEncryptedValue(BigInt(value), 160); + values.push(BigInt(value)); + bits.push(160); + return this; + }, + getValues() { + return values; + }, + getBits() { + return bits; + }, + resetValues() { + values.length = 0; + bits.length = 0; + return this; + }, + encrypt() { + const encrypted = CompactFheUint160List.encrypt_with_compact_public_key( + values, + publicKey, + ); + // const encrypted = ProvenCompactFheUint160List.encrypt_with_compact_public_key( + // values, + // publicZkParams, + // publicKey, + // ZkComputeLoad.Proof, + // ); + return encrypted.serialize(); + }, + }; + }; diff --git a/src/sdk/index.test.ts b/src/sdk/index.test.ts index 93ecb3e..7cd2c47 100644 --- a/src/sdk/index.test.ts +++ b/src/sdk/index.test.ts @@ -1,7 +1,7 @@ import sodium from 'libsodium-wrappers'; import { createInstance } from './index'; import { createTfhePublicKey } from '../tfhe'; -import { fromHexString, toHexString, bigIntToBytes } from '../utils'; +import { fromHexString, bigIntToBytes } from '../utils'; describe('index', () => { let tfhePublicKey: string; @@ -16,46 +16,20 @@ describe('index', () => { chainId: 1234, publicKey: tfhePublicKey, }); - expect(instance.encryptBool).toBeDefined(); - expect(instance.encrypt4).toBeDefined(); - expect(instance.encrypt8).toBeDefined(); - expect(instance.encrypt16).toBeDefined(); - expect(instance.encrypt32).toBeDefined(); - expect(instance.generatePublicKey).toBeDefined(); - expect(instance.decrypt).toBeDefined(); - expect(instance.decryptAddress).toBeDefined(); - expect(instance.serializeKeypairs).toBeDefined(); - expect(instance.getPublicKey).toBeDefined(); - expect(instance.hasKeypair).toBeDefined(); + expect(instance.reencrypt).toBeDefined(); + expect(instance.reencrypt.createEIP712).toBeDefined(); + expect(instance.reencrypt.generateKeypair).toBeDefined(); + expect(instance.createEncryptedInput).toBeDefined(); }); it('creates an instance for mock', async () => { const instance = await createInstance({ chainId: 1234, }); - expect(instance.encrypt8).toBeDefined(); - expect(instance.encrypt16).toBeDefined(); - expect(instance.encrypt32).toBeDefined(); - expect(instance.encrypt64).toBeDefined(); - expect(instance.generatePublicKey).toBeDefined(); - expect(instance.decrypt).toBeDefined(); - expect(instance.decryptAddress).toBeDefined(); - expect(instance.serializeKeypairs).toBeDefined(); - expect(instance.getPublicKey).toBeDefined(); - expect(instance.hasKeypair).toBeDefined(); - - expect(() => instance.encrypt8(2)).toThrow( - 'Your instance has been created without the public blockchain key', - ); - expect(() => instance.encrypt16(2)).toThrow( - 'Your instance has been created without the public blockchain key', - ); - expect(() => instance.encrypt32(2)).toThrow( - 'Your instance has been created without the public blockchain key', - ); - expect(() => instance.encrypt64(2)).toThrow( - 'Your instance has been created without the public blockchain key', - ); + expect(instance.reencrypt).toBeDefined(); + expect(instance.reencrypt.createEIP712).toBeDefined(); + expect(instance.reencrypt.generateKeypair).toBeDefined(); + expect(instance.createEncryptedInput).toBeDefined(); }); it('fails to create an instance', async () => { @@ -70,312 +44,4 @@ describe('index', () => { createInstance({ chainId: 9000, publicKey: 43 as any }), ).rejects.toThrow('publicKey must be a string'); }); - - it('creates an instance with keypairs', async () => { - const keypair = sodium.crypto_box_keypair('hex'); - - const contractAddress = '0x1c786b8ca49D932AFaDCEc00827352B503edf16c'; - - const instance = await createInstance({ - chainId: 1234, - publicKey: tfhePublicKey, - keypairs: { - [contractAddress]: { - privateKey: keypair.privateKey, - publicKey: keypair.publicKey, - signature: null, - }, - }, - }); - - const value = BigInt(937387); - const ciphertext = sodium.crypto_box_seal( - bigIntToBytes(value), - fromHexString(keypair.publicKey), - 'hex', - ); - - const cleartext = instance.decrypt(contractAddress, ciphertext); - expect(cleartext.toString()).toBe(value.toString()); - - const address = BigInt('0xD115BFFAbbdd893A6f7ceA402e7338643Ced44a6'); - const ciphertextAddress = sodium.crypto_box_seal( - bigIntToBytes(address), - fromHexString(keypair.publicKey), - 'hex', - ); - - const cleartextAddress = instance.decryptAddress( - contractAddress, - ciphertextAddress, - ); - expect(cleartextAddress).toBe('0xD115BFFAbbdd893A6f7ceA402e7338643Ced44a6'); - }); - - it('controls decrypt', async () => { - const instance = await createInstance({ - chainId: 1234, - publicKey: tfhePublicKey, - }); - - const keypair = instance.generatePublicKey({ - verifyingContract: '0xD115BFFAbbdd893A6f7ceA402e7338643Ced44a6', - }); - - const value = BigInt(937387); - const ciphertext = sodium.crypto_box_seal( - bigIntToBytes(value), - keypair.publicKey, - 'hex', - ); - - const address = BigInt('0xD115BFFAbbdd893A6f7ceA402e7338643Ced44a6'); - const ciphertextAddress = sodium.crypto_box_seal( - bigIntToBytes(address), - keypair.publicKey, - 'hex', - ); - - expect(() => instance.decrypt(undefined as any, ciphertext)).toThrow( - 'Missing contract address.', - ); - - expect(() => - instance.decryptAddress(undefined as any, ciphertextAddress), - ).toThrow('Missing contract address.'); - - expect(() => - instance.decrypt( - '0xD115BFFAbbdd893A6f7ceA402e7338643Ced44a6', - undefined as any, - ), - ).toThrow('Missing ciphertext.'); - - expect(() => - instance.decryptAddress( - '0xD115BFFAbbdd893A6f7ceA402e7338643Ced44a6', - undefined as any, - ), - ).toThrow('Missing ciphertext.'); - - expect(() => - instance.decrypt( - '0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb', - ciphertext, - ), - ).toThrow( - 'Missing keypair for 0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.', - ); - - expect(() => - instance.decryptAddress( - '0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb', - ciphertextAddress, - ), - ).toThrow( - 'Missing keypair for 0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.', - ); - }); - - it('controls encrypt', async () => { - const instance = await createInstance({ - chainId: 1234, - publicKey: tfhePublicKey, - }); - expect(instance.encryptBool(true)).toBeTruthy(); - - expect(instance.encryptBool(1)).toBeTruthy(); - expect(instance.encrypt4(2)).toBeTruthy(); - expect(instance.encrypt8(34)).toBeTruthy(); - expect(instance.encrypt16(344)).toBeTruthy(); - expect(instance.encrypt32(3422)).toBeTruthy(); - expect(instance.encrypt64(34)).toBeTruthy(); - - expect(instance.encryptBool(BigInt(0))).toBeTruthy(); - expect(instance.encrypt4(BigInt(2))).toBeTruthy(); - expect(instance.encrypt8(BigInt(233))).toBeTruthy(); - expect(instance.encrypt16(BigInt(3342))).toBeTruthy(); - expect(instance.encrypt32(BigInt(838392))).toBeTruthy(); - expect(instance.encrypt64(BigInt(3433434343))).toBeTruthy(); - - expect( - instance.encryptAddress('0x8ba1f109551bd432803012645ac136ddd64dba72'), - ).toBeTruthy(); - - expect(() => instance.encryptBool(undefined as any)).toThrow( - 'Missing value', - ); - expect(() => instance.encrypt4(undefined as any)).toThrow('Missing value'); - expect(() => instance.encrypt8(undefined as any)).toThrow('Missing value'); - expect(() => instance.encrypt16(undefined as any)).toThrow('Missing value'); - expect(() => instance.encrypt32(undefined as any)).toThrow('Missing value'); - expect(() => instance.encrypt64(undefined as any)).toThrow('Missing value'); - - expect(() => instance.encryptBool('wrong value' as any)).toThrow( - 'Value must be a boolean', - ); - expect(() => instance.encrypt4('wrong value' as any)).toThrow( - 'Value must be a number or a bigint.', - ); - expect(() => instance.encrypt8('wrong value' as any)).toThrow( - 'Value must be a number or a bigint.', - ); - expect(() => instance.encrypt16('wrong value' as any)).toThrow( - 'Value must be a number or a bigint.', - ); - expect(() => instance.encrypt32('wrong value' as any)).toThrow( - 'Value must be a number or a bigint.', - ); - expect(() => instance.encrypt64('wrong value' as any)).toThrow( - 'Value must be a number or a bigint.', - ); - expect(() => instance.encryptAddress('wrong value' as any)).toThrow( - 'Value must be a valid address.', - ); - expect(() => instance.encryptAddress(BigInt(32) as any)).toThrow( - 'Value must be a string.', - ); - - // Check limit - expect(instance.encryptBool(1)).toBeTruthy(); - expect(() => instance.encryptBool(34)).toThrow('Value must be 1 or 0.'); - expect(() => instance.encryptBool(BigInt(34))).toThrow( - 'Value must be 1 or 0.', - ); - - expect(instance.encrypt4(Math.pow(2, 4) - 1)).toBeTruthy(); - expect(() => instance.encrypt4(BigInt(34))).toThrow( - 'The value exceeds the limit for 4bits integer (15).', - ); - - expect(instance.encrypt8(Math.pow(2, 8) - 1)).toBeTruthy(); - expect(() => instance.encrypt8(BigInt(256))).toThrow( - 'The value exceeds the limit for 8bits integer (255).', - ); - - expect(instance.encrypt16(Math.pow(2, 16) - 1)).toBeTruthy(); - expect(() => instance.encrypt16(BigInt(70000))).toThrow( - 'The value exceeds the limit for 16bits integer (65535).', - ); - - expect(instance.encrypt32(Math.pow(2, 32) - 1)).toBeTruthy(); - expect(() => instance.encrypt32(BigInt(Math.pow(2, 32)) as any)).toThrow( - 'The value exceeds the limit for 32bits integer (4294967295).', - ); - - expect( - instance.encrypt64(BigInt(Math.pow(2, 64)) - BigInt(1)), - ).toBeTruthy(); - expect(() => instance.encrypt64(BigInt(Math.pow(2, 64)) as any)).toThrow( - 'The value exceeds the limit for 64bits integer (18446744073709551615).', - ); - }); - - it('controls generatePublicKey', async () => { - const instance = await createInstance({ - chainId: 1234, - publicKey: tfhePublicKey, - }); - expect(() => instance.generatePublicKey(undefined as any)).toThrow( - 'Missing contract address', - ); - expect(() => instance.generatePublicKey({ verifyingContract: '' })).toThrow( - 'Missing contract address', - ); - expect(() => - instance.generatePublicKey({ verifyingContract: '0x847473829d' }), - ).toThrow('Invalid contract address'); - }); - - it('save generated public key', async () => { - const instance = await createInstance({ - chainId: 1234, - publicKey: tfhePublicKey, - }); - - const contractAddress = '0x1c786b8ca49D932AFaDCEc00827352B503edf16c'; - - const { eip712, publicKey } = instance.generatePublicKey({ - verifyingContract: contractAddress, - }); - - instance.setSignature(contractAddress, 'signnnn'); - - expect(instance.hasKeypair(contractAddress)).toBeTruthy(); - - const kp = instance.getPublicKey(contractAddress); - expect(kp!.publicKey).toBe(publicKey); - }); - - it("don't export keys without signature", async () => { - const instance = await createInstance({ - chainId: 1234, - publicKey: tfhePublicKey, - }); - - const contractAddress = '0x1c786b8ca49D932AFaDCEc00827352B503edf16c'; - - const { eip712, publicKey } = instance.generatePublicKey({ - verifyingContract: contractAddress, - }); - const keypairs = instance.serializeKeypairs(); - expect(keypairs[contractAddress]).toBeUndefined(); - const keypair = instance.getPublicKey(contractAddress); - expect(keypair).toBeNull(); - expect(instance.hasKeypair(contractAddress)).toBeFalsy(); - }); - - it('decrypts data', async () => { - const instance = await createInstance({ - chainId: 1234, - publicKey: tfhePublicKey, - }); - - const contractAddress = '0x1c786b8ca49D932AFaDCEc00827352B503edf16c'; - - const { eip712, publicKey } = instance.generatePublicKey({ - verifyingContract: contractAddress, - }); - - instance.setSignature(contractAddress, 'signnnn'); - - const kp = instance.getPublicKey(contractAddress); - expect(kp!.publicKey).toBe(publicKey); - - const value = BigInt(89290); - const ciphertext = sodium.crypto_box_seal( - bigIntToBytes(value), - publicKey, - 'hex', - ); - const cleartext = instance.decrypt(contractAddress, ciphertext); - expect(cleartext.toString()).toBe(value.toString()); - }); - - it('decrypts address', async () => { - const instance = await createInstance({ - chainId: 1234, - publicKey: tfhePublicKey, - }); - - const contractAddress = '0x1c786b8ca49D932AFaDCEc00827352B503edf16c'; - - const { eip712, publicKey } = instance.generatePublicKey({ - verifyingContract: contractAddress, - }); - - instance.setSignature(contractAddress, 'signnnn'); - - const kp = instance.getPublicKey(contractAddress); - expect(kp!.publicKey).toBe(publicKey); - - const value = BigInt('0x1c786b8ca49D932AFaDCEc00827352B503edf16c'); - const ciphertext = sodium.crypto_box_seal( - bigIntToBytes(value), - publicKey, - 'hex', - ); - const cleartext = instance.decryptAddress(contractAddress, ciphertext); - expect(cleartext).toBe('0x1c786b8ca49D932AFaDCEc00827352B503edf16c'); - }); }); diff --git a/src/sdk/index.ts b/src/sdk/index.ts index a992a84..dd7f024 100644 --- a/src/sdk/index.ts +++ b/src/sdk/index.ts @@ -1,72 +1,38 @@ -import { TfheCompactPublicKey } from 'node-tfhe'; import sodium from 'libsodium-wrappers'; -import { - encrypt4, - encrypt8, - encrypt16, - encrypt32, - encrypt64, - encryptAddress, - encryptBool, -} from './encrypt'; -import { - EIP712, - GeneratePublicKeyParams, - generatePublicKey, -} from './publicKey'; -import { decrypt, decryptAddress } from './decrypt'; -import { fromHexString, isAddress, toHexString } from '../utils'; -import { ContractKeypairs } from './types'; - -export type FhevmInstance = { - encryptBool: (value: boolean | number | bigint) => Uint8Array; - encrypt4: (value: number | bigint) => Uint8Array; - encrypt8: (value: number | bigint) => Uint8Array; - encrypt16: (value: number | bigint) => Uint8Array; - encrypt32: (value: number | bigint) => Uint8Array; - encrypt64: (value: number | bigint) => Uint8Array; - encryptAddress: (value: string) => Uint8Array; - generatePublicKey: ( - options: GeneratePublicKeyParams & { - force?: boolean; - }, - ) => { - publicKey: Uint8Array; - eip712: EIP712; - }; - setSignature: (contractAddress: string, signature: string) => void; - getPublicKey: ( - contractAddress: string, - ) => { publicKey: Uint8Array; signature: string } | null; - hasKeypair: (contractAddress: string) => boolean; - decrypt: (contractAddress: string, ciphertext: string) => bigint; - decryptAddress: (contractAddress: string, ciphertext: string) => string; - serializeKeypairs: () => ExportedContractKeypairs; -}; +import { TfheCompactPublicKey } from 'node-tfhe'; -export type TokenSignature = { - publicKey: Uint8Array; - signature: string; -}; - -export type ExportedContractKeypairs = { - [key: string]: { - publicKey: string; - privateKey: string; - signature?: string | null; - }; -}; +import { fromHexString } from '../utils'; +import { ZKInput } from './encrypt'; +import { getPublicKeyFromNetwork, getChainIdFromNetwork } from './network'; +import { createEncryptedInput } from './encrypt'; +import { generateKeypair, createEIP712, EIP712 } from './keypair'; +import { reencryptRequest } from './reencrypt'; export type FhevmInstanceParams = { - chainId: number; + chainId?: number; publicKey?: string; - keypairs?: ExportedContractKeypairs; + networkUrl?: string; + reencryptionUrl?: string; }; -export const getPublicKeyCallParams = () => ({ - to: '0x000000000000000000000000000000000000005d', - data: '0xd9d47bb001', -}); +export type FhevmInstance = { + createEncryptedInput: ( + contractAddress: string, + userAddress: string, + ) => ZKInput; + reencrypt: { + generateKeypair: () => { publicKey: string; privateKey: string }; + createEIP712: (publicKey: string, contractAddress: string) => EIP712; + request: ( + handle: bigint, + privateKey: string, + publicKey: string, + signature: string, + contractAddress: string, + userAddress: string, + ) => Promise; + }; +}; export const getCiphertextCallParams = (handle: bigint) => { let hex = handle.toString(16); @@ -81,206 +47,36 @@ export const createInstance = async ( params: FhevmInstanceParams, ): Promise => { await sodium.ready; - const { chainId, publicKey, keypairs } = params; + + const { chainId, networkUrl } = params; + + let publicKey: string | undefined = params.publicKey; + let tfheCompactPublicKey: TfheCompactPublicKey | undefined; + + if (networkUrl && !chainId) { + publicKey = await getChainIdFromNetwork(networkUrl); + } + if (typeof chainId !== 'number') throw new Error('chainId must be a number'); + + if (networkUrl && !publicKey) { + publicKey = await getPublicKeyFromNetwork(networkUrl); + } + if (publicKey && typeof publicKey !== 'string') throw new Error('publicKey must be a string'); - let tfheCompactPublicKey: TfheCompactPublicKey; + if (publicKey) { const buff = fromHexString(publicKey); tfheCompactPublicKey = TfheCompactPublicKey.deserialize(buff); } - let contractKeypairs: ContractKeypairs = {}; - - if (keypairs) { - Object.keys(keypairs).forEach((contractAddress) => { - if (isAddress(contractAddress)) { - const oKeys = Object.keys(keypairs[contractAddress]); - if ( - ['signature', 'privateKey', 'publicKey'].every((v) => - oKeys.includes(v), - ) - ) { - contractKeypairs[contractAddress] = { - signature: keypairs[contractAddress].signature, - publicKey: fromHexString(keypairs[contractAddress].publicKey), - privateKey: fromHexString(keypairs[contractAddress].privateKey), - }; - } - } - }); - } - - const hasKeypair = (contractAddress: string) => { - return ( - contractKeypairs[contractAddress] != null && - !!contractKeypairs[contractAddress].signature - ); - }; - - const checkEncryptedValue = (value: number | bigint, bits: number) => { - if (value == null) throw new Error('Missing value'); - const limit = BigInt(Math.pow(2, bits)); - if (typeof value !== 'number' && typeof value !== 'bigint') - throw new Error('Value must be a number or a bigint.'); - if (value >= limit) { - throw new Error( - `The value exceeds the limit for ${bits}bits integer (${( - limit - BigInt(1) - ).toString()}).`, - ); - } - }; - return { - // Parameters - encryptBool(value) { - if (!tfheCompactPublicKey) - throw new Error( - 'Your instance has been created without the public blockchain key.', - ); - if (value == null) throw new Error('Missing value'); - if ( - typeof value !== 'boolean' && - typeof value !== 'number' && - typeof value !== 'bigint' - ) - throw new Error('Value must be a boolean, a number or a bigint.'); - if ( - (typeof value !== 'bigint' || typeof value !== 'number') && - Number(value) > 1 - ) - throw new Error('Value must be 1 or 0.'); - return encryptBool(Boolean(value), tfheCompactPublicKey); - }, - encrypt4(value) { - if (!tfheCompactPublicKey) - throw new Error( - 'Your instance has been created without the public blockchain key.', - ); - checkEncryptedValue(value, 4); - return encrypt4(Number(value), tfheCompactPublicKey); - }, - encrypt8(value) { - if (!tfheCompactPublicKey) - throw new Error( - 'Your instance has been created without the public blockchain key.', - ); - checkEncryptedValue(value, 8); - return encrypt8(Number(value), tfheCompactPublicKey); - }, - encrypt16(value) { - if (!tfheCompactPublicKey) - throw new Error( - 'Your instance has been created without the public blockchain key.', - ); - checkEncryptedValue(value, 16); - return encrypt16(Number(value), tfheCompactPublicKey); - }, - - encrypt32(value) { - if (!tfheCompactPublicKey) - throw new Error( - 'Your instance has been created without the public blockchain key.', - ); - checkEncryptedValue(value, 32); - return encrypt32(Number(value), tfheCompactPublicKey); - }, - - encrypt64(value) { - if (!tfheCompactPublicKey) - throw new Error( - 'Your instance has been created without the public blockchain key.', - ); - checkEncryptedValue(value, 64); - return encrypt64(value, tfheCompactPublicKey); - }, - - encryptAddress(value) { - if (!tfheCompactPublicKey) - throw new Error( - 'Your instance has been created without the public blockchain key.', - ); - if (typeof value !== 'string') throw new Error('Value must be a string.'); - if (!isAddress(value)) throw new Error('Value must be a valid address.'); - return encryptAddress(value, tfheCompactPublicKey); - }, - - // Reencryption - generatePublicKey(options) { - if (!options || !options.verifyingContract) - throw new Error('Missing contract address'); - if (!isAddress(options.verifyingContract)) - throw new Error('Invalid contract address'); - let kp; - if (!options.force && contractKeypairs[options.verifyingContract]) { - kp = contractKeypairs[options.verifyingContract]; - } - const { eip712, keypair } = generatePublicKey({ - verifyingContract: options.verifyingContract, - name: options.name, - version: options.version, - chainId, - keypair: kp, - }); - contractKeypairs[options.verifyingContract] = { - privateKey: keypair.privateKey, - publicKey: keypair.publicKey, - signature: null, - }; - return { eip712, publicKey: keypair.publicKey }; - }, - - setSignature(contractAddress: string, signature: string) { - if ( - contractKeypairs[contractAddress] && - contractKeypairs[contractAddress].privateKey - ) { - contractKeypairs[contractAddress].signature = signature; - } - }, - - getPublicKey(contractAddress: string): TokenSignature | null { - if (hasKeypair(contractAddress)) { - return { - publicKey: contractKeypairs[contractAddress].publicKey, - signature: contractKeypairs[contractAddress].signature!, - }; - } - return null; - }, - - hasKeypair, - - decrypt(contractAddress, ciphertext) { - if (!ciphertext) throw new Error('Missing ciphertext.'); - if (!contractAddress) throw new Error('Missing contract address.'); - const kp = contractKeypairs[contractAddress]; - if (!kp) throw new Error(`Missing keypair for ${contractAddress}.`); - return decrypt(kp, ciphertext); - }, - - decryptAddress(contractAddress, ciphertext) { - if (!ciphertext) throw new Error('Missing ciphertext.'); - if (!contractAddress) throw new Error('Missing contract address.'); - const kp = contractKeypairs[contractAddress]; - if (!kp) throw new Error(`Missing keypair for ${contractAddress}.`); - return decryptAddress(kp, ciphertext); - }, - - serializeKeypairs() { - const stringKeypairs: ExportedContractKeypairs = {}; - Object.keys(contractKeypairs).forEach((contractAddress) => { - const signature = contractKeypairs[contractAddress].signature; - if (!signature) return; - stringKeypairs[contractAddress] = { - signature, - publicKey: toHexString(contractKeypairs[contractAddress].publicKey), - privateKey: toHexString(contractKeypairs[contractAddress].privateKey), - }; - }); - return stringKeypairs; + createEncryptedInput: createEncryptedInput(tfheCompactPublicKey), + reencrypt: { + generateKeypair, + createEIP712: createEIP712(chainId), + request: reencryptRequest(networkUrl), }, }; }; diff --git a/src/sdk/keypair.test.ts b/src/sdk/keypair.test.ts new file mode 100644 index 0000000..5d901c2 --- /dev/null +++ b/src/sdk/keypair.test.ts @@ -0,0 +1,50 @@ +import sodium from 'libsodium-wrappers'; +import { fromHexString } from '../utils'; +import { generateKeypair, createEIP712 } from './keypair'; +import { + cryptobox_pk_to_u8vec, + cryptobox_sk_to_u8vec, + u8vec_to_cryptobox_pk, + u8vec_to_cryptobox_sk, +} from '../kms/kms_lib'; + +describe('token', () => { + beforeAll(async () => { + await sodium.ready; + }); + + it('generate a valid keypair', async () => { + const keypair = generateKeypair(); + + expect(keypair.publicKey.length).toBe(68); + expect(keypair.privateKey.length).toBe(68); + + let pkBuf = cryptobox_pk_to_u8vec( + u8vec_to_cryptobox_pk(fromHexString(keypair.publicKey)), + ); + expect(34).toBe(pkBuf.length); + + let skBuf = cryptobox_sk_to_u8vec( + u8vec_to_cryptobox_sk(fromHexString(keypair.privateKey)), + ); + expect(34).toBe(skBuf.length); + }); + + it('create a valid EIP712', async () => { + const keypair = generateKeypair(); + + const eip712 = createEIP712(1234)( + keypair.publicKey, + '0x8ba1f109551bd432803012645ac136ddd64dba72', + ); + + expect(eip712.domain.chainId).toBe(1234); + expect(eip712.domain.name).toBe('Authorization token'); + expect(eip712.domain.version).toBe('1'); + expect(eip712.message.publicKey).toBe(`0x${keypair.publicKey}`); + expect(eip712.primaryType).toBe('Reencrypt'); + expect(eip712.types.Reencrypt.length).toBe(1); + expect(eip712.types.Reencrypt[0].name).toBe('publicKey'); + expect(eip712.types.Reencrypt[0].type).toBe('bytes32'); + }); +}); diff --git a/src/sdk/keypair.ts b/src/sdk/keypair.ts new file mode 100644 index 0000000..4eec714 --- /dev/null +++ b/src/sdk/keypair.ts @@ -0,0 +1,69 @@ +import { toHexString } from '../utils'; +import { + cryptobox_keygen, + cryptobox_sk_to_u8vec, + cryptobox_pk_to_u8vec, + cryptobox_get_pk, +} from '../kms'; + +export type EIP712Type = { name: string; type: string }; + +export type EIP712 = { + domain: { + chainId: number; + name: string; + verifyingContract: string; + version: string; + }; + message: { + [key: string]: any; + }; + primaryType: string; + types: { + [key: string]: EIP712Type[]; + }; +}; + +export const createEIP712 = + (chainId: number) => (publicKey: string, verifyingContract: string) => { + const msgParams: EIP712 = { + types: { + // This refers to the domain the contract is hosted on. + EIP712Domain: [ + { name: 'name', type: 'string' }, + { name: 'version', type: 'string' }, + { name: 'chainId', type: 'uint256' }, + { name: 'verifyingContract', type: 'address' }, + ], + // Refer to primaryType. + Reencrypt: [{ name: 'publicKey', type: 'bytes32' }], + }, + // This defines the message you're proposing the user to sign, is dapp-specific, and contains + // anything you want. There are no required fields. Be as explicit as possible when building out + // the message schema. + // This refers to the keys of the following types object. + primaryType: 'Reencrypt', + domain: { + // Give a user-friendly name to the specific contract you're signing for. + name: 'Authorization token', + // This identifies the latest version. + version: '1', + // This defines the network, in this case, Mainnet. + chainId: chainId, + // // Add a verifying contract to make sure you're establishing contracts with the proper entity. + verifyingContract, + }, + message: { + publicKey: `0x${publicKey}`, + }, + }; + return msgParams; + }; + +export const generateKeypair = () => { + const keypair = cryptobox_keygen(); + return { + publicKey: toHexString(cryptobox_pk_to_u8vec(cryptobox_get_pk(keypair))), + privateKey: toHexString(cryptobox_sk_to_u8vec(keypair)), + }; +}; diff --git a/src/sdk/network.test.ts b/src/sdk/network.test.ts new file mode 100644 index 0000000..941bc3d --- /dev/null +++ b/src/sdk/network.test.ts @@ -0,0 +1,30 @@ +import { + FheUint160, + CompactFheUint160List, + TfheCompactPublicKey, + TfheClientKey, +} from 'node-tfhe'; +import { createTfheKeypair } from '../tfhe'; +import { createEncryptedInput } from './encrypt'; +import { getPublicKeyCallParams, getPublicKeyFromNetwork } from './network'; +import { fromHexString } from '../utils'; + +describe('network', () => { + let clientKey: TfheClientKey; + let publicKey: TfheCompactPublicKey; + + beforeAll(async () => { + const keypair = createTfheKeypair(); + }); + + it('get network key', async () => { + const pk = await getPublicKeyFromNetwork('https://devnet.zama.ai'); + expect(pk!.length).toBe(33106); + }); + + it('get public key params', async () => { + const params = await getPublicKeyCallParams(); + expect(params.to).toBe('0x000000000000000000000000000000000000005d'); + expect(params.data).toBe('0xd9d47bb001'); + }); +}); diff --git a/src/sdk/network.ts b/src/sdk/network.ts new file mode 100644 index 0000000..ec4ea64 --- /dev/null +++ b/src/sdk/network.ts @@ -0,0 +1,89 @@ +import { toHexString } from '../utils'; + +function decodeAbiBytes(hex: string): Uint8Array { + if (hex.startsWith('0x')) { + hex = hex.substring(2); + } + // The data offset is the first 32 bytes, which points to the start of the data (skip this part) + const dataOffset = parseInt(hex.substring(0, 64), 16) * 2; // Convert offset from bytes to characters + + // The length of the data is the next 32 bytes, starting from the offset + const dataLength = + parseInt(hex.substring(dataOffset, dataOffset + 64), 16) * 2; // Convert length from bytes to characters + + // Extract the data + const data = hex.substring(dataOffset + 64, dataOffset + 64 + dataLength); + + // Convert the extracted data from hex to Uint8Array + const bytes = new Uint8Array(data.length / 2); + for (let i = 0, j = 0; i < data.length; i += 2, j++) { + bytes[j] = parseInt(data.substring(i, i + 2), 16); + } + + return bytes; +} + +const fetchJSONRPC = async (url: string, options: RequestInit) => { + try { + const response = await fetch(url, options); + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + const data = await response.json(); + if (data && data.result) { + // The result is usually prefixed with '0x' and is in hex format + const hexResult = data.result; + const decodedBytes = decodeAbiBytes(hexResult); + return `0x${toHexString(decodedBytes)}`; + } else { + console.error('No result from blockchain call'); + } + } catch (error) { + console.error('Error performing eth_call:', error); + } +}; + +export const getPublicKeyCallParams = () => ({ + to: '0x000000000000000000000000000000000000005d', + data: '0xd9d47bb001', +}); + +export const getChainIdFromNetwork = async (url: string) => { + const payload = { + jsonrpc: '2.0', + method: 'eth_chainId', + params: [], + id: 1, + }; + + const options = { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(payload), + }; + return fetchJSONRPC(url, options); +}; + +// Define the function to perform the eth_call +export const getPublicKeyFromNetwork = async (url: string) => { + // Create the JSON-RPC request payload + const payload = { + jsonrpc: '2.0', + method: 'eth_call', + params: [getPublicKeyCallParams(), 'latest'], + id: 1, + }; + + // Set up the fetch request options + const options = { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(payload), + }; + + return fetchJSONRPC(url, options); +}; diff --git a/src/sdk/publicKey.test.ts b/src/sdk/publicKey.test.ts deleted file mode 100644 index 179a029..0000000 --- a/src/sdk/publicKey.test.ts +++ /dev/null @@ -1,45 +0,0 @@ -import sodium from 'libsodium-wrappers'; -import { toHexString } from '../utils'; -import { generatePublicKey } from './publicKey'; - -describe('token', () => { - beforeAll(async () => { - await sodium.ready; - }); - it('creates a valid EIP712 object', async () => { - const { eip712, keypair } = generatePublicKey({ - verifyingContract: '0xccc', - chainId: 1234, - name: 'hello', - version: '3', - }); - expect(eip712.domain.chainId).toBe(1234); - expect(eip712.domain.name).toBe('hello'); - expect(eip712.domain.version).toBe('3'); - expect(eip712.message.publicKey).toBe( - `0x${toHexString(keypair.publicKey)}`, - ); - - expect(eip712.primaryType).toBe('Reencrypt'); - expect(eip712.types.Reencrypt.length).toBe(1); - expect(eip712.types.Reencrypt[0].name).toBe('publicKey'); - expect(eip712.types.Reencrypt[0].type).toBe('bytes32'); - }); - - it('creates a valid EIP712 object with default values', async () => { - const { eip712, keypair } = generatePublicKey({ - verifyingContract: '0xccc', - }); - expect(eip712.domain.chainId).toBe(9000); - expect(eip712.domain.name).toBe('Authorization token'); - expect(eip712.domain.version).toBe('1'); - expect(eip712.message.publicKey).toBe( - `0x${toHexString(keypair.publicKey)}`, - ); - - expect(eip712.primaryType).toBe('Reencrypt'); - expect(eip712.types.Reencrypt.length).toBe(1); - expect(eip712.types.Reencrypt[0].name).toBe('publicKey'); - expect(eip712.types.Reencrypt[0].type).toBe('bytes32'); - }); -}); diff --git a/src/sdk/publicKey.ts b/src/sdk/publicKey.ts deleted file mode 100644 index 8d19634..0000000 --- a/src/sdk/publicKey.ts +++ /dev/null @@ -1,78 +0,0 @@ -import sodium from 'libsodium-wrappers'; -import { toHexString } from '../utils'; -import { ContractKeypair } from './types'; - -export type EIP712Type = { name: string; type: string }; - -export type EIP712 = { - domain: { - chainId: number; - name: string; - verifyingContract: string; - version: string; - }; - message: { - [key: string]: any; - }; - primaryType: string; - types: { - [key: string]: EIP712Type[]; - }; -}; - -export type GeneratePublicKeyParams = { - name?: string; - version?: string; - chainId?: number; - verifyingContract: string; - keypair?: ContractKeypair; -}; - -export type FhevmToken = { - keypair: ContractKeypair; - eip712: EIP712; -}; - -export const generatePublicKey = ( - params: GeneratePublicKeyParams, -): FhevmToken => { - const keypair = params.keypair || sodium.crypto_box_keypair(); - const msgParams: EIP712 = { - types: { - // This refers to the domain the contract is hosted on. - EIP712Domain: [ - { name: 'name', type: 'string' }, - { name: 'version', type: 'string' }, - { name: 'chainId', type: 'uint256' }, - { name: 'verifyingContract', type: 'address' }, - ], - // Refer to primaryType. - Reencrypt: [{ name: 'publicKey', type: 'bytes32' }], - }, - // This defines the message you're proposing the user to sign, is dapp-specific, and contains - // anything you want. There are no required fields. Be as explicit as possible when building out - // the message schema. - // This refers to the keys of the following types object. - primaryType: 'Reencrypt', - domain: { - // Give a user-friendly name to the specific contract you're signing for. - name: params.name || 'Authorization token', - // This identifies the latest version. - version: params.version || '1', - // This defines the network, in this case, Mainnet. - chainId: params.chainId || 9000, - // // Add a verifying contract to make sure you're establishing contracts with the proper entity. - verifyingContract: params.verifyingContract, - }, - message: { - publicKey: `0x${toHexString(keypair.publicKey)}`, - }, - }; - return { - keypair: { - publicKey: keypair.publicKey, - privateKey: keypair.privateKey, - }, - eip712: msgParams, - }; -}; diff --git a/src/sdk/reencrypt.test.ts b/src/sdk/reencrypt.test.ts new file mode 100644 index 0000000..3118f9c --- /dev/null +++ b/src/sdk/reencrypt.test.ts @@ -0,0 +1,16 @@ +import { + FheUint160, + CompactFheUint160List, + TfheCompactPublicKey, + TfheClientKey, +} from 'node-tfhe'; +import { createTfheKeypair } from '../tfhe'; +import { createEncryptedInput } from './encrypt'; +import { getPublicKeyCallParams, getPublicKeyFromNetwork } from './network'; +import { fromHexString } from '../utils'; + +describe('reencrypt', () => { + it('get reencryption for handle', async () => { + expect(true).toBe(true); + }); +}); diff --git a/src/sdk/reencrypt.ts b/src/sdk/reencrypt.ts new file mode 100644 index 0000000..daf34c0 --- /dev/null +++ b/src/sdk/reencrypt.ts @@ -0,0 +1,29 @@ +import { toHexString } from 'src/utils'; +import { + u8vec_to_cryptobox_pk, + cryptobox_encrypt, + cryptobox_decrypt, + cryptobox_pk_to_u8vec, +} from '../kms'; + +export const reencryptRequest = + (reencryptUrl?: string) => + async ( + handle: bigint, + privateKey: string, + publicKey: string, + signature: string, + contractAddress: string, + userAddress: string, + ) => { + if (!reencryptUrl) throw new Error('You must provide a reencrypt URL'); + const data = { + publicKey, + handle, + signature, + contractAddress, + userAddress, + }; + // const response = await fetch(`${reencryptUrl}`); + return BigInt(10); + }; diff --git a/src/sdk/types.ts b/src/sdk/types.ts deleted file mode 100644 index 8a0922d..0000000 --- a/src/sdk/types.ts +++ /dev/null @@ -1,9 +0,0 @@ -export type ContractKeypairs = { - [key: string]: ContractKeypair; -}; - -export type ContractKeypair = { - publicKey: Uint8Array; - privateKey: Uint8Array; - signature?: string | null; -}; From 0957d02c68ae1cfbb96230a6600ab87575539aa8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20=27birdy=27=20Danjou?= Date: Tue, 21 May 2024 17:51:23 +0200 Subject: [PATCH 03/15] feat: moving reencrypt method --- src/sdk/encrypt.ts | 13 +++++++++++-- src/sdk/index.test.ts | 8 ++++---- src/sdk/index.ts | 30 +++++++++++++----------------- 3 files changed, 28 insertions(+), 23 deletions(-) diff --git a/src/sdk/encrypt.ts b/src/sdk/encrypt.ts index 0a295a6..d1634f3 100644 --- a/src/sdk/encrypt.ts +++ b/src/sdk/encrypt.ts @@ -14,8 +14,9 @@ export type ZKInput = { addAddress: (value: string) => ZKInput; getValues: () => bigint[]; getBits: () => number[]; - resetValues: (value: string) => ZKInput; + resetValues: () => ZKInput; encrypt: () => Uint8Array; + encryptAndSend: () => UInt8Array; }; const checkEncryptedValue = (value: number | bigint, bits: number) => { @@ -33,7 +34,7 @@ const checkEncryptedValue = (value: number | bigint, bits: number) => { }; export const createEncryptedInput = - (tfheCompactPublicKey?: TfheCompactPublicKey) => + (tfheCompactPublicKey?: TfheCompactPublicKey, coprocessorUrl?: string) => (contractAddress: string, userAddress: string) => { if (!tfheCompactPublicKey) throw new Error( @@ -134,5 +135,13 @@ export const createEncryptedInput = // ); return encrypted.serialize(); }, + encryptAndSend() { + if (!coprocessorUrl) throw new Error('Coprocessor URL not provided'); + const encrypted = CompactFheUint160List.encrypt_with_compact_public_key( + values, + publicKey, + ); + return BigInt(20); + }, }; }; diff --git a/src/sdk/index.test.ts b/src/sdk/index.test.ts index 7cd2c47..ca811c8 100644 --- a/src/sdk/index.test.ts +++ b/src/sdk/index.test.ts @@ -17,8 +17,8 @@ describe('index', () => { publicKey: tfhePublicKey, }); expect(instance.reencrypt).toBeDefined(); - expect(instance.reencrypt.createEIP712).toBeDefined(); - expect(instance.reencrypt.generateKeypair).toBeDefined(); + expect(instance.createEIP712).toBeDefined(); + expect(instance.generateKeypair).toBeDefined(); expect(instance.createEncryptedInput).toBeDefined(); }); @@ -27,8 +27,8 @@ describe('index', () => { chainId: 1234, }); expect(instance.reencrypt).toBeDefined(); - expect(instance.reencrypt.createEIP712).toBeDefined(); - expect(instance.reencrypt.generateKeypair).toBeDefined(); + expect(instance.createEIP712).toBeDefined(); + expect(instance.generateKeypair).toBeDefined(); expect(instance.createEncryptedInput).toBeDefined(); }); diff --git a/src/sdk/index.ts b/src/sdk/index.ts index dd7f024..33c0edb 100644 --- a/src/sdk/index.ts +++ b/src/sdk/index.ts @@ -20,18 +20,16 @@ export type FhevmInstance = { contractAddress: string, userAddress: string, ) => ZKInput; - reencrypt: { - generateKeypair: () => { publicKey: string; privateKey: string }; - createEIP712: (publicKey: string, contractAddress: string) => EIP712; - request: ( - handle: bigint, - privateKey: string, - publicKey: string, - signature: string, - contractAddress: string, - userAddress: string, - ) => Promise; - }; + generateKeypair: () => { publicKey: string; privateKey: string }; + createEIP712: (publicKey: string, contractAddress: string) => EIP712; + reencrypt: ( + handle: bigint, + privateKey: string, + publicKey: string, + signature: string, + contractAddress: string, + userAddress: string, + ) => Promise; }; export const getCiphertextCallParams = (handle: bigint) => { @@ -73,10 +71,8 @@ export const createInstance = async ( return { createEncryptedInput: createEncryptedInput(tfheCompactPublicKey), - reencrypt: { - generateKeypair, - createEIP712: createEIP712(chainId), - request: reencryptRequest(networkUrl), - }, + generateKeypair, + createEIP712: createEIP712(chainId), + reencrypt: reencryptRequest(networkUrl), }; }; From ae4edf9c93f261ea278c55f7511ea926aa98767f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20=27birdy=27=20Danjou?= Date: Fri, 31 May 2024 15:06:03 +0200 Subject: [PATCH 04/15] feat: add KMS wasm package --- config/rollup.config.js | 2 + config/webpack.config.cjs | 50 +- jest.config.cjs | 37 +- package-lock.json | 1190 ++++++++++++++- package.json | 6 +- src/kms/node/index.js | 1 + src/kms/{ => node}/kms_lib.d.ts | 0 src/kms/node/kms_lib.js | 1783 +++++++++++++++++++++++ src/kms/{ => node}/kms_lib_bg.wasm | Bin src/kms/{ => node}/kms_lib_bg.wasm.d.ts | 0 src/kms/{ => web}/README.md | 0 src/kms/web/kms_lib.d.ts | 404 +++++ src/kms/{ => web}/kms_lib.js | 497 ++++--- src/kms/web/kms_lib_bg.wasm | Bin 0 -> 554374 bytes src/kms/web/kms_lib_bg.wasm.d.ts | 87 ++ src/kms/{ => web}/package.json | 7 +- src/node.d.ts | 0 src/node.ts | 9 + src/sdk/encrypt.ts | 17 +- src/sdk/keypair.test.ts | 2 +- src/sdk/keypair.ts | 2 +- src/sdk/network.test.ts | 7 +- src/sdk/reencrypt.ts | 5 +- tsconfig.json | 3 +- tsconfig.rollup.json | 3 +- 25 files changed, 3804 insertions(+), 308 deletions(-) create mode 100644 src/kms/node/index.js rename src/kms/{ => node}/kms_lib.d.ts (100%) create mode 100644 src/kms/node/kms_lib.js rename src/kms/{ => node}/kms_lib_bg.wasm (100%) rename src/kms/{ => node}/kms_lib_bg.wasm.d.ts (100%) rename src/kms/{ => web}/README.md (100%) create mode 100644 src/kms/web/kms_lib.d.ts rename src/kms/{ => web}/kms_lib.js (80%) create mode 100644 src/kms/web/kms_lib_bg.wasm create mode 100644 src/kms/web/kms_lib_bg.wasm.d.ts rename src/kms/{ => web}/package.json (55%) create mode 100644 src/node.d.ts diff --git a/config/rollup.config.js b/config/rollup.config.js index 0e66686..37494c7 100644 --- a/config/rollup.config.js +++ b/config/rollup.config.js @@ -10,6 +10,7 @@ const plugins = [ replace({ preventAssignment: true, 'node-tfhe': 'tfhe', + 'kms/node/': 'kms/web/', }), typescript({ tsconfig: './tsconfig.rollup.json', @@ -45,6 +46,7 @@ export default [ format: 'cjs', }, plugins: [ + commonjs(), typescript({ tsconfig: './tsconfig.rollup.json', }), diff --git a/config/webpack.config.cjs b/config/webpack.config.cjs index e64bc05..6b66559 100644 --- a/config/webpack.config.cjs +++ b/config/webpack.config.cjs @@ -1,25 +1,25 @@ -"use strict"; -const webpack = require("webpack"); -const path = require("path"); -const PATHS = require("./paths.cjs"); +'use strict'; +const webpack = require('webpack'); +const path = require('path'); +const PATHS = require('./paths.cjs'); const web = { entry: { - "fhevm.min": PATHS.web, + 'fhevm.min': PATHS.web, }, output: { path: PATHS.build, - filename: "[name].js", - chunkFilename: "[name].js", - globalObject: "this", + filename: '[name].js', + chunkFilename: '[name].js', + globalObject: 'this', library: { - name: "fhevm", - type: "umd2", + name: 'fhevm', + type: 'umd2', }, }, optimization: { splitChunks: { - chunks: "all", + chunks: 'all', minRemainingSize: 0, minChunks: 1, cacheGroups: { @@ -42,34 +42,36 @@ const web = { { test: /\.tsx?$/, exclude: [/node_modules/], - use: ["ts-loader"], + use: ['ts-loader'], generator: { - filename: "[name][ext]", + filename: '[name][ext]', }, }, ], }, resolve: { - extensions: [".tsx", ".ts", ".js"], + extensions: ['.tsx', '.ts', '.js'], extensionAlias: { - ".js": [".ts", ".tsx", ".js"], - ".mjs": [".mts", ".mjs"], + '.js': ['.ts', '.tsx', '.js'], + '.mjs': ['.mts', '.mjs'], }, alias: { - "node-tfhe": "tfhe/tfhe", + 'node-tfhe': 'tfhe/tfhe', }, fallback: { - "tfhe_bg.wasm": require.resolve("tfhe/tfhe_bg.wasm"), - "node-tfhe": require.resolve("tfhe/tfhe"), - buffer: require.resolve("buffer/"), - crypto: require.resolve("crypto-browserify"), - stream: require.resolve("stream-browserify"), - path: require.resolve("path-browserify"), + 'tfhe_bg.wasm': require.resolve('tfhe/tfhe_bg.wasm'), + 'node-tfhe': require.resolve('tfhe/tfhe'), + 'kms_lib_bg.wasm': require.resolve('../src/kms/web/kms_lib_bg.wasm'), + 'node-kms': require.resolve('../src/kms/web/kms_lib.js'), + buffer: require.resolve('buffer/'), + crypto: require.resolve('crypto-browserify'), + stream: require.resolve('stream-browserify'), + path: require.resolve('path-browserify'), }, }, plugins: [ new webpack.ProvidePlugin({ - Buffer: ["buffer", "Buffer"], + Buffer: ['buffer', 'Buffer'], }), new webpack.optimize.LimitChunkCountPlugin({ maxChunks: 1, diff --git a/jest.config.cjs b/jest.config.cjs index a556031..fe81d07 100644 --- a/jest.config.cjs +++ b/jest.config.cjs @@ -1,31 +1,34 @@ module.exports = { - preset: "ts-jest", + preset: 'ts-jest', transform: { - "^.+\\.tsx?$": [ - "ts-jest", + '^.+\\.tsx?$': [ + 'ts-jest', { - tsconfig: "tsconfig.json", + tsconfig: 'tsconfig.json', }, ], - "^.+\\.jsx?$": [ - "ts-jest", + '^.+\\.jsx?$': [ + 'ts-jest', { - tsconfig: "tsconfig.json", + tsconfig: 'tsconfig.json', }, ], - "^.+\\.bin$": ["config/rawLoader.cjs"], + '^.+\\.bin$': ['config/rawLoader.cjs'], + }, + testEnvironment: 'node', + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], + moduleNameMapper: { + '^node-kms$': '/src/kms/node', }, - testEnvironment: "node", - moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"], collectCoverageFrom: [ - "src/**/*.ts", - "!src/**/*.d.ts", - "src/**/*.tsx", - "!src/**/*.story.**", + 'src/**/*.ts', + '!src/**/*.d.ts', + 'src/**/*.tsx', + '!src/**/*.story.**', ], - testRegex: "\\.test\\.tsx?$", - coverageReporters: ["lcov", "text-summary", "json"], - transformIgnorePatterns: ["/node_modules/"], + testRegex: '\\.test\\.tsx?$', + coverageReporters: ['lcov', 'text-summary', 'json'], + transformIgnorePatterns: ['/node_modules/'], coveragePathIgnorePatterns: [], coverageThreshold: { global: { diff --git a/package-lock.json b/package-lock.json index 17ea3f6..808c7b0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,8 +15,10 @@ "ethers": "^6.6.4", "libsodium": "^0.7.11", "libsodium-wrappers": "^0.7.11", + "node-fetch": "^3.3.2", "node-tfhe": "^0.6.1", - "tfhe": "^0.6.1" + "tfhe": "^0.6.1", + "web3-validator": "^2.0.6" }, "bin": { "fhevm": "bin/fhevm.js" @@ -30,8 +32,10 @@ "@rollup/plugin-wasm": "^6.1.3", "@types/jest": "^29.5.1", "@types/libsodium-wrappers": "^0.7.10", + "@types/node-fetch": "^2.6.11", "buffer": "^6.0.3", "crypto-browserify": "^3.12.0", + "fetch-mock-jest": "^1.5.1", "jest": "^29.5.0", "jest-raw-loader": "^1.0.1", "path-browserify": "^1.0.1", @@ -677,6 +681,18 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/runtime": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.6.tgz", + "integrity": "sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/template": { "version": "7.23.9", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", @@ -1117,6 +1133,28 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, + "node_modules/@noble/curves": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.3.0.tgz", + "integrity": "sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==", + "dependencies": { + "@noble/hashes": "1.3.3" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/curves/node_modules/@noble/hashes": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", + "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@noble/hashes": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", @@ -1404,6 +1442,61 @@ } } }, + "node_modules/@scure/base": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.6.tgz", + "integrity": "sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.3.tgz", + "integrity": "sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ==", + "dependencies": { + "@noble/curves": "~1.3.0", + "@noble/hashes": "~1.3.2", + "@scure/base": "~1.1.4" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/hashes": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", + "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.2.tgz", + "integrity": "sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==", + "dependencies": { + "@noble/hashes": "~1.3.2", + "@scure/base": "~1.1.4" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39/node_modules/@noble/hashes": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", + "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", @@ -1556,6 +1649,16 @@ "integrity": "sha512-CTO/wa8x+rZU626cL2BlbCDzydgnFNgc19h4YvizpTO88MFQxab8wqisxaofQJ/9bLGugRdWIuX/TbIs6VVF6g==", "dev": true }, + "node_modules/@types/node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", + "dev": true, + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" + } + }, "node_modules/@types/prettier": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", @@ -1930,12 +2033,32 @@ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, "node_modules/atob-lite": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/atob-lite/-/atob-lite-2.0.0.tgz", "integrity": "sha512-LEeSAWeh2Gfa2FtlQE1shxQ8zi5F9GHarrGKz08TMdODD5T4eH6BMsvtnhbWZ+XQn+Gb6om/917ucvRu7l7ukw==", "dev": true }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/babel-jest": { "version": "29.5.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz", @@ -2295,6 +2418,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -2505,6 +2646,18 @@ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/commander": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", @@ -2531,6 +2684,17 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, + "node_modules/core-js": { + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.1.tgz", + "integrity": "sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/create-ecdh": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", @@ -2615,6 +2779,14 @@ "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "engines": { + "node": ">= 12" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -2647,6 +2819,31 @@ "node": ">=0.10.0" } }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/des.js": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", @@ -2801,6 +2998,25 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-module-lexer": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", @@ -2887,6 +3103,28 @@ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true }, + "node_modules/ethereum-cryptography": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.3.tgz", + "integrity": "sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA==", + "dependencies": { + "@noble/curves": "1.3.0", + "@noble/hashes": "1.3.3", + "@scure/bip32": "1.3.3", + "@scure/bip39": "1.2.2" + } + }, + "node_modules/ethereum-cryptography/node_modules/@noble/hashes": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", + "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/ethers": { "version": "6.6.4", "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.6.4.tgz", @@ -3046,6 +3284,85 @@ "bser": "2.1.1" } }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/fetch-mock": { + "version": "9.11.0", + "resolved": "https://registry.npmjs.org/fetch-mock/-/fetch-mock-9.11.0.tgz", + "integrity": "sha512-PG1XUv+x7iag5p/iNHD4/jdpxL9FtVSqRMUQhPab4hVDt80T1MH5ehzVrL2IdXO9Q2iBggArFvPqjUbHFuI58Q==", + "dev": true, + "dependencies": { + "@babel/core": "^7.0.0", + "@babel/runtime": "^7.0.0", + "core-js": "^3.0.0", + "debug": "^4.1.1", + "glob-to-regexp": "^0.4.0", + "is-subset": "^0.1.1", + "lodash.isequal": "^4.5.0", + "path-to-regexp": "^2.2.1", + "querystring": "^0.2.0", + "whatwg-url": "^6.5.0" + }, + "engines": { + "node": ">=4.0.0" + }, + "funding": { + "type": "charity", + "url": "https://www.justgiving.com/refugee-support-europe" + }, + "peerDependencies": { + "node-fetch": "*" + }, + "peerDependenciesMeta": { + "node-fetch": { + "optional": true + } + } + }, + "node_modules/fetch-mock-jest": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/fetch-mock-jest/-/fetch-mock-jest-1.5.1.tgz", + "integrity": "sha512-+utwzP8C+Pax1GSka3nFXILWMY3Er2L+s090FOgqVNrNCPp0fDqgXnAHAJf12PLHi0z4PhcTaZNTz8e7K3fjqQ==", + "dev": true, + "dependencies": { + "fetch-mock": "^9.11.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "charity", + "url": "https://www.justgiving.com/refugee-support-europe" + }, + "peerDependencies": { + "node-fetch": "*" + }, + "peerDependenciesMeta": { + "node-fetch": { + "optional": true + } + } + }, "node_modules/file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -3085,6 +3402,39 @@ "dtype": "^2.0.0" } }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -3106,10 +3456,12 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/gensync": { "version": "1.0.0-beta.2", @@ -3129,6 +3481,24 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", @@ -3217,6 +3587,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -3244,6 +3625,53 @@ "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/hash-base": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", @@ -3268,6 +3696,17 @@ "minimalistic-assert": "^1.0.1" } }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -3364,8 +3803,7 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/interpret": { "version": "3.1.1", @@ -3376,6 +3814,21 @@ "node": ">=10.13.0" } }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -3427,6 +3880,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-core-module": { "version": "2.12.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", @@ -3466,6 +3930,20 @@ "node": ">=6" } }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -3526,6 +4004,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-subset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", + "integrity": "sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw==", + "dev": true + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -4397,12 +4895,24 @@ "node": ">=8" } }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "dev": true + }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "dev": true }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -4609,6 +5119,41 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -4777,6 +5322,12 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/path-to-regexp": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.4.0.tgz", + "integrity": "sha512-G6zHoVqC6GGTQkZwF4lkuEyMbVOjoBKAEybQUypI1WTkqinCOrq2x6U2+phkJ1XsEMTy4LjtwPI7HW+NVrRR2w==", + "dev": true + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -4850,6 +5401,14 @@ "queue-lit": "^1.5.0" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/prettier": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", @@ -4955,6 +5514,16 @@ } ] }, + "node_modules/querystring": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", + "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, "node_modules/queue-lit": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/queue-lit/-/queue-lit-1.5.0.tgz", @@ -5044,6 +5613,12 @@ "node": ">= 10.13.0" } }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -5251,6 +5826,22 @@ "randombytes": "^2.1.0" } }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/sha.js": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", @@ -5604,6 +6195,15 @@ "node": ">=8.0" } }, + "node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/ts-jest": { "version": "29.1.0", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.0.tgz", @@ -5799,6 +6399,18 @@ } } }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -5847,6 +6459,57 @@ "node": ">=10.13.0" } }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/web3-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/web3-errors/-/web3-errors-1.2.0.tgz", + "integrity": "sha512-58Kczou5zyjcm9LuSs5Hrm6VrG8t9p2J8X0yGArZrhKNPZL66gMGkOUpPx+EopE944Sk4yE+Q25hKv4H5BH+kA==", + "dependencies": { + "web3-types": "^1.6.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-types": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/web3-types/-/web3-types-1.6.0.tgz", + "integrity": "sha512-qgOtADqlD5hw+KPKBUGaXAcdNLL0oh6qTeVgXwewCfbL/lG9R+/GrgMQB1gbTJ3cit8hMwtH8KX2Em6OwO0HRw==", + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/web3-validator/-/web3-validator-2.0.6.tgz", + "integrity": "sha512-qn9id0/l1bWmvH4XfnG/JtGKKwut2Vokl6YXP5Kfg424npysmtRLe9DgiNBM9Op7QL/aSiaA0TVXibuIuWcizg==", + "dependencies": { + "ethereum-cryptography": "^2.0.0", + "util": "^0.12.5", + "web3-errors": "^1.2.0", + "web3-types": "^1.6.0", + "zod": "^3.21.4" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, "node_modules/webpack": { "version": "5.82.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.82.1.tgz", @@ -5970,6 +6633,17 @@ "node": ">=10.13.0" } }, + "node_modules/whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "dev": true, + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -5985,6 +6659,24 @@ "node": ">= 8" } }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/wildcard": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", @@ -6100,6 +6792,14 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } }, "dependencies": { @@ -6581,6 +7281,15 @@ "@babel/helper-plugin-utils": "^7.20.2" } }, + "@babel/runtime": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.6.tgz", + "integrity": "sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.14.0" + } + }, "@babel/template": { "version": "7.23.9", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", @@ -6935,6 +7644,21 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, + "@noble/curves": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.3.0.tgz", + "integrity": "sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==", + "requires": { + "@noble/hashes": "1.3.3" + }, + "dependencies": { + "@noble/hashes": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", + "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==" + } + } + }, "@noble/hashes": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", @@ -7098,6 +7822,44 @@ "picomatch": "^2.3.1" } }, + "@scure/base": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.6.tgz", + "integrity": "sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==" + }, + "@scure/bip32": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.3.tgz", + "integrity": "sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ==", + "requires": { + "@noble/curves": "~1.3.0", + "@noble/hashes": "~1.3.2", + "@scure/base": "~1.1.4" + }, + "dependencies": { + "@noble/hashes": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", + "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==" + } + } + }, + "@scure/bip39": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.2.tgz", + "integrity": "sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==", + "requires": { + "@noble/hashes": "~1.3.2", + "@scure/base": "~1.1.4" + }, + "dependencies": { + "@noble/hashes": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", + "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==" + } + } + }, "@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", @@ -7250,6 +8012,16 @@ "integrity": "sha512-CTO/wa8x+rZU626cL2BlbCDzydgnFNgc19h4YvizpTO88MFQxab8wqisxaofQJ/9bLGugRdWIuX/TbIs6VVF6g==", "dev": true }, + "@types/node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", + "dev": true, + "requires": { + "@types/node": "*", + "form-data": "^4.0.0" + } + }, "@types/prettier": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", @@ -7568,12 +8340,26 @@ } } }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, "atob-lite": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/atob-lite/-/atob-lite-2.0.0.tgz", "integrity": "sha512-LEeSAWeh2Gfa2FtlQE1shxQ8zi5F9GHarrGKz08TMdODD5T4eH6BMsvtnhbWZ+XQn+Gb6om/917ucvRu7l7ukw==", "dev": true }, + "available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "requires": { + "possible-typed-array-names": "^1.0.0" + } + }, "babel-jest": { "version": "29.5.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz", @@ -7843,6 +8629,18 @@ "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true }, + "call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + } + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -7987,6 +8785,15 @@ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, "commander": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", @@ -8010,6 +8817,12 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, + "core-js": { + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.1.tgz", + "integrity": "sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==", + "dev": true + }, "create-ecdh": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", @@ -8090,6 +8903,11 @@ "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" }, + "data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==" + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -8111,6 +8929,22 @@ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true }, + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, "des.js": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", @@ -8239,6 +9073,19 @@ "is-arrayish": "^0.2.1" } }, + "es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "requires": { + "get-intrinsic": "^1.2.4" + } + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" + }, "es-module-lexer": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", @@ -8302,6 +9149,24 @@ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true }, + "ethereum-cryptography": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.3.tgz", + "integrity": "sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA==", + "requires": { + "@noble/curves": "1.3.0", + "@noble/hashes": "1.3.3", + "@scure/bip32": "1.3.3", + "@scure/bip39": "1.2.2" + }, + "dependencies": { + "@noble/hashes": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", + "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==" + } + } + }, "ethers": { "version": "6.6.4", "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.6.4.tgz", @@ -8429,6 +9294,42 @@ "bser": "2.1.1" } }, + "fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "requires": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + } + }, + "fetch-mock": { + "version": "9.11.0", + "resolved": "https://registry.npmjs.org/fetch-mock/-/fetch-mock-9.11.0.tgz", + "integrity": "sha512-PG1XUv+x7iag5p/iNHD4/jdpxL9FtVSqRMUQhPab4hVDt80T1MH5ehzVrL2IdXO9Q2iBggArFvPqjUbHFuI58Q==", + "dev": true, + "requires": { + "@babel/core": "^7.0.0", + "@babel/runtime": "^7.0.0", + "core-js": "^3.0.0", + "debug": "^4.1.1", + "glob-to-regexp": "^0.4.0", + "is-subset": "^0.1.1", + "lodash.isequal": "^4.5.0", + "path-to-regexp": "^2.2.1", + "querystring": "^0.2.0", + "whatwg-url": "^6.5.0" + } + }, + "fetch-mock-jest": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/fetch-mock-jest/-/fetch-mock-jest-1.5.1.tgz", + "integrity": "sha512-+utwzP8C+Pax1GSka3nFXILWMY3Er2L+s090FOgqVNrNCPp0fDqgXnAHAJf12PLHi0z4PhcTaZNTz8e7K3fjqQ==", + "dev": true, + "requires": { + "fetch-mock": "^9.11.0" + } + }, "file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -8462,6 +9363,33 @@ "dtype": "^2.0.0" } }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "requires": { + "is-callable": "^1.1.3" + } + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "requires": { + "fetch-blob": "^3.1.2" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -8476,10 +9404,9 @@ "optional": true }, "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, "gensync": { "version": "1.0.0-beta.2", @@ -8493,6 +9420,18 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, + "get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + } + }, "get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", @@ -8554,6 +9493,14 @@ "slash": "^3.0.0" } }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "requires": { + "get-intrinsic": "^1.1.3" + } + }, "graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -8575,6 +9522,32 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "requires": { + "es-define-property": "^1.0.0" + } + }, + "has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "requires": { + "has-symbols": "^1.0.3" + } + }, "hash-base": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", @@ -8596,6 +9569,14 @@ "minimalistic-assert": "^1.0.1" } }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "requires": { + "function-bind": "^1.1.2" + } + }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -8660,8 +9641,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "interpret": { "version": "3.1.1", @@ -8669,6 +9649,15 @@ "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -8705,6 +9694,11 @@ "builtin-modules": "^3.3.0" } }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" + }, "is-core-module": { "version": "2.12.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", @@ -8732,6 +9726,14 @@ "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -8777,6 +9779,20 @@ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, + "is-subset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", + "integrity": "sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw==", + "dev": true + }, + "is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "requires": { + "which-typed-array": "^1.1.14" + } + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -9454,12 +10470,24 @@ "p-locate": "^4.1.0" } }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "dev": true + }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "dev": true }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -9627,6 +10655,21 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, + "node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==" + }, + "node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "requires": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + } + }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -9756,6 +10799,12 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "path-to-regexp": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.4.0.tgz", + "integrity": "sha512-G6zHoVqC6GGTQkZwF4lkuEyMbVOjoBKAEybQUypI1WTkqinCOrq2x6U2+phkJ1XsEMTy4LjtwPI7HW+NVrRR2w==", + "dev": true + }, "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -9811,6 +10860,11 @@ "queue-lit": "^1.5.0" } }, + "possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==" + }, "prettier": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", @@ -9886,6 +10940,12 @@ "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", "dev": true }, + "querystring": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", + "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==", + "dev": true + }, "queue-lit": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/queue-lit/-/queue-lit-1.5.0.tgz", @@ -9952,6 +11012,12 @@ "resolve": "^1.20.0" } }, + "regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -10086,6 +11152,19 @@ "randombytes": "^2.1.0" } }, + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + } + }, "sha.js": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", @@ -10348,6 +11427,15 @@ "is-number": "^7.0.0" } }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, "ts-jest": { "version": "29.1.0", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.0.tgz", @@ -10453,6 +11541,18 @@ "schema-utils": "^3.0.0" } }, + "util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -10497,6 +11597,42 @@ "graceful-fs": "^4.1.2" } }, + "web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==" + }, + "web3-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/web3-errors/-/web3-errors-1.2.0.tgz", + "integrity": "sha512-58Kczou5zyjcm9LuSs5Hrm6VrG8t9p2J8X0yGArZrhKNPZL66gMGkOUpPx+EopE944Sk4yE+Q25hKv4H5BH+kA==", + "requires": { + "web3-types": "^1.6.0" + } + }, + "web3-types": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/web3-types/-/web3-types-1.6.0.tgz", + "integrity": "sha512-qgOtADqlD5hw+KPKBUGaXAcdNLL0oh6qTeVgXwewCfbL/lG9R+/GrgMQB1gbTJ3cit8hMwtH8KX2Em6OwO0HRw==" + }, + "web3-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/web3-validator/-/web3-validator-2.0.6.tgz", + "integrity": "sha512-qn9id0/l1bWmvH4XfnG/JtGKKwut2Vokl6YXP5Kfg424npysmtRLe9DgiNBM9Op7QL/aSiaA0TVXibuIuWcizg==", + "requires": { + "ethereum-cryptography": "^2.0.0", + "util": "^0.12.5", + "web3-errors": "^1.2.0", + "web3-types": "^1.6.0", + "zod": "^3.21.4" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, "webpack": { "version": "5.82.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.82.1.tgz", @@ -10574,6 +11710,17 @@ "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true }, + "whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -10583,6 +11730,18 @@ "isexe": "^2.0.0" } }, + "which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "requires": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + } + }, "wildcard": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", @@ -10660,6 +11819,11 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true + }, + "zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==" } } } diff --git a/package.json b/package.json index 4fee09a..0d617c7 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,10 @@ "ethers": "^6.6.4", "libsodium": "^0.7.11", "libsodium-wrappers": "^0.7.11", + "node-fetch": "^3.3.2", "node-tfhe": "^0.6.1", - "tfhe": "^0.6.1" + "tfhe": "^0.6.1", + "web3-validator": "^2.0.6" }, "devDependencies": { "@rollup/plugin-alias": "^5.0.0", @@ -61,8 +63,10 @@ "@rollup/plugin-wasm": "^6.1.3", "@types/jest": "^29.5.1", "@types/libsodium-wrappers": "^0.7.10", + "@types/node-fetch": "^2.6.11", "buffer": "^6.0.3", "crypto-browserify": "^3.12.0", + "fetch-mock-jest": "^1.5.1", "jest": "^29.5.0", "jest-raw-loader": "^1.0.1", "path-browserify": "^1.0.1", diff --git a/src/kms/node/index.js b/src/kms/node/index.js new file mode 100644 index 0000000..9a4cd55 --- /dev/null +++ b/src/kms/node/index.js @@ -0,0 +1 @@ +export * from './kms_lib'; diff --git a/src/kms/kms_lib.d.ts b/src/kms/node/kms_lib.d.ts similarity index 100% rename from src/kms/kms_lib.d.ts rename to src/kms/node/kms_lib.d.ts diff --git a/src/kms/node/kms_lib.js b/src/kms/node/kms_lib.js new file mode 100644 index 0000000..e4b6af5 --- /dev/null +++ b/src/kms/node/kms_lib.js @@ -0,0 +1,1783 @@ +let imports = {}; +imports['__wbindgen_placeholder__'] = module.exports; +let wasm; +const { TextDecoder, TextEncoder } = require(`util`); + +const heap = new Array(128).fill(undefined); + +heap.push(undefined, null, true, false); + +function getObject(idx) { + return heap[idx]; +} + +let heap_next = heap.length; + +function dropObject(idx) { + if (idx < 132) return; + heap[idx] = heap_next; + heap_next = idx; +} + +function takeObject(idx) { + const ret = getObject(idx); + dropObject(idx); + return ret; +} + +let cachedTextDecoder = new TextDecoder('utf-8', { + ignoreBOM: true, + fatal: true, +}); + +cachedTextDecoder.decode(); + +let cachedUint8Memory0 = null; + +function getUint8Memory0() { + if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) { + cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8Memory0; +} + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); +} + +function addHeapObject(obj) { + if (heap_next === heap.length) heap.push(heap.length + 1); + const idx = heap_next; + heap_next = heap[idx]; + + heap[idx] = obj; + return idx; +} + +let cachedInt32Memory0 = null; + +function getInt32Memory0() { + if (cachedInt32Memory0 === null || cachedInt32Memory0.byteLength === 0) { + cachedInt32Memory0 = new Int32Array(wasm.memory.buffer); + } + return cachedInt32Memory0; +} + +let WASM_VECTOR_LEN = 0; + +let cachedTextEncoder = new TextEncoder('utf-8'); + +const encodeString = + typeof cachedTextEncoder.encodeInto === 'function' + ? function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); + } + : function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length, + }; + }; + +function passStringToWasm0(arg, malloc, realloc) { + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8Memory0() + .subarray(ptr, ptr + buf.length) + .set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8Memory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7f) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, (len = offset + arg.length * 3), 1) >>> 0; + const view = getUint8Memory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +function getArrayU8FromWasm0(ptr, len) { + ptr = ptr >>> 0; + return getUint8Memory0().subarray(ptr / 1, ptr / 1 + len); +} + +function passArray8ToWasm0(arg, malloc) { + const ptr = malloc(arg.length * 1, 1) >>> 0; + getUint8Memory0().set(arg, ptr / 1); + WASM_VECTOR_LEN = arg.length; + return ptr; +} + +function isLikeNone(x) { + return x === undefined || x === null; +} + +function _assertClass(instance, klass) { + if (!(instance instanceof klass)) { + throw new Error(`expected instance of ${klass.name}`); + } + return instance.ptr; +} + +let cachedUint32Memory0 = null; + +function getUint32Memory0() { + if (cachedUint32Memory0 === null || cachedUint32Memory0.byteLength === 0) { + cachedUint32Memory0 = new Uint32Array(wasm.memory.buffer); + } + return cachedUint32Memory0; +} + +function passArrayJsValueToWasm0(array, malloc) { + const ptr = malloc(array.length * 4, 4) >>> 0; + const mem = getUint32Memory0(); + for (let i = 0; i < array.length; i++) { + mem[ptr / 4 + i] = addHeapObject(array[i]); + } + WASM_VECTOR_LEN = array.length; + return ptr; +} +/** + * @param {(PublicSigKey)[]} server_pks + * @param {PublicSigKey} client_pk + * @param {number} shares_needed + * @param {string} params_json + * @returns {Client} + */ +module.exports.new_client = function ( + server_pks, + client_pk, + shares_needed, + params_json, +) { + const ptr0 = passArrayJsValueToWasm0(server_pks, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + _assertClass(client_pk, PublicSigKey); + var ptr1 = client_pk.__destroy_into_raw(); + const ptr2 = passStringToWasm0( + params_json, + wasm.__wbindgen_malloc, + wasm.__wbindgen_realloc, + ); + const len2 = WASM_VECTOR_LEN; + const ret = wasm.new_client(ptr0, len0, ptr1, shares_needed, ptr2, len2); + return Client.__wrap(ret); +}; + +/** + * @returns {PrivateEncKey} + */ +module.exports.cryptobox_keygen = function () { + const ret = wasm.cryptobox_keygen(); + return PrivateEncKey.__wrap(ret); +}; + +/** + * @param {PrivateEncKey} sk + * @returns {PublicEncKey} + */ +module.exports.cryptobox_get_pk = function (sk) { + _assertClass(sk, PrivateEncKey); + const ret = wasm.cryptobox_get_pk(sk.__wbg_ptr); + return PublicEncKey.__wrap(ret); +}; + +/** + * @param {PublicEncKey} pk + * @returns {Uint8Array} + */ +module.exports.cryptobox_pk_to_u8vec = function (pk) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + _assertClass(pk, PublicEncKey); + wasm.cryptobox_pk_to_u8vec(retptr, pk.__wbg_ptr); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + var r3 = getInt32Memory0()[retptr / 4 + 3]; + if (r3) { + throw takeObject(r2); + } + var v1 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 1, 1); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +}; + +/** + * @param {PrivateEncKey} sk + * @returns {Uint8Array} + */ +module.exports.cryptobox_sk_to_u8vec = function (sk) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + _assertClass(sk, PrivateEncKey); + wasm.cryptobox_sk_to_u8vec(retptr, sk.__wbg_ptr); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + var r3 = getInt32Memory0()[retptr / 4 + 3]; + if (r3) { + throw takeObject(r2); + } + var v1 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 1, 1); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +}; + +/** + * @param {Uint8Array} v + * @returns {PublicEncKey} + */ +module.exports.u8vec_to_cryptobox_pk = function (v) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + const ptr0 = passArray8ToWasm0(v, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + wasm.u8vec_to_cryptobox_pk(retptr, ptr0, len0); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return PublicEncKey.__wrap(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +}; + +/** + * @param {Uint8Array} v + * @returns {PrivateEncKey} + */ +module.exports.u8vec_to_cryptobox_sk = function (v) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + const ptr0 = passArray8ToWasm0(v, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + wasm.u8vec_to_cryptobox_sk(retptr, ptr0, len0); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return PrivateEncKey.__wrap(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +}; + +/** + * @param {Uint8Array} msg + * @param {PublicEncKey} their_pk + * @param {PrivateEncKey} my_sk + * @returns {CryptoBoxCt} + */ +module.exports.cryptobox_encrypt = function (msg, their_pk, my_sk) { + const ptr0 = passArray8ToWasm0(msg, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + _assertClass(their_pk, PublicEncKey); + _assertClass(my_sk, PrivateEncKey); + const ret = wasm.cryptobox_encrypt( + ptr0, + len0, + their_pk.__wbg_ptr, + my_sk.__wbg_ptr, + ); + return CryptoBoxCt.__wrap(ret); +}; + +/** + * @param {CryptoBoxCt} ct + * @param {PrivateEncKey} my_sk + * @param {PublicEncKey} their_pk + * @returns {Uint8Array} + */ +module.exports.cryptobox_decrypt = function (ct, my_sk, their_pk) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + _assertClass(ct, CryptoBoxCt); + _assertClass(my_sk, PrivateEncKey); + _assertClass(their_pk, PublicEncKey); + wasm.cryptobox_decrypt( + retptr, + ct.__wbg_ptr, + my_sk.__wbg_ptr, + their_pk.__wbg_ptr, + ); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var v1 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 1, 1); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +}; + +/** + * This function assembles [ReencryptionRequest] + * from a signature and other metadata. + * The signature is on the ephemeral public key + * signed by the client's private key + * following the EIP712 standard. + * @param {Client} client + * @param {Uint8Array} signature + * @param {PublicEncKey} enc_pk + * @param {FheType} fhe_type + * @param {RequestId} key_id + * @param {Uint8Array} ciphertext_digest + * @param {Eip712DomainMsg} domain + * @returns {ReencryptionRequest} + */ +module.exports.make_reencryption_req = function ( + client, + signature, + enc_pk, + fhe_type, + key_id, + ciphertext_digest, + domain, +) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + _assertClass(client, Client); + const ptr0 = passArray8ToWasm0(signature, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + _assertClass(enc_pk, PublicEncKey); + var ptr1 = enc_pk.__destroy_into_raw(); + _assertClass(key_id, RequestId); + var ptr2 = key_id.__destroy_into_raw(); + const ptr3 = passArray8ToWasm0(ciphertext_digest, wasm.__wbindgen_malloc); + const len3 = WASM_VECTOR_LEN; + _assertClass(domain, Eip712DomainMsg); + var ptr4 = domain.__destroy_into_raw(); + wasm.make_reencryption_req( + retptr, + client.__wbg_ptr, + ptr0, + len0, + ptr1, + fhe_type, + ptr2, + ptr3, + len3, + ptr4, + ); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return ReencryptionRequest.__wrap(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +}; + +function passArray32ToWasm0(arg, malloc) { + const ptr = malloc(arg.length * 4, 4) >>> 0; + getUint32Memory0().set(arg, ptr / 4); + WASM_VECTOR_LEN = arg.length; + return ptr; +} +/** + * This function takes [AggregatedReencryptionResponse] normally + * but wasm does not support HashMap so we need to take two parameters: + * `agg_resp` and `agg_resp_id`. + * @param {Client} client + * @param {ReencryptionRequest | undefined} request + * @param {(ReencryptionResponse)[]} agg_resp + * @param {Uint32Array} agg_resp_ids + * @param {PublicEncKey} enc_pk + * @param {PrivateEncKey} enc_sk + * @returns {number} + */ +module.exports.process_reencryption_resp = function ( + client, + request, + agg_resp, + agg_resp_ids, + enc_pk, + enc_sk, +) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + _assertClass(client, Client); + let ptr0 = 0; + if (!isLikeNone(request)) { + _assertClass(request, ReencryptionRequest); + ptr0 = request.__destroy_into_raw(); + } + const ptr1 = passArrayJsValueToWasm0(agg_resp, wasm.__wbindgen_malloc); + const len1 = WASM_VECTOR_LEN; + const ptr2 = passArray32ToWasm0(agg_resp_ids, wasm.__wbindgen_malloc); + const len2 = WASM_VECTOR_LEN; + _assertClass(enc_pk, PublicEncKey); + _assertClass(enc_sk, PrivateEncKey); + wasm.process_reencryption_resp( + retptr, + client.__wbg_ptr, + ptr0, + ptr1, + len1, + ptr2, + len2, + enc_pk.__wbg_ptr, + enc_sk.__wbg_ptr, + ); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return r0; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +}; + +function handleError(f, args) { + try { + return f.apply(this, args); + } catch (e) { + wasm.__wbindgen_exn_store(addHeapObject(e)); + } +} +/** + * The plaintext types that can be encrypted in a fhevm ciphertext. + */ +module.exports.FheType = Object.freeze({ + Bool: 0, + 0: 'Bool', + Euint4: 1, + 1: 'Euint4', + Euint8: 2, + 2: 'Euint8', + Euint16: 3, + 3: 'Euint16', + Euint32: 4, + 4: 'Euint32', + Euint64: 5, + 5: 'Euint64', + Euint128: 6, + 6: 'Euint128', + Euint160: 7, + 7: 'Euint160', +}); + +const ClientFinalization = + typeof FinalizationRegistry === 'undefined' + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry((ptr) => wasm.__wbg_client_free(ptr >>> 0)); +/** + * Simple client to interact with the KMS servers. This can be seen as a proof-of-concept + * and reference code for validating the KMS. The logic supplied by the client will be + * distributed accross the aggregator/proxy and smart contracts. + * TODO should probably aggregate the KmsEndpointClient to void having two client code bases + * exposed in tests and MVP + * + * client_sk is optional because sometimes the private signing key is kept + * in a secure location, e.g., hardware wallet. Calling functions that requires + * client_sk when it is None will return an error. + */ +class Client { + static __wrap(ptr) { + ptr = ptr >>> 0; + const obj = Object.create(Client.prototype); + obj.__wbg_ptr = ptr; + ClientFinalization.register(obj, obj.__wbg_ptr, obj); + return obj; + } + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + ClientFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_client_free(ptr); + } +} +module.exports.Client = Client; + +const CryptoBoxCtFinalization = + typeof FinalizationRegistry === 'undefined' + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry((ptr) => wasm.__wbg_cryptoboxct_free(ptr >>> 0)); +/** + */ +class CryptoBoxCt { + static __wrap(ptr) { + ptr = ptr >>> 0; + const obj = Object.create(CryptoBoxCt.prototype); + obj.__wbg_ptr = ptr; + CryptoBoxCtFinalization.register(obj, obj.__wbg_ptr, obj); + return obj; + } + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + CryptoBoxCtFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_cryptoboxct_free(ptr); + } +} +module.exports.CryptoBoxCt = CryptoBoxCt; + +const Eip712DomainMsgFinalization = + typeof FinalizationRegistry === 'undefined' + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry((ptr) => + wasm.__wbg_eip712domainmsg_free(ptr >>> 0), + ); +/** + * + * eventually chain_id, verifying_contract and salt will be parsed in to solidity types + */ +class Eip712DomainMsg { + static __wrap(ptr) { + ptr = ptr >>> 0; + const obj = Object.create(Eip712DomainMsg.prototype); + obj.__wbg_ptr = ptr; + Eip712DomainMsgFinalization.register(obj, obj.__wbg_ptr, obj); + return obj; + } + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + Eip712DomainMsgFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_eip712domainmsg_free(ptr); + } + /** + * @returns {string} + */ + get name() { + let deferred1_0; + let deferred1_1; + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.__wbg_get_eip712domainmsg_name(retptr, this.__wbg_ptr); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + deferred1_0 = r0; + deferred1_1 = r1; + return getStringFromWasm0(r0, r1); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } + } + /** + * @param {string} arg0 + */ + set name(arg0) { + const ptr0 = passStringToWasm0( + arg0, + wasm.__wbindgen_malloc, + wasm.__wbindgen_realloc, + ); + const len0 = WASM_VECTOR_LEN; + wasm.__wbg_set_eip712domainmsg_name(this.__wbg_ptr, ptr0, len0); + } + /** + * @returns {string} + */ + get version() { + let deferred1_0; + let deferred1_1; + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.__wbg_get_eip712domainmsg_version(retptr, this.__wbg_ptr); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + deferred1_0 = r0; + deferred1_1 = r1; + return getStringFromWasm0(r0, r1); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } + } + /** + * @param {string} arg0 + */ + set version(arg0) { + const ptr0 = passStringToWasm0( + arg0, + wasm.__wbindgen_malloc, + wasm.__wbindgen_realloc, + ); + const len0 = WASM_VECTOR_LEN; + wasm.__wbg_set_eip712domainmsg_version(this.__wbg_ptr, ptr0, len0); + } + /** + * @returns {Uint8Array} + */ + get chain_id() { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.__wbg_get_eip712domainmsg_chain_id(retptr, this.__wbg_ptr); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var v1 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 1, 1); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * @param {Uint8Array} arg0 + */ + set chain_id(arg0) { + const ptr0 = passArray8ToWasm0(arg0, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + wasm.__wbg_set_eip712domainmsg_chain_id(this.__wbg_ptr, ptr0, len0); + } + /** + * @returns {string} + */ + get verifying_contract() { + let deferred1_0; + let deferred1_1; + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.__wbg_get_eip712domainmsg_verifying_contract(retptr, this.__wbg_ptr); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + deferred1_0 = r0; + deferred1_1 = r1; + return getStringFromWasm0(r0, r1); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } + } + /** + * @param {string} arg0 + */ + set verifying_contract(arg0) { + const ptr0 = passStringToWasm0( + arg0, + wasm.__wbindgen_malloc, + wasm.__wbindgen_realloc, + ); + const len0 = WASM_VECTOR_LEN; + wasm.__wbg_set_eip712domainmsg_verifying_contract( + this.__wbg_ptr, + ptr0, + len0, + ); + } + /** + * @returns {Uint8Array} + */ + get salt() { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.__wbg_get_eip712domainmsg_salt(retptr, this.__wbg_ptr); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var v1 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 1, 1); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * @param {Uint8Array} arg0 + */ + set salt(arg0) { + const ptr0 = passArray8ToWasm0(arg0, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + wasm.__wbg_set_eip712domainmsg_salt(this.__wbg_ptr, ptr0, len0); + } +} +module.exports.Eip712DomainMsg = Eip712DomainMsg; + +const PlaintextFinalization = + typeof FinalizationRegistry === 'undefined' + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry((ptr) => wasm.__wbg_plaintext_free(ptr >>> 0)); +/** + */ +class Plaintext { + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + PlaintextFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_plaintext_free(ptr); + } + /** + * @returns {bigint} + */ + get lowest_bits() { + const ret = wasm.__wbg_get_plaintext_lowest_bits(this.__wbg_ptr); + return BigInt.asUintN(64, ret); + } + /** + * @param {bigint} arg0 + */ + set lowest_bits(arg0) { + wasm.__wbg_set_plaintext_lowest_bits(this.__wbg_ptr, arg0); + } + /** + * @returns {bigint} + */ + get middle_bits() { + const ret = wasm.__wbg_get_plaintext_middle_bits(this.__wbg_ptr); + return BigInt.asUintN(64, ret); + } + /** + * @param {bigint} arg0 + */ + set middle_bits(arg0) { + wasm.__wbg_set_plaintext_middle_bits(this.__wbg_ptr, arg0); + } + /** + * @returns {number} + */ + get higest_bits() { + const ret = wasm.__wbg_get_plaintext_higest_bits(this.__wbg_ptr); + return ret >>> 0; + } + /** + * @param {number} arg0 + */ + set higest_bits(arg0) { + wasm.__wbg_set_plaintext_higest_bits(this.__wbg_ptr, arg0); + } +} +module.exports.Plaintext = Plaintext; + +const PrivateEncKeyFinalization = + typeof FinalizationRegistry === 'undefined' + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry((ptr) => + wasm.__wbg_privateenckey_free(ptr >>> 0), + ); +/** + */ +class PrivateEncKey { + static __wrap(ptr) { + ptr = ptr >>> 0; + const obj = Object.create(PrivateEncKey.prototype); + obj.__wbg_ptr = ptr; + PrivateEncKeyFinalization.register(obj, obj.__wbg_ptr, obj); + return obj; + } + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + PrivateEncKeyFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_privateenckey_free(ptr); + } +} +module.exports.PrivateEncKey = PrivateEncKey; + +const PrivateSigKeyFinalization = + typeof FinalizationRegistry === 'undefined' + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry((ptr) => + wasm.__wbg_privatesigkey_free(ptr >>> 0), + ); +/** + */ +class PrivateSigKey { + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + PrivateSigKeyFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_privatesigkey_free(ptr); + } +} +module.exports.PrivateSigKey = PrivateSigKey; + +const PublicEncKeyFinalization = + typeof FinalizationRegistry === 'undefined' + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry((ptr) => + wasm.__wbg_publicenckey_free(ptr >>> 0), + ); +/** + */ +class PublicEncKey { + static __wrap(ptr) { + ptr = ptr >>> 0; + const obj = Object.create(PublicEncKey.prototype); + obj.__wbg_ptr = ptr; + PublicEncKeyFinalization.register(obj, obj.__wbg_ptr, obj); + return obj; + } + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + PublicEncKeyFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_publicenckey_free(ptr); + } +} +module.exports.PublicEncKey = PublicEncKey; + +const PublicSigKeyFinalization = + typeof FinalizationRegistry === 'undefined' + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry((ptr) => + wasm.__wbg_publicsigkey_free(ptr >>> 0), + ); +/** + */ +class PublicSigKey { + static __unwrap(jsValue) { + if (!(jsValue instanceof PublicSigKey)) { + return 0; + } + return jsValue.__destroy_into_raw(); + } + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + PublicSigKeyFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_publicsigkey_free(ptr); + } +} +module.exports.PublicSigKey = PublicSigKey; + +const ReencryptionRequestFinalization = + typeof FinalizationRegistry === 'undefined' + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry((ptr) => + wasm.__wbg_reencryptionrequest_free(ptr >>> 0), + ); +/** + */ +class ReencryptionRequest { + static __wrap(ptr) { + ptr = ptr >>> 0; + const obj = Object.create(ReencryptionRequest.prototype); + obj.__wbg_ptr = ptr; + ReencryptionRequestFinalization.register(obj, obj.__wbg_ptr, obj); + return obj; + } + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + ReencryptionRequestFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_reencryptionrequest_free(ptr); + } + /** + * Signature of the ASN1 DER serialization of \[ReencryptionRequestPayload\]. + * @returns {Uint8Array} + */ + get signature() { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.__wbg_get_reencryptionrequest_signature(retptr, this.__wbg_ptr); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var v1 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 1, 1); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Signature of the ASN1 DER serialization of \[ReencryptionRequestPayload\]. + * @param {Uint8Array} arg0 + */ + set signature(arg0) { + const ptr0 = passArray8ToWasm0(arg0, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + wasm.__wbg_set_eip712domainmsg_name(this.__wbg_ptr, ptr0, len0); + } + /** + * @returns {ReencryptionRequestPayload | undefined} + */ + get payload() { + const ret = wasm.__wbg_get_reencryptionrequest_payload(this.__wbg_ptr); + return ret === 0 ? undefined : ReencryptionRequestPayload.__wrap(ret); + } + /** + * @param {ReencryptionRequestPayload | undefined} [arg0] + */ + set payload(arg0) { + let ptr0 = 0; + if (!isLikeNone(arg0)) { + _assertClass(arg0, ReencryptionRequestPayload); + ptr0 = arg0.__destroy_into_raw(); + } + wasm.__wbg_set_reencryptionrequest_payload(this.__wbg_ptr, ptr0); + } + /** + * @returns {Eip712DomainMsg | undefined} + */ + get domain() { + const ret = wasm.__wbg_get_reencryptionrequest_domain(this.__wbg_ptr); + return ret === 0 ? undefined : Eip712DomainMsg.__wrap(ret); + } + /** + * @param {Eip712DomainMsg | undefined} [arg0] + */ + set domain(arg0) { + let ptr0 = 0; + if (!isLikeNone(arg0)) { + _assertClass(arg0, Eip712DomainMsg); + ptr0 = arg0.__destroy_into_raw(); + } + wasm.__wbg_set_reencryptionrequest_domain(this.__wbg_ptr, ptr0); + } + /** + * The ID that identifies this request. + * Future queries for the result must use this request ID. + * @returns {RequestId | undefined} + */ + get request_id() { + const ret = wasm.__wbg_get_reencryptionrequest_request_id(this.__wbg_ptr); + return ret === 0 ? undefined : RequestId.__wrap(ret); + } + /** + * The ID that identifies this request. + * Future queries for the result must use this request ID. + * @param {RequestId | undefined} [arg0] + */ + set request_id(arg0) { + let ptr0 = 0; + if (!isLikeNone(arg0)) { + _assertClass(arg0, RequestId); + ptr0 = arg0.__destroy_into_raw(); + } + wasm.__wbg_set_reencryptionrequest_request_id(this.__wbg_ptr, ptr0); + } +} +module.exports.ReencryptionRequest = ReencryptionRequest; + +const ReencryptionRequestPayloadFinalization = + typeof FinalizationRegistry === 'undefined' + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry((ptr) => + wasm.__wbg_reencryptionrequestpayload_free(ptr >>> 0), + ); +/** + */ +class ReencryptionRequestPayload { + static __wrap(ptr) { + ptr = ptr >>> 0; + const obj = Object.create(ReencryptionRequestPayload.prototype); + obj.__wbg_ptr = ptr; + ReencryptionRequestPayloadFinalization.register(obj, obj.__wbg_ptr, obj); + return obj; + } + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + ReencryptionRequestPayloadFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_reencryptionrequestpayload_free(ptr); + } + /** + * Version of the request format. + * @returns {number} + */ + get version() { + const ret = wasm.__wbg_get_reencryptionrequestpayload_version( + this.__wbg_ptr, + ); + return ret >>> 0; + } + /** + * Version of the request format. + * @param {number} arg0 + */ + set version(arg0) { + wasm.__wbg_set_reencryptionrequestpayload_version(this.__wbg_ptr, arg0); + } + /** + * The amount of shares needed to recombine the result. + * This implies the threshold used. + * Needed to avoid a single malicious server taking over a request that should + * have been distributed. + * @returns {number} + */ + get servers_needed() { + const ret = wasm.__wbg_get_reencryptionrequestpayload_servers_needed( + this.__wbg_ptr, + ); + return ret >>> 0; + } + /** + * The amount of shares needed to recombine the result. + * This implies the threshold used. + * Needed to avoid a single malicious server taking over a request that should + * have been distributed. + * @param {number} arg0 + */ + set servers_needed(arg0) { + wasm.__wbg_set_reencryptionrequestpayload_servers_needed( + this.__wbg_ptr, + arg0, + ); + } + /** + * The server's signature verification key. + * Encoded using SEC1. + * TODO not needed in the request! Should be removed + * @returns {Uint8Array} + */ + get verification_key() { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.__wbg_get_reencryptionrequest_signature(retptr, this.__wbg_ptr); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var v1 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 1, 1); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * The server's signature verification key. + * Encoded using SEC1. + * TODO not needed in the request! Should be removed + * @param {Uint8Array} arg0 + */ + set verification_key(arg0) { + const ptr0 = passArray8ToWasm0(arg0, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + wasm.__wbg_set_eip712domainmsg_name(this.__wbg_ptr, ptr0, len0); + } + /** + * Randomness specified in the request to ensure EU-CMA of the signed response. + * TODO check that we don't need two types of randomness. One for the reuqest and one for the response + * TODO also check potential risk with repeated calls + * @returns {Uint8Array} + */ + get randomness() { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.__wbg_get_reencryptionrequestpayload_randomness( + retptr, + this.__wbg_ptr, + ); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var v1 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 1, 1); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Randomness specified in the request to ensure EU-CMA of the signed response. + * TODO check that we don't need two types of randomness. One for the reuqest and one for the response + * TODO also check potential risk with repeated calls + * @param {Uint8Array} arg0 + */ + set randomness(arg0) { + const ptr0 = passArray8ToWasm0(arg0, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + wasm.__wbg_set_eip712domainmsg_version(this.__wbg_ptr, ptr0, len0); + } + /** + * Encoding of the user's public encryption key for this request. + * Encoding using the default encoding of libsodium, i.e. the 32 bytes of a + * Montgomery point. + * @returns {Uint8Array} + */ + get enc_key() { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.__wbg_get_eip712domainmsg_chain_id(retptr, this.__wbg_ptr); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var v1 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 1, 1); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Encoding of the user's public encryption key for this request. + * Encoding using the default encoding of libsodium, i.e. the 32 bytes of a + * Montgomery point. + * @param {Uint8Array} arg0 + */ + set enc_key(arg0) { + const ptr0 = passArray8ToWasm0(arg0, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + wasm.__wbg_set_eip712domainmsg_chain_id(this.__wbg_ptr, ptr0, len0); + } + /** + * The type of plaintext encrypted. + * @returns {number} + */ + get fhe_type() { + const ret = wasm.__wbg_get_reencryptionrequestpayload_fhe_type( + this.__wbg_ptr, + ); + return ret; + } + /** + * The type of plaintext encrypted. + * @param {number} arg0 + */ + set fhe_type(arg0) { + wasm.__wbg_set_reencryptionrequestpayload_fhe_type(this.__wbg_ptr, arg0); + } + /** + * The key id to use for decryption. Will be the request_id used during key generation + * @returns {RequestId | undefined} + */ + get key_id() { + const ret = wasm.__wbg_get_reencryptionrequestpayload_key_id( + this.__wbg_ptr, + ); + return ret === 0 ? undefined : RequestId.__wrap(ret); + } + /** + * The key id to use for decryption. Will be the request_id used during key generation + * @param {RequestId | undefined} [arg0] + */ + set key_id(arg0) { + let ptr0 = 0; + if (!isLikeNone(arg0)) { + _assertClass(arg0, RequestId); + ptr0 = arg0.__destroy_into_raw(); + } + wasm.__wbg_set_reencryptionrequestpayload_key_id(this.__wbg_ptr, ptr0); + } + /** + * The actual ciphertext to decrypt, taken directly from the fhevm. + * When creating the payload, this field may be empty, + * it is the responsibility of the gateway to fetch the + * ciphertext for the given digest below. + * @returns {Uint8Array | undefined} + */ + get ciphertext() { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.__wbg_get_reencryptionrequestpayload_ciphertext( + retptr, + this.__wbg_ptr, + ); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + let v1; + if (r0 !== 0) { + v1 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 1, 1); + } + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * The actual ciphertext to decrypt, taken directly from the fhevm. + * When creating the payload, this field may be empty, + * it is the responsibility of the gateway to fetch the + * ciphertext for the given digest below. + * @param {Uint8Array | undefined} [arg0] + */ + set ciphertext(arg0) { + var ptr0 = isLikeNone(arg0) + ? 0 + : passArray8ToWasm0(arg0, wasm.__wbindgen_malloc); + var len0 = WASM_VECTOR_LEN; + wasm.__wbg_set_reencryptionrequestpayload_ciphertext( + this.__wbg_ptr, + ptr0, + len0, + ); + } + /** + * The SHA3 digest of the ciphertext above. + * @returns {Uint8Array} + */ + get ciphertext_digest() { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.__wbg_get_reencryptionrequestpayload_ciphertext_digest( + retptr, + this.__wbg_ptr, + ); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var v1 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 1, 1); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * The SHA3 digest of the ciphertext above. + * @param {Uint8Array} arg0 + */ + set ciphertext_digest(arg0) { + const ptr0 = passArray8ToWasm0(arg0, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + wasm.__wbg_set_eip712domainmsg_verifying_contract( + this.__wbg_ptr, + ptr0, + len0, + ); + } +} +module.exports.ReencryptionRequestPayload = ReencryptionRequestPayload; + +const ReencryptionResponseFinalization = + typeof FinalizationRegistry === 'undefined' + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry((ptr) => + wasm.__wbg_reencryptionresponse_free(ptr >>> 0), + ); +/** + */ +class ReencryptionResponse { + static __unwrap(jsValue) { + if (!(jsValue instanceof ReencryptionResponse)) { + return 0; + } + return jsValue.__destroy_into_raw(); + } + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + ReencryptionResponseFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_reencryptionresponse_free(ptr); + } + /** + * Version of the response format. + * @returns {number} + */ + get version() { + const ret = wasm.__wbg_get_reencryptionresponse_version(this.__wbg_ptr); + return ret >>> 0; + } + /** + * Version of the response format. + * @param {number} arg0 + */ + set version(arg0) { + wasm.__wbg_set_reencryptionresponse_version(this.__wbg_ptr, arg0); + } + /** + * Servers_needed are not really needed since there is a link to the + * digest, however, it seems better to be able to handle a response without + * getting data from the request as well. but this is also a security issue + * since it is possible to get meaning from the response without directly + * linking it to a request + * + * The amount of shares needed to recombine the result. + * This implies the threshold used. + * @returns {number} + */ + get servers_needed() { + const ret = wasm.__wbg_get_reencryptionresponse_servers_needed( + this.__wbg_ptr, + ); + return ret >>> 0; + } + /** + * Servers_needed are not really needed since there is a link to the + * digest, however, it seems better to be able to handle a response without + * getting data from the request as well. but this is also a security issue + * since it is possible to get meaning from the response without directly + * linking it to a request + * + * The amount of shares needed to recombine the result. + * This implies the threshold used. + * @param {number} arg0 + */ + set servers_needed(arg0) { + wasm.__wbg_set_reencryptionresponse_servers_needed(this.__wbg_ptr, arg0); + } + /** + * The server's signature verification key. + * Encoded using SEC1. + * Needed to validate the response, but MUST also be linked to a list of + * trusted keys. + * @returns {Uint8Array} + */ + get verification_key() { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.__wbg_get_reencryptionrequest_signature(retptr, this.__wbg_ptr); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var v1 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 1, 1); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * The server's signature verification key. + * Encoded using SEC1. + * Needed to validate the response, but MUST also be linked to a list of + * trusted keys. + * @param {Uint8Array} arg0 + */ + set verification_key(arg0) { + const ptr0 = passArray8ToWasm0(arg0, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + wasm.__wbg_set_eip712domainmsg_name(this.__wbg_ptr, ptr0, len0); + } + /** + * Digest of the request validated. + * Needed to ensure that the response is for the expected request. + * @returns {Uint8Array} + */ + get digest() { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.__wbg_get_reencryptionrequestpayload_randomness( + retptr, + this.__wbg_ptr, + ); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var v1 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 1, 1); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Digest of the request validated. + * Needed to ensure that the response is for the expected request. + * @param {Uint8Array} arg0 + */ + set digest(arg0) { + const ptr0 = passArray8ToWasm0(arg0, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + wasm.__wbg_set_eip712domainmsg_version(this.__wbg_ptr, ptr0, len0); + } + /** + * The type of plaintext encrypted. + * @returns {number} + */ + get fhe_type() { + const ret = wasm.__wbg_get_reencryptionresponse_fhe_type(this.__wbg_ptr); + return ret; + } + /** + * The type of plaintext encrypted. + * @param {number} arg0 + */ + set fhe_type(arg0) { + wasm.__wbg_set_reencryptionresponse_fhe_type(this.__wbg_ptr, arg0); + } + /** + * The signcrypted payload, using a hybrid encryption approach in + * sign-then-encrypt. + * @returns {Uint8Array} + */ + get signcrypted_ciphertext() { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.__wbg_get_eip712domainmsg_chain_id(retptr, this.__wbg_ptr); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var v1 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 1, 1); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * The signcrypted payload, using a hybrid encryption approach in + * sign-then-encrypt. + * @param {Uint8Array} arg0 + */ + set signcrypted_ciphertext(arg0) { + const ptr0 = passArray8ToWasm0(arg0, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + wasm.__wbg_set_eip712domainmsg_chain_id(this.__wbg_ptr, ptr0, len0); + } +} +module.exports.ReencryptionResponse = ReencryptionResponse; + +const RequestIdFinalization = + typeof FinalizationRegistry === 'undefined' + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry((ptr) => wasm.__wbg_requestid_free(ptr >>> 0)); +/** + * Simple response to return an ID, to be used to retrieve the computed result later on. + */ +class RequestId { + static __wrap(ptr) { + ptr = ptr >>> 0; + const obj = Object.create(RequestId.prototype); + obj.__wbg_ptr = ptr; + RequestIdFinalization.register(obj, obj.__wbg_ptr, obj); + return obj; + } + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + RequestIdFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_requestid_free(ptr); + } + /** + * @returns {string} + */ + get request_id() { + let deferred1_0; + let deferred1_1; + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.__wbg_get_eip712domainmsg_name(retptr, this.__wbg_ptr); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + deferred1_0 = r0; + deferred1_1 = r1; + return getStringFromWasm0(r0, r1); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } + } + /** + * @param {string} arg0 + */ + set request_id(arg0) { + const ptr0 = passStringToWasm0( + arg0, + wasm.__wbindgen_malloc, + wasm.__wbindgen_realloc, + ); + const len0 = WASM_VECTOR_LEN; + wasm.__wbg_set_eip712domainmsg_name(this.__wbg_ptr, ptr0, len0); + } +} +module.exports.RequestId = RequestId; + +module.exports.__wbg_reencryptionresponse_unwrap = function (arg0) { + const ret = ReencryptionResponse.__unwrap(takeObject(arg0)); + return ret; +}; + +module.exports.__wbindgen_object_drop_ref = function (arg0) { + takeObject(arg0); +}; + +module.exports.__wbindgen_error_new = function (arg0, arg1) { + const ret = new Error(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); +}; + +module.exports.__wbg_publicsigkey_unwrap = function (arg0) { + const ret = PublicSigKey.__unwrap(takeObject(arg0)); + return ret; +}; + +module.exports.__wbg_new_abda76e883ba8a5f = function () { + const ret = new Error(); + return addHeapObject(ret); +}; + +module.exports.__wbg_stack_658279fe44541cf6 = function (arg0, arg1) { + const ret = getObject(arg1).stack; + const ptr1 = passStringToWasm0( + ret, + wasm.__wbindgen_malloc, + wasm.__wbindgen_realloc, + ); + const len1 = WASM_VECTOR_LEN; + getInt32Memory0()[arg0 / 4 + 1] = len1; + getInt32Memory0()[arg0 / 4 + 0] = ptr1; +}; + +module.exports.__wbg_error_f851667af71bcfc6 = function (arg0, arg1) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.error(getStringFromWasm0(arg0, arg1)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + } +}; + +module.exports.__wbg_crypto_1d1f22824a6a080c = function (arg0) { + const ret = getObject(arg0).crypto; + return addHeapObject(ret); +}; + +module.exports.__wbindgen_is_object = function (arg0) { + const val = getObject(arg0); + const ret = typeof val === 'object' && val !== null; + return ret; +}; + +module.exports.__wbg_process_4a72847cc503995b = function (arg0) { + const ret = getObject(arg0).process; + return addHeapObject(ret); +}; + +module.exports.__wbg_versions_f686565e586dd935 = function (arg0) { + const ret = getObject(arg0).versions; + return addHeapObject(ret); +}; + +module.exports.__wbg_node_104a2ff8d6ea03a2 = function (arg0) { + const ret = getObject(arg0).node; + return addHeapObject(ret); +}; + +module.exports.__wbindgen_is_string = function (arg0) { + const ret = typeof getObject(arg0) === 'string'; + return ret; +}; + +module.exports.__wbg_msCrypto_eb05e62b530a1508 = function (arg0) { + const ret = getObject(arg0).msCrypto; + return addHeapObject(ret); +}; + +module.exports.__wbg_require_cca90b1a94a0255b = function () { + return handleError(function () { + const ret = module.require; + return addHeapObject(ret); + }, arguments); +}; + +module.exports.__wbindgen_is_function = function (arg0) { + const ret = typeof getObject(arg0) === 'function'; + return ret; +}; + +module.exports.__wbindgen_string_new = function (arg0, arg1) { + const ret = getStringFromWasm0(arg0, arg1); + return addHeapObject(ret); +}; + +module.exports.__wbg_randomFillSync_5c9c955aa56b6049 = function () { + return handleError(function (arg0, arg1) { + getObject(arg0).randomFillSync(takeObject(arg1)); + }, arguments); +}; + +module.exports.__wbg_getRandomValues_3aa56aa6edec874c = function () { + return handleError(function (arg0, arg1) { + getObject(arg0).getRandomValues(getObject(arg1)); + }, arguments); +}; + +module.exports.__wbg_newnoargs_e258087cd0daa0ea = function (arg0, arg1) { + const ret = new Function(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); +}; + +module.exports.__wbg_call_27c0f87801dedf93 = function () { + return handleError(function (arg0, arg1) { + const ret = getObject(arg0).call(getObject(arg1)); + return addHeapObject(ret); + }, arguments); +}; + +module.exports.__wbindgen_object_clone_ref = function (arg0) { + const ret = getObject(arg0); + return addHeapObject(ret); +}; + +module.exports.__wbg_self_ce0dbfc45cf2f5be = function () { + return handleError(function () { + const ret = self.self; + return addHeapObject(ret); + }, arguments); +}; + +module.exports.__wbg_window_c6fb939a7f436783 = function () { + return handleError(function () { + const ret = window.window; + return addHeapObject(ret); + }, arguments); +}; + +module.exports.__wbg_globalThis_d1e6af4856ba331b = function () { + return handleError(function () { + const ret = globalThis.globalThis; + return addHeapObject(ret); + }, arguments); +}; + +module.exports.__wbg_global_207b558942527489 = function () { + return handleError(function () { + const ret = global.global; + return addHeapObject(ret); + }, arguments); +}; + +module.exports.__wbindgen_is_undefined = function (arg0) { + const ret = getObject(arg0) === undefined; + return ret; +}; + +module.exports.__wbg_call_b3ca7c6051f9bec1 = function () { + return handleError(function (arg0, arg1, arg2) { + const ret = getObject(arg0).call(getObject(arg1), getObject(arg2)); + return addHeapObject(ret); + }, arguments); +}; + +module.exports.__wbg_buffer_12d079cc21e14bdb = function (arg0) { + const ret = getObject(arg0).buffer; + return addHeapObject(ret); +}; + +module.exports.__wbg_newwithbyteoffsetandlength_aa4a17c33a06e5cb = function ( + arg0, + arg1, + arg2, +) { + const ret = new Uint8Array(getObject(arg0), arg1 >>> 0, arg2 >>> 0); + return addHeapObject(ret); +}; + +module.exports.__wbg_new_63b92bc8671ed464 = function (arg0) { + const ret = new Uint8Array(getObject(arg0)); + return addHeapObject(ret); +}; + +module.exports.__wbg_set_a47bac70306a19a7 = function (arg0, arg1, arg2) { + getObject(arg0).set(getObject(arg1), arg2 >>> 0); +}; + +module.exports.__wbg_newwithlength_e9b4878cebadb3d3 = function (arg0) { + const ret = new Uint8Array(arg0 >>> 0); + return addHeapObject(ret); +}; + +module.exports.__wbg_subarray_a1f73cd4b5b42fe1 = function (arg0, arg1, arg2) { + const ret = getObject(arg0).subarray(arg1 >>> 0, arg2 >>> 0); + return addHeapObject(ret); +}; + +module.exports.__wbindgen_throw = function (arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); +}; + +module.exports.__wbindgen_memory = function () { + const ret = wasm.memory; + return addHeapObject(ret); +}; + +const path = require('path').join(__dirname, 'kms_lib_bg.wasm'); +const bytes = require('fs').readFileSync(path); + +const wasmModule = new WebAssembly.Module(bytes); +const wasmInstance = new WebAssembly.Instance(wasmModule, imports); +wasm = wasmInstance.exports; +module.exports.__wasm = wasm; diff --git a/src/kms/kms_lib_bg.wasm b/src/kms/node/kms_lib_bg.wasm similarity index 100% rename from src/kms/kms_lib_bg.wasm rename to src/kms/node/kms_lib_bg.wasm diff --git a/src/kms/kms_lib_bg.wasm.d.ts b/src/kms/node/kms_lib_bg.wasm.d.ts similarity index 100% rename from src/kms/kms_lib_bg.wasm.d.ts rename to src/kms/node/kms_lib_bg.wasm.d.ts diff --git a/src/kms/README.md b/src/kms/web/README.md similarity index 100% rename from src/kms/README.md rename to src/kms/web/README.md diff --git a/src/kms/web/kms_lib.d.ts b/src/kms/web/kms_lib.d.ts new file mode 100644 index 0000000..abb9b57 --- /dev/null +++ b/src/kms/web/kms_lib.d.ts @@ -0,0 +1,404 @@ +/* tslint:disable */ +/* eslint-disable */ +/** +* @param {(PublicSigKey)[]} server_pks +* @param {PublicSigKey} client_pk +* @param {number} shares_needed +* @param {string} params_json +* @returns {Client} +*/ +export function new_client(server_pks: (PublicSigKey)[], client_pk: PublicSigKey, shares_needed: number, params_json: string): Client; +/** +* @returns {PrivateEncKey} +*/ +export function cryptobox_keygen(): PrivateEncKey; +/** +* @param {PrivateEncKey} sk +* @returns {PublicEncKey} +*/ +export function cryptobox_get_pk(sk: PrivateEncKey): PublicEncKey; +/** +* @param {PublicEncKey} pk +* @returns {Uint8Array} +*/ +export function cryptobox_pk_to_u8vec(pk: PublicEncKey): Uint8Array; +/** +* @param {PrivateEncKey} sk +* @returns {Uint8Array} +*/ +export function cryptobox_sk_to_u8vec(sk: PrivateEncKey): Uint8Array; +/** +* @param {Uint8Array} v +* @returns {PublicEncKey} +*/ +export function u8vec_to_cryptobox_pk(v: Uint8Array): PublicEncKey; +/** +* @param {Uint8Array} v +* @returns {PrivateEncKey} +*/ +export function u8vec_to_cryptobox_sk(v: Uint8Array): PrivateEncKey; +/** +* @param {Uint8Array} msg +* @param {PublicEncKey} their_pk +* @param {PrivateEncKey} my_sk +* @returns {CryptoBoxCt} +*/ +export function cryptobox_encrypt(msg: Uint8Array, their_pk: PublicEncKey, my_sk: PrivateEncKey): CryptoBoxCt; +/** +* @param {CryptoBoxCt} ct +* @param {PrivateEncKey} my_sk +* @param {PublicEncKey} their_pk +* @returns {Uint8Array} +*/ +export function cryptobox_decrypt(ct: CryptoBoxCt, my_sk: PrivateEncKey, their_pk: PublicEncKey): Uint8Array; +/** +* This function assembles [ReencryptionRequest] +* from a signature and other metadata. +* The signature is on the ephemeral public key +* signed by the client's private key +* following the EIP712 standard. +* @param {Client} client +* @param {Uint8Array} signature +* @param {PublicEncKey} enc_pk +* @param {FheType} fhe_type +* @param {RequestId} key_id +* @param {Uint8Array} ciphertext_digest +* @param {Eip712DomainMsg} domain +* @returns {ReencryptionRequest} +*/ +export function make_reencryption_req(client: Client, signature: Uint8Array, enc_pk: PublicEncKey, fhe_type: FheType, key_id: RequestId, ciphertext_digest: Uint8Array, domain: Eip712DomainMsg): ReencryptionRequest; +/** +* This function takes [AggregatedReencryptionResponse] normally +* but wasm does not support HashMap so we need to take two parameters: +* `agg_resp` and `agg_resp_id`. +* @param {Client} client +* @param {ReencryptionRequest | undefined} request +* @param {(ReencryptionResponse)[]} agg_resp +* @param {Uint32Array} agg_resp_ids +* @param {PublicEncKey} enc_pk +* @param {PrivateEncKey} enc_sk +* @returns {number} +*/ +export function process_reencryption_resp(client: Client, request: ReencryptionRequest | undefined, agg_resp: (ReencryptionResponse)[], agg_resp_ids: Uint32Array, enc_pk: PublicEncKey, enc_sk: PrivateEncKey): number; +/** +* The plaintext types that can be encrypted in a fhevm ciphertext. +*/ +export enum FheType { + Bool = 0, + Euint4 = 1, + Euint8 = 2, + Euint16 = 3, + Euint32 = 4, + Euint64 = 5, + Euint128 = 6, + Euint160 = 7, +} +/** +* Simple client to interact with the KMS servers. This can be seen as a proof-of-concept +* and reference code for validating the KMS. The logic supplied by the client will be +* distributed accross the aggregator/proxy and smart contracts. +* TODO should probably aggregate the KmsEndpointClient to void having two client code bases +* exposed in tests and MVP +* +* client_sk is optional because sometimes the private signing key is kept +* in a secure location, e.g., hardware wallet. Calling functions that requires +* client_sk when it is None will return an error. +*/ +export class Client { + free(): void; +} +/** +*/ +export class CryptoBoxCt { + free(): void; +} +/** +* +* eventually chain_id, verifying_contract and salt will be parsed in to solidity types +*/ +export class Eip712DomainMsg { + free(): void; +/** +*/ + chain_id: Uint8Array; +/** +*/ + name: string; +/** +*/ + salt: Uint8Array; +/** +*/ + verifying_contract: string; +/** +*/ + version: string; +} +/** +*/ +export class Plaintext { + free(): void; +/** +*/ + higest_bits: number; +/** +*/ + lowest_bits: bigint; +/** +*/ + middle_bits: bigint; +} +/** +*/ +export class PrivateEncKey { + free(): void; +} +/** +*/ +export class PrivateSigKey { + free(): void; +} +/** +*/ +export class PublicEncKey { + free(): void; +} +/** +*/ +export class PublicSigKey { + free(): void; +} +/** +*/ +export class ReencryptionRequest { + free(): void; +/** +*/ + domain?: Eip712DomainMsg; +/** +*/ + payload?: ReencryptionRequestPayload; +/** +* The ID that identifies this request. +* Future queries for the result must use this request ID. +*/ + request_id?: RequestId; +/** +* Signature of the ASN1 DER serialization of \[ReencryptionRequestPayload\]. +*/ + signature: Uint8Array; +} +/** +*/ +export class ReencryptionRequestPayload { + free(): void; +/** +* The actual ciphertext to decrypt, taken directly from the fhevm. +* When creating the payload, this field may be empty, +* it is the responsibility of the gateway to fetch the +* ciphertext for the given digest below. +*/ + ciphertext?: Uint8Array; +/** +* The SHA3 digest of the ciphertext above. +*/ + ciphertext_digest: Uint8Array; +/** +* Encoding of the user's public encryption key for this request. +* Encoding using the default encoding of libsodium, i.e. the 32 bytes of a +* Montgomery point. +*/ + enc_key: Uint8Array; +/** +* The type of plaintext encrypted. +*/ + fhe_type: number; +/** +* The key id to use for decryption. Will be the request_id used during key generation +*/ + key_id?: RequestId; +/** +* Randomness specified in the request to ensure EU-CMA of the signed response. +* TODO check that we don't need two types of randomness. One for the reuqest and one for the response +* TODO also check potential risk with repeated calls +*/ + randomness: Uint8Array; +/** +* The amount of shares needed to recombine the result. +* This implies the threshold used. +* Needed to avoid a single malicious server taking over a request that should +* have been distributed. +*/ + servers_needed: number; +/** +* The server's signature verification key. +* Encoded using SEC1. +* TODO not needed in the request! Should be removed +*/ + verification_key: Uint8Array; +/** +* Version of the request format. +*/ + version: number; +} +/** +*/ +export class ReencryptionResponse { + free(): void; +/** +* Digest of the request validated. +* Needed to ensure that the response is for the expected request. +*/ + digest: Uint8Array; +/** +* The type of plaintext encrypted. +*/ + fhe_type: number; +/** +* Servers_needed are not really needed since there is a link to the +* digest, however, it seems better to be able to handle a response without +* getting data from the request as well. but this is also a security issue +* since it is possible to get meaning from the response without directly +* linking it to a request +* +* The amount of shares needed to recombine the result. +* This implies the threshold used. +*/ + servers_needed: number; +/** +* The signcrypted payload, using a hybrid encryption approach in +* sign-then-encrypt. +*/ + signcrypted_ciphertext: Uint8Array; +/** +* The server's signature verification key. +* Encoded using SEC1. +* Needed to validate the response, but MUST also be linked to a list of +* trusted keys. +*/ + verification_key: Uint8Array; +/** +* Version of the response format. +*/ + version: number; +} +/** +* Simple response to return an ID, to be used to retrieve the computed result later on. +*/ +export class RequestId { + free(): void; +/** +*/ + request_id: string; +} + +export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; + +export interface InitOutput { + readonly memory: WebAssembly.Memory; + readonly __wbg_client_free: (a: number) => void; + readonly __wbg_requestid_free: (a: number) => void; + readonly __wbg_reencryptionrequestpayload_free: (a: number) => void; + readonly __wbg_get_reencryptionrequestpayload_version: (a: number) => number; + readonly __wbg_set_reencryptionrequestpayload_version: (a: number, b: number) => void; + readonly __wbg_get_reencryptionrequestpayload_servers_needed: (a: number) => number; + readonly __wbg_set_reencryptionrequestpayload_servers_needed: (a: number, b: number) => void; + readonly __wbg_get_reencryptionrequestpayload_randomness: (a: number, b: number) => void; + readonly __wbg_get_reencryptionrequestpayload_fhe_type: (a: number) => number; + readonly __wbg_set_reencryptionrequestpayload_fhe_type: (a: number, b: number) => void; + readonly __wbg_get_reencryptionrequestpayload_key_id: (a: number) => number; + readonly __wbg_set_reencryptionrequestpayload_key_id: (a: number, b: number) => void; + readonly __wbg_get_reencryptionrequestpayload_ciphertext: (a: number, b: number) => void; + readonly __wbg_set_reencryptionrequestpayload_ciphertext: (a: number, b: number, c: number) => void; + readonly __wbg_get_reencryptionrequestpayload_ciphertext_digest: (a: number, b: number) => void; + readonly __wbg_eip712domainmsg_free: (a: number) => void; + readonly __wbg_get_eip712domainmsg_name: (a: number, b: number) => void; + readonly __wbg_set_eip712domainmsg_name: (a: number, b: number, c: number) => void; + readonly __wbg_get_eip712domainmsg_version: (a: number, b: number) => void; + readonly __wbg_set_eip712domainmsg_version: (a: number, b: number, c: number) => void; + readonly __wbg_get_eip712domainmsg_chain_id: (a: number, b: number) => void; + readonly __wbg_set_eip712domainmsg_chain_id: (a: number, b: number, c: number) => void; + readonly __wbg_get_eip712domainmsg_verifying_contract: (a: number, b: number) => void; + readonly __wbg_set_eip712domainmsg_verifying_contract: (a: number, b: number, c: number) => void; + readonly __wbg_get_eip712domainmsg_salt: (a: number, b: number) => void; + readonly __wbg_set_eip712domainmsg_salt: (a: number, b: number, c: number) => void; + readonly __wbg_reencryptionrequest_free: (a: number) => void; + readonly __wbg_get_reencryptionrequest_signature: (a: number, b: number) => void; + readonly __wbg_get_reencryptionrequest_payload: (a: number) => number; + readonly __wbg_set_reencryptionrequest_payload: (a: number, b: number) => void; + readonly __wbg_get_reencryptionrequest_domain: (a: number) => number; + readonly __wbg_set_reencryptionrequest_domain: (a: number, b: number) => void; + readonly __wbg_get_reencryptionrequest_request_id: (a: number) => number; + readonly __wbg_set_reencryptionrequest_request_id: (a: number, b: number) => void; + readonly __wbg_reencryptionresponse_free: (a: number) => void; + readonly __wbg_get_reencryptionresponse_version: (a: number) => number; + readonly __wbg_set_reencryptionresponse_version: (a: number, b: number) => void; + readonly __wbg_get_reencryptionresponse_servers_needed: (a: number) => number; + readonly __wbg_set_reencryptionresponse_servers_needed: (a: number, b: number) => void; + readonly __wbg_get_reencryptionresponse_fhe_type: (a: number) => number; + readonly __wbg_set_reencryptionresponse_fhe_type: (a: number, b: number) => void; + readonly __wbg_get_reencryptionrequestpayload_enc_key: (a: number, b: number) => void; + readonly __wbg_get_reencryptionrequestpayload_verification_key: (a: number, b: number) => void; + readonly __wbg_get_reencryptionresponse_verification_key: (a: number, b: number) => void; + readonly __wbg_get_reencryptionresponse_digest: (a: number, b: number) => void; + readonly __wbg_get_reencryptionresponse_signcrypted_ciphertext: (a: number, b: number) => void; + readonly __wbg_get_requestid_request_id: (a: number, b: number) => void; + readonly __wbg_set_requestid_request_id: (a: number, b: number, c: number) => void; + readonly __wbg_set_reencryptionrequestpayload_verification_key: (a: number, b: number, c: number) => void; + readonly __wbg_set_reencryptionrequestpayload_randomness: (a: number, b: number, c: number) => void; + readonly __wbg_set_reencryptionrequestpayload_enc_key: (a: number, b: number, c: number) => void; + readonly __wbg_set_reencryptionrequestpayload_ciphertext_digest: (a: number, b: number, c: number) => void; + readonly __wbg_set_reencryptionrequest_signature: (a: number, b: number, c: number) => void; + readonly __wbg_set_reencryptionresponse_verification_key: (a: number, b: number, c: number) => void; + readonly __wbg_set_reencryptionresponse_digest: (a: number, b: number, c: number) => void; + readonly __wbg_set_reencryptionresponse_signcrypted_ciphertext: (a: number, b: number, c: number) => void; + readonly __wbg_plaintext_free: (a: number) => void; + readonly __wbg_get_plaintext_lowest_bits: (a: number) => number; + readonly __wbg_set_plaintext_lowest_bits: (a: number, b: number) => void; + readonly __wbg_get_plaintext_middle_bits: (a: number) => number; + readonly __wbg_set_plaintext_middle_bits: (a: number, b: number) => void; + readonly __wbg_get_plaintext_higest_bits: (a: number) => number; + readonly __wbg_set_plaintext_higest_bits: (a: number, b: number) => void; + readonly new_client: (a: number, b: number, c: number, d: number, e: number, f: number) => number; + readonly __wbg_cryptoboxct_free: (a: number) => void; + readonly cryptobox_keygen: () => number; + readonly cryptobox_get_pk: (a: number) => number; + readonly cryptobox_pk_to_u8vec: (a: number, b: number) => void; + readonly cryptobox_sk_to_u8vec: (a: number, b: number) => void; + readonly u8vec_to_cryptobox_pk: (a: number, b: number, c: number) => void; + readonly u8vec_to_cryptobox_sk: (a: number, b: number, c: number) => void; + readonly cryptobox_encrypt: (a: number, b: number, c: number, d: number) => number; + readonly cryptobox_decrypt: (a: number, b: number, c: number, d: number) => void; + readonly make_reencryption_req: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number) => void; + readonly process_reencryption_resp: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number) => void; + readonly __wbg_publicenckey_free: (a: number) => void; + readonly __wbg_privateenckey_free: (a: number) => void; + readonly __wbg_publicsigkey_free: (a: number) => void; + readonly __wbg_privatesigkey_free: (a: number) => void; + readonly __wbindgen_add_to_stack_pointer: (a: number) => number; + readonly __wbindgen_free: (a: number, b: number, c: number) => void; + readonly __wbindgen_malloc: (a: number, b: number) => number; + readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; + readonly __wbindgen_exn_store: (a: number) => void; +} + +export type SyncInitInput = BufferSource | WebAssembly.Module; +/** +* Instantiates the given `module`, which can either be bytes or +* a precompiled `WebAssembly.Module`. +* +* @param {SyncInitInput} module +* +* @returns {InitOutput} +*/ +export function initSync(module: SyncInitInput): InitOutput; + +/** +* If `module_or_path` is {RequestInfo} or {URL}, makes a request and +* for everything else, calls `WebAssembly.instantiate` directly. +* +* @param {InitInput | Promise} module_or_path +* +* @returns {Promise} +*/ +export default function __wbg_init (module_or_path?: InitInput | Promise): Promise; diff --git a/src/kms/kms_lib.js b/src/kms/web/kms_lib.js similarity index 80% rename from src/kms/kms_lib.js rename to src/kms/web/kms_lib.js index c22113b..d5ef7fb 100644 --- a/src/kms/kms_lib.js +++ b/src/kms/web/kms_lib.js @@ -1,7 +1,4 @@ -let imports = {}; -imports['__wbindgen_placeholder__'] = module.exports; let wasm; -const { TextDecoder, TextEncoder } = require(`util`); const heap = new Array(128).fill(undefined); @@ -23,9 +20,9 @@ function takeObject(idx) { return ret; } -let cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }); +const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); -cachedTextDecoder.decode(); +if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; let cachedUint8Memory0 = null; @@ -61,7 +58,7 @@ function getInt32Memory0() { let WASM_VECTOR_LEN = 0; -let cachedTextEncoder = new TextEncoder('utf-8'); +const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' ? function (arg, view) { @@ -163,7 +160,7 @@ function passArrayJsValueToWasm0(array, malloc) { * @param {string} params_json * @returns {Client} */ -module.exports.new_client = function(server_pks, client_pk, shares_needed, params_json) { +export function new_client(server_pks, client_pk, shares_needed, params_json) { const ptr0 = passArrayJsValueToWasm0(server_pks, wasm.__wbindgen_malloc); const len0 = WASM_VECTOR_LEN; _assertClass(client_pk, PublicSigKey); @@ -172,31 +169,31 @@ module.exports.new_client = function(server_pks, client_pk, shares_needed, param const len2 = WASM_VECTOR_LEN; const ret = wasm.new_client(ptr0, len0, ptr1, shares_needed, ptr2, len2); return Client.__wrap(ret); -}; +} /** * @returns {PrivateEncKey} */ -module.exports.cryptobox_keygen = function() { +export function cryptobox_keygen() { const ret = wasm.cryptobox_keygen(); return PrivateEncKey.__wrap(ret); -}; +} /** * @param {PrivateEncKey} sk * @returns {PublicEncKey} */ -module.exports.cryptobox_get_pk = function(sk) { +export function cryptobox_get_pk(sk) { _assertClass(sk, PrivateEncKey); const ret = wasm.cryptobox_get_pk(sk.__wbg_ptr); return PublicEncKey.__wrap(ret); -}; +} /** * @param {PublicEncKey} pk * @returns {Uint8Array} */ -module.exports.cryptobox_pk_to_u8vec = function(pk) { +export function cryptobox_pk_to_u8vec(pk) { try { const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); _assertClass(pk, PublicEncKey); @@ -214,13 +211,13 @@ module.exports.cryptobox_pk_to_u8vec = function(pk) { } finally { wasm.__wbindgen_add_to_stack_pointer(16); } -}; +} /** * @param {PrivateEncKey} sk * @returns {Uint8Array} */ -module.exports.cryptobox_sk_to_u8vec = function(sk) { +export function cryptobox_sk_to_u8vec(sk) { try { const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); _assertClass(sk, PrivateEncKey); @@ -238,13 +235,13 @@ module.exports.cryptobox_sk_to_u8vec = function(sk) { } finally { wasm.__wbindgen_add_to_stack_pointer(16); } -}; +} /** * @param {Uint8Array} v * @returns {PublicEncKey} */ -module.exports.u8vec_to_cryptobox_pk = function(v) { +export function u8vec_to_cryptobox_pk(v) { try { const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); const ptr0 = passArray8ToWasm0(v, wasm.__wbindgen_malloc); @@ -260,13 +257,13 @@ module.exports.u8vec_to_cryptobox_pk = function(v) { } finally { wasm.__wbindgen_add_to_stack_pointer(16); } -}; +} /** * @param {Uint8Array} v * @returns {PrivateEncKey} */ -module.exports.u8vec_to_cryptobox_sk = function(v) { +export function u8vec_to_cryptobox_sk(v) { try { const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); const ptr0 = passArray8ToWasm0(v, wasm.__wbindgen_malloc); @@ -282,7 +279,7 @@ module.exports.u8vec_to_cryptobox_sk = function(v) { } finally { wasm.__wbindgen_add_to_stack_pointer(16); } -}; +} /** * @param {Uint8Array} msg @@ -290,14 +287,14 @@ module.exports.u8vec_to_cryptobox_sk = function(v) { * @param {PrivateEncKey} my_sk * @returns {CryptoBoxCt} */ -module.exports.cryptobox_encrypt = function(msg, their_pk, my_sk) { +export function cryptobox_encrypt(msg, their_pk, my_sk) { const ptr0 = passArray8ToWasm0(msg, wasm.__wbindgen_malloc); const len0 = WASM_VECTOR_LEN; _assertClass(their_pk, PublicEncKey); _assertClass(my_sk, PrivateEncKey); const ret = wasm.cryptobox_encrypt(ptr0, len0, their_pk.__wbg_ptr, my_sk.__wbg_ptr); return CryptoBoxCt.__wrap(ret); -}; +} /** * @param {CryptoBoxCt} ct @@ -305,7 +302,7 @@ module.exports.cryptobox_encrypt = function(msg, their_pk, my_sk) { * @param {PublicEncKey} their_pk * @returns {Uint8Array} */ -module.exports.cryptobox_decrypt = function(ct, my_sk, their_pk) { +export function cryptobox_decrypt(ct, my_sk, their_pk) { try { const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); _assertClass(ct, CryptoBoxCt); @@ -320,7 +317,7 @@ module.exports.cryptobox_decrypt = function(ct, my_sk, their_pk) { } finally { wasm.__wbindgen_add_to_stack_pointer(16); } -}; +} /** * This function assembles [ReencryptionRequest] @@ -337,7 +334,7 @@ module.exports.cryptobox_decrypt = function(ct, my_sk, their_pk) { * @param {Eip712DomainMsg} domain * @returns {ReencryptionRequest} */ -module.exports.make_reencryption_req = function(client, signature, enc_pk, fhe_type, key_id, ciphertext_digest, domain) { +export function make_reencryption_req(client, signature, enc_pk, fhe_type, key_id, ciphertext_digest, domain) { try { const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); _assertClass(client, Client); @@ -362,7 +359,7 @@ module.exports.make_reencryption_req = function(client, signature, enc_pk, fhe_t } finally { wasm.__wbindgen_add_to_stack_pointer(16); } -}; +} function passArray32ToWasm0(arg, malloc) { const ptr = malloc(arg.length * 4, 4) >>> 0; @@ -382,7 +379,7 @@ function passArray32ToWasm0(arg, malloc) { * @param {PrivateEncKey} enc_sk * @returns {number} */ -module.exports.process_reencryption_resp = function(client, request, agg_resp, agg_resp_ids, enc_pk, enc_sk) { +export function process_reencryption_resp(client, request, agg_resp, agg_resp_ids, enc_pk, enc_sk) { try { const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); _assertClass(client, Client); @@ -408,7 +405,7 @@ module.exports.process_reencryption_resp = function(client, request, agg_resp, a } finally { wasm.__wbindgen_add_to_stack_pointer(16); } -}; +} function handleError(f, args) { try { @@ -420,7 +417,7 @@ function handleError(f, args) { /** * The plaintext types that can be encrypted in a fhevm ciphertext. */ -module.exports.FheType = Object.freeze({ Bool:0,"0":"Bool",Euint4:1,"1":"Euint4",Euint8:2,"2":"Euint8",Euint16:3,"3":"Euint16",Euint32:4,"4":"Euint32",Euint64:5,"5":"Euint64",Euint128:6,"6":"Euint128",Euint160:7,"7":"Euint160", }); +export const FheType = Object.freeze({ Bool:0,"0":"Bool",Euint4:1,"1":"Euint4",Euint8:2,"2":"Euint8",Euint16:3,"3":"Euint16",Euint32:4,"4":"Euint32",Euint64:5,"5":"Euint64",Euint128:6,"6":"Euint128",Euint160:7,"7":"Euint160", }); const ClientFinalization = (typeof FinalizationRegistry === 'undefined') ? { register: () => {}, unregister: () => {} } @@ -436,7 +433,7 @@ const ClientFinalization = (typeof FinalizationRegistry === 'undefined') * in a secure location, e.g., hardware wallet. Calling functions that requires * client_sk when it is None will return an error. */ -class Client { +export class Client { static __wrap(ptr) { ptr = ptr >>> 0; @@ -458,14 +455,13 @@ class Client { wasm.__wbg_client_free(ptr); } } -module.exports.Client = Client; const CryptoBoxCtFinalization = (typeof FinalizationRegistry === 'undefined') ? { register: () => {}, unregister: () => {} } : new FinalizationRegistry(ptr => wasm.__wbg_cryptoboxct_free(ptr >>> 0)); /** */ -class CryptoBoxCt { +export class CryptoBoxCt { static __wrap(ptr) { ptr = ptr >>> 0; @@ -487,7 +483,6 @@ class CryptoBoxCt { wasm.__wbg_cryptoboxct_free(ptr); } } -module.exports.CryptoBoxCt = CryptoBoxCt; const Eip712DomainMsgFinalization = (typeof FinalizationRegistry === 'undefined') ? { register: () => {}, unregister: () => {} } @@ -496,7 +491,7 @@ const Eip712DomainMsgFinalization = (typeof FinalizationRegistry === 'undefined' * * eventually chain_id, verifying_contract and salt will be parsed in to solidity types */ -class Eip712DomainMsg { +export class Eip712DomainMsg { static __wrap(ptr) { ptr = ptr >>> 0; @@ -647,14 +642,13 @@ class Eip712DomainMsg { wasm.__wbg_set_eip712domainmsg_salt(this.__wbg_ptr, ptr0, len0); } } -module.exports.Eip712DomainMsg = Eip712DomainMsg; const PlaintextFinalization = (typeof FinalizationRegistry === 'undefined') ? { register: () => {}, unregister: () => {} } : new FinalizationRegistry(ptr => wasm.__wbg_plaintext_free(ptr >>> 0)); /** */ -class Plaintext { +export class Plaintext { __destroy_into_raw() { const ptr = this.__wbg_ptr; @@ -707,14 +701,13 @@ class Plaintext { wasm.__wbg_set_plaintext_higest_bits(this.__wbg_ptr, arg0); } } -module.exports.Plaintext = Plaintext; const PrivateEncKeyFinalization = (typeof FinalizationRegistry === 'undefined') ? { register: () => {}, unregister: () => {} } : new FinalizationRegistry(ptr => wasm.__wbg_privateenckey_free(ptr >>> 0)); /** */ -class PrivateEncKey { +export class PrivateEncKey { static __wrap(ptr) { ptr = ptr >>> 0; @@ -736,14 +729,13 @@ class PrivateEncKey { wasm.__wbg_privateenckey_free(ptr); } } -module.exports.PrivateEncKey = PrivateEncKey; const PrivateSigKeyFinalization = (typeof FinalizationRegistry === 'undefined') ? { register: () => {}, unregister: () => {} } : new FinalizationRegistry(ptr => wasm.__wbg_privatesigkey_free(ptr >>> 0)); /** */ -class PrivateSigKey { +export class PrivateSigKey { __destroy_into_raw() { const ptr = this.__wbg_ptr; @@ -757,14 +749,13 @@ class PrivateSigKey { wasm.__wbg_privatesigkey_free(ptr); } } -module.exports.PrivateSigKey = PrivateSigKey; const PublicEncKeyFinalization = (typeof FinalizationRegistry === 'undefined') ? { register: () => {}, unregister: () => {} } : new FinalizationRegistry(ptr => wasm.__wbg_publicenckey_free(ptr >>> 0)); /** */ -class PublicEncKey { +export class PublicEncKey { static __wrap(ptr) { ptr = ptr >>> 0; @@ -786,14 +777,13 @@ class PublicEncKey { wasm.__wbg_publicenckey_free(ptr); } } -module.exports.PublicEncKey = PublicEncKey; const PublicSigKeyFinalization = (typeof FinalizationRegistry === 'undefined') ? { register: () => {}, unregister: () => {} } : new FinalizationRegistry(ptr => wasm.__wbg_publicsigkey_free(ptr >>> 0)); /** */ -class PublicSigKey { +export class PublicSigKey { static __unwrap(jsValue) { if (!(jsValue instanceof PublicSigKey)) { @@ -814,14 +804,13 @@ class PublicSigKey { wasm.__wbg_publicsigkey_free(ptr); } } -module.exports.PublicSigKey = PublicSigKey; const ReencryptionRequestFinalization = (typeof FinalizationRegistry === 'undefined') ? { register: () => {}, unregister: () => {} } : new FinalizationRegistry(ptr => wasm.__wbg_reencryptionrequest_free(ptr >>> 0)); /** */ -class ReencryptionRequest { +export class ReencryptionRequest { static __wrap(ptr) { ptr = ptr >>> 0; @@ -927,14 +916,13 @@ class ReencryptionRequest { wasm.__wbg_set_reencryptionrequest_request_id(this.__wbg_ptr, ptr0); } } -module.exports.ReencryptionRequest = ReencryptionRequest; const ReencryptionRequestPayloadFinalization = (typeof FinalizationRegistry === 'undefined') ? { register: () => {}, unregister: () => {} } : new FinalizationRegistry(ptr => wasm.__wbg_reencryptionrequestpayload_free(ptr >>> 0)); /** */ -class ReencryptionRequestPayload { +export class ReencryptionRequestPayload { static __wrap(ptr) { ptr = ptr >>> 0; @@ -1178,14 +1166,13 @@ class ReencryptionRequestPayload { wasm.__wbg_set_eip712domainmsg_verifying_contract(this.__wbg_ptr, ptr0, len0); } } -module.exports.ReencryptionRequestPayload = ReencryptionRequestPayload; const ReencryptionResponseFinalization = (typeof FinalizationRegistry === 'undefined') ? { register: () => {}, unregister: () => {} } : new FinalizationRegistry(ptr => wasm.__wbg_reencryptionresponse_free(ptr >>> 0)); /** */ -class ReencryptionResponse { +export class ReencryptionResponse { static __unwrap(jsValue) { if (!(jsValue instanceof ReencryptionResponse)) { @@ -1353,7 +1340,6 @@ class ReencryptionResponse { wasm.__wbg_set_eip712domainmsg_chain_id(this.__wbg_ptr, ptr0, len0); } } -module.exports.ReencryptionResponse = ReencryptionResponse; const RequestIdFinalization = (typeof FinalizationRegistry === 'undefined') ? { register: () => {}, unregister: () => {} } @@ -1361,7 +1347,7 @@ const RequestIdFinalization = (typeof FinalizationRegistry === 'undefined') /** * Simple response to return an ID, to be used to retrieve the computed result later on. */ -class RequestId { +export class RequestId { static __wrap(ptr) { ptr = ptr >>> 0; @@ -1410,199 +1396,244 @@ class RequestId { wasm.__wbg_set_eip712domainmsg_name(this.__wbg_ptr, ptr0, len0); } } -module.exports.RequestId = RequestId; -module.exports.__wbg_reencryptionresponse_unwrap = function(arg0) { - const ret = ReencryptionResponse.__unwrap(takeObject(arg0)); - return ret; -}; +async function __wbg_load(module, imports) { + if (typeof Response === 'function' && module instanceof Response) { + if (typeof WebAssembly.instantiateStreaming === 'function') { + try { + return await WebAssembly.instantiateStreaming(module, imports); -module.exports.__wbindgen_object_drop_ref = function(arg0) { - takeObject(arg0); -}; + } catch (e) { + if (module.headers.get('Content-Type') != 'application/wasm') { + console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); -module.exports.__wbindgen_error_new = function(arg0, arg1) { - const ret = new Error(getStringFromWasm0(arg0, arg1)); - return addHeapObject(ret); -}; + } else { + throw e; + } + } + } -module.exports.__wbg_publicsigkey_unwrap = function(arg0) { - const ret = PublicSigKey.__unwrap(takeObject(arg0)); - return ret; -}; - -module.exports.__wbg_new_abda76e883ba8a5f = function() { - const ret = new Error(); - return addHeapObject(ret); -}; - -module.exports.__wbg_stack_658279fe44541cf6 = function(arg0, arg1) { - const ret = getObject(arg1).stack; - const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len1 = WASM_VECTOR_LEN; - getInt32Memory0()[arg0 / 4 + 1] = len1; - getInt32Memory0()[arg0 / 4 + 0] = ptr1; -}; - -module.exports.__wbg_error_f851667af71bcfc6 = function(arg0, arg1) { - let deferred0_0; - let deferred0_1; - try { - deferred0_0 = arg0; - deferred0_1 = arg1; - console.error(getStringFromWasm0(arg0, arg1)); - } finally { - wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + const bytes = await module.arrayBuffer(); + return await WebAssembly.instantiate(bytes, imports); + + } else { + const instance = await WebAssembly.instantiate(module, imports); + + if (instance instanceof WebAssembly.Instance) { + return { instance, module }; + + } else { + return instance; + } } -}; +} -module.exports.__wbg_crypto_1d1f22824a6a080c = function(arg0) { - const ret = getObject(arg0).crypto; - return addHeapObject(ret); -}; +function __wbg_get_imports() { + const imports = {}; + imports.wbg = {}; + imports.wbg.__wbg_reencryptionresponse_unwrap = function(arg0) { + const ret = ReencryptionResponse.__unwrap(takeObject(arg0)); + return ret; + }; + imports.wbg.__wbindgen_object_drop_ref = function(arg0) { + takeObject(arg0); + }; + imports.wbg.__wbindgen_error_new = function(arg0, arg1) { + const ret = new Error(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_publicsigkey_unwrap = function(arg0) { + const ret = PublicSigKey.__unwrap(takeObject(arg0)); + return ret; + }; + imports.wbg.__wbg_new_abda76e883ba8a5f = function() { + const ret = new Error(); + return addHeapObject(ret); + }; + imports.wbg.__wbg_stack_658279fe44541cf6 = function(arg0, arg1) { + const ret = getObject(arg1).stack; + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getInt32Memory0()[arg0 / 4 + 1] = len1; + getInt32Memory0()[arg0 / 4 + 0] = ptr1; + }; + imports.wbg.__wbg_error_f851667af71bcfc6 = function(arg0, arg1) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.error(getStringFromWasm0(arg0, arg1)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + } + }; + imports.wbg.__wbg_crypto_1d1f22824a6a080c = function(arg0) { + const ret = getObject(arg0).crypto; + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_is_object = function(arg0) { + const val = getObject(arg0); + const ret = typeof(val) === 'object' && val !== null; + return ret; + }; + imports.wbg.__wbg_process_4a72847cc503995b = function(arg0) { + const ret = getObject(arg0).process; + return addHeapObject(ret); + }; + imports.wbg.__wbg_versions_f686565e586dd935 = function(arg0) { + const ret = getObject(arg0).versions; + return addHeapObject(ret); + }; + imports.wbg.__wbg_node_104a2ff8d6ea03a2 = function(arg0) { + const ret = getObject(arg0).node; + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_is_string = function(arg0) { + const ret = typeof(getObject(arg0)) === 'string'; + return ret; + }; + imports.wbg.__wbg_msCrypto_eb05e62b530a1508 = function(arg0) { + const ret = getObject(arg0).msCrypto; + return addHeapObject(ret); + }; + imports.wbg.__wbg_require_cca90b1a94a0255b = function() { return handleError(function () { + const ret = module.require; + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbindgen_is_function = function(arg0) { + const ret = typeof(getObject(arg0)) === 'function'; + return ret; + }; + imports.wbg.__wbindgen_string_new = function(arg0, arg1) { + const ret = getStringFromWasm0(arg0, arg1); + return addHeapObject(ret); + }; + imports.wbg.__wbg_randomFillSync_5c9c955aa56b6049 = function() { return handleError(function (arg0, arg1) { + getObject(arg0).randomFillSync(takeObject(arg1)); + }, arguments) }; + imports.wbg.__wbg_getRandomValues_3aa56aa6edec874c = function() { return handleError(function (arg0, arg1) { + getObject(arg0).getRandomValues(getObject(arg1)); + }, arguments) }; + imports.wbg.__wbg_newnoargs_e258087cd0daa0ea = function(arg0, arg1) { + const ret = new Function(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_call_27c0f87801dedf93 = function() { return handleError(function (arg0, arg1) { + const ret = getObject(arg0).call(getObject(arg1)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbindgen_object_clone_ref = function(arg0) { + const ret = getObject(arg0); + return addHeapObject(ret); + }; + imports.wbg.__wbg_self_ce0dbfc45cf2f5be = function() { return handleError(function () { + const ret = self.self; + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_window_c6fb939a7f436783 = function() { return handleError(function () { + const ret = window.window; + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_globalThis_d1e6af4856ba331b = function() { return handleError(function () { + const ret = globalThis.globalThis; + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_global_207b558942527489 = function() { return handleError(function () { + const ret = global.global; + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbindgen_is_undefined = function(arg0) { + const ret = getObject(arg0) === undefined; + return ret; + }; + imports.wbg.__wbg_call_b3ca7c6051f9bec1 = function() { return handleError(function (arg0, arg1, arg2) { + const ret = getObject(arg0).call(getObject(arg1), getObject(arg2)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_buffer_12d079cc21e14bdb = function(arg0) { + const ret = getObject(arg0).buffer; + return addHeapObject(ret); + }; + imports.wbg.__wbg_newwithbyteoffsetandlength_aa4a17c33a06e5cb = function(arg0, arg1, arg2) { + const ret = new Uint8Array(getObject(arg0), arg1 >>> 0, arg2 >>> 0); + return addHeapObject(ret); + }; + imports.wbg.__wbg_new_63b92bc8671ed464 = function(arg0) { + const ret = new Uint8Array(getObject(arg0)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_set_a47bac70306a19a7 = function(arg0, arg1, arg2) { + getObject(arg0).set(getObject(arg1), arg2 >>> 0); + }; + imports.wbg.__wbg_newwithlength_e9b4878cebadb3d3 = function(arg0) { + const ret = new Uint8Array(arg0 >>> 0); + return addHeapObject(ret); + }; + imports.wbg.__wbg_subarray_a1f73cd4b5b42fe1 = function(arg0, arg1, arg2) { + const ret = getObject(arg0).subarray(arg1 >>> 0, arg2 >>> 0); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_throw = function(arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); + }; + imports.wbg.__wbindgen_memory = function() { + const ret = wasm.memory; + return addHeapObject(ret); + }; -module.exports.__wbindgen_is_object = function(arg0) { - const val = getObject(arg0); - const ret = typeof(val) === 'object' && val !== null; - return ret; -}; + return imports; +} -module.exports.__wbg_process_4a72847cc503995b = function(arg0) { - const ret = getObject(arg0).process; - return addHeapObject(ret); -}; +function __wbg_init_memory(imports, maybe_memory) { -module.exports.__wbg_versions_f686565e586dd935 = function(arg0) { - const ret = getObject(arg0).versions; - return addHeapObject(ret); -}; +} -module.exports.__wbg_node_104a2ff8d6ea03a2 = function(arg0) { - const ret = getObject(arg0).node; - return addHeapObject(ret); -}; +function __wbg_finalize_init(instance, module) { + wasm = instance.exports; + __wbg_init.__wbindgen_wasm_module = module; + cachedInt32Memory0 = null; + cachedUint32Memory0 = null; + cachedUint8Memory0 = null; -module.exports.__wbindgen_is_string = function(arg0) { - const ret = typeof(getObject(arg0)) === 'string'; - return ret; -}; -module.exports.__wbg_msCrypto_eb05e62b530a1508 = function(arg0) { - const ret = getObject(arg0).msCrypto; - return addHeapObject(ret); -}; + return wasm; +} -module.exports.__wbg_require_cca90b1a94a0255b = function() { return handleError(function () { - const ret = module.require; - return addHeapObject(ret); -}, arguments) }; +function initSync(module) { + if (wasm !== undefined) return wasm; -module.exports.__wbindgen_is_function = function(arg0) { - const ret = typeof(getObject(arg0)) === 'function'; - return ret; -}; - -module.exports.__wbindgen_string_new = function(arg0, arg1) { - const ret = getStringFromWasm0(arg0, arg1); - return addHeapObject(ret); -}; - -module.exports.__wbg_randomFillSync_5c9c955aa56b6049 = function() { return handleError(function (arg0, arg1) { - getObject(arg0).randomFillSync(takeObject(arg1)); -}, arguments) }; - -module.exports.__wbg_getRandomValues_3aa56aa6edec874c = function() { return handleError(function (arg0, arg1) { - getObject(arg0).getRandomValues(getObject(arg1)); -}, arguments) }; - -module.exports.__wbg_newnoargs_e258087cd0daa0ea = function(arg0, arg1) { - const ret = new Function(getStringFromWasm0(arg0, arg1)); - return addHeapObject(ret); -}; - -module.exports.__wbg_call_27c0f87801dedf93 = function() { return handleError(function (arg0, arg1) { - const ret = getObject(arg0).call(getObject(arg1)); - return addHeapObject(ret); -}, arguments) }; - -module.exports.__wbindgen_object_clone_ref = function(arg0) { - const ret = getObject(arg0); - return addHeapObject(ret); -}; - -module.exports.__wbg_self_ce0dbfc45cf2f5be = function() { return handleError(function () { - const ret = self.self; - return addHeapObject(ret); -}, arguments) }; - -module.exports.__wbg_window_c6fb939a7f436783 = function() { return handleError(function () { - const ret = window.window; - return addHeapObject(ret); -}, arguments) }; - -module.exports.__wbg_globalThis_d1e6af4856ba331b = function() { return handleError(function () { - const ret = globalThis.globalThis; - return addHeapObject(ret); -}, arguments) }; - -module.exports.__wbg_global_207b558942527489 = function() { return handleError(function () { - const ret = global.global; - return addHeapObject(ret); -}, arguments) }; - -module.exports.__wbindgen_is_undefined = function(arg0) { - const ret = getObject(arg0) === undefined; - return ret; -}; - -module.exports.__wbg_call_b3ca7c6051f9bec1 = function() { return handleError(function (arg0, arg1, arg2) { - const ret = getObject(arg0).call(getObject(arg1), getObject(arg2)); - return addHeapObject(ret); -}, arguments) }; - -module.exports.__wbg_buffer_12d079cc21e14bdb = function(arg0) { - const ret = getObject(arg0).buffer; - return addHeapObject(ret); -}; - -module.exports.__wbg_newwithbyteoffsetandlength_aa4a17c33a06e5cb = function(arg0, arg1, arg2) { - const ret = new Uint8Array(getObject(arg0), arg1 >>> 0, arg2 >>> 0); - return addHeapObject(ret); -}; - -module.exports.__wbg_new_63b92bc8671ed464 = function(arg0) { - const ret = new Uint8Array(getObject(arg0)); - return addHeapObject(ret); -}; - -module.exports.__wbg_set_a47bac70306a19a7 = function(arg0, arg1, arg2) { - getObject(arg0).set(getObject(arg1), arg2 >>> 0); -}; - -module.exports.__wbg_newwithlength_e9b4878cebadb3d3 = function(arg0) { - const ret = new Uint8Array(arg0 >>> 0); - return addHeapObject(ret); -}; - -module.exports.__wbg_subarray_a1f73cd4b5b42fe1 = function(arg0, arg1, arg2) { - const ret = getObject(arg0).subarray(arg1 >>> 0, arg2 >>> 0); - return addHeapObject(ret); -}; - -module.exports.__wbindgen_throw = function(arg0, arg1) { - throw new Error(getStringFromWasm0(arg0, arg1)); -}; - -module.exports.__wbindgen_memory = function() { - const ret = wasm.memory; - return addHeapObject(ret); -}; - -const path = require('path').join(__dirname, 'kms_lib_bg.wasm'); -const bytes = require('fs').readFileSync(path); - -const wasmModule = new WebAssembly.Module(bytes); -const wasmInstance = new WebAssembly.Instance(wasmModule, imports); -wasm = wasmInstance.exports; -module.exports.__wasm = wasm; + const imports = __wbg_get_imports(); + + __wbg_init_memory(imports); + + if (!(module instanceof WebAssembly.Module)) { + module = new WebAssembly.Module(module); + } + + const instance = new WebAssembly.Instance(module, imports); + + return __wbg_finalize_init(instance, module); +} + +async function __wbg_init(input) { + if (wasm !== undefined) return wasm; + + if (typeof input === 'undefined') { + input = new URL('kms_lib_bg.wasm', import.meta.url); + } + const imports = __wbg_get_imports(); + + if (typeof input === 'string' || (typeof Request === 'function' && input instanceof Request) || (typeof URL === 'function' && input instanceof URL)) { + input = fetch(input); + } + + __wbg_init_memory(imports); + + const { instance, module } = await __wbg_load(await input, imports); + + return __wbg_finalize_init(instance, module); +} +export { initSync } +export default __wbg_init; diff --git a/src/kms/web/kms_lib_bg.wasm b/src/kms/web/kms_lib_bg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..d036e82c3c2a3cda7c5d9d305ef210e362613d09 GIT binary patch literal 554374 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

WY@>wn|L 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

5dK=tI%wmK-YPT!@@{`YHNq7lNruHpwAM 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%0Aivv0{$Y_0v@3k$S;jW06O8D0%~GO0hZrfg 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

fD{%p9es9?o~K7RG;l#1yR%sd>P{d#e(U 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 literal 0 HcmV?d00001 diff --git a/src/kms/web/kms_lib_bg.wasm.d.ts b/src/kms/web/kms_lib_bg.wasm.d.ts new file mode 100644 index 0000000..d2bdf1d --- /dev/null +++ b/src/kms/web/kms_lib_bg.wasm.d.ts @@ -0,0 +1,87 @@ +/* tslint:disable */ +/* eslint-disable */ +export const memory: WebAssembly.Memory; +export function __wbg_client_free(a: number): void; +export function __wbg_requestid_free(a: number): void; +export function __wbg_reencryptionrequestpayload_free(a: number): void; +export function __wbg_get_reencryptionrequestpayload_version(a: number): number; +export function __wbg_set_reencryptionrequestpayload_version(a: number, b: number): void; +export function __wbg_get_reencryptionrequestpayload_servers_needed(a: number): number; +export function __wbg_set_reencryptionrequestpayload_servers_needed(a: number, b: number): void; +export function __wbg_get_reencryptionrequestpayload_randomness(a: number, b: number): void; +export function __wbg_get_reencryptionrequestpayload_fhe_type(a: number): number; +export function __wbg_set_reencryptionrequestpayload_fhe_type(a: number, b: number): void; +export function __wbg_get_reencryptionrequestpayload_key_id(a: number): number; +export function __wbg_set_reencryptionrequestpayload_key_id(a: number, b: number): void; +export function __wbg_get_reencryptionrequestpayload_ciphertext(a: number, b: number): void; +export function __wbg_set_reencryptionrequestpayload_ciphertext(a: number, b: number, c: number): void; +export function __wbg_get_reencryptionrequestpayload_ciphertext_digest(a: number, b: number): void; +export function __wbg_eip712domainmsg_free(a: number): void; +export function __wbg_get_eip712domainmsg_name(a: number, b: number): void; +export function __wbg_set_eip712domainmsg_name(a: number, b: number, c: number): void; +export function __wbg_get_eip712domainmsg_version(a: number, b: number): void; +export function __wbg_set_eip712domainmsg_version(a: number, b: number, c: number): void; +export function __wbg_get_eip712domainmsg_chain_id(a: number, b: number): void; +export function __wbg_set_eip712domainmsg_chain_id(a: number, b: number, c: number): void; +export function __wbg_get_eip712domainmsg_verifying_contract(a: number, b: number): void; +export function __wbg_set_eip712domainmsg_verifying_contract(a: number, b: number, c: number): void; +export function __wbg_get_eip712domainmsg_salt(a: number, b: number): void; +export function __wbg_set_eip712domainmsg_salt(a: number, b: number, c: number): void; +export function __wbg_reencryptionrequest_free(a: number): void; +export function __wbg_get_reencryptionrequest_signature(a: number, b: number): void; +export function __wbg_get_reencryptionrequest_payload(a: number): number; +export function __wbg_set_reencryptionrequest_payload(a: number, b: number): void; +export function __wbg_get_reencryptionrequest_domain(a: number): number; +export function __wbg_set_reencryptionrequest_domain(a: number, b: number): void; +export function __wbg_get_reencryptionrequest_request_id(a: number): number; +export function __wbg_set_reencryptionrequest_request_id(a: number, b: number): void; +export function __wbg_reencryptionresponse_free(a: number): void; +export function __wbg_get_reencryptionresponse_version(a: number): number; +export function __wbg_set_reencryptionresponse_version(a: number, b: number): void; +export function __wbg_get_reencryptionresponse_servers_needed(a: number): number; +export function __wbg_set_reencryptionresponse_servers_needed(a: number, b: number): void; +export function __wbg_get_reencryptionresponse_fhe_type(a: number): number; +export function __wbg_set_reencryptionresponse_fhe_type(a: number, b: number): void; +export function __wbg_get_reencryptionrequestpayload_enc_key(a: number, b: number): void; +export function __wbg_get_reencryptionrequestpayload_verification_key(a: number, b: number): void; +export function __wbg_get_reencryptionresponse_verification_key(a: number, b: number): void; +export function __wbg_get_reencryptionresponse_digest(a: number, b: number): void; +export function __wbg_get_reencryptionresponse_signcrypted_ciphertext(a: number, b: number): void; +export function __wbg_get_requestid_request_id(a: number, b: number): void; +export function __wbg_set_requestid_request_id(a: number, b: number, c: number): void; +export function __wbg_set_reencryptionrequestpayload_verification_key(a: number, b: number, c: number): void; +export function __wbg_set_reencryptionrequestpayload_randomness(a: number, b: number, c: number): void; +export function __wbg_set_reencryptionrequestpayload_enc_key(a: number, b: number, c: number): void; +export function __wbg_set_reencryptionrequestpayload_ciphertext_digest(a: number, b: number, c: number): void; +export function __wbg_set_reencryptionrequest_signature(a: number, b: number, c: number): void; +export function __wbg_set_reencryptionresponse_verification_key(a: number, b: number, c: number): void; +export function __wbg_set_reencryptionresponse_digest(a: number, b: number, c: number): void; +export function __wbg_set_reencryptionresponse_signcrypted_ciphertext(a: number, b: number, c: number): void; +export function __wbg_plaintext_free(a: number): void; +export function __wbg_get_plaintext_lowest_bits(a: number): number; +export function __wbg_set_plaintext_lowest_bits(a: number, b: number): void; +export function __wbg_get_plaintext_middle_bits(a: number): number; +export function __wbg_set_plaintext_middle_bits(a: number, b: number): void; +export function __wbg_get_plaintext_higest_bits(a: number): number; +export function __wbg_set_plaintext_higest_bits(a: number, b: number): void; +export function new_client(a: number, b: number, c: number, d: number, e: number, f: number): number; +export function __wbg_cryptoboxct_free(a: number): void; +export function cryptobox_keygen(): number; +export function cryptobox_get_pk(a: number): number; +export function cryptobox_pk_to_u8vec(a: number, b: number): void; +export function cryptobox_sk_to_u8vec(a: number, b: number): void; +export function u8vec_to_cryptobox_pk(a: number, b: number, c: number): void; +export function u8vec_to_cryptobox_sk(a: number, b: number, c: number): void; +export function cryptobox_encrypt(a: number, b: number, c: number, d: number): number; +export function cryptobox_decrypt(a: number, b: number, c: number, d: number): void; +export function make_reencryption_req(a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number): void; +export function process_reencryption_resp(a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number): void; +export function __wbg_publicenckey_free(a: number): void; +export function __wbg_privateenckey_free(a: number): void; +export function __wbg_publicsigkey_free(a: number): void; +export function __wbg_privatesigkey_free(a: number): void; +export function __wbindgen_add_to_stack_pointer(a: number): number; +export function __wbindgen_free(a: number, b: number, c: number): void; +export function __wbindgen_malloc(a: number, b: number): number; +export function __wbindgen_realloc(a: number, b: number, c: number, d: number): number; +export function __wbindgen_exn_store(a: number): void; diff --git a/src/kms/package.json b/src/kms/web/package.json similarity index 55% rename from src/kms/package.json rename to src/kms/web/package.json index 2f0b64b..c10d1d3 100644 --- a/src/kms/package.json +++ b/src/kms/web/package.json @@ -6,6 +6,9 @@ "kms_lib.js", "kms_lib.d.ts" ], - "main": "kms_lib.js", - "types": "kms_lib.d.ts" + "module": "kms_lib.js", + "types": "kms_lib.d.ts", + "sideEffects": [ + "./snippets/*" + ] } \ No newline at end of file diff --git a/src/node.d.ts b/src/node.d.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/node.ts b/src/node.ts index 9d5f06e..ceeed48 100644 --- a/src/node.ts +++ b/src/node.ts @@ -1,4 +1,13 @@ //@ts-check +import fetch, { Headers, Request, Response } from 'node-fetch'; + +if (!global.fetch) { + global.fetch = fetch as any; + globalThis.Headers = Headers as any; + globalThis.Request = Request as any; + globalThis.Response = Response as any; +} + export * from './sdk'; export * from './tfhe'; export { clientKeyDecryptor } from './utils'; diff --git a/src/sdk/encrypt.ts b/src/sdk/encrypt.ts index d1634f3..312c433 100644 --- a/src/sdk/encrypt.ts +++ b/src/sdk/encrypt.ts @@ -1,4 +1,4 @@ -import { isAddress } from 'ethers'; +import { isAddress } from 'web3-validator'; import { TfheCompactPublicKey, CompactFheUint160List } from 'node-tfhe'; // const publicZkParams = CompactPkePublicParams.deserialize(crsBuffer); @@ -16,7 +16,7 @@ export type ZKInput = { getBits: () => number[]; resetValues: () => ZKInput; encrypt: () => Uint8Array; - encryptAndSend: () => UInt8Array; + send: () => Uint8Array; }; const checkEncryptedValue = (value: number | bigint, bits: number) => { @@ -35,7 +35,12 @@ const checkEncryptedValue = (value: number | bigint, bits: number) => { export const createEncryptedInput = (tfheCompactPublicKey?: TfheCompactPublicKey, coprocessorUrl?: string) => - (contractAddress: string, userAddress: string) => { + ( + contractAddress: string, + userAddress: string, + functionSignature: string, + callerAddress?: string, + ) => { if (!tfheCompactPublicKey) throw new Error( 'Your instance has been created without the public blockchain key.', @@ -133,15 +138,15 @@ export const createEncryptedInput = // publicKey, // ZkComputeLoad.Proof, // ); - return encrypted.serialize(); + return [encrypted.serialize()]; }, - encryptAndSend() { + send() { if (!coprocessorUrl) throw new Error('Coprocessor URL not provided'); const encrypted = CompactFheUint160List.encrypt_with_compact_public_key( values, publicKey, ); - return BigInt(20); + return encrypted.serialize(); }, }; }; diff --git a/src/sdk/keypair.test.ts b/src/sdk/keypair.test.ts index 5d901c2..b0c6e6d 100644 --- a/src/sdk/keypair.test.ts +++ b/src/sdk/keypair.test.ts @@ -6,7 +6,7 @@ import { cryptobox_sk_to_u8vec, u8vec_to_cryptobox_pk, u8vec_to_cryptobox_sk, -} from '../kms/kms_lib'; +} from '../kms/node/kms_lib'; describe('token', () => { beforeAll(async () => { diff --git a/src/sdk/keypair.ts b/src/sdk/keypair.ts index 4eec714..e4894bb 100644 --- a/src/sdk/keypair.ts +++ b/src/sdk/keypair.ts @@ -4,7 +4,7 @@ import { cryptobox_sk_to_u8vec, cryptobox_pk_to_u8vec, cryptobox_get_pk, -} from '../kms'; +} from 'node-kms'; export type EIP712Type = { name: string; type: string }; diff --git a/src/sdk/network.test.ts b/src/sdk/network.test.ts index 941bc3d..fc1c78c 100644 --- a/src/sdk/network.test.ts +++ b/src/sdk/network.test.ts @@ -1,9 +1,4 @@ -import { - FheUint160, - CompactFheUint160List, - TfheCompactPublicKey, - TfheClientKey, -} from 'node-tfhe'; +import { TfheCompactPublicKey, TfheClientKey } from 'node-tfhe'; import { createTfheKeypair } from '../tfhe'; import { createEncryptedInput } from './encrypt'; import { getPublicKeyCallParams, getPublicKeyFromNetwork } from './network'; diff --git a/src/sdk/reencrypt.ts b/src/sdk/reencrypt.ts index daf34c0..795b642 100644 --- a/src/sdk/reencrypt.ts +++ b/src/sdk/reencrypt.ts @@ -1,10 +1,10 @@ -import { toHexString } from 'src/utils'; +import { toHexString } from '../utils'; import { u8vec_to_cryptobox_pk, cryptobox_encrypt, cryptobox_decrypt, cryptobox_pk_to_u8vec, -} from '../kms'; +} from '../kms/node'; export const reencryptRequest = (reencryptUrl?: string) => @@ -25,5 +25,6 @@ export const reencryptRequest = userAddress, }; // const response = await fetch(`${reencryptUrl}`); + return BigInt(10); }; diff --git a/tsconfig.json b/tsconfig.json index 3ccb020..3818162 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,7 +14,8 @@ "baseUrl": ".", "resolveJsonModule": true, "paths": { - "*": ["*"] + "*": ["*"], + "node-kms": ["src/kms/node/index.js"] } }, "include": ["src", "types"], diff --git a/tsconfig.rollup.json b/tsconfig.rollup.json index c12c108..8287472 100644 --- a/tsconfig.rollup.json +++ b/tsconfig.rollup.json @@ -13,7 +13,8 @@ "baseUrl": ".", "resolveJsonModule": false, "paths": { - "*": ["*"] + "*": ["*"], + "node-kms": ["src/kms/node/index.js"] } }, "include": ["src"], From 8fee554ba35cf00a6819d2d712215261195612fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20=27birdy=27=20Danjou?= Date: Wed, 12 Jun 2024 15:29:26 +0200 Subject: [PATCH 05/15] feat: update encryption --- package-lock.json | 119 +++++++++++++++++++++++++++---------- package.json | 2 + src/ethCall.ts | 44 ++++++++++++++ src/sdk/encrypt.test.ts | 4 +- src/sdk/encrypt.ts | 80 +++++++++++++++++++------ src/sdk/encryptionTypes.ts | 14 +++++ src/sdk/network.ts | 45 +------------- 7 files changed, 212 insertions(+), 96 deletions(-) create mode 100644 src/ethCall.ts create mode 100644 src/sdk/encryptionTypes.ts diff --git a/package-lock.json b/package-lock.json index 808c7b0..1b69f79 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,18 +1,20 @@ { "name": "fhevmjs", - "version": "0.5.0-0", + "version": "0.5.0-1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "fhevmjs", - "version": "0.5.0-0", + "version": "0.5.0-1", "license": "BSD-3-Clause-Clear", "dependencies": { + "@types/keccak": "^3.0.4", "bigint-buffer": "^1.1.5", "commander": "^11.0.0", "crypto-js": "^4.1.1", "ethers": "^6.6.4", + "keccak": "^3.0.4", "libsodium": "^0.7.11", "libsodium-wrappers": "^0.7.11", "node-fetch": "^3.3.2", @@ -1637,6 +1639,14 @@ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, + "node_modules/@types/keccak": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/keccak/-/keccak-3.0.4.tgz", + "integrity": "sha512-hdnkmbie7tE0yXnQQvlIOqCyjEsoXDVEZ3ACqO+F305XgUOW4Z9ElWdogCXXRAW/khnZ7GxM0t/BGB5bORKt/g==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/libsodium-wrappers": { "version": "0.7.10", "resolved": "https://registry.npmjs.org/@types/libsodium-wrappers/-/libsodium-wrappers-0.7.10.tgz", @@ -1646,8 +1656,7 @@ "node_modules/@types/node": { "version": "20.1.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.2.tgz", - "integrity": "sha512-CTO/wa8x+rZU626cL2BlbCDzydgnFNgc19h4YvizpTO88MFQxab8wqisxaofQJ/9bLGugRdWIuX/TbIs6VVF6g==", - "dev": true + "integrity": "sha512-CTO/wa8x+rZU626cL2BlbCDzydgnFNgc19h4YvizpTO88MFQxab8wqisxaofQJ/9bLGugRdWIuX/TbIs6VVF6g==" }, "node_modules/@types/node-fetch": { "version": "2.6.11", @@ -2231,12 +2240,12 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -3369,9 +3378,9 @@ "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" @@ -4814,6 +4823,20 @@ "node": ">=6" } }, + "node_modules/keccak": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", + "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==", + "hasInstallScript": true, + "dependencies": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -5119,6 +5142,11 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, + "node_modules/node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" + }, "node_modules/node-domexception": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", @@ -5154,6 +5182,16 @@ "url": "https://opencollective.com/node-fetch" } }, + "node_modules/node-gyp-build": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", + "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -5579,7 +5617,6 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -5762,7 +5799,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, "funding": [ { "type": "github", @@ -5960,7 +5996,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -6414,8 +6449,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/v8-to-istanbul": { "version": "9.1.0", @@ -8000,6 +8034,14 @@ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, + "@types/keccak": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/keccak/-/keccak-3.0.4.tgz", + "integrity": "sha512-hdnkmbie7tE0yXnQQvlIOqCyjEsoXDVEZ3ACqO+F305XgUOW4Z9ElWdogCXXRAW/khnZ7GxM0t/BGB5bORKt/g==", + "requires": { + "@types/node": "*" + } + }, "@types/libsodium-wrappers": { "version": "0.7.10", "resolved": "https://registry.npmjs.org/@types/libsodium-wrappers/-/libsodium-wrappers-0.7.10.tgz", @@ -8009,8 +8051,7 @@ "@types/node": { "version": "20.1.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.2.tgz", - "integrity": "sha512-CTO/wa8x+rZU626cL2BlbCDzydgnFNgc19h4YvizpTO88MFQxab8wqisxaofQJ/9bLGugRdWIuX/TbIs6VVF6g==", - "dev": true + "integrity": "sha512-CTO/wa8x+rZU626cL2BlbCDzydgnFNgc19h4YvizpTO88MFQxab8wqisxaofQJ/9bLGugRdWIuX/TbIs6VVF6g==" }, "@types/node-fetch": { "version": "2.6.11", @@ -8487,12 +8528,12 @@ } }, "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "requires": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" } }, "brorand": { @@ -9336,9 +9377,9 @@ "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" }, "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -10407,6 +10448,16 @@ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true }, + "keccak": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", + "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==", + "requires": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0", + "readable-stream": "^3.6.0" + } + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -10655,6 +10706,11 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, + "node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" + }, "node-domexception": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", @@ -10670,6 +10726,11 @@ "formdata-polyfill": "^4.0.10" } }, + "node-gyp-build": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", + "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==" + }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -10987,7 +11048,6 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -11114,8 +11174,7 @@ "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "safer-buffer": { "version": "2.1.2", @@ -11262,7 +11321,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, "requires": { "safe-buffer": "~5.2.0" } @@ -11556,8 +11614,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "v8-to-istanbul": { "version": "9.1.0", diff --git a/package.json b/package.json index 0d617c7..e757edc 100644 --- a/package.json +++ b/package.json @@ -43,10 +43,12 @@ }, "homepage": "https://github.com/zama-ai/fhevmjs#readme", "dependencies": { + "@types/keccak": "^3.0.4", "bigint-buffer": "^1.1.5", "commander": "^11.0.0", "crypto-js": "^4.1.1", "ethers": "^6.6.4", + "keccak": "^3.0.4", "libsodium": "^0.7.11", "libsodium-wrappers": "^0.7.11", "node-fetch": "^3.3.2", diff --git a/src/ethCall.ts b/src/ethCall.ts new file mode 100644 index 0000000..53cf9e1 --- /dev/null +++ b/src/ethCall.ts @@ -0,0 +1,44 @@ +import { toHexString } from './utils'; + +export function decodeAbiBytes(hex: string): Uint8Array { + if (hex.startsWith('0x')) { + hex = hex.substring(2); + } + // The data offset is the first 32 bytes, which points to the start of the data (skip this part) + const dataOffset = parseInt(hex.substring(0, 64), 16) * 2; // Convert offset from bytes to characters + + // The length of the data is the next 32 bytes, starting from the offset + const dataLength = + parseInt(hex.substring(dataOffset, dataOffset + 64), 16) * 2; // Convert length from bytes to characters + + // Extract the data + const data = hex.substring(dataOffset + 64, dataOffset + 64 + dataLength); + + // Convert the extracted data from hex to Uint8Array + const bytes = new Uint8Array(data.length / 2); + for (let i = 0, j = 0; i < data.length; i += 2, j++) { + bytes[j] = parseInt(data.substring(i, i + 2), 16); + } + + return bytes; +} + +export const fetchJSONRPC = async (url: string, options: RequestInit) => { + try { + const response = await fetch(url, options); + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + const data = await response.json(); + if (data && data.result) { + // The result is usually prefixed with '0x' and is in hex format + const hexResult = data.result; + const decodedBytes = decodeAbiBytes(hexResult); + return `0x${toHexString(decodedBytes)}`; + } else { + console.error('No result from blockchain call'); + } + } catch (error) { + console.error('Error performing eth_call:', error); + } +}; diff --git a/src/sdk/encrypt.test.ts b/src/sdk/encrypt.test.ts index 39ddce0..508475f 100644 --- a/src/sdk/encrypt.test.ts +++ b/src/sdk/encrypt.test.ts @@ -27,7 +27,7 @@ describe('encrypt', () => { input.add8(BigInt(43)); input.add32(BigInt(2339389323)); const buffer = input.encrypt(); - const compactList = CompactFheUint160List.deserialize(buffer); + const compactList = CompactFheUint160List.deserialize(buffer.data); let encryptedList = compactList.expand(); expect(encryptedList.length).toBe(4); encryptedList.forEach((v: FheUint160, i: number) => { @@ -56,7 +56,7 @@ describe('encrypt', () => { ); input.add128(BigInt(0)); const buffer = input.encrypt(); - const compactList = CompactFheUint160List.deserialize(buffer); + const compactList = CompactFheUint160List.deserialize(buffer.data); let encryptedList = compactList.expand(); expect(encryptedList.length).toBe(1); encryptedList.forEach((v: FheUint160, i: number) => { diff --git a/src/sdk/encrypt.ts b/src/sdk/encrypt.ts index 312c433..d17ae20 100644 --- a/src/sdk/encrypt.ts +++ b/src/sdk/encrypt.ts @@ -1,6 +1,11 @@ import { isAddress } from 'web3-validator'; +import createKeccakHash from 'keccak'; import { TfheCompactPublicKey, CompactFheUint160List } from 'node-tfhe'; +import { toHexString } from '../utils'; +import { ENCRYPTION_TYPES } from './encryptionTypes'; +import { fetchJSONRPC } from '../ethCall'; + // const publicZkParams = CompactPkePublicParams.deserialize(crsBuffer); export type ZKInput = { @@ -15,8 +20,11 @@ export type ZKInput = { getValues: () => bigint[]; getBits: () => number[]; resetValues: () => ZKInput; - encrypt: () => Uint8Array; - send: () => Uint8Array; + encrypt: () => { + inputs: string[]; + data: Uint8Array; + }; + send: () => Promise<{ inputs: string[]; signature: string }>; }; const checkEncryptedValue = (value: number | bigint, bits: number) => { @@ -35,12 +43,7 @@ const checkEncryptedValue = (value: number | bigint, bits: number) => { export const createEncryptedInput = (tfheCompactPublicKey?: TfheCompactPublicKey, coprocessorUrl?: string) => - ( - contractAddress: string, - userAddress: string, - functionSignature: string, - callerAddress?: string, - ) => { + (contractAddress: string, userAddress: string, callerAddress?: string) => { if (!tfheCompactPublicKey) throw new Error( 'Your instance has been created without the public blockchain key.', @@ -68,43 +71,43 @@ export const createEncryptedInput = ) throw new Error('Value must be 1 or 0.'); values.push(BigInt(value)); - bits.push(1); + bits.push(ENCRYPTION_TYPES[1]); return this; }, add4(value: number | bigint) { checkEncryptedValue(value, 4); values.push(BigInt(value)); - bits.push(4); + bits.push(ENCRYPTION_TYPES[4]); return this; }, add8(value: number | bigint) { checkEncryptedValue(value, 8); values.push(BigInt(value)); - bits.push(8); + bits.push(ENCRYPTION_TYPES[8]); return this; }, add16(value: number | bigint) { checkEncryptedValue(value, 16); values.push(BigInt(value)); - bits.push(16); + bits.push(ENCRYPTION_TYPES[16]); return this; }, add32(value: number | bigint) { checkEncryptedValue(value, 32); values.push(BigInt(value)); - bits.push(32); + bits.push(ENCRYPTION_TYPES[32]); return this; }, add64(value: number | bigint) { checkEncryptedValue(value, 64); values.push(BigInt(value)); - bits.push(64); + bits.push(ENCRYPTION_TYPES[64]); return this; }, add128(value: number | bigint) { checkEncryptedValue(value, 128); values.push(BigInt(value)); - bits.push(128); + bits.push(ENCRYPTION_TYPES[128]); return this; }, addAddress(value: string) { @@ -113,7 +116,7 @@ export const createEncryptedInput = } checkEncryptedValue(BigInt(value), 160); values.push(BigInt(value)); - bits.push(160); + bits.push(ENCRYPTION_TYPES[160]); return this; }, getValues() { @@ -138,15 +141,54 @@ export const createEncryptedInput = // publicKey, // ZkComputeLoad.Proof, // ); - return [encrypted.serialize()]; + const data = encrypted.serialize(); + const hash = createKeccakHash('keccak256') + .update(toHexString(data)) + .digest(); + const inputs = bits.map((v, i) => { + const dataInput = new Uint8Array(32); + dataInput.set(hash, 0); + dataInput.set([i, bits[v]], 30); + return createKeccakHash('keccak256') + .update(toHexString(dataInput)) + .digest('hex'); + }); + return { + inputs, + data, + }; }, - send() { + async send() { if (!coprocessorUrl) throw new Error('Coprocessor URL not provided'); const encrypted = CompactFheUint160List.encrypt_with_compact_public_key( values, publicKey, ); - return encrypted.serialize(); + const ciphertext = encrypted.serialize(); + + const data = new Uint8Array(1 + bits.length + ciphertext.length); + data.set([data.length], 0); + data.set(bits, 1); + data.set(ciphertext, data.length + 1); + + const payload = { + jsonrpc: '2.0', + method: 'eth_call', + params: [toHexString(data), 'latest'], + id: 1, + }; + + // Set up the fetch request options + const options = { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(payload), + }; + const response = await fetchJSONRPC(coprocessorUrl, options); + if (!response) throw new Error('Invalid input'); + return JSON.parse(response); }, }; }; diff --git a/src/sdk/encryptionTypes.ts b/src/sdk/encryptionTypes.ts new file mode 100644 index 0000000..f117dd1 --- /dev/null +++ b/src/sdk/encryptionTypes.ts @@ -0,0 +1,14 @@ +export const ENCRYPTION_TYPES = { + 1: 0, + 4: 1, + 8: 2, + 16: 3, + 32: 4, + 64: 5, + 128: 6, + 160: 7, + 256: 8, + 512: 9, + 1024: 10, + 2048: 11, +}; diff --git a/src/sdk/network.ts b/src/sdk/network.ts index ec4ea64..e075651 100644 --- a/src/sdk/network.ts +++ b/src/sdk/network.ts @@ -1,47 +1,4 @@ -import { toHexString } from '../utils'; - -function decodeAbiBytes(hex: string): Uint8Array { - if (hex.startsWith('0x')) { - hex = hex.substring(2); - } - // The data offset is the first 32 bytes, which points to the start of the data (skip this part) - const dataOffset = parseInt(hex.substring(0, 64), 16) * 2; // Convert offset from bytes to characters - - // The length of the data is the next 32 bytes, starting from the offset - const dataLength = - parseInt(hex.substring(dataOffset, dataOffset + 64), 16) * 2; // Convert length from bytes to characters - - // Extract the data - const data = hex.substring(dataOffset + 64, dataOffset + 64 + dataLength); - - // Convert the extracted data from hex to Uint8Array - const bytes = new Uint8Array(data.length / 2); - for (let i = 0, j = 0; i < data.length; i += 2, j++) { - bytes[j] = parseInt(data.substring(i, i + 2), 16); - } - - return bytes; -} - -const fetchJSONRPC = async (url: string, options: RequestInit) => { - try { - const response = await fetch(url, options); - if (!response.ok) { - throw new Error(`HTTP error! status: ${response.status}`); - } - const data = await response.json(); - if (data && data.result) { - // The result is usually prefixed with '0x' and is in hex format - const hexResult = data.result; - const decodedBytes = decodeAbiBytes(hexResult); - return `0x${toHexString(decodedBytes)}`; - } else { - console.error('No result from blockchain call'); - } - } catch (error) { - console.error('Error performing eth_call:', error); - } -}; +import { fetchJSONRPC } from '../ethCall'; export const getPublicKeyCallParams = () => ({ to: '0x000000000000000000000000000000000000005d', From eb62c7a499083669380a24ffca9d9bec9e8b078d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20=27birdy=27=20Danjou?= Date: Wed, 12 Jun 2024 15:32:34 +0200 Subject: [PATCH 06/15] fix: fix eth_call to eth_addUserCiphertext --- src/sdk/encrypt.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sdk/encrypt.ts b/src/sdk/encrypt.ts index d17ae20..a2f97a3 100644 --- a/src/sdk/encrypt.ts +++ b/src/sdk/encrypt.ts @@ -173,7 +173,7 @@ export const createEncryptedInput = const payload = { jsonrpc: '2.0', - method: 'eth_call', + method: 'eth_addUserCiphertext', params: [toHexString(data), 'latest'], id: 1, }; From 65c85741c58ba04f29e4445fddebc5d40255882a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20=27birdy=27=20Danjou?= Date: Wed, 12 Jun 2024 16:11:18 +0200 Subject: [PATCH 07/15] fix: add handle version --- src/sdk/encrypt.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sdk/encrypt.ts b/src/sdk/encrypt.ts index a2f97a3..96c64a5 100644 --- a/src/sdk/encrypt.ts +++ b/src/sdk/encrypt.ts @@ -148,7 +148,7 @@ export const createEncryptedInput = const inputs = bits.map((v, i) => { const dataInput = new Uint8Array(32); dataInput.set(hash, 0); - dataInput.set([i, bits[v]], 30); + dataInput.set([i, bits[v], 0], 29); return createKeccakHash('keccak256') .update(toHexString(dataInput)) .digest('hex'); From 66fe6c16338982a61a44e8f6393ef87e67c025d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20=27birdy=27=20Danjou?= Date: Wed, 12 Jun 2024 16:11:29 +0200 Subject: [PATCH 08/15] chore: remove wrong README --- src/kms/web/README.md | 65 ------------------------------------------- 1 file changed, 65 deletions(-) delete mode 100644 src/kms/web/README.md diff --git a/src/kms/web/README.md b/src/kms/web/README.md deleted file mode 100644 index ba4a8e9..0000000 --- a/src/kms/web/README.md +++ /dev/null @@ -1,65 +0,0 @@ -# Key Management System - -[![CI](https://github.com/zama-ai/kms/workflows/CI/badge.svg)](https://github.com/zama-ai/kms/actions) -[![image-badge](https://ghcr-badge.egpl.dev/zama-ai/kms/tags?trim=major)](https://github.com/zama-ai/kms/pkgs/container/kms) -[![image-size-badge](https://ghcr-badge.egpl.dev/zama-ai/kms/size)](https://github.com/zama-ai/kms/pkgs/container/kms) -[![license-badge](https://img.shields.io/badge/License-BSD-blue)](LICENSE) - - -https://github.com/zama-ai/kms/actions/workflows/publish-docker-image.yml - -This repository hosts the code for the Zama Key Management System prototypes. - -## MVP Specification - -The full KMS specification is currently under review. What follows describes a KMS minimal viable product. - -### Description -It is assumed that neither decryptions nor reencryptions happen during transactions. Instead, transactions *mark* ciphertexts as decryptable or reencryptable. -Subsequently, full nodes may issue decryption and reencryption requests to the KMS for ciphertexts which have been marked as decryptable or reencryptable. Usually, this happens upon reception of a request from a user or wallet. - -### Sequence Diagram (reencryption) - -```mermaid -sequenceDiagram - actor Wallet - Wallet->>+Full Node: View function request - Full Node->>Full Node: Execute view function (encounter `TFHE.reencrypt(ct, pubkey)`) - Full Node->>Full Node: Generate `proof` for {`ct`, `pubkey`} - Full Node->>+KMS: Reencryption request ({`ct`, `pubkey`, `proof`, `height`}) - KMS->>+Light Client: Get state root at height `height` - Light Client->>-KMS: `root` - KMS->>KMS: Verify `proof` against `root` - KMS->>KMS: Decrypt - KMS->>KMS: Encrypt result under `pubkey` - KMS->>KMS: Sign encrypted result - KMS->>-Full Node: {`reencryped_ciphertext`, `sig`} - Full Node->>Full Node: Verify `sig` - Full Node->>-Wallet: `reencryped_ciphertext` - Wallet->>Wallet: Decrypt -``` -The process for decryptions is analogous. - -For the time being, the light client is assumed to provide valid state roots to the KMS service. - -In practice, the light client relies on any full node that is live and up to date with the blockchain. -Once the trusted setup is done at genesis, the light client can be trusted to provide valid state roots for any block, as long as the full node it connects to does not engage in byzantine behavior. - -## Implementation - -The KMS is iplemented as a gRPC service using the [tonic](https://github.com/hyperium/tonic) crate. -Communication between full nodes and the KMS service is defined by [protobuf](/proto/kms.proto) messages. -The rest of the communication is defined by existing standards and uses JSON-RPC. -For the light client, we currently use CometBFT's [light](https://pkg.go.dev/github.com/cometbft/cometbft/light) package, which provides a service that connects to any CometBFT full node to serve trusted state roots on-demand. -The light client package handles the logic of sequentially verifying block headers. - -## Next steps -- [ ] Full Node ->> KMS Reencryption request should contain user signature on `pubkey` and an `ACL` object. -- [ ] KMS should verify the user signature on `pubkey` against the values of permissible decryptors in `ACL`. - - -## Contribution - -See [CONTRIBUTING.md](CONTRIBUTING.md). - - From 58c14c565b7a1830168b8bb71373f00e95ff808c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20=27birdy=27=20Danjou?= Date: Wed, 12 Jun 2024 16:25:48 +0200 Subject: [PATCH 09/15] fix: add index in hash --- src/sdk/encrypt.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/sdk/encrypt.ts b/src/sdk/encrypt.ts index 96c64a5..2bed8ca 100644 --- a/src/sdk/encrypt.ts +++ b/src/sdk/encrypt.ts @@ -142,10 +142,13 @@ export const createEncryptedInput = // ZkComputeLoad.Proof, // ); const data = encrypted.serialize(); - const hash = createKeccakHash('keccak256') - .update(toHexString(data)) - .digest(); const inputs = bits.map((v, i) => { + const dataWithIndex = new Uint8Array(data.length + 1); + dataWithIndex.set(data, 0); + dataWithIndex.set([i], data.length); + const hash = createKeccakHash('keccak256') + .update(Buffer.from(dataWithIndex)) + .digest(); const dataInput = new Uint8Array(32); dataInput.set(hash, 0); dataInput.set([i, bits[v], 0], 29); From 3fc4ef8239e9104188231c09b807bb6c82025552 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20=27birdy=27=20Danjou?= Date: Wed, 12 Jun 2024 22:09:47 +0200 Subject: [PATCH 10/15] test: add more test --- jest.config.cjs | 8 ++-- src/sdk/encrypt.test.ts | 92 +++++++++++++++++++++++++++++++++++++-- src/sdk/encrypt.ts | 15 ++++--- src/sdk/index.ts | 41 ++++++++--------- src/sdk/keypair.test.ts | 42 ++++++++++++++++++ src/sdk/keypair.ts | 21 +++++++-- src/sdk/reencrypt.test.ts | 27 +++++++++++- src/sdk/reencrypt.ts | 5 ++- src/utils.test.ts | 19 ++++++++ src/utils.ts | 8 ---- 10 files changed, 229 insertions(+), 49 deletions(-) diff --git a/jest.config.cjs b/jest.config.cjs index fe81d07..7ade4af 100644 --- a/jest.config.cjs +++ b/jest.config.cjs @@ -22,14 +22,16 @@ module.exports = { }, collectCoverageFrom: [ 'src/**/*.ts', - '!src/**/*.d.ts', 'src/**/*.tsx', - '!src/**/*.story.**', + '!src/**/*.d.ts', + '!src/kms/*', + '!src/init.ts', + '!src/node.ts', + '!src/web.ts', ], testRegex: '\\.test\\.tsx?$', coverageReporters: ['lcov', 'text-summary', 'json'], transformIgnorePatterns: ['/node_modules/'], - coveragePathIgnorePatterns: [], coverageThreshold: { global: { branches: 80, diff --git a/src/sdk/encrypt.test.ts b/src/sdk/encrypt.test.ts index 508475f..eb71fee 100644 --- a/src/sdk/encrypt.test.ts +++ b/src/sdk/encrypt.test.ts @@ -20,16 +20,20 @@ describe('encrypt', () => { it('encrypt/decrypt', async () => { const input = createEncryptedInput(publicKey)( '0x8ba1f109551bd432803012645ac136ddd64dba72', - '0x8ba1f109551bd432803012645ac136ddd64dba72', + '0xa5e1defb98EFe38EBb2D958CEe052410247F4c80', ); - input.addBool(false); + input.addBool(BigInt(0)); input.add4(2); input.add8(BigInt(43)); + input.add16(BigInt(87)); input.add32(BigInt(2339389323)); + input.add64(BigInt(23393893233)); + input.add128(BigInt(233938932390)); + input.addAddress('0xa5e1defb98EFe38EBb2D958CEe052410247F4c80'); const buffer = input.encrypt(); const compactList = CompactFheUint160List.deserialize(buffer.data); let encryptedList = compactList.expand(); - expect(encryptedList.length).toBe(4); + expect(encryptedList.length).toBe(8); encryptedList.forEach((v: FheUint160, i: number) => { const decrypted = v.decrypt(clientKey); switch (i) { @@ -42,17 +46,34 @@ describe('encrypt', () => { case 2: expect(decrypted.toString()).toBe('43'); break; + case 3: + expect(decrypted.toString()).toBe('87'); + break; case 3: expect(decrypted.toString()).toBe('2339389323'); break; + case 5: + expect(decrypted.toString()).toBe('23393893233'); + break; + case 6: + expect(decrypted.toString()).toBe('233938932390'); + break; + case 7: + expect(decrypted.toString()).toBe( + '947020569397242089359429103430823793539382463616', + ); + break; } }); + input.resetValues(); + expect(input.getBits().length).toBe(0); + expect(input.getValues().length).toBe(0); }); it('encrypt/decrypt one 0 value', async () => { const input = createEncryptedInput(publicKey)( '0x8ba1f109551bd432803012645ac136ddd64dba72', - '0x8ba1f109551bd432803012645ac136ddd64dba72', + '0xa5e1defb98EFe38EBb2D958CEe052410247F4c80', ); input.add128(BigInt(0)); const buffer = input.encrypt(); @@ -68,4 +89,67 @@ describe('encrypt', () => { } }); }); + + it('throws errors', async () => { + expect(() => + createEncryptedInput()( + '0x8ba1f109551bd432803012645ac136ddd64dba72', + '0xa5e1defb98EFe38EBb2D958CEe052410247F4c80', + ), + ).toThrow( + 'Your instance has been created without the public blockchain key.', + ); + expect(() => + createEncryptedInput(publicKey)( + '0x8ba1f109551bd432803012645ac136ddd64dba', + '0xa5e1defb98EFe38EBb2D958CEe052410247F4c80', + ), + ).toThrow('Contract address is not a valid address.'); + + expect(() => + createEncryptedInput(publicKey)( + '0x8ba1f109551bd432803012645ac136ddd64dba72', + '0xa5e1defb98EFe38EBb2D958CEe052410247F4c', + ), + ).toThrow('User address is not a valid address.'); + + const input = createEncryptedInput(publicKey)( + '0x8ba1f109551bd432803012645ac136ddd64dba72', + '0xa5e1defb98EFe38EBb2D958CEe052410247F4c80', + ); + expect(() => input.addBool('hello' as any)).toThrow( + 'The value must be a boolean, a number or a bigint.', + ); + expect(() => input.addBool({} as any)).toThrow( + 'The value must be a boolean, a number or a bigint.', + ); + expect(() => input.addBool(29393)).toThrow('The value must be 1 or 0.'); + expect(() => input.add4(29393)).toThrow( + 'The value exceeds the limit for 4bits integer (15)', + ); + expect(() => input.add8(2 ** 8)).toThrow( + 'The value exceeds the limit for 8bits integer (255)', + ); + expect(() => input.add16(2 ** 16)).toThrow( + `The value exceeds the limit for 16bits integer (65535).`, + ); + expect(() => input.add32(2 ** 32)).toThrow( + 'The value exceeds the limit for 32bits integer (4294967295).', + ); + expect(() => input.add64(BigInt('0xffffffffffffffff') + BigInt(1))).toThrow( + 'The value exceeds the limit for 64bits integer (18446744073709551615).', + ); + expect(() => + input.add128(BigInt('0xffffffffffffffffffffffffffffffff') + BigInt(1)), + ).toThrow( + 'The value exceeds the limit for 128bits integer (340282366920938463463374607431768211455).', + ); + + expect(() => input.addAddress('0x00')).toThrow( + 'The value must be a valid address.', + ); + + expect(input.getBits().length).toBe(0); + expect(input.getValues().length).toBe(0); + }); }); diff --git a/src/sdk/encrypt.ts b/src/sdk/encrypt.ts index 2bed8ca..093dc57 100644 --- a/src/sdk/encrypt.ts +++ b/src/sdk/encrypt.ts @@ -43,7 +43,7 @@ const checkEncryptedValue = (value: number | bigint, bits: number) => { export const createEncryptedInput = (tfheCompactPublicKey?: TfheCompactPublicKey, coprocessorUrl?: string) => - (contractAddress: string, userAddress: string, callerAddress?: string) => { + (contractAddress: string, userAddress: string) => { if (!tfheCompactPublicKey) throw new Error( 'Your instance has been created without the public blockchain key.', @@ -53,23 +53,27 @@ export const createEncryptedInput = throw new Error('Contract address is not a valid address.'); } + if (!isAddress(userAddress)) { + throw new Error('User address is not a valid address.'); + } + const publicKey: TfheCompactPublicKey = tfheCompactPublicKey; const values: bigint[] = []; const bits: number[] = []; return { - addBool(value: boolean) { + addBool(value: boolean | number | bigint) { if (value == null) throw new Error('Missing value'); if ( typeof value !== 'boolean' && typeof value !== 'number' && typeof value !== 'bigint' ) - throw new Error('Value must be a boolean, a number or a bigint.'); + throw new Error('The value must be a boolean, a number or a bigint.'); if ( (typeof value !== 'bigint' || typeof value !== 'number') && Number(value) > 1 ) - throw new Error('Value must be 1 or 0.'); + throw new Error('The value must be 1 or 0.'); values.push(BigInt(value)); bits.push(ENCRYPTION_TYPES[1]); return this; @@ -112,9 +116,8 @@ export const createEncryptedInput = }, addAddress(value: string) { if (!isAddress(value)) { - throw new Error('Value must be a valid address.'); + throw new Error('The value must be a valid address.'); } - checkEncryptedValue(BigInt(value), 160); values.push(BigInt(value)); bits.push(ENCRYPTION_TYPES[160]); return this; diff --git a/src/sdk/index.ts b/src/sdk/index.ts index 33c0edb..71367d4 100644 --- a/src/sdk/index.ts +++ b/src/sdk/index.ts @@ -8,11 +8,13 @@ import { createEncryptedInput } from './encrypt'; import { generateKeypair, createEIP712, EIP712 } from './keypair'; import { reencryptRequest } from './reencrypt'; -export type FhevmInstanceParams = { - chainId?: number; +export { getPublicKeyCallParams } from './network'; + +type FhevmInstanceConfig = { + chainId: number; publicKey?: string; - networkUrl?: string; reencryptionUrl?: string; + networkUrl?: string; }; export type FhevmInstance = { @@ -21,7 +23,11 @@ export type FhevmInstance = { userAddress: string, ) => ZKInput; generateKeypair: () => { publicKey: string; privateKey: string }; - createEIP712: (publicKey: string, contractAddress: string) => EIP712; + createEIP712: ( + publicKey: string, + contractAddress: string, + userAddress?: string, + ) => EIP712; reencrypt: ( handle: bigint, privateKey: string, @@ -32,29 +38,16 @@ export type FhevmInstance = { ) => Promise; }; -export const getCiphertextCallParams = (handle: bigint) => { - let hex = handle.toString(16); - hex = hex.padStart(64, '0'); - return { - to: '0x000000000000000000000000000000000000005d', - data: '0xff627e77' + hex, - }; -}; - export const createInstance = async ( - params: FhevmInstanceParams, + config: FhevmInstanceConfig, ): Promise => { await sodium.ready; - const { chainId, networkUrl } = params; + const { chainId, networkUrl, reencryptionUrl } = config; - let publicKey: string | undefined = params.publicKey; + let publicKey: string | undefined = config.publicKey; let tfheCompactPublicKey: TfheCompactPublicKey | undefined; - if (networkUrl && !chainId) { - publicKey = await getChainIdFromNetwork(networkUrl); - } - if (typeof chainId !== 'number') throw new Error('chainId must be a number'); if (networkUrl && !publicKey) { @@ -66,13 +59,17 @@ export const createInstance = async ( if (publicKey) { const buff = fromHexString(publicKey); - tfheCompactPublicKey = TfheCompactPublicKey.deserialize(buff); + try { + tfheCompactPublicKey = TfheCompactPublicKey.deserialize(buff); + } catch (e) { + throw new Error('Invalid public key (deserialization failed)'); + } } return { createEncryptedInput: createEncryptedInput(tfheCompactPublicKey), generateKeypair, createEIP712: createEIP712(chainId), - reencrypt: reencryptRequest(networkUrl), + reencrypt: reencryptRequest(reencryptionUrl), }; }; diff --git a/src/sdk/keypair.test.ts b/src/sdk/keypair.test.ts index b0c6e6d..46d7a1b 100644 --- a/src/sdk/keypair.test.ts +++ b/src/sdk/keypair.test.ts @@ -47,4 +47,46 @@ describe('token', () => { expect(eip712.types.Reencrypt[0].name).toBe('publicKey'); expect(eip712.types.Reencrypt[0].type).toBe('bytes32'); }); + + it('create a valid EIP712 with delegated accunt', async () => { + const keypair = generateKeypair(); + + const eip712 = createEIP712(1234)( + keypair.publicKey, + '0x8ba1f109551bd432803012645ac136ddd64dba72', + '0xa5e1defb98EFe38EBb2D958CEe052410247F4c80', + ); + + expect(eip712.domain.chainId).toBe(1234); + expect(eip712.domain.name).toBe('Authorization token'); + expect(eip712.domain.version).toBe('1'); + expect(eip712.message.publicKey).toBe(`0x${keypair.publicKey}`); + expect(eip712.message.delegatedAccount).toBe( + '0xa5e1defb98EFe38EBb2D958CEe052410247F4c80', + ); + expect(eip712.primaryType).toBe('Reencrypt'); + expect(eip712.types.Reencrypt.length).toBe(2); + expect(eip712.types.Reencrypt[0].name).toBe('publicKey'); + expect(eip712.types.Reencrypt[0].type).toBe('bytes32'); + expect(eip712.types.Reencrypt[1].name).toBe('delegatedAccount'); + expect(eip712.types.Reencrypt[1].type).toBe('address'); + }); + + it('create invalid EIP712', async () => { + const keypair = generateKeypair(); + + expect(() => + createEIP712(1234)( + keypair.publicKey, + '0x8ba1f109551bd432803012645ac136ddd64dba', + ), + ).toThrow('Invalid contract address.'); + expect(() => + createEIP712(1234)( + keypair.publicKey, + '0x8ba1f109551bd432803012645ac136ddd64dba72', + '0xa5e1defb98EFe38EBb2D958CEe052410247F4c8022', + ), + ).toThrow('Invalid delegated account.'); + }); }); diff --git a/src/sdk/keypair.ts b/src/sdk/keypair.ts index e4894bb..87e7820 100644 --- a/src/sdk/keypair.ts +++ b/src/sdk/keypair.ts @@ -1,3 +1,4 @@ +import { isAddress } from 'web3-validator'; import { toHexString } from '../utils'; import { cryptobox_keygen, @@ -16,7 +17,8 @@ export type EIP712 = { version: string; }; message: { - [key: string]: any; + publicKey: string; + delegatedAccount?: string; }; primaryType: string; types: { @@ -25,7 +27,12 @@ export type EIP712 = { }; export const createEIP712 = - (chainId: number) => (publicKey: string, verifyingContract: string) => { + (chainId: number) => + (publicKey: string, verifyingContract: string, delegatedAccount?: string) => { + if (!isAddress(verifyingContract)) + throw new Error('Invalid contract address.'); + if (delegatedAccount && !isAddress(delegatedAccount)) + throw new Error('Invalid delegated account.'); const msgParams: EIP712 = { types: { // This refers to the domain the contract is hosted on. @@ -49,7 +56,7 @@ export const createEIP712 = // This identifies the latest version. version: '1', // This defines the network, in this case, Mainnet. - chainId: chainId, + chainId, // // Add a verifying contract to make sure you're establishing contracts with the proper entity. verifyingContract, }, @@ -57,6 +64,14 @@ export const createEIP712 = publicKey: `0x${publicKey}`, }, }; + + if (delegatedAccount) { + msgParams.message.delegatedAccount = delegatedAccount; + msgParams.types.Reencrypt.push({ + name: 'delegatedAccount', + type: 'address', + }); + } return msgParams; }; diff --git a/src/sdk/reencrypt.test.ts b/src/sdk/reencrypt.test.ts index 3118f9c..48b28d6 100644 --- a/src/sdk/reencrypt.test.ts +++ b/src/sdk/reencrypt.test.ts @@ -4,6 +4,7 @@ import { TfheCompactPublicKey, TfheClientKey, } from 'node-tfhe'; +import { reencryptRequest } from './reencrypt'; import { createTfheKeypair } from '../tfhe'; import { createEncryptedInput } from './encrypt'; import { getPublicKeyCallParams, getPublicKeyFromNetwork } from './network'; @@ -11,6 +12,30 @@ import { fromHexString } from '../utils'; describe('reencrypt', () => { it('get reencryption for handle', async () => { - expect(true).toBe(true); + const reencrypt = reencryptRequest('mock'); + const result = await reencrypt( + BigInt(3333), + '0xccc', + '0xcccc', + '0xccc', + '0x8ba1f109551bd432803012645ac136ddd64dba72', + '0xa5e1defb98EFe38EBb2D958CEe052410247F4c80', + ); + + expect(result.toString()).toBe('10'); + }); + + it('throw if no reencryption URL is provided', async () => { + const reencrypt = reencryptRequest(); + const result = reencrypt( + BigInt(3333), + '0xccc', + '0xcccc', + '0xccc', + '0x8ba1f109551bd432803012645ac136ddd64dba72', + '0xa5e1defb98EFe38EBb2D958CEe052410247F4c80', + ); + + expect(result).rejects.toThrow('You must provide a reencryption URL.'); }); }); diff --git a/src/sdk/reencrypt.ts b/src/sdk/reencrypt.ts index 795b642..fdabc43 100644 --- a/src/sdk/reencrypt.ts +++ b/src/sdk/reencrypt.ts @@ -7,7 +7,7 @@ import { } from '../kms/node'; export const reencryptRequest = - (reencryptUrl?: string) => + (reencryptionUrl?: string) => async ( handle: bigint, privateKey: string, @@ -16,7 +16,8 @@ export const reencryptRequest = contractAddress: string, userAddress: string, ) => { - if (!reencryptUrl) throw new Error('You must provide a reencrypt URL'); + if (!reencryptionUrl) + throw new Error('You must provide a reencryption URL.'); const data = { publicKey, handle, diff --git a/src/utils.test.ts b/src/utils.test.ts index 95ed0a0..79e2a1b 100644 --- a/src/utils.test.ts +++ b/src/utils.test.ts @@ -1,7 +1,9 @@ import { bigIntToBytes, bytesToBigInt, + bytesToHex, clientKeyDecryptor, + fromHexString, toHexString, } from './utils'; import { createTfheKeypair } from './tfhe'; @@ -26,6 +28,23 @@ describe('decrypt', () => { compactPublicKey = publicKey; }); + it('converts a hex to bytes', async () => { + const value = '0xff'; + const bytes = fromHexString(value); + expect(bytes).toEqual(new Uint8Array([255])); + + const bytes2 = fromHexString('0x'); + expect(bytes2).toEqual(new Uint8Array([])); + }); + + it('converts a bytes to hex', async () => { + const bytes = bytesToHex(new Uint8Array([255])); + expect(bytes).toEqual('0xff'); + + const bytes2 = bytesToHex(new Uint8Array()); + expect(bytes2).toEqual('0x0'); + }); + it('converts a number to bytes', async () => { const value = BigInt(28482); const bytes = bigIntToBytes(value); diff --git a/src/utils.ts b/src/utils.ts index face392..304d249 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -42,14 +42,6 @@ export const bytesToBigInt = function (byteArray: Uint8Array): bigint { return result; }; -export const isAddress = function (address: string) { - if (address.match(/^0x[0-9a-fA-F]{40}$/)) { - // check if it has the basic requirements of an address - return true; - } - return false; -}; - export const clientKeyDecryptor = (clientKeySer: Uint8Array) => { const clientKey = TfheClientKey.deserialize(clientKeySer); return { From c50e8060d6e68d9fac0968813c5b1275e3d014a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20=27birdy=27=20Danjou?= Date: Thu, 13 Jun 2024 11:22:22 +0200 Subject: [PATCH 11/15] feat: add fetch pub key from coprocessor --- src/sdk/index.ts | 20 ++++++++++++++++---- src/sdk/network.ts | 24 +++++++++++++++++++++++- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/sdk/index.ts b/src/sdk/index.ts index 71367d4..65a7c42 100644 --- a/src/sdk/index.ts +++ b/src/sdk/index.ts @@ -3,7 +3,11 @@ import { TfheCompactPublicKey } from 'node-tfhe'; import { fromHexString } from '../utils'; import { ZKInput } from './encrypt'; -import { getPublicKeyFromNetwork, getChainIdFromNetwork } from './network'; +import { + getPublicKeyFromNetwork, + getPublicKeyFromCoprocessor, + getChainIdFromNetwork, +} from './network'; import { createEncryptedInput } from './encrypt'; import { generateKeypair, createEIP712, EIP712 } from './keypair'; import { reencryptRequest } from './reencrypt'; @@ -15,6 +19,7 @@ type FhevmInstanceConfig = { publicKey?: string; reencryptionUrl?: string; networkUrl?: string; + coprocessorUrl?: string; }; export type FhevmInstance = { @@ -43,17 +48,24 @@ export const createInstance = async ( ): Promise => { await sodium.ready; - const { chainId, networkUrl, reencryptionUrl } = config; + const { networkUrl, reencryptionUrl, coprocessorUrl } = config; + let chainId: number | undefined = config.chainId; let publicKey: string | undefined = config.publicKey; let tfheCompactPublicKey: TfheCompactPublicKey | undefined; - if (typeof chainId !== 'number') throw new Error('chainId must be a number'); + if (typeof chainId !== 'number') throw new Error('chainId must be a number.'); - if (networkUrl && !publicKey) { + if (coprocessorUrl && !publicKey) { + publicKey = await getPublicKeyFromCoprocessor(coprocessorUrl); + } else if (networkUrl && !publicKey) { publicKey = await getPublicKeyFromNetwork(networkUrl); } + if (networkUrl && !chainId) { + chainId = await getChainIdFromNetwork(networkUrl); + } + if (publicKey && typeof publicKey !== 'string') throw new Error('publicKey must be a string'); diff --git a/src/sdk/network.ts b/src/sdk/network.ts index e075651..63fbc8e 100644 --- a/src/sdk/network.ts +++ b/src/sdk/network.ts @@ -20,7 +20,7 @@ export const getChainIdFromNetwork = async (url: string) => { }, body: JSON.stringify(payload), }; - return fetchJSONRPC(url, options); + return Number(fetchJSONRPC(url, options)); }; // Define the function to perform the eth_call @@ -44,3 +44,25 @@ export const getPublicKeyFromNetwork = async (url: string) => { return fetchJSONRPC(url, options); }; + +// Define the function to perform the eth_call +export const getPublicKeyFromCoprocessor = async (url: string) => { + // Create the JSON-RPC request payload + const payload = { + jsonrpc: '2.0', + method: 'eth_getPublicFhevmKey', + params: [], + id: 1, + }; + + // Set up the fetch request options + const options = { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(payload), + }; + + return fetchJSONRPC(url, options); +}; From ea2b778c9e5fd35e30d78aed6a3e9f4900560e66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20=27birdy=27=20Danjou?= Date: Thu, 13 Jun 2024 11:23:10 +0200 Subject: [PATCH 12/15] fix: add missing param --- src/sdk/index.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/sdk/index.ts b/src/sdk/index.ts index 65a7c42..b97bcfd 100644 --- a/src/sdk/index.ts +++ b/src/sdk/index.ts @@ -79,7 +79,10 @@ export const createInstance = async ( } return { - createEncryptedInput: createEncryptedInput(tfheCompactPublicKey), + createEncryptedInput: createEncryptedInput( + tfheCompactPublicKey, + coprocessorUrl, + ), generateKeypair, createEIP712: createEIP712(chainId), reencrypt: reencryptRequest(reencryptionUrl), From bb442b9251f18dfd73355f049986c7fcc43bfb64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20=27birdy=27=20Danjou?= Date: Thu, 13 Jun 2024 11:41:43 +0200 Subject: [PATCH 13/15] fix: fix few param in encrypt --- bin/fhevm.js | 1 - src/sdk/encrypt.ts | 10 ++++------ 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/bin/fhevm.js b/bin/fhevm.js index 9dc46ec..c203960 100755 --- a/bin/fhevm.js +++ b/bin/fhevm.js @@ -28,7 +28,6 @@ const getInstance = async (provider) => { // first four bytes of keccak256('fhePubKey(bytes1)') + 1 byte for library data: '0xd9d47bb001', }); - // console.log(ret); const decoded = AbiCoder.defaultAbiCoder().decode(['bytes'], ret); const publicKey = decoded[0]; _instance = await createInstance({ chainId, publicKey }); diff --git a/src/sdk/encrypt.ts b/src/sdk/encrypt.ts index 093dc57..7388f84 100644 --- a/src/sdk/encrypt.ts +++ b/src/sdk/encrypt.ts @@ -43,7 +43,7 @@ const checkEncryptedValue = (value: number | bigint, bits: number) => { export const createEncryptedInput = (tfheCompactPublicKey?: TfheCompactPublicKey, coprocessorUrl?: string) => - (contractAddress: string, userAddress: string) => { + (contractAddress: string, callerAddress: string) => { if (!tfheCompactPublicKey) throw new Error( 'Your instance has been created without the public blockchain key.', @@ -53,7 +53,7 @@ export const createEncryptedInput = throw new Error('Contract address is not a valid address.'); } - if (!isAddress(userAddress)) { + if (!isAddress(callerAddress)) { throw new Error('User address is not a valid address.'); } @@ -155,9 +155,7 @@ export const createEncryptedInput = const dataInput = new Uint8Array(32); dataInput.set(hash, 0); dataInput.set([i, bits[v], 0], 29); - return createKeccakHash('keccak256') - .update(toHexString(dataInput)) - .digest('hex'); + return toHexString(dataInput); }); return { inputs, @@ -180,7 +178,7 @@ export const createEncryptedInput = const payload = { jsonrpc: '2.0', method: 'eth_addUserCiphertext', - params: [toHexString(data), 'latest'], + params: [toHexString(data), contractAddress, callerAddress], id: 1, }; From 52395855a72dc204aa938030e2125191844ac036 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20=27birdy=27=20Danjou?= Date: Thu, 13 Jun 2024 12:25:12 +0200 Subject: [PATCH 14/15] fix: change hashing of handles --- src/sdk/encrypt.ts | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/sdk/encrypt.ts b/src/sdk/encrypt.ts index 7388f84..3231e2c 100644 --- a/src/sdk/encrypt.ts +++ b/src/sdk/encrypt.ts @@ -21,7 +21,7 @@ export type ZKInput = { getBits: () => number[]; resetValues: () => ZKInput; encrypt: () => { - inputs: string[]; + inputs: Uint8Array[]; data: Uint8Array; }; send: () => Promise<{ inputs: string[]; signature: string }>; @@ -138,24 +138,27 @@ export const createEncryptedInput = values, publicKey, ); + const data = encrypted.serialize(); + const hash = createKeccakHash('keccak256') + .update(Buffer.from(data)) + .digest(); // const encrypted = ProvenCompactFheUint160List.encrypt_with_compact_public_key( // values, // publicZkParams, // publicKey, // ZkComputeLoad.Proof, // ); - const data = encrypted.serialize(); const inputs = bits.map((v, i) => { - const dataWithIndex = new Uint8Array(data.length + 1); - dataWithIndex.set(data, 0); - dataWithIndex.set([i], data.length); - const hash = createKeccakHash('keccak256') + const dataWithIndex = new Uint8Array(hash.length + 1); + dataWithIndex.set(hash, 0); + dataWithIndex.set([i], hash.length); + const finalHash = createKeccakHash('keccak256') .update(Buffer.from(dataWithIndex)) .digest(); const dataInput = new Uint8Array(32); - dataInput.set(hash, 0); + dataInput.set(finalHash, 0); dataInput.set([i, bits[v], 0], 29); - return toHexString(dataInput); + return dataInput; }); return { inputs, From 3935569e80ee3b10d8d3890206856b4273093c86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20=27birdy=27=20Danjou?= Date: Thu, 13 Jun 2024 12:39:44 +0200 Subject: [PATCH 15/15] chore: bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e757edc..8317013 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fhevmjs", - "version": "0.5.0-1", + "version": "0.5.0-2", "description": "fhEVM SDK for blockchain using TFHE", "main": "lib/node.cjs", "types": "lib/node.d.ts",