@motebit/crypto 0.8.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.
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Credential anchor — leaf hashing and self-verification.
3
+ *
4
+ * MIT: these functions are part of the open protocol. Any implementation
5
+ * can compute credential leaves and verify anchor proofs using this module.
6
+ *
7
+ * motebit/credential-anchor@1.0 §3 (leaf hash) and §5.2 (verification).
8
+ */
9
+ import { canonicalJson, sha256, ed25519Verify, hexToBytes } from "./signing.js";
10
+ // === Helpers (inlined — zero monorepo deps) ===
11
+ function toHex(bytes) {
12
+ return Array.from(bytes)
13
+ .map((b) => b.toString(16).padStart(2, "0"))
14
+ .join("");
15
+ }
16
+ function fromHex(hex) {
17
+ const bytes = new Uint8Array(hex.length / 2);
18
+ for (let i = 0; i < hex.length; i += 2) {
19
+ bytes[i / 2] = parseInt(hex.slice(i, i + 2), 16);
20
+ }
21
+ return bytes;
22
+ }
23
+ function concat(a, b) {
24
+ const out = new Uint8Array(a.length + b.length);
25
+ out.set(a);
26
+ out.set(b, a.length);
27
+ return out;
28
+ }
29
+ // === Leaf Hash ===
30
+ /**
31
+ * Compute a credential leaf hash for Merkle anchoring.
32
+ *
33
+ * The input is the full W3C VC 2.0 credential including its `proof` field.
34
+ * The proof is included because it binds the credential to its issuer's
35
+ * signature — without it, anyone could claim arbitrary credential content.
36
+ *
37
+ * @param credential - Full verifiable credential object (with proof)
38
+ * @returns Hex-encoded SHA-256 hash
39
+ */
40
+ export async function computeCredentialLeaf(credential) {
41
+ const canonical = canonicalJson(credential);
42
+ const hash = await sha256(new TextEncoder().encode(canonical));
43
+ return toHex(hash);
44
+ }
45
+ // === Merkle Proof Verification ===
46
+ /**
47
+ * Verify a Merkle inclusion proof against an expected root.
48
+ *
49
+ * Binary tree with odd-leaf promotion (no duplication).
50
+ * Same algorithm as @motebit/encryption/merkle.ts — inlined here
51
+ * so the crypto package remains zero-monorepo-deps.
52
+ */
53
+ async function verifyMerkleInclusion(leaf, index, siblings, layerSizes, expectedRoot) {
54
+ let current = fromHex(leaf);
55
+ let idx = index;
56
+ let sibIdx = 0;
57
+ for (const layerSize of layerSizes) {
58
+ const siblingPos = idx % 2 === 0 ? idx + 1 : idx - 1;
59
+ const hasSibling = siblingPos >= 0 && siblingPos < layerSize;
60
+ if (hasSibling) {
61
+ if (sibIdx >= siblings.length)
62
+ return false;
63
+ const siblingBytes = fromHex(siblings[sibIdx]);
64
+ const combined = idx % 2 === 0 ? concat(current, siblingBytes) : concat(siblingBytes, current);
65
+ current = await sha256(combined);
66
+ sibIdx++;
67
+ }
68
+ // Odd promotion: current passes through unchanged
69
+ idx = Math.floor(idx / 2);
70
+ }
71
+ return toHex(current) === expectedRoot;
72
+ }
73
+ /**
74
+ * Verify a credential anchor proof — the 4-step self-verification algorithm.
75
+ *
76
+ * Steps 1–3 are fully offline. Step 4 (onchain lookup) requires a callback
77
+ * and is skipped if not provided or if the proof has no onchain anchor.
78
+ *
79
+ * @param credential - The full W3C VC 2.0 credential (with proof)
80
+ * @param anchorProof - The CredentialAnchorProof from the relay
81
+ * @param chainVerifier - Optional callback for step 4 (onchain verification)
82
+ * @returns Verification result with per-step breakdown
83
+ *
84
+ * @example
85
+ * ```ts
86
+ * import { verifyCredentialAnchor } from "@motebit/crypto";
87
+ *
88
+ * const result = await verifyCredentialAnchor(credential, proof);
89
+ * if (result.valid) {
90
+ * // Steps 1-3 passed: credential was anchored by this relay
91
+ * }
92
+ * ```
93
+ */
94
+ export async function verifyCredentialAnchor(credential, anchorProof, chainVerifier) {
95
+ const errors = [];
96
+ // Step 1: Hash verification — credential maps to the claimed leaf
97
+ const computedHash = await computeCredentialLeaf(credential);
98
+ const hashValid = computedHash === anchorProof.credential_hash;
99
+ if (!hashValid) {
100
+ errors.push(`Hash mismatch: computed ${computedHash.slice(0, 16)}…, proof claims ${anchorProof.credential_hash.slice(0, 16)}…`);
101
+ }
102
+ // Step 2: Merkle inclusion — leaf reconstructs to root
103
+ const merkleValid = await verifyMerkleInclusion(anchorProof.credential_hash, anchorProof.leaf_index, anchorProof.siblings, anchorProof.layer_sizes, anchorProof.merkle_root);
104
+ if (!merkleValid) {
105
+ errors.push("Merkle proof does not reconstruct to the claimed root");
106
+ }
107
+ // Step 3: Relay attestation — relay signed the batch payload
108
+ // Reconstruct the exact payload signed by cutCredentialBatch
109
+ const batchPayload = canonicalJson({
110
+ batch_id: anchorProof.batch_id,
111
+ merkle_root: anchorProof.merkle_root,
112
+ leaf_count: anchorProof.leaf_count,
113
+ first_issued_at: anchorProof.first_issued_at,
114
+ last_issued_at: anchorProof.last_issued_at,
115
+ relay_id: anchorProof.relay_id,
116
+ });
117
+ const payloadBytes = new TextEncoder().encode(batchPayload);
118
+ const signatureBytes = hexToBytes(anchorProof.batch_signature);
119
+ const publicKeyBytes = hexToBytes(anchorProof.relay_public_key);
120
+ let relaySignatureValid = false;
121
+ try {
122
+ relaySignatureValid = await ed25519Verify(signatureBytes, payloadBytes, publicKeyBytes);
123
+ }
124
+ catch {
125
+ relaySignatureValid = false;
126
+ }
127
+ if (!relaySignatureValid) {
128
+ errors.push("Relay batch signature verification failed");
129
+ }
130
+ // Step 4: Onchain anchor (optional — requires network access)
131
+ let chainVerified = null;
132
+ if (anchorProof.anchor && chainVerifier) {
133
+ try {
134
+ chainVerified = await chainVerifier({
135
+ ...anchorProof.anchor,
136
+ expected_root: anchorProof.merkle_root,
137
+ });
138
+ if (!chainVerified) {
139
+ errors.push("Onchain anchor verification failed");
140
+ }
141
+ }
142
+ catch (err) {
143
+ chainVerified = false;
144
+ errors.push(`Onchain verification error: ${err instanceof Error ? err.message : String(err)}`);
145
+ }
146
+ }
147
+ const valid = hashValid && merkleValid && relaySignatureValid && (chainVerified === null || chainVerified);
148
+ return {
149
+ valid,
150
+ steps: {
151
+ hash_valid: hashValid,
152
+ merkle_valid: merkleValid,
153
+ relay_signature_valid: relaySignatureValid,
154
+ chain_verified: chainVerified,
155
+ },
156
+ errors,
157
+ };
158
+ }
159
+ //# sourceMappingURL=credential-anchor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-anchor.js","sourceRoot":"","sources":["../src/credential-anchor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Verifiable Credentials (W3C VC Data Model 2.0) with eddsa-jcs-2022 cryptosuite.
3
+ *
4
+ * Signing and verification of W3C Verifiable Credentials and Presentations
5
+ * using the protocol's canonical Ed25519 + JCS pipeline.
6
+ *
7
+ * Moved from BSL @motebit/crypto to MIT @motebit/crypto.
8
+ */
9
+ export interface DataIntegrityProof {
10
+ type: "DataIntegrityProof";
11
+ cryptosuite: "eddsa-jcs-2022";
12
+ created: string;
13
+ verificationMethod: string;
14
+ proofPurpose: "assertionMethod" | "authentication";
15
+ proofValue: string;
16
+ }
17
+ export interface VerifiableCredential<T = Record<string, unknown>> {
18
+ "@context": string[];
19
+ type: string[];
20
+ issuer: string;
21
+ credentialSubject: T & {
22
+ id: string;
23
+ };
24
+ validFrom: string;
25
+ validUntil?: string;
26
+ credentialStatus?: {
27
+ id: string;
28
+ type: string;
29
+ };
30
+ proof: DataIntegrityProof;
31
+ }
32
+ export interface VerifiablePresentation {
33
+ "@context": string[];
34
+ type: string[];
35
+ holder: string;
36
+ verifiableCredential: VerifiableCredential[];
37
+ proof: DataIntegrityProof;
38
+ }
39
+ export interface GradientCredentialSubject {
40
+ id: string;
41
+ gradient: number;
42
+ knowledge_density: number;
43
+ knowledge_quality: number;
44
+ graph_connectivity: number;
45
+ temporal_stability: number;
46
+ retrieval_quality: number;
47
+ interaction_efficiency: number;
48
+ tool_efficiency: number;
49
+ curiosity_pressure: number;
50
+ measured_at: number;
51
+ }
52
+ export interface ReputationCredentialSubject {
53
+ id: string;
54
+ success_rate: number;
55
+ avg_latency_ms: number;
56
+ task_count: number;
57
+ trust_score: number;
58
+ availability: number;
59
+ sample_size: number;
60
+ measured_at: number;
61
+ }
62
+ export interface TrustCredentialSubject {
63
+ id: string;
64
+ trust_level: string;
65
+ interaction_count: number;
66
+ successful_tasks: number;
67
+ failed_tasks: number;
68
+ first_seen_at: number;
69
+ last_seen_at: number;
70
+ }
71
+ export declare function signVerifiableCredential<T = Record<string, unknown>>(unsignedVC: Omit<VerifiableCredential<T>, "proof">, privateKey: Uint8Array, publicKey: Uint8Array): Promise<VerifiableCredential<T>>;
72
+ export declare function verifyVerifiableCredential<T = Record<string, unknown>>(vc: VerifiableCredential<T>): Promise<boolean>;
73
+ export declare function signVerifiablePresentation(unsignedVP: Omit<VerifiablePresentation, "proof">, privateKey: Uint8Array, publicKey: Uint8Array): Promise<VerifiablePresentation>;
74
+ export declare function verifyVerifiablePresentation(vp: VerifiablePresentation): Promise<{
75
+ valid: boolean;
76
+ errors: string[];
77
+ }>;
78
+ export declare function issueGradientCredential(snapshot: {
79
+ gradient: number;
80
+ knowledge_density: number;
81
+ knowledge_quality: number;
82
+ graph_connectivity: number;
83
+ temporal_stability: number;
84
+ retrieval_quality: number;
85
+ interaction_efficiency: number;
86
+ tool_efficiency: number;
87
+ curiosity_pressure: number;
88
+ timestamp: number;
89
+ }, privateKey: Uint8Array, publicKey: Uint8Array, subjectDid?: string, validForMs?: number, statusEndpoint?: string): Promise<VerifiableCredential<GradientCredentialSubject>>;
90
+ export declare function issueReputationCredential(snapshot: {
91
+ success_rate: number;
92
+ avg_latency_ms: number;
93
+ task_count: number;
94
+ trust_score: number;
95
+ availability: number;
96
+ measured_at: number;
97
+ }, privateKey: Uint8Array, publicKey: Uint8Array, subjectDid: string, validForMs?: number, statusEndpoint?: string): Promise<VerifiableCredential<ReputationCredentialSubject>>;
98
+ export declare function issueTrustCredential(trustRecord: {
99
+ trust_level: string;
100
+ interaction_count: number;
101
+ successful_tasks?: number;
102
+ failed_tasks?: number;
103
+ first_seen_at: number;
104
+ last_seen_at: number;
105
+ }, privateKey: Uint8Array, publicKey: Uint8Array, subjectDid: string, validForMs?: number, statusEndpoint?: string): Promise<VerifiableCredential<TrustCredentialSubject>>;
106
+ export declare function createPresentation(credentials: VerifiableCredential[], privateKey: Uint8Array, publicKey: Uint8Array): Promise<VerifiablePresentation>;
107
+ //# sourceMappingURL=credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,209 @@
1
+ /**
2
+ * Verifiable Credentials (W3C VC Data Model 2.0) with eddsa-jcs-2022 cryptosuite.
3
+ *
4
+ * Signing and verification of W3C Verifiable Credentials and Presentations
5
+ * using the protocol's canonical Ed25519 + JCS pipeline.
6
+ *
7
+ * Moved from BSL @motebit/crypto to MIT @motebit/crypto.
8
+ */
9
+ import { canonicalJson, ed25519Sign, ed25519Verify, base58btcEncode, base58btcDecode, publicKeyToDidKey, didKeyToPublicKey, sha256, } from "./signing.js";
10
+ // === Internal helpers ===
11
+ function buildVerificationMethod(publicKey) {
12
+ const did = publicKeyToDidKey(publicKey);
13
+ const fragment = did.slice("did:key:".length);
14
+ return `${did}#${fragment}`;
15
+ }
16
+ // === eddsa-jcs-2022 Signing ===
17
+ /**
18
+ * Sign a document using eddsa-jcs-2022 (Data Integrity EdDSA Cryptosuites).
19
+ *
20
+ * 1. Separate proof options from document
21
+ * 2. proofHash = SHA-256(canonicalJson(proofOptions))
22
+ * 3. docHash = SHA-256(canonicalJson(documentWithoutProof))
23
+ * 4. signature = Ed25519.sign(proofHash || docHash, privateKey)
24
+ * 5. proofValue = "z" + base58btcEncode(signature)
25
+ */
26
+ async function signDataIntegrity(document, privateKey, publicKey, proofPurpose) {
27
+ const verificationMethod = buildVerificationMethod(publicKey);
28
+ const created = new Date().toISOString();
29
+ const proofOptions = {
30
+ type: "DataIntegrityProof",
31
+ cryptosuite: "eddsa-jcs-2022",
32
+ created,
33
+ verificationMethod,
34
+ proofPurpose,
35
+ };
36
+ const encoder = new TextEncoder();
37
+ const proofHash = await sha256(encoder.encode(canonicalJson(proofOptions)));
38
+ const { proof: _proof, ...docWithoutProof } = document;
39
+ const docHash = await sha256(encoder.encode(canonicalJson(docWithoutProof)));
40
+ const combined = new Uint8Array(proofHash.length + docHash.length);
41
+ combined.set(proofHash);
42
+ combined.set(docHash, proofHash.length);
43
+ const signature = await ed25519Sign(combined, privateKey);
44
+ const proofValue = "z" + base58btcEncode(signature);
45
+ return { ...proofOptions, proofValue };
46
+ }
47
+ /**
48
+ * Verify a Data Integrity proof using eddsa-jcs-2022.
49
+ */
50
+ async function verifyDataIntegritySigning(document, proof) {
51
+ if (proof.type !== "DataIntegrityProof" || proof.cryptosuite !== "eddsa-jcs-2022") {
52
+ return false;
53
+ }
54
+ const did = proof.verificationMethod.split("#")[0];
55
+ let publicKey;
56
+ try {
57
+ publicKey = didKeyToPublicKey(did);
58
+ }
59
+ catch {
60
+ return false;
61
+ }
62
+ const { proofValue, ...proofOptions } = proof;
63
+ const encoder = new TextEncoder();
64
+ const proofHash = await sha256(encoder.encode(canonicalJson(proofOptions)));
65
+ const { proof: _proof, ...docWithoutProof } = document;
66
+ const docHash = await sha256(encoder.encode(canonicalJson(docWithoutProof)));
67
+ const combined = new Uint8Array(proofHash.length + docHash.length);
68
+ combined.set(proofHash);
69
+ combined.set(docHash, proofHash.length);
70
+ if (!proofValue.startsWith("z"))
71
+ return false;
72
+ let signature;
73
+ try {
74
+ signature = base58btcDecode(proofValue.slice(1));
75
+ }
76
+ catch {
77
+ return false;
78
+ }
79
+ return ed25519Verify(signature, combined, publicKey);
80
+ }
81
+ // === Verifiable Credential Sign/Verify ===
82
+ export async function signVerifiableCredential(unsignedVC, privateKey, publicKey) {
83
+ const proof = await signDataIntegrity(unsignedVC, privateKey, publicKey, "assertionMethod");
84
+ return { ...unsignedVC, proof };
85
+ }
86
+ export async function verifyVerifiableCredential(vc) {
87
+ if (vc.validUntil) {
88
+ const expiresAt = new Date(vc.validUntil).getTime();
89
+ if (Date.now() > expiresAt)
90
+ return false;
91
+ }
92
+ return verifyDataIntegritySigning(vc, vc.proof);
93
+ }
94
+ // === Verifiable Presentation Sign/Verify ===
95
+ export async function signVerifiablePresentation(unsignedVP, privateKey, publicKey) {
96
+ const proof = await signDataIntegrity(unsignedVP, privateKey, publicKey, "authentication");
97
+ return { ...unsignedVP, proof };
98
+ }
99
+ export async function verifyVerifiablePresentation(vp) {
100
+ const errors = [];
101
+ const vpValid = await verifyDataIntegritySigning(vp, vp.proof);
102
+ if (!vpValid) {
103
+ errors.push("Presentation proof is invalid");
104
+ }
105
+ for (let i = 0; i < vp.verifiableCredential.length; i++) {
106
+ const vc = vp.verifiableCredential[i];
107
+ const vcValid = await verifyVerifiableCredential(vc);
108
+ if (!vcValid) {
109
+ errors.push(`Credential ${i} proof is invalid`);
110
+ }
111
+ }
112
+ return { valid: errors.length === 0, errors };
113
+ }
114
+ // === Convenience Issuance Functions ===
115
+ const VC_TYPE_GRADIENT = "AgentGradientCredential";
116
+ const VC_TYPE_REPUTATION = "AgentReputationCredential";
117
+ const VC_TYPE_TRUST = "AgentTrustCredential";
118
+ const ONE_HOUR_MS = 60 * 60 * 1000;
119
+ export async function issueGradientCredential(snapshot, privateKey, publicKey, subjectDid, validForMs = ONE_HOUR_MS, statusEndpoint) {
120
+ const issuerDid = publicKeyToDidKey(publicKey);
121
+ const subject = {
122
+ id: subjectDid ?? issuerDid,
123
+ gradient: snapshot.gradient,
124
+ knowledge_density: snapshot.knowledge_density,
125
+ knowledge_quality: snapshot.knowledge_quality,
126
+ graph_connectivity: snapshot.graph_connectivity,
127
+ temporal_stability: snapshot.temporal_stability,
128
+ retrieval_quality: snapshot.retrieval_quality,
129
+ interaction_efficiency: snapshot.interaction_efficiency,
130
+ tool_efficiency: snapshot.tool_efficiency,
131
+ curiosity_pressure: snapshot.curiosity_pressure,
132
+ measured_at: snapshot.timestamp,
133
+ };
134
+ const now = new Date();
135
+ const unsignedVC = {
136
+ "@context": ["https://www.w3.org/ns/credentials/v2"],
137
+ type: ["VerifiableCredential", VC_TYPE_GRADIENT],
138
+ issuer: issuerDid,
139
+ credentialSubject: subject,
140
+ validFrom: now.toISOString(),
141
+ validUntil: new Date(now.getTime() + validForMs).toISOString(),
142
+ ...(statusEndpoint
143
+ ? { credentialStatus: { id: statusEndpoint, type: "RevocationList2024" } }
144
+ : {}),
145
+ };
146
+ return signVerifiableCredential(unsignedVC, privateKey, publicKey);
147
+ }
148
+ export async function issueReputationCredential(snapshot, privateKey, publicKey, subjectDid, validForMs = ONE_HOUR_MS, statusEndpoint) {
149
+ const issuerDid = publicKeyToDidKey(publicKey);
150
+ const subject = {
151
+ id: subjectDid,
152
+ success_rate: snapshot.success_rate,
153
+ avg_latency_ms: snapshot.avg_latency_ms,
154
+ task_count: snapshot.task_count,
155
+ trust_score: snapshot.trust_score,
156
+ availability: snapshot.availability,
157
+ sample_size: snapshot.task_count,
158
+ measured_at: snapshot.measured_at,
159
+ };
160
+ const now = new Date();
161
+ const unsignedVC = {
162
+ "@context": ["https://www.w3.org/ns/credentials/v2"],
163
+ type: ["VerifiableCredential", VC_TYPE_REPUTATION],
164
+ issuer: issuerDid,
165
+ credentialSubject: subject,
166
+ validFrom: now.toISOString(),
167
+ validUntil: new Date(now.getTime() + validForMs).toISOString(),
168
+ ...(statusEndpoint
169
+ ? { credentialStatus: { id: statusEndpoint, type: "RevocationList2024" } }
170
+ : {}),
171
+ };
172
+ return signVerifiableCredential(unsignedVC, privateKey, publicKey);
173
+ }
174
+ export async function issueTrustCredential(trustRecord, privateKey, publicKey, subjectDid, validForMs = ONE_HOUR_MS, statusEndpoint) {
175
+ const issuerDid = publicKeyToDidKey(publicKey);
176
+ const subject = {
177
+ id: subjectDid,
178
+ trust_level: trustRecord.trust_level,
179
+ interaction_count: trustRecord.interaction_count,
180
+ successful_tasks: trustRecord.successful_tasks ?? 0,
181
+ failed_tasks: trustRecord.failed_tasks ?? 0,
182
+ first_seen_at: trustRecord.first_seen_at,
183
+ last_seen_at: trustRecord.last_seen_at,
184
+ };
185
+ const now = new Date();
186
+ const unsignedVC = {
187
+ "@context": ["https://www.w3.org/ns/credentials/v2"],
188
+ type: ["VerifiableCredential", VC_TYPE_TRUST],
189
+ issuer: issuerDid,
190
+ credentialSubject: subject,
191
+ validFrom: now.toISOString(),
192
+ validUntil: new Date(now.getTime() + validForMs).toISOString(),
193
+ ...(statusEndpoint
194
+ ? { credentialStatus: { id: statusEndpoint, type: "RevocationList2024" } }
195
+ : {}),
196
+ };
197
+ return signVerifiableCredential(unsignedVC, privateKey, publicKey);
198
+ }
199
+ export async function createPresentation(credentials, privateKey, publicKey) {
200
+ const holderDid = publicKeyToDidKey(publicKey);
201
+ const unsignedVP = {
202
+ "@context": ["https://www.w3.org/ns/credentials/v2"],
203
+ type: ["VerifiablePresentation"],
204
+ holder: holderDid,
205
+ verifiableCredential: credentials,
206
+ };
207
+ return signVerifiablePresentation(unsignedVP, privateKey, publicKey);
208
+ }
209
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"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"}