@zksdk/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/TfheClient.d.ts +88 -0
- package/dist/TfheClient.d.ts.map +1 -0
- package/dist/TfheClient.js +315 -0
- package/dist/TfheClient.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +53 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/package.json +45 -0
- package/tfhe-wasm/tfhe.d.ts +4818 -0
- package/tfhe-wasm/tfhe.js +24889 -0
- package/tfhe-wasm/tfhe_bg.wasm +0 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ZKSDK TfheClient - Core FHE encryption/decryption client
|
|
3
|
+
*
|
|
4
|
+
* This client handles all TFHE operations including key generation,
|
|
5
|
+
* encryption, and decryption. The ClientKey never leaves the user's machine.
|
|
6
|
+
*/
|
|
7
|
+
import type { VaultKeys, EncryptedTransferParams, CmuxTransferResult, BalanceTransferResult, KeyGenOptions, ExecutePayload } from "./types.js";
|
|
8
|
+
declare function toBase64(bytes: Uint8Array): string;
|
|
9
|
+
declare function fromBase64(b64: string): Uint8Array;
|
|
10
|
+
/**
|
|
11
|
+
* TfheClient - Main client for FHE operations
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* import { TfheClient } from '@zksdk/core';
|
|
16
|
+
*
|
|
17
|
+
* const client = new TfheClient();
|
|
18
|
+
* await client.init();
|
|
19
|
+
*
|
|
20
|
+
* // Generate vault keys (client-side)
|
|
21
|
+
* const keys = await client.generateVaultKeys();
|
|
22
|
+
* // Save keys.clientKey securely - you need it to decrypt!
|
|
23
|
+
*
|
|
24
|
+
* // Encrypt transfer params
|
|
25
|
+
* const encrypted = client.encryptTransferParams(0, 1, 50);
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare class TfheClient {
|
|
29
|
+
private initialized;
|
|
30
|
+
private clientKey;
|
|
31
|
+
private compressedServerKey;
|
|
32
|
+
private ciphertextSizes;
|
|
33
|
+
private vaultPublicKey;
|
|
34
|
+
private vaultKeyId;
|
|
35
|
+
/**
|
|
36
|
+
* Initialize the TFHE WASM module
|
|
37
|
+
*/
|
|
38
|
+
init(wasmModule?: unknown): Promise<void>;
|
|
39
|
+
private requireKeys;
|
|
40
|
+
/**
|
|
41
|
+
* Generate standard FHE keys
|
|
42
|
+
*/
|
|
43
|
+
generateKeys(options?: KeyGenOptions): Promise<{
|
|
44
|
+
clientKeyB64: string;
|
|
45
|
+
serverKeyB64: string;
|
|
46
|
+
}>;
|
|
47
|
+
/**
|
|
48
|
+
* Generate vault FHE keys client-side (Zero-Trust Model)
|
|
49
|
+
*
|
|
50
|
+
* SECURITY: ClientKey stays on YOUR machine - NEVER sent to oracle.
|
|
51
|
+
* Only ServerKey and PublicKey are sent to the worker.
|
|
52
|
+
*/
|
|
53
|
+
generateVaultKeys(options?: KeyGenOptions): Promise<VaultKeys>;
|
|
54
|
+
/**
|
|
55
|
+
* Load a ClientKey from base64 string
|
|
56
|
+
*/
|
|
57
|
+
loadClientKey(clientKeyB64: string): void;
|
|
58
|
+
/**
|
|
59
|
+
* Load a vault's public key from the worker API
|
|
60
|
+
*/
|
|
61
|
+
loadVaultPublicKey(workerUrl: string, vaultKeyId: string): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* Encrypt transfer parameters
|
|
64
|
+
*/
|
|
65
|
+
encryptTransferParams(senderIdx: number, receiverIdx: number, amount: number): EncryptedTransferParams;
|
|
66
|
+
/**
|
|
67
|
+
* Build execute payload for secure transfer
|
|
68
|
+
*/
|
|
69
|
+
buildSecureTransferPayload(senderIdx: number, receiverIdx: number, amount: number, metadata?: Record<string, unknown>): ExecutePayload;
|
|
70
|
+
/**
|
|
71
|
+
* Encrypt CMUX token transfer (legacy method)
|
|
72
|
+
* @deprecated Use encryptTransferParams() with vault public key instead
|
|
73
|
+
*/
|
|
74
|
+
encryptCmuxToken(balances: number[], senderIdx: number, receiverIdx: number, amount: number): EncryptedTransferParams & {
|
|
75
|
+
evaluation_keys: string;
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* Decrypt CMUX token transfer result
|
|
79
|
+
*/
|
|
80
|
+
decryptCmuxToken(encryptedResultB64: string): CmuxTransferResult;
|
|
81
|
+
/**
|
|
82
|
+
* Decrypt balance transfer result
|
|
83
|
+
*/
|
|
84
|
+
decryptBalanceTransfer(encryptedResultB64: string): BalanceTransferResult;
|
|
85
|
+
private computeCiphertextSizes;
|
|
86
|
+
}
|
|
87
|
+
export { toBase64, fromBase64 };
|
|
88
|
+
//# sourceMappingURL=TfheClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TfheClient.d.ts","sourceRoot":"","sources":["../src/TfheClient.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EACV,SAAS,EACT,uBAAuB,EACvB,kBAAkB,EAClB,qBAAqB,EACrB,aAAa,EACb,cAAc,EAEf,MAAM,YAAY,CAAC;AAiBpB,iBAAS,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAS3C;AAED,iBAAS,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAU3C;AAaD;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,mBAAmB,CAAa;IACxC,OAAO,CAAC,eAAe,CAAgD;IACvE,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,UAAU,CAAuB;IAEzC;;OAEG;IACG,IAAI,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IA0B/C,OAAO,CAAC,WAAW;IAMnB;;OAEG;IACG,YAAY,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAgBxG;;;;;OAKG;IACG,iBAAiB,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,SAAS,CAAC;IAoCxE;;OAEG;IACH,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAazC;;OAEG;IACG,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB9E;;OAEG;IACH,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,uBAAuB;IAkCtG;;OAEG;IACH,0BAA0B,CACxB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACrC,cAAc;IAajB;;;OAGG;IACH,gBAAgB,CACd,QAAQ,EAAE,MAAM,EAAE,EAClB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,uBAAuB,GAAG;QAAE,eAAe,EAAE,MAAM,CAAA;KAAE;IA4BxD;;OAEG;IACH,gBAAgB,CAAC,kBAAkB,EAAE,MAAM,GAAG,kBAAkB;IAwBhE;;OAEG;IACH,sBAAsB,CAAC,kBAAkB,EAAE,MAAM,GAAG,qBAAqB;IAyBzE,OAAO,CAAC,sBAAsB;CAW/B;AAGD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ZKSDK TfheClient - Core FHE encryption/decryption client
|
|
3
|
+
*
|
|
4
|
+
* This client handles all TFHE operations including key generation,
|
|
5
|
+
* encryption, and decryption. The ClientKey never leaves the user's machine.
|
|
6
|
+
*/
|
|
7
|
+
import { fileURLToPath } from "url";
|
|
8
|
+
import { dirname, join } from "path";
|
|
9
|
+
import { readFileSync } from "fs";
|
|
10
|
+
// Dynamic imports for TFHE WASM
|
|
11
|
+
let initTfhe;
|
|
12
|
+
let tfhe;
|
|
13
|
+
const DEFAULT_CIRCUIT_ID = "private_token_slots_v1";
|
|
14
|
+
// Helper to load WASM in Node.js
|
|
15
|
+
async function loadWasmForNode() {
|
|
16
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
17
|
+
const __dirname = dirname(__filename);
|
|
18
|
+
// Look for WASM in parent directory (dist -> package root)
|
|
19
|
+
const wasmPath = join(__dirname, "..", "tfhe-wasm", "tfhe_bg.wasm");
|
|
20
|
+
return readFileSync(wasmPath);
|
|
21
|
+
}
|
|
22
|
+
function toBase64(bytes) {
|
|
23
|
+
if (typeof Buffer !== "undefined") {
|
|
24
|
+
return Buffer.from(bytes).toString("base64");
|
|
25
|
+
}
|
|
26
|
+
let binary = "";
|
|
27
|
+
for (let i = 0; i < bytes.length; i += 1) {
|
|
28
|
+
binary += String.fromCharCode(bytes[i]);
|
|
29
|
+
}
|
|
30
|
+
return btoa(binary);
|
|
31
|
+
}
|
|
32
|
+
function fromBase64(b64) {
|
|
33
|
+
if (typeof Buffer !== "undefined") {
|
|
34
|
+
return new Uint8Array(Buffer.from(b64, "base64"));
|
|
35
|
+
}
|
|
36
|
+
const binary = atob(b64);
|
|
37
|
+
const bytes = new Uint8Array(binary.length);
|
|
38
|
+
for (let i = 0; i < binary.length; i += 1) {
|
|
39
|
+
bytes[i] = binary.charCodeAt(i);
|
|
40
|
+
}
|
|
41
|
+
return bytes;
|
|
42
|
+
}
|
|
43
|
+
function concatBytes(chunks) {
|
|
44
|
+
const total = chunks.reduce((sum, chunk) => sum + chunk.length, 0);
|
|
45
|
+
const merged = new Uint8Array(total);
|
|
46
|
+
let offset = 0;
|
|
47
|
+
for (const chunk of chunks) {
|
|
48
|
+
merged.set(chunk, offset);
|
|
49
|
+
offset += chunk.length;
|
|
50
|
+
}
|
|
51
|
+
return merged;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* TfheClient - Main client for FHE operations
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* ```typescript
|
|
58
|
+
* import { TfheClient } from '@zksdk/core';
|
|
59
|
+
*
|
|
60
|
+
* const client = new TfheClient();
|
|
61
|
+
* await client.init();
|
|
62
|
+
*
|
|
63
|
+
* // Generate vault keys (client-side)
|
|
64
|
+
* const keys = await client.generateVaultKeys();
|
|
65
|
+
* // Save keys.clientKey securely - you need it to decrypt!
|
|
66
|
+
*
|
|
67
|
+
* // Encrypt transfer params
|
|
68
|
+
* const encrypted = client.encryptTransferParams(0, 1, 50);
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
export class TfheClient {
|
|
72
|
+
constructor() {
|
|
73
|
+
this.initialized = false;
|
|
74
|
+
this.clientKey = null;
|
|
75
|
+
this.compressedServerKey = null;
|
|
76
|
+
this.ciphertextSizes = null;
|
|
77
|
+
this.vaultPublicKey = null;
|
|
78
|
+
this.vaultKeyId = null;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Initialize the TFHE WASM module
|
|
82
|
+
*/
|
|
83
|
+
async init(wasmModule) {
|
|
84
|
+
if (this.initialized)
|
|
85
|
+
return;
|
|
86
|
+
// Dynamic import of TFHE bindings
|
|
87
|
+
const tfheModule = await import("../tfhe-wasm/tfhe.js");
|
|
88
|
+
initTfhe = tfheModule.default;
|
|
89
|
+
tfhe = tfheModule;
|
|
90
|
+
// In Node.js, load WASM from file system
|
|
91
|
+
if (!wasmModule && typeof window === "undefined") {
|
|
92
|
+
wasmModule = await loadWasmForNode();
|
|
93
|
+
}
|
|
94
|
+
await initTfhe(wasmModule);
|
|
95
|
+
if (typeof tfhe.init_panic_hook === "function") {
|
|
96
|
+
try {
|
|
97
|
+
tfhe.init_panic_hook();
|
|
98
|
+
}
|
|
99
|
+
catch (_) {
|
|
100
|
+
// Optional; continue even if not available
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
this.initialized = true;
|
|
104
|
+
}
|
|
105
|
+
requireKeys() {
|
|
106
|
+
if (!this.clientKey || !this.compressedServerKey) {
|
|
107
|
+
throw new Error("Call generateKeys() or generateVaultKeys() before encrypting or decrypting");
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Generate standard FHE keys
|
|
112
|
+
*/
|
|
113
|
+
async generateKeys(options = {}) {
|
|
114
|
+
await this.init(options.wasmModule);
|
|
115
|
+
const builder = options.configBuilder ?? tfhe.TfheConfigBuilder.default();
|
|
116
|
+
const config = builder.build();
|
|
117
|
+
this.clientKey = tfhe.TfheClientKey.generate(config);
|
|
118
|
+
this.compressedServerKey = tfhe.TfheCompressedServerKey.new(this.clientKey);
|
|
119
|
+
this.ciphertextSizes = null;
|
|
120
|
+
return {
|
|
121
|
+
clientKeyB64: toBase64(this.clientKey.serialize()),
|
|
122
|
+
serverKeyB64: toBase64(this.compressedServerKey.serialize()),
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Generate vault FHE keys client-side (Zero-Trust Model)
|
|
127
|
+
*
|
|
128
|
+
* SECURITY: ClientKey stays on YOUR machine - NEVER sent to oracle.
|
|
129
|
+
* Only ServerKey and PublicKey are sent to the worker.
|
|
130
|
+
*/
|
|
131
|
+
async generateVaultKeys(options = {}) {
|
|
132
|
+
await this.init(options.wasmModule);
|
|
133
|
+
console.log("Generating vault FHE keys client-side...");
|
|
134
|
+
const startTime = Date.now();
|
|
135
|
+
const config = tfhe.TfheConfigBuilder.default().build();
|
|
136
|
+
const clientKey = tfhe.TfheClientKey.generate(config);
|
|
137
|
+
const serverKey = tfhe.TfheCompressedServerKey.new(clientKey);
|
|
138
|
+
const publicKey = tfhe.TfheCompressedPublicKey.new(clientKey);
|
|
139
|
+
const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
140
|
+
console.log(` Key generation complete in ${elapsed}s`);
|
|
141
|
+
// Store keys internally
|
|
142
|
+
this.clientKey = clientKey;
|
|
143
|
+
this.compressedServerKey = serverKey;
|
|
144
|
+
this.vaultPublicKey = publicKey;
|
|
145
|
+
this.ciphertextSizes = null;
|
|
146
|
+
// Serialize all keys
|
|
147
|
+
const clientKeyB64 = toBase64(clientKey.serialize());
|
|
148
|
+
const serverKeyB64 = toBase64(serverKey.serialize());
|
|
149
|
+
const publicKeyB64 = toBase64(publicKey.serialize());
|
|
150
|
+
console.log(` ClientKey size: ${(clientKeyB64.length / 1024).toFixed(1)} KB`);
|
|
151
|
+
console.log(` ServerKey size: ${(serverKeyB64.length / 1024 / 1024).toFixed(1)} MB`);
|
|
152
|
+
console.log(` PublicKey size: ${(publicKeyB64.length / 1024 / 1024).toFixed(1)} MB`);
|
|
153
|
+
return {
|
|
154
|
+
clientKey: clientKeyB64,
|
|
155
|
+
serverKey: serverKeyB64,
|
|
156
|
+
publicKey: publicKeyB64,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Load a ClientKey from base64 string
|
|
161
|
+
*/
|
|
162
|
+
loadClientKey(clientKeyB64) {
|
|
163
|
+
if (!this.initialized) {
|
|
164
|
+
throw new Error("Call init() first before loading keys");
|
|
165
|
+
}
|
|
166
|
+
const clientKeyBytes = fromBase64(clientKeyB64);
|
|
167
|
+
this.clientKey = tfhe.TfheClientKey.deserialize(clientKeyBytes);
|
|
168
|
+
this.compressedServerKey = tfhe.TfheCompressedServerKey.new(this.clientKey);
|
|
169
|
+
this.ciphertextSizes = null;
|
|
170
|
+
console.log("ClientKey loaded successfully");
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Load a vault's public key from the worker API
|
|
174
|
+
*/
|
|
175
|
+
async loadVaultPublicKey(workerUrl, vaultKeyId) {
|
|
176
|
+
await this.init();
|
|
177
|
+
const response = await fetch(`${workerUrl}/api/v1/vault/${vaultKeyId}/public-key`);
|
|
178
|
+
if (!response.ok) {
|
|
179
|
+
const error = await response.text();
|
|
180
|
+
throw new Error(`Failed to load vault public key: ${error}`);
|
|
181
|
+
}
|
|
182
|
+
const data = await response.json();
|
|
183
|
+
const publicKeyBytes = fromBase64(data.public_key);
|
|
184
|
+
this.vaultPublicKey = tfhe.TfheCompressedPublicKey.deserialize(publicKeyBytes);
|
|
185
|
+
this.vaultKeyId = vaultKeyId;
|
|
186
|
+
console.log(`Loaded public key for vault ${vaultKeyId}`);
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Encrypt transfer parameters
|
|
190
|
+
*/
|
|
191
|
+
encryptTransferParams(senderIdx, receiverIdx, amount) {
|
|
192
|
+
// Vault owner path: use ClientKey (fast)
|
|
193
|
+
if (this.clientKey) {
|
|
194
|
+
const senderIdxCt = tfhe.FheUint8.encrypt_with_client_key(senderIdx, this.clientKey);
|
|
195
|
+
const receiverIdxCt = tfhe.FheUint8.encrypt_with_client_key(receiverIdx, this.clientKey);
|
|
196
|
+
const amountCt = tfhe.FheUint8.encrypt_with_client_key(amount, this.clientKey);
|
|
197
|
+
const payload = concatBytes([
|
|
198
|
+
senderIdxCt.serialize(),
|
|
199
|
+
receiverIdxCt.serialize(),
|
|
200
|
+
amountCt.serialize(),
|
|
201
|
+
]);
|
|
202
|
+
return { encrypted_data: toBase64(payload) };
|
|
203
|
+
}
|
|
204
|
+
// External user path: use PublicKey
|
|
205
|
+
if (!this.vaultPublicKey) {
|
|
206
|
+
throw new Error("No keys available. Vault owner: call generateVaultKeys(). External user: call loadVaultPublicKey().");
|
|
207
|
+
}
|
|
208
|
+
const senderIdxCt = tfhe.FheUint8.encrypt_with_compressed_public_key(senderIdx, this.vaultPublicKey);
|
|
209
|
+
const receiverIdxCt = tfhe.FheUint8.encrypt_with_compressed_public_key(receiverIdx, this.vaultPublicKey);
|
|
210
|
+
const amountCt = tfhe.FheUint8.encrypt_with_compressed_public_key(amount, this.vaultPublicKey);
|
|
211
|
+
const payload = concatBytes([
|
|
212
|
+
senderIdxCt.serialize(),
|
|
213
|
+
receiverIdxCt.serialize(),
|
|
214
|
+
amountCt.serialize(),
|
|
215
|
+
]);
|
|
216
|
+
return { encrypted_data: toBase64(payload) };
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Build execute payload for secure transfer
|
|
220
|
+
*/
|
|
221
|
+
buildSecureTransferPayload(senderIdx, receiverIdx, amount, metadata = {}) {
|
|
222
|
+
const { encrypted_data } = this.encryptTransferParams(senderIdx, receiverIdx, amount);
|
|
223
|
+
return {
|
|
224
|
+
circuit_id: DEFAULT_CIRCUIT_ID,
|
|
225
|
+
encrypted_data,
|
|
226
|
+
metadata: {
|
|
227
|
+
...metadata,
|
|
228
|
+
vault_key_id: this.vaultKeyId,
|
|
229
|
+
},
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Encrypt CMUX token transfer (legacy method)
|
|
234
|
+
* @deprecated Use encryptTransferParams() with vault public key instead
|
|
235
|
+
*/
|
|
236
|
+
encryptCmuxToken(balances, senderIdx, receiverIdx, amount) {
|
|
237
|
+
this.requireKeys();
|
|
238
|
+
const encryptedBalances = balances.map((b) => tfhe.FheUint8.encrypt_with_client_key(b, this.clientKey));
|
|
239
|
+
const senderIdxCt = tfhe.FheUint8.encrypt_with_client_key(senderIdx, this.clientKey);
|
|
240
|
+
const receiverIdxCt = tfhe.FheUint8.encrypt_with_client_key(receiverIdx, this.clientKey);
|
|
241
|
+
const amountCt = tfhe.FheUint8.encrypt_with_client_key(amount, this.clientKey);
|
|
242
|
+
const countBytes = new Uint8Array([balances.length]);
|
|
243
|
+
const balanceChunks = encryptedBalances.map((ct) => ct.serialize());
|
|
244
|
+
const payload = concatBytes([
|
|
245
|
+
countBytes,
|
|
246
|
+
...balanceChunks,
|
|
247
|
+
senderIdxCt.serialize(),
|
|
248
|
+
receiverIdxCt.serialize(),
|
|
249
|
+
amountCt.serialize(),
|
|
250
|
+
]);
|
|
251
|
+
return {
|
|
252
|
+
encrypted_data: toBase64(payload),
|
|
253
|
+
evaluation_keys: toBase64(this.compressedServerKey.serialize()),
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Decrypt CMUX token transfer result
|
|
258
|
+
*/
|
|
259
|
+
decryptCmuxToken(encryptedResultB64) {
|
|
260
|
+
this.requireKeys();
|
|
261
|
+
const bytes = fromBase64(encryptedResultB64);
|
|
262
|
+
const sizes = this.ciphertextSizes ?? this.computeCiphertextSizes();
|
|
263
|
+
// First 2 bytes are u16 count (little-endian)
|
|
264
|
+
const count = bytes[0] | (bytes[1] << 8);
|
|
265
|
+
let offset = 2;
|
|
266
|
+
const balances = [];
|
|
267
|
+
for (let i = 0; i < count; i++) {
|
|
268
|
+
const balanceBytes = bytes.slice(offset, offset + sizes.uint8);
|
|
269
|
+
const balanceCt = tfhe.FheUint8.deserialize(balanceBytes);
|
|
270
|
+
balances.push(balanceCt.decrypt(this.clientKey));
|
|
271
|
+
offset += sizes.uint8;
|
|
272
|
+
}
|
|
273
|
+
const boolBytes = bytes.slice(offset, offset + sizes.bool);
|
|
274
|
+
const validCt = tfhe.FheBool.deserialize(boolBytes);
|
|
275
|
+
const isValid = validCt.decrypt(this.clientKey);
|
|
276
|
+
return { balances, isValid };
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Decrypt balance transfer result
|
|
280
|
+
*/
|
|
281
|
+
decryptBalanceTransfer(encryptedResultB64) {
|
|
282
|
+
this.requireKeys();
|
|
283
|
+
const bytes = fromBase64(encryptedResultB64);
|
|
284
|
+
const sizes = this.ciphertextSizes ?? this.computeCiphertextSizes();
|
|
285
|
+
const expectedLen = sizes.uint8 * 2 + sizes.bool;
|
|
286
|
+
if (bytes.length < expectedLen) {
|
|
287
|
+
throw new Error(`Encrypted result too short: ${bytes.length} < ${expectedLen}`);
|
|
288
|
+
}
|
|
289
|
+
const senderBytes = bytes.slice(0, sizes.uint8);
|
|
290
|
+
const receiverBytes = bytes.slice(sizes.uint8, sizes.uint8 * 2);
|
|
291
|
+
const boolBytes = bytes.slice(sizes.uint8 * 2, expectedLen);
|
|
292
|
+
const newSenderCt = tfhe.FheUint8.deserialize(senderBytes);
|
|
293
|
+
const newReceiverCt = tfhe.FheUint8.deserialize(receiverBytes);
|
|
294
|
+
const validCt = tfhe.FheBool.deserialize(boolBytes);
|
|
295
|
+
return {
|
|
296
|
+
newSender: newSenderCt.decrypt(this.clientKey),
|
|
297
|
+
newReceiver: newReceiverCt.decrypt(this.clientKey),
|
|
298
|
+
isValid: validCt.decrypt(this.clientKey),
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
computeCiphertextSizes() {
|
|
302
|
+
this.requireKeys();
|
|
303
|
+
const sampleUint = tfhe.FheUint8.encrypt_with_client_key(0, this.clientKey);
|
|
304
|
+
const sampleBool = tfhe.FheBool.encrypt_with_client_key(false, this.clientKey);
|
|
305
|
+
const sizes = {
|
|
306
|
+
uint8: sampleUint.serialize().length,
|
|
307
|
+
bool: sampleBool.serialize().length,
|
|
308
|
+
};
|
|
309
|
+
this.ciphertextSizes = sizes;
|
|
310
|
+
return sizes;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
// Re-export helper functions
|
|
314
|
+
export { toBase64, fromBase64 };
|
|
315
|
+
//# sourceMappingURL=TfheClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TfheClient.js","sourceRoot":"","sources":["../src/TfheClient.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @zksdk/core - Core FHE client and types for privacy-preserving computation
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```typescript
|
|
6
|
+
* import { TfheClient } from '@zksdk/core';
|
|
7
|
+
*
|
|
8
|
+
* const client = new TfheClient();
|
|
9
|
+
* await client.init();
|
|
10
|
+
*
|
|
11
|
+
* const keys = await client.generateVaultKeys();
|
|
12
|
+
* console.log('Save your clientKey securely!');
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export { TfheClient, toBase64, fromBase64 } from './TfheClient.js';
|
|
16
|
+
export type { CircuitId, VaultKeys, EncryptedTransferParams, CmuxTransferResult, BalanceTransferResult, KeyGenOptions, VaultRegistration, ExecutePayload, } from './types.js';
|
|
17
|
+
export { CIRCUIT_PRIVATE_TOKEN_SLOTS, CIRCUIT_CMUX_TOKEN_LEGACY } from './types.js';
|
|
18
|
+
/** Package version */
|
|
19
|
+
export declare const VERSION = "0.1.0";
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEnE,YAAY,EACV,SAAS,EACT,SAAS,EACT,uBAAuB,EACvB,kBAAkB,EAClB,qBAAqB,EACrB,aAAa,EACb,iBAAiB,EACjB,cAAc,GACf,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,2BAA2B,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAEpF,sBAAsB;AACtB,eAAO,MAAM,OAAO,UAAU,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @zksdk/core - Core FHE client and types for privacy-preserving computation
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```typescript
|
|
6
|
+
* import { TfheClient } from '@zksdk/core';
|
|
7
|
+
*
|
|
8
|
+
* const client = new TfheClient();
|
|
9
|
+
* await client.init();
|
|
10
|
+
*
|
|
11
|
+
* const keys = await client.generateVaultKeys();
|
|
12
|
+
* console.log('Save your clientKey securely!');
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export { TfheClient, toBase64, fromBase64 } from './TfheClient.js';
|
|
16
|
+
// Export circuit ID constants
|
|
17
|
+
export { CIRCUIT_PRIVATE_TOKEN_SLOTS, CIRCUIT_CMUX_TOKEN_LEGACY } from './types.js';
|
|
18
|
+
/** Package version */
|
|
19
|
+
export const VERSION = '0.1.0';
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAanE,8BAA8B;AAC9B,OAAO,EAAE,2BAA2B,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAEpF,sBAAsB;AACtB,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ZKSDK Core Types
|
|
3
|
+
*/
|
|
4
|
+
/** Supported circuit identifiers */
|
|
5
|
+
export type CircuitId = 'private_token_slots_v1' | 'cmux_token_v1_linear' | 'balance_transfer_v1' | 'private_token_accounts_v1' | string;
|
|
6
|
+
/** Current private token slots circuit ID */
|
|
7
|
+
export declare const CIRCUIT_PRIVATE_TOKEN_SLOTS: CircuitId;
|
|
8
|
+
/** Legacy circuit ID (deprecated, use CIRCUIT_PRIVATE_TOKEN_SLOTS) */
|
|
9
|
+
export declare const CIRCUIT_CMUX_TOKEN_LEGACY: CircuitId;
|
|
10
|
+
/** Vault key set generated client-side */
|
|
11
|
+
export interface VaultKeys {
|
|
12
|
+
/** Secret key - NEVER share! Only for decryption. */
|
|
13
|
+
clientKey: string;
|
|
14
|
+
/** Evaluation key - send to worker for FHE computation */
|
|
15
|
+
serverKey: string;
|
|
16
|
+
/** Public key - for encrypting transfers */
|
|
17
|
+
publicKey: string;
|
|
18
|
+
}
|
|
19
|
+
/** Encrypted transfer parameters */
|
|
20
|
+
export interface EncryptedTransferParams {
|
|
21
|
+
encrypted_data: string;
|
|
22
|
+
evaluation_keys?: string;
|
|
23
|
+
}
|
|
24
|
+
/** Result from CMUX token transfer decryption */
|
|
25
|
+
export interface CmuxTransferResult {
|
|
26
|
+
balances: number[];
|
|
27
|
+
isValid: boolean;
|
|
28
|
+
}
|
|
29
|
+
/** Result from simple balance transfer decryption */
|
|
30
|
+
export interface BalanceTransferResult {
|
|
31
|
+
newSender: number;
|
|
32
|
+
newReceiver: number;
|
|
33
|
+
isValid: boolean;
|
|
34
|
+
}
|
|
35
|
+
/** Key generation options */
|
|
36
|
+
export interface KeyGenOptions {
|
|
37
|
+
wasmModule?: unknown;
|
|
38
|
+
configBuilder?: unknown;
|
|
39
|
+
}
|
|
40
|
+
/** Vault registration response */
|
|
41
|
+
export interface VaultRegistration {
|
|
42
|
+
vault_key_id: string;
|
|
43
|
+
created_at: string;
|
|
44
|
+
num_slots: number;
|
|
45
|
+
}
|
|
46
|
+
/** Execute payload for FHE worker */
|
|
47
|
+
export interface ExecutePayload {
|
|
48
|
+
circuit_id: CircuitId;
|
|
49
|
+
encrypted_data: string;
|
|
50
|
+
evaluation_keys?: string;
|
|
51
|
+
metadata?: Record<string, unknown>;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,oCAAoC;AACpC,MAAM,MAAM,SAAS,GACjB,wBAAwB,GACxB,sBAAsB,GACtB,qBAAqB,GACrB,2BAA2B,GAC3B,MAAM,CAAC;AAEX,6CAA6C;AAC7C,eAAO,MAAM,2BAA2B,EAAE,SAAoC,CAAC;AAC/E,sEAAsE;AACtE,eAAO,MAAM,yBAAyB,EAAE,SAAkC,CAAC;AAE3E,0CAA0C;AAC1C,MAAM,WAAW,SAAS;IACxB,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,SAAS,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,oCAAoC;AACpC,MAAM,WAAW,uBAAuB;IACtC,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,iDAAiD;AACjD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,qDAAqD;AACrD,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,6BAA6B;AAC7B,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,kCAAkC;AAClC,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qCAAqC;AACrC,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,SAAS,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ZKSDK Core Types
|
|
3
|
+
*/
|
|
4
|
+
/** Current private token slots circuit ID */
|
|
5
|
+
export const CIRCUIT_PRIVATE_TOKEN_SLOTS = 'private_token_slots_v1';
|
|
6
|
+
/** Legacy circuit ID (deprecated, use CIRCUIT_PRIVATE_TOKEN_SLOTS) */
|
|
7
|
+
export const CIRCUIT_CMUX_TOKEN_LEGACY = 'cmux_token_v1_linear';
|
|
8
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,6CAA6C;AAC7C,MAAM,CAAC,MAAM,2BAA2B,GAAc,wBAAwB,CAAC;AAC/E,sEAAsE;AACtE,MAAM,CAAC,MAAM,yBAAyB,GAAc,sBAAsB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@zksdk/core",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "ZKSDK Core - FHE client and types for privacy-preserving computation",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts"
|
|
12
|
+
},
|
|
13
|
+
"./tfhe": {
|
|
14
|
+
"import": "./dist/TfheClient.js",
|
|
15
|
+
"types": "./dist/TfheClient.d.ts"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist",
|
|
20
|
+
"tfhe-wasm"
|
|
21
|
+
],
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "tsc",
|
|
24
|
+
"clean": "rm -rf dist",
|
|
25
|
+
"prepublishOnly": "npm run build"
|
|
26
|
+
},
|
|
27
|
+
"publishConfig": {
|
|
28
|
+
"access": "public",
|
|
29
|
+
"registry": "https://registry.npmjs.org/"
|
|
30
|
+
},
|
|
31
|
+
"keywords": [
|
|
32
|
+
"fhe",
|
|
33
|
+
"tfhe",
|
|
34
|
+
"privacy",
|
|
35
|
+
"zksdk",
|
|
36
|
+
"homomorphic-encryption",
|
|
37
|
+
"solana",
|
|
38
|
+
"blockchain"
|
|
39
|
+
],
|
|
40
|
+
"license": "MIT",
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@types/node": "^25.0.2",
|
|
43
|
+
"typescript": "^5.3.0"
|
|
44
|
+
}
|
|
45
|
+
}
|