reputrans 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/LICENSE +21 -0
- package/README.md +114 -0
- package/circuits/composite/target/composite.json +1 -0
- package/circuits/field_disclosure/target/field_disclosure.json +1 -0
- package/circuits/map_to_curve/target/map_to_curve.json +1 -0
- package/circuits/poseidon_compat/target/poseidon_compat.json +1 -0
- package/circuits/range_proof/target/range_proof.json +1 -0
- package/circuits/set_membership/target/set_membership.json +1 -0
- package/circuits/signature_verify/target/signature_verify.json +1 -0
- package/dist/cli/src/auto-detect.d.ts +9 -0
- package/dist/cli/src/auto-detect.d.ts.map +1 -0
- package/dist/cli/src/auto-detect.js +21 -0
- package/dist/cli/src/auto-detect.js.map +1 -0
- package/dist/cli/src/commands/inspect.d.ts +6 -0
- package/dist/cli/src/commands/inspect.d.ts.map +1 -0
- package/dist/cli/src/commands/inspect.js +43 -0
- package/dist/cli/src/commands/inspect.js.map +1 -0
- package/dist/cli/src/commands/issue.d.ts +8 -0
- package/dist/cli/src/commands/issue.d.ts.map +1 -0
- package/dist/cli/src/commands/issue.js +107 -0
- package/dist/cli/src/commands/issue.js.map +1 -0
- package/dist/cli/src/commands/keygen.d.ts +7 -0
- package/dist/cli/src/commands/keygen.d.ts.map +1 -0
- package/dist/cli/src/commands/keygen.js +39 -0
- package/dist/cli/src/commands/keygen.js.map +1 -0
- package/dist/cli/src/commands/prove.d.ts +9 -0
- package/dist/cli/src/commands/prove.d.ts.map +1 -0
- package/dist/cli/src/commands/prove.js +139 -0
- package/dist/cli/src/commands/prove.js.map +1 -0
- package/dist/cli/src/commands/verify.d.ts +6 -0
- package/dist/cli/src/commands/verify.d.ts.map +1 -0
- package/dist/cli/src/commands/verify.js +63 -0
- package/dist/cli/src/commands/verify.js.map +1 -0
- package/dist/cli/src/index.d.ts +3 -0
- package/dist/cli/src/index.d.ts.map +1 -0
- package/dist/cli/src/index.js +45 -0
- package/dist/cli/src/index.js.map +1 -0
- package/dist/sdk/src/circuit-loader.d.ts +19 -0
- package/dist/sdk/src/circuit-loader.d.ts.map +1 -0
- package/dist/sdk/src/circuit-loader.js +65 -0
- package/dist/sdk/src/circuit-loader.js.map +1 -0
- package/dist/sdk/src/eddsa.d.ts +63 -0
- package/dist/sdk/src/eddsa.d.ts.map +1 -0
- package/dist/sdk/src/eddsa.js +177 -0
- package/dist/sdk/src/eddsa.js.map +1 -0
- package/dist/sdk/src/encoder.d.ts +49 -0
- package/dist/sdk/src/encoder.d.ts.map +1 -0
- package/dist/sdk/src/encoder.js +117 -0
- package/dist/sdk/src/encoder.js.map +1 -0
- package/dist/sdk/src/identity.d.ts +69 -0
- package/dist/sdk/src/identity.d.ts.map +1 -0
- package/dist/sdk/src/identity.js +110 -0
- package/dist/sdk/src/identity.js.map +1 -0
- package/dist/sdk/src/index.d.ts +18 -0
- package/dist/sdk/src/index.d.ts.map +1 -0
- package/dist/sdk/src/index.js +18 -0
- package/dist/sdk/src/index.js.map +1 -0
- package/dist/sdk/src/poseidon.d.ts +33 -0
- package/dist/sdk/src/poseidon.d.ts.map +1 -0
- package/dist/sdk/src/poseidon.js +59 -0
- package/dist/sdk/src/poseidon.js.map +1 -0
- package/dist/sdk/src/proof-request.d.ts +58 -0
- package/dist/sdk/src/proof-request.d.ts.map +1 -0
- package/dist/sdk/src/proof-request.js +68 -0
- package/dist/sdk/src/proof-request.js.map +1 -0
- package/dist/sdk/src/prover.d.ts +38 -0
- package/dist/sdk/src/prover.d.ts.map +1 -0
- package/dist/sdk/src/prover.js +108 -0
- package/dist/sdk/src/prover.js.map +1 -0
- package/dist/sdk/src/vc-parser.d.ts +50 -0
- package/dist/sdk/src/vc-parser.d.ts.map +1 -0
- package/dist/sdk/src/vc-parser.js +96 -0
- package/dist/sdk/src/vc-parser.js.map +1 -0
- package/dist/sdk/src/verifier.d.ts +19 -0
- package/dist/sdk/src/verifier.d.ts.map +1 -0
- package/dist/sdk/src/verifier.js +31 -0
- package/dist/sdk/src/verifier.js.map +1 -0
- package/dist/verifier/src/did-resolver.d.ts +36 -0
- package/dist/verifier/src/did-resolver.d.ts.map +1 -0
- package/dist/verifier/src/did-resolver.js +179 -0
- package/dist/verifier/src/did-resolver.js.map +1 -0
- package/dist/verifier/src/index.d.ts +2 -0
- package/dist/verifier/src/index.d.ts.map +1 -0
- package/dist/verifier/src/index.js +9 -0
- package/dist/verifier/src/index.js.map +1 -0
- package/dist/verifier/src/server.d.ts +6 -0
- package/dist/verifier/src/server.d.ts.map +1 -0
- package/dist/verifier/src/server.js +75 -0
- package/dist/verifier/src/server.js.map +1 -0
- package/dist/verifier/src/verify.d.ts +20 -0
- package/dist/verifier/src/verify.d.ts.map +1 -0
- package/dist/verifier/src/verify.js +97 -0
- package/dist/verifier/src/verify.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Find the most recent file matching a glob pattern in the current directory.
|
|
3
|
+
* Returns the full path, or null if none found.
|
|
4
|
+
*/
|
|
5
|
+
export declare function findFile(pattern: RegExp, dir?: string): Promise<string | null>;
|
|
6
|
+
export declare function findKeyFile(dir?: string): Promise<string | null>;
|
|
7
|
+
export declare function findCredentialFile(dir?: string): Promise<string | null>;
|
|
8
|
+
export declare function findProofFile(dir?: string): Promise<string | null>;
|
|
9
|
+
//# sourceMappingURL=auto-detect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-detect.d.ts","sourceRoot":"","sources":["../../../cli/src/auto-detect.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,SAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAIjF;AAED,wBAAsB,WAAW,CAAC,GAAG,SAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAEnE;AAED,wBAAsB,kBAAkB,CAAC,GAAG,SAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAE1E;AAED,wBAAsB,aAAa,CAAC,GAAG,SAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAErE"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { readdir } from 'fs/promises';
|
|
2
|
+
import { resolve } from 'path';
|
|
3
|
+
/**
|
|
4
|
+
* Find the most recent file matching a glob pattern in the current directory.
|
|
5
|
+
* Returns the full path, or null if none found.
|
|
6
|
+
*/
|
|
7
|
+
export async function findFile(pattern, dir = '.') {
|
|
8
|
+
const entries = await readdir(resolve(dir));
|
|
9
|
+
const matches = entries.filter((f) => pattern.test(f)).sort().reverse();
|
|
10
|
+
return matches.length > 0 ? resolve(dir, matches[0]) : null;
|
|
11
|
+
}
|
|
12
|
+
export async function findKeyFile(dir = '.') {
|
|
13
|
+
return findFile(/-key\.json$/, dir);
|
|
14
|
+
}
|
|
15
|
+
export async function findCredentialFile(dir = '.') {
|
|
16
|
+
return findFile(/^credential-.*\.json$/, dir);
|
|
17
|
+
}
|
|
18
|
+
export async function findProofFile(dir = '.') {
|
|
19
|
+
return findFile(/^proof-.*\.json$/, dir);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=auto-detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-detect.js","sourceRoot":"","sources":["../../../cli/src/auto-detect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAe,EAAE,GAAG,GAAG,GAAG;IACvD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;IACxE,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAG,GAAG,GAAG;IACzC,OAAO,QAAQ,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAG,GAAG,GAAG;IAChD,OAAO,QAAQ,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAG,GAAG,GAAG;IAC3C,OAAO,QAAQ,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspect.d.ts","sourceRoot":"","sources":["../../../../cli/src/commands/inspect.ts"],"names":[],"mappings":"AAIA,UAAU,cAAc;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA2CjE"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { readFile } from 'fs/promises';
|
|
2
|
+
import { resolve } from 'path';
|
|
3
|
+
import { findCredentialFile } from '../auto-detect.js';
|
|
4
|
+
export async function inspect(opts) {
|
|
5
|
+
let credPath = opts.credential;
|
|
6
|
+
if (!credPath) {
|
|
7
|
+
const found = await findCredentialFile();
|
|
8
|
+
if (!found) {
|
|
9
|
+
console.error('No credential file found. Run "npx tsx cli/src/index.ts issue" first.');
|
|
10
|
+
process.exit(1);
|
|
11
|
+
}
|
|
12
|
+
credPath = found;
|
|
13
|
+
console.log(`Using credential: ${credPath}`);
|
|
14
|
+
}
|
|
15
|
+
const raw = await readFile(resolve(credPath), 'utf-8');
|
|
16
|
+
const cred = JSON.parse(raw);
|
|
17
|
+
console.log(`\nREPUTRANS Credential (v${cred.version})`);
|
|
18
|
+
console.log(` Issuer: ${cred.issuer.name || 'unknown'}`);
|
|
19
|
+
console.log(` Issued: ${cred.issuedAt || 'unknown'}`);
|
|
20
|
+
console.log(` Merkle root: ${cred.merkle.root.slice(0, 20)}...`);
|
|
21
|
+
console.log();
|
|
22
|
+
console.log('Fields:');
|
|
23
|
+
const claims = cred.claims;
|
|
24
|
+
const sortedKeys = Object.keys(claims).sort();
|
|
25
|
+
for (let i = 0; i < sortedKeys.length; i++) {
|
|
26
|
+
const key = sortedKeys[i];
|
|
27
|
+
const value = claims[key];
|
|
28
|
+
const isNumeric = /^-?\d+(\.\d+)?$/.test(value);
|
|
29
|
+
const proofTypes = ['disclose'];
|
|
30
|
+
if (isNumeric)
|
|
31
|
+
proofTypes.push('range (gte, lte)');
|
|
32
|
+
console.log(` [${i}] ${key} = "${value}"`);
|
|
33
|
+
console.log(` Proof types: ${proofTypes.join(', ')}`);
|
|
34
|
+
}
|
|
35
|
+
console.log();
|
|
36
|
+
console.log('Next:');
|
|
37
|
+
console.log(` npx tsx cli/src/index.ts prove --disclose ${sortedKeys[0]}`);
|
|
38
|
+
if (sortedKeys.some((k) => /^-?\d+(\.\d+)?$/.test(claims[k]))) {
|
|
39
|
+
const numericKey = sortedKeys.find((k) => /^-?\d+(\.\d+)?$/.test(claims[k]));
|
|
40
|
+
console.log(` npx tsx cli/src/index.ts prove --range ${numericKey}:gte:${claims[numericKey]}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=inspect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../../../cli/src/commands/inspect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issue.d.ts","sourceRoot":"","sources":["../../../../cli/src/commands/issue.ts"],"names":[],"mappings":"AAMA,UAAU,YAAY;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AASD,wBAAsB,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAmG7D"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { readFile, writeFile } from 'fs/promises';
|
|
2
|
+
import { resolve } from 'path';
|
|
3
|
+
import { sign } from '../../../sdk/src/eddsa.js';
|
|
4
|
+
import { encodeCredential } from '../../../sdk/src/encoder.js';
|
|
5
|
+
import { findKeyFile } from '../auto-detect.js';
|
|
6
|
+
const EXAMPLE_CLAIMS = {
|
|
7
|
+
name: 'Alice',
|
|
8
|
+
field_of_study: 'Computer Science',
|
|
9
|
+
graduation_year: '2025',
|
|
10
|
+
gpa: '3.8',
|
|
11
|
+
};
|
|
12
|
+
export async function issue(opts) {
|
|
13
|
+
// Auto-detect key file
|
|
14
|
+
let keyPath = opts.key;
|
|
15
|
+
if (!keyPath) {
|
|
16
|
+
const found = await findKeyFile();
|
|
17
|
+
if (!found) {
|
|
18
|
+
console.error('No key file found. Run "npx tsx cli/src/index.ts keygen" first.');
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
keyPath = found;
|
|
22
|
+
console.log(`Using key: ${keyPath}`);
|
|
23
|
+
}
|
|
24
|
+
// Load issuer key
|
|
25
|
+
const keyRaw = await readFile(resolve(keyPath), 'utf-8');
|
|
26
|
+
const keyData = JSON.parse(keyRaw);
|
|
27
|
+
const privateKey = BigInt(keyData.privateKey);
|
|
28
|
+
// Parse claims - inline JSON, file path, or use example
|
|
29
|
+
let claims;
|
|
30
|
+
if (!opts.claims) {
|
|
31
|
+
claims = EXAMPLE_CLAIMS;
|
|
32
|
+
console.log('No --claims provided, using example credential:');
|
|
33
|
+
console.log(` ${JSON.stringify(claims)}`);
|
|
34
|
+
console.log();
|
|
35
|
+
}
|
|
36
|
+
else if (opts.claims.startsWith('{')) {
|
|
37
|
+
try {
|
|
38
|
+
claims = JSON.parse(opts.claims);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// PowerShell strips quotes from JSON - try to fix common mangling
|
|
42
|
+
const fixed = opts.claims.replace(/([{,])\s*([a-zA-Z_]\w*)\s*:/g, '$1"$2":').replace(/:([^",{}\[\]]+)([,}])/g, ':"$1"$2');
|
|
43
|
+
try {
|
|
44
|
+
claims = JSON.parse(fixed);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
console.error('Invalid JSON in --claims. Use a file instead:');
|
|
48
|
+
console.error(' echo \'{"role":"engineer"}\' > claims.json');
|
|
49
|
+
console.error(' npx tsx cli/src/index.ts issue --claims claims.json');
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
const claimsRaw = await readFile(resolve(opts.claims), 'utf-8');
|
|
56
|
+
claims = JSON.parse(claimsRaw);
|
|
57
|
+
}
|
|
58
|
+
// Ensure all values are strings
|
|
59
|
+
for (const [k, v] of Object.entries(claims)) {
|
|
60
|
+
if (typeof v !== 'string') {
|
|
61
|
+
claims[k] = String(v);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Encode into Merkle tree
|
|
65
|
+
const encoded = encodeCredential(claims);
|
|
66
|
+
// Sign the Merkle root
|
|
67
|
+
const { signature, publicKey } = sign(privateKey, encoded.merkleRoot);
|
|
68
|
+
const credential = {
|
|
69
|
+
version: '1.0',
|
|
70
|
+
issuer: {
|
|
71
|
+
name: keyData.name,
|
|
72
|
+
publicKey: {
|
|
73
|
+
x: publicKey.x.toString(),
|
|
74
|
+
y: publicKey.y.toString(),
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
claims,
|
|
78
|
+
merkle: {
|
|
79
|
+
root: encoded.merkleRoot.toString(),
|
|
80
|
+
fieldNames: encoded.fieldNames,
|
|
81
|
+
fieldValues: encoded.fieldValues.map(String),
|
|
82
|
+
paths: encoded.merklePaths.map((p) => ({
|
|
83
|
+
siblings: p.siblings.map(String),
|
|
84
|
+
indices: p.indices,
|
|
85
|
+
})),
|
|
86
|
+
},
|
|
87
|
+
signature: {
|
|
88
|
+
r8: {
|
|
89
|
+
x: signature.r8.x.toString(),
|
|
90
|
+
y: signature.r8.y.toString(),
|
|
91
|
+
},
|
|
92
|
+
s: signature.s.toString(),
|
|
93
|
+
},
|
|
94
|
+
issuedAt: new Date().toISOString(),
|
|
95
|
+
};
|
|
96
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
|
|
97
|
+
const outPath = opts.out
|
|
98
|
+
? resolve(opts.out)
|
|
99
|
+
: resolve(`credential-${timestamp}.json`);
|
|
100
|
+
await writeFile(outPath, JSON.stringify(credential, null, 2));
|
|
101
|
+
const fieldNames = Object.keys(claims).sort();
|
|
102
|
+
console.log(`Credential issued by "${keyData.name}"`);
|
|
103
|
+
console.log(` Fields: ${fieldNames.join(', ')}`);
|
|
104
|
+
console.log(` Saved to: ${outPath}`);
|
|
105
|
+
console.log(`\nNext: npx tsx cli/src/index.ts inspect`);
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=issue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issue.js","sourceRoot":"","sources":["../../../../cli/src/commands/issue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keygen.d.ts","sourceRoot":"","sources":["../../../../cli/src/commands/keygen.ts"],"names":[],"mappings":"AAKA,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAsC/D"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { writeFile, chmod } from 'fs/promises';
|
|
2
|
+
import { resolve } from 'path';
|
|
3
|
+
import { getPublicKey } from '../../../sdk/src/eddsa.js';
|
|
4
|
+
import { BN254_FIELD_ORDER } from '../../../sdk/src/poseidon.js';
|
|
5
|
+
export async function keygen(opts) {
|
|
6
|
+
const name = opts.name || 'issuer';
|
|
7
|
+
// Generate a random BN254 field element as private key
|
|
8
|
+
const bytes = new Uint8Array(32);
|
|
9
|
+
crypto.getRandomValues(bytes);
|
|
10
|
+
let privateKey = 0n;
|
|
11
|
+
for (const b of bytes)
|
|
12
|
+
privateKey = (privateKey << 8n) | BigInt(b);
|
|
13
|
+
privateKey = privateKey % BN254_FIELD_ORDER;
|
|
14
|
+
// Derive public key
|
|
15
|
+
const publicKey = getPublicKey(privateKey);
|
|
16
|
+
const keyData = {
|
|
17
|
+
version: '1.0',
|
|
18
|
+
name,
|
|
19
|
+
privateKey: privateKey.toString(),
|
|
20
|
+
publicKey: {
|
|
21
|
+
x: publicKey.x.toString(),
|
|
22
|
+
y: publicKey.y.toString(),
|
|
23
|
+
},
|
|
24
|
+
createdAt: new Date().toISOString(),
|
|
25
|
+
};
|
|
26
|
+
const filename = `${name.toLowerCase().replace(/[^a-z0-9]/g, '-')}-key.json`;
|
|
27
|
+
const outPath = opts.out ? resolve(opts.out) : resolve(filename);
|
|
28
|
+
await writeFile(outPath, JSON.stringify(keyData, null, 2));
|
|
29
|
+
// Restrict key file permissions (owner-only read/write)
|
|
30
|
+
if (process.platform !== 'win32') {
|
|
31
|
+
await chmod(outPath, 0o600);
|
|
32
|
+
}
|
|
33
|
+
console.log(`Keypair generated for "${name}"`);
|
|
34
|
+
console.log(` Saved to: ${outPath}`);
|
|
35
|
+
console.log(` Public key X: ${publicKey.x.toString().slice(0, 20)}...`);
|
|
36
|
+
console.log(` Public key Y: ${publicKey.y.toString().slice(0, 20)}...`);
|
|
37
|
+
console.log(`\nNext: npx tsx cli/src/index.ts issue --claims '{"field":"value"}'`);
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=keygen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keygen.js","sourceRoot":"","sources":["../../../../cli/src/commands/keygen.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAOjE,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAmB;IAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC;IAEnC,uDAAuD;IACvD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IACjC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,UAAU,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACnE,UAAU,GAAG,UAAU,GAAG,iBAAiB,CAAC;IAE5C,oBAAoB;IACpB,MAAM,SAAS,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IAE3C,MAAM,OAAO,GAAG;QACd,OAAO,EAAE,KAAK;QACd,IAAI;QACJ,UAAU,EAAE,UAAU,CAAC,QAAQ,EAAE;QACjC,SAAS,EAAE;YACT,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE;YACzB,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE;SAC1B;QACD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IAEF,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,WAAW,CAAC;IAC7E,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEjE,MAAM,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3D,wDAAwD;IACxD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,MAAM,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,GAAG,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,EAAE,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,mBAAmB,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,CAAC,mBAAmB,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;AACrF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prove.d.ts","sourceRoot":"","sources":["../../../../cli/src/commands/prove.ts"],"names":[],"mappings":"AAKA,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA8J7D"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { readFile, writeFile } from 'fs/promises';
|
|
2
|
+
import { resolve } from 'path';
|
|
3
|
+
import { loadCircuit } from '../../../sdk/src/circuit-loader.js';
|
|
4
|
+
import { findCredentialFile } from '../auto-detect.js';
|
|
5
|
+
export async function prove(opts) {
|
|
6
|
+
// Auto-detect credential
|
|
7
|
+
let credPath = opts.credential;
|
|
8
|
+
if (!credPath) {
|
|
9
|
+
const found = await findCredentialFile();
|
|
10
|
+
if (!found) {
|
|
11
|
+
console.error('No credential file found. Run "npx tsx cli/src/index.ts issue" first.');
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
credPath = found;
|
|
15
|
+
console.log(`Using credential: ${credPath}`);
|
|
16
|
+
}
|
|
17
|
+
if (!opts.disclose && !opts.range) {
|
|
18
|
+
console.error('Specify what to prove:');
|
|
19
|
+
console.error(' --disclose field_name Reveal a specific field');
|
|
20
|
+
console.error(' --range field:gte:threshold Prove a field meets a threshold');
|
|
21
|
+
console.error('\nRun "npx tsx cli/src/index.ts inspect" to see available fields.');
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
// Load credential
|
|
25
|
+
const raw = await readFile(resolve(credPath), 'utf-8');
|
|
26
|
+
const cred = JSON.parse(raw);
|
|
27
|
+
// Parse disclose field
|
|
28
|
+
const disclosedFieldName = opts.disclose || '';
|
|
29
|
+
const disclosedIdx = cred.merkle.fieldNames.indexOf(disclosedFieldName);
|
|
30
|
+
if (opts.disclose && disclosedIdx < 0) {
|
|
31
|
+
const available = cred.merkle.fieldNames.filter((n) => n !== '');
|
|
32
|
+
console.error(`Field "${disclosedFieldName}" not found. Available: ${available.join(', ')}`);
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
// Parse range spec
|
|
36
|
+
let rangeFieldName = '';
|
|
37
|
+
let rangeIdx = 0;
|
|
38
|
+
let rangeThreshold = '0';
|
|
39
|
+
let rangeComparisonType = '0'; // 0=gte, 1=lte
|
|
40
|
+
if (opts.range) {
|
|
41
|
+
const parts = opts.range.split(':');
|
|
42
|
+
if (parts.length !== 3) {
|
|
43
|
+
console.error('Range format: field:operator:threshold (e.g. gpa:gte:3)');
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
rangeFieldName = parts[0];
|
|
47
|
+
const operator = parts[1];
|
|
48
|
+
rangeThreshold = parts[2];
|
|
49
|
+
rangeIdx = cred.merkle.fieldNames.indexOf(rangeFieldName);
|
|
50
|
+
if (rangeIdx < 0) {
|
|
51
|
+
const available = cred.merkle.fieldNames.filter((n) => n !== '');
|
|
52
|
+
console.error(`Field "${rangeFieldName}" not found. Available: ${available.join(', ')}`);
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
rangeComparisonType = operator === 'lte' ? '1' : '0';
|
|
56
|
+
}
|
|
57
|
+
// If no disclose specified but range is, use the range field index for disclosure too
|
|
58
|
+
const effectiveDisclosedIdx = opts.disclose ? disclosedIdx : rangeIdx;
|
|
59
|
+
console.log('Loading circuit...');
|
|
60
|
+
const circuit = await loadCircuit('composite');
|
|
61
|
+
console.log('Initializing proof system...');
|
|
62
|
+
const { Noir } = await import('@noir-lang/noir_js');
|
|
63
|
+
const { BarretenbergBackend } = await import('@noir-lang/backend_barretenberg');
|
|
64
|
+
const backend = new BarretenbergBackend(circuit);
|
|
65
|
+
const noir = new Noir(circuit);
|
|
66
|
+
// Build circuit inputs from credential data
|
|
67
|
+
const inputs = {
|
|
68
|
+
// Signature verification
|
|
69
|
+
pub_key_x: cred.issuer.publicKey.x,
|
|
70
|
+
pub_key_y: cred.issuer.publicKey.y,
|
|
71
|
+
signature_r8_x: cred.signature.r8.x,
|
|
72
|
+
signature_r8_y: cred.signature.r8.y,
|
|
73
|
+
signature_s: cred.signature.s,
|
|
74
|
+
msg: cred.merkle.root,
|
|
75
|
+
// Field disclosure
|
|
76
|
+
credential_root: cred.merkle.root,
|
|
77
|
+
disclosed_field_value: cred.merkle.fieldValues[effectiveDisclosedIdx],
|
|
78
|
+
disclosed_field_index: effectiveDisclosedIdx.toString(),
|
|
79
|
+
disclosed_merkle_path: cred.merkle.paths[effectiveDisclosedIdx].siblings,
|
|
80
|
+
disclosed_path_indices: cred.merkle.paths[effectiveDisclosedIdx].indices.map(String),
|
|
81
|
+
// Range proof - when no range requested, use a padded zero leaf (index 15)
|
|
82
|
+
// so the Merkle check passes and range check is 0 >= 0 = trivially true
|
|
83
|
+
range_field_value: opts.range ? cred.merkle.fieldValues[rangeIdx] : cred.merkle.fieldValues[15],
|
|
84
|
+
range_field_index: opts.range ? rangeIdx.toString() : '15',
|
|
85
|
+
range_merkle_path: opts.range
|
|
86
|
+
? cred.merkle.paths[rangeIdx].siblings
|
|
87
|
+
: cred.merkle.paths[15].siblings,
|
|
88
|
+
range_path_indices: opts.range
|
|
89
|
+
? cred.merkle.paths[rangeIdx].indices.map(String)
|
|
90
|
+
: cred.merkle.paths[15].indices.map(String),
|
|
91
|
+
range_threshold: rangeThreshold,
|
|
92
|
+
range_comparison_type: rangeComparisonType,
|
|
93
|
+
};
|
|
94
|
+
console.log('Generating ZK proof (this takes 10-40 seconds)...');
|
|
95
|
+
const startTime = Date.now();
|
|
96
|
+
const { witness } = await noir.execute(inputs);
|
|
97
|
+
const proof = await backend.generateProof(witness);
|
|
98
|
+
const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
99
|
+
console.log(`Proof generated in ${elapsed}s`);
|
|
100
|
+
// Build proof output
|
|
101
|
+
const proofHex = '0x' + Array.from(proof.proof).map((b) => b.toString(16).padStart(2, '0')).join('');
|
|
102
|
+
const disclosed = {};
|
|
103
|
+
if (opts.disclose) {
|
|
104
|
+
disclosed[disclosedFieldName] = cred.claims[disclosedFieldName];
|
|
105
|
+
}
|
|
106
|
+
const proofOutput = {
|
|
107
|
+
version: '1.0',
|
|
108
|
+
circuit: 'composite',
|
|
109
|
+
proof: proofHex,
|
|
110
|
+
publicInputs: proof.publicInputs,
|
|
111
|
+
issuer: {
|
|
112
|
+
name: cred.issuer.name,
|
|
113
|
+
publicKey: cred.issuer.publicKey,
|
|
114
|
+
},
|
|
115
|
+
disclosed,
|
|
116
|
+
generatedAt: new Date().toISOString(),
|
|
117
|
+
generationTimeMs: Date.now() - startTime,
|
|
118
|
+
};
|
|
119
|
+
if (opts.range) {
|
|
120
|
+
proofOutput.range = {
|
|
121
|
+
field: rangeFieldName,
|
|
122
|
+
operator: rangeComparisonType === '0' ? 'gte' : 'lte',
|
|
123
|
+
threshold: rangeThreshold,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
|
|
127
|
+
const outPath = opts.out ? resolve(opts.out) : resolve(`proof-${timestamp}.json`);
|
|
128
|
+
await writeFile(outPath, JSON.stringify(proofOutput, null, 2));
|
|
129
|
+
await backend.destroy?.();
|
|
130
|
+
console.log(`\nProof saved: ${outPath}`);
|
|
131
|
+
if (opts.disclose) {
|
|
132
|
+
console.log(` Disclosed: ${disclosedFieldName} = "${cred.claims[disclosedFieldName]}"`);
|
|
133
|
+
}
|
|
134
|
+
if (opts.range) {
|
|
135
|
+
console.log(` Range: ${rangeFieldName} ${rangeComparisonType === '0' ? '>=' : '<='} ${rangeThreshold}`);
|
|
136
|
+
}
|
|
137
|
+
console.log(`\nNext: npx tsx cli/src/index.ts verify`);
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=prove.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prove.js","sourceRoot":"","sources":["../../../../cli/src/commands/prove.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../../cli/src/commands/verify.ts"],"names":[],"mappings":"AAKA,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAmE/D"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { readFile } from 'fs/promises';
|
|
2
|
+
import { resolve } from 'path';
|
|
3
|
+
import { loadCircuit } from '../../../sdk/src/circuit-loader.js';
|
|
4
|
+
import { findProofFile } from '../auto-detect.js';
|
|
5
|
+
export async function verify(opts) {
|
|
6
|
+
// Auto-detect proof file
|
|
7
|
+
let proofPath = opts.proof;
|
|
8
|
+
if (!proofPath) {
|
|
9
|
+
const found = await findProofFile();
|
|
10
|
+
if (!found) {
|
|
11
|
+
console.error('No proof file found. Run "npx tsx cli/src/index.ts prove" first.');
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
proofPath = found;
|
|
15
|
+
console.log(`Using proof: ${proofPath}`);
|
|
16
|
+
}
|
|
17
|
+
// Load proof
|
|
18
|
+
const raw = await readFile(resolve(proofPath), 'utf-8');
|
|
19
|
+
const proofData = JSON.parse(raw);
|
|
20
|
+
console.log('Loading circuit...');
|
|
21
|
+
const circuit = await loadCircuit(proofData.circuit || 'composite');
|
|
22
|
+
console.log('Verifying proof...');
|
|
23
|
+
const { BarretenbergBackend } = await import('@noir-lang/backend_barretenberg');
|
|
24
|
+
const backend = new BarretenbergBackend(circuit);
|
|
25
|
+
// Decode proof hex to Uint8Array
|
|
26
|
+
const proofHex = proofData.proof.startsWith('0x')
|
|
27
|
+
? proofData.proof.slice(2)
|
|
28
|
+
: proofData.proof;
|
|
29
|
+
const proofBytes = Uint8Array.from(proofHex.match(/.{2}/g).map((b) => parseInt(b, 16)));
|
|
30
|
+
let valid;
|
|
31
|
+
try {
|
|
32
|
+
valid = await backend.verifyProof({
|
|
33
|
+
proof: proofBytes,
|
|
34
|
+
publicInputs: proofData.publicInputs,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
valid = false;
|
|
39
|
+
}
|
|
40
|
+
await backend.destroy?.();
|
|
41
|
+
if (valid) {
|
|
42
|
+
console.log('\nProof VALID');
|
|
43
|
+
console.log(` Circuit: ${proofData.circuit}`);
|
|
44
|
+
console.log(` Issuer: ${proofData.issuer?.name || 'unknown'}`);
|
|
45
|
+
if (proofData.disclosed && Object.keys(proofData.disclosed).length > 0) {
|
|
46
|
+
console.log(' Disclosed fields:');
|
|
47
|
+
for (const [field, value] of Object.entries(proofData.disclosed)) {
|
|
48
|
+
console.log(` ${field} = "${value}"`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (proofData.range) {
|
|
52
|
+
const op = proofData.range.operator === 'gte' ? '>=' : '<=';
|
|
53
|
+
console.log(` Range proof: ${proofData.range.field} ${op} ${proofData.range.threshold} PASSED`);
|
|
54
|
+
}
|
|
55
|
+
console.log(` Generated: ${proofData.generatedAt || 'unknown'}`);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
console.log('\nProof INVALID');
|
|
59
|
+
console.log('The proof does not verify. The credential may have been tampered with.');
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../../../cli/src/commands/verify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../cli/src/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { keygen } from './commands/keygen.js';
|
|
4
|
+
import { issue } from './commands/issue.js';
|
|
5
|
+
import { inspect } from './commands/inspect.js';
|
|
6
|
+
import { prove } from './commands/prove.js';
|
|
7
|
+
import { verify } from './commands/verify.js';
|
|
8
|
+
const program = new Command();
|
|
9
|
+
program
|
|
10
|
+
.name('reputrans')
|
|
11
|
+
.description('Zero-knowledge credential toolkit - issue, prove, and verify credentials without revealing private data')
|
|
12
|
+
.version('0.1.0');
|
|
13
|
+
program
|
|
14
|
+
.command('keygen')
|
|
15
|
+
.description('Generate an issuer keypair')
|
|
16
|
+
.option('--name <name>', 'Issuer name', 'issuer')
|
|
17
|
+
.option('--out <path>', 'Output file path')
|
|
18
|
+
.action(keygen);
|
|
19
|
+
program
|
|
20
|
+
.command('issue')
|
|
21
|
+
.description('Sign claims into a verifiable credential')
|
|
22
|
+
.option('--key <path>', 'Path to issuer key JSON (auto-detects *-key.json in current dir)')
|
|
23
|
+
.option('--claims <json>', 'Claims as JSON string or path to JSON file')
|
|
24
|
+
.option('--out <path>', 'Output credential path')
|
|
25
|
+
.action(issue);
|
|
26
|
+
program
|
|
27
|
+
.command('inspect')
|
|
28
|
+
.description('Show credential fields and available proof types')
|
|
29
|
+
.option('--credential <path>', 'Path to credential JSON (auto-detects credential-*.json)')
|
|
30
|
+
.action(inspect);
|
|
31
|
+
program
|
|
32
|
+
.command('prove')
|
|
33
|
+
.description('Generate a ZK proof of selected credential fields')
|
|
34
|
+
.option('--credential <path>', 'Path to credential JSON (auto-detects credential-*.json)')
|
|
35
|
+
.option('--disclose <fields>', 'Comma-separated field names to disclose')
|
|
36
|
+
.option('--range <spec>', 'Range proof: field:operator:threshold (e.g. gpa:gte:3.0)')
|
|
37
|
+
.option('--out <path>', 'Output proof path')
|
|
38
|
+
.action(prove);
|
|
39
|
+
program
|
|
40
|
+
.command('verify')
|
|
41
|
+
.description('Verify a ZK proof')
|
|
42
|
+
.option('--proof <path>', 'Path to proof JSON (auto-detects proof-*.json)')
|
|
43
|
+
.action(verify);
|
|
44
|
+
program.parse();
|
|
45
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../cli/src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,yGAAyG,CAAC;KACtH,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,4BAA4B,CAAC;KACzC,MAAM,CAAC,eAAe,EAAE,aAAa,EAAE,QAAQ,CAAC;KAChD,MAAM,CAAC,cAAc,EAAE,kBAAkB,CAAC;KAC1C,MAAM,CAAC,MAAM,CAAC,CAAC;AAElB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,cAAc,EAAE,kEAAkE,CAAC;KAC1F,MAAM,CAAC,iBAAiB,EAAE,4CAA4C,CAAC;KACvE,MAAM,CAAC,cAAc,EAAE,wBAAwB,CAAC;KAChD,MAAM,CAAC,KAAK,CAAC,CAAC;AAEjB,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,kDAAkD,CAAC;KAC/D,MAAM,CAAC,qBAAqB,EAAE,0DAA0D,CAAC;KACzF,MAAM,CAAC,OAAO,CAAC,CAAC;AAEnB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,mDAAmD,CAAC;KAChE,MAAM,CAAC,qBAAqB,EAAE,0DAA0D,CAAC;KACzF,MAAM,CAAC,qBAAqB,EAAE,yCAAyC,CAAC;KACxE,MAAM,CAAC,gBAAgB,EAAE,0DAA0D,CAAC;KACpF,MAAM,CAAC,cAAc,EAAE,mBAAmB,CAAC;KAC3C,MAAM,CAAC,KAAK,CAAC,CAAC;AAEjB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,mBAAmB,CAAC;KAChC,MAAM,CAAC,gBAAgB,EAAE,gDAAgD,CAAC;KAC1E,MAAM,CAAC,MAAM,CAAC,CAAC;AAElB,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Circuit artifact loader for REPUTRANS.
|
|
3
|
+
*
|
|
4
|
+
* Loads compiled Noir ACIR artifacts from the filesystem.
|
|
5
|
+
* Works in Node.js only (uses fs). For browser usage, load
|
|
6
|
+
* the JSON via fetch and pass directly to createProver/createVerifier.
|
|
7
|
+
*/
|
|
8
|
+
import type { CompiledCircuit } from './prover.js';
|
|
9
|
+
export type CircuitName = 'composite' | 'field_disclosure' | 'range_proof' | 'set_membership' | 'signature_verify' | 'poseidon_compat' | 'map_to_curve';
|
|
10
|
+
/**
|
|
11
|
+
* Load a compiled circuit artifact by name.
|
|
12
|
+
*
|
|
13
|
+
* @param name - Circuit name (must match the directory and JSON filename)
|
|
14
|
+
* @param circuitsDir - Override the circuits directory path. Defaults to
|
|
15
|
+
* the monorepo's circuits/ directory relative to this file, or the
|
|
16
|
+
* REPUTRANS_CIRCUITS_DIR environment variable.
|
|
17
|
+
*/
|
|
18
|
+
export declare function loadCircuit(name: CircuitName | string, circuitsDir?: string): Promise<CompiledCircuit>;
|
|
19
|
+
//# sourceMappingURL=circuit-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuit-loader.d.ts","sourceRoot":"","sources":["../../../sdk/src/circuit-loader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AA0BnD,MAAM,MAAM,WAAW,GACnB,WAAW,GACX,kBAAkB,GAClB,aAAa,GACb,gBAAgB,GAChB,kBAAkB,GAClB,iBAAiB,GACjB,cAAc,CAAC;AAEnB;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,WAAW,GAAG,MAAM,EAC1B,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,eAAe,CAAC,CA8B1B"}
|