@motebit/crypto 1.1.0 → 1.2.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/artifacts.d.ts +1 -1
- package/dist/artifacts.js +1158 -0
- package/dist/artifacts.js.map +1 -0
- package/dist/credential-anchor.d.ts.map +1 -1
- package/dist/credential-anchor.js +200 -0
- package/dist/credential-anchor.js.map +1 -0
- package/dist/credentials.js +212 -0
- package/dist/credentials.js.map +1 -0
- package/dist/deletion-certificate.d.ts +256 -0
- package/dist/deletion-certificate.d.ts.map +1 -0
- package/dist/deletion-certificate.js +562 -0
- package/dist/deletion-certificate.js.map +1 -0
- package/dist/hardware-attestation.js +400 -0
- package/dist/hardware-attestation.js.map +1 -0
- package/dist/index.d.ts +120 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1070 -5862
- package/dist/index.js.map +1 -0
- package/dist/merkle.d.ts +34 -0
- package/dist/merkle.d.ts.map +1 -0
- package/dist/merkle.js +84 -0
- package/dist/merkle.js.map +1 -0
- package/dist/signing.js +314 -0
- package/dist/signing.js.map +1 -0
- package/dist/skills.d.ts +95 -0
- package/dist/skills.d.ts.map +1 -0
- package/dist/skills.js +228 -0
- package/dist/skills.js.map +1 -0
- package/dist/suite-dispatch.js +189 -3223
- package/dist/suite-dispatch.js.map +1 -0
- package/dist/witness-omission-dispute.d.ts +98 -0
- package/dist/witness-omission-dispute.d.ts.map +1 -0
- package/dist/witness-omission-dispute.js +237 -0
- package/dist/witness-omission-dispute.js.map +1 -0
- package/package.json +2 -2
package/dist/skills.js
ADDED
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill manifest + envelope signing and verification — spec/skills-v1.md.
|
|
3
|
+
*
|
|
4
|
+
* Skills are motebit-internal protocol artifacts. They install locally,
|
|
5
|
+
* verify on motebit runtimes, and are signed by their author's motebit
|
|
6
|
+
* identity using `motebit-jcs-ed25519-b64-v1` — the same suite used for
|
|
7
|
+
* execution receipts, tool invocation receipts, settlement anchors, and
|
|
8
|
+
* migration artifacts. NOT W3C `eddsa-jcs-2022` (that suite is reserved for
|
|
9
|
+
* credentials, identity files, and presentations needing third-party W3C
|
|
10
|
+
* interop).
|
|
11
|
+
*
|
|
12
|
+
* Signature recipe (spec §5.1):
|
|
13
|
+
*
|
|
14
|
+
* manifest_bytes = JCS(manifest_with_signature_value_removed) || 0x0A || lf_body
|
|
15
|
+
* envelope_bytes = JCS(envelope_with_signature_value_removed)
|
|
16
|
+
* signature = Ed25519.sign(bytes, privateKey) -- routed through verifyBySuite
|
|
17
|
+
*
|
|
18
|
+
* Verification is offline: no relay, no registry, no external service. Per
|
|
19
|
+
* @motebit/crypto/CLAUDE.md rule 4, third-party verifiers using only this
|
|
20
|
+
* package and the signer's public key can validate any motebit-signed skill.
|
|
21
|
+
*/
|
|
22
|
+
import { canonicalJson, fromBase64Url, hexToBytes, signBySuite, toBase64Url, verifyBySuite, } from "./signing.js";
|
|
23
|
+
/** The suite skills sign under in v1. Mirrors EXECUTION_RECEIPT_SUITE. */
|
|
24
|
+
export const SKILL_SIGNATURE_SUITE = "motebit-jcs-ed25519-b64-v1";
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// Canonicalization — pure, deterministic, dependency-free
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
/**
|
|
29
|
+
* Strip `signature.value` from a SkillSignature, preserving `suite` and
|
|
30
|
+
* `public_key` (those ARE part of the signed canonical form per spec §5.1).
|
|
31
|
+
*/
|
|
32
|
+
function signatureWithoutValue(sig) {
|
|
33
|
+
return { suite: sig.suite, public_key: sig.public_key };
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Compute the canonical bytes that a SkillManifest signature is computed over.
|
|
37
|
+
* `body` is the LF-normalized SKILL.md body bytes (everything after the
|
|
38
|
+
* closing `---` delimiter), with CRLF/CR converted to LF, no BOM, UTF-8.
|
|
39
|
+
*
|
|
40
|
+
* Caller is responsible for body normalization. The reference parser in
|
|
41
|
+
* @motebit/skills (BSL) does the normalization at file-read time.
|
|
42
|
+
*
|
|
43
|
+
* The manifest's `motebit.signature.value` is removed before canonicalization;
|
|
44
|
+
* `suite` and `public_key` are preserved (they are signature-bound).
|
|
45
|
+
*/
|
|
46
|
+
export function canonicalizeSkillManifestBytes(manifest, body) {
|
|
47
|
+
const motebitForCanonical = manifest.motebit.signature
|
|
48
|
+
? {
|
|
49
|
+
...manifest.motebit,
|
|
50
|
+
signature: signatureWithoutValue(manifest.motebit.signature),
|
|
51
|
+
}
|
|
52
|
+
: manifest.motebit;
|
|
53
|
+
const manifestForCanonical = { ...manifest, motebit: motebitForCanonical };
|
|
54
|
+
const canonical = canonicalJson(manifestForCanonical);
|
|
55
|
+
const manifestBytes = new TextEncoder().encode(canonical);
|
|
56
|
+
const out = new Uint8Array(manifestBytes.length + 1 + body.length);
|
|
57
|
+
out.set(manifestBytes, 0);
|
|
58
|
+
out[manifestBytes.length] = 0x0a; // LF separator
|
|
59
|
+
out.set(body, manifestBytes.length + 1);
|
|
60
|
+
return out;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Compute the canonical bytes that a SkillEnvelope signature is computed
|
|
64
|
+
* over. Sibling to manifest canonicalization; envelope is pure JSON so no
|
|
65
|
+
* body concatenation.
|
|
66
|
+
*/
|
|
67
|
+
export function canonicalizeSkillEnvelopeBytes(envelope) {
|
|
68
|
+
const envelopeForCanonical = {
|
|
69
|
+
...envelope,
|
|
70
|
+
signature: signatureWithoutValue(envelope.signature),
|
|
71
|
+
};
|
|
72
|
+
const canonical = canonicalJson(envelopeForCanonical);
|
|
73
|
+
return new TextEncoder().encode(canonical);
|
|
74
|
+
}
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
// Signing — for skill authors
|
|
77
|
+
// ---------------------------------------------------------------------------
|
|
78
|
+
/**
|
|
79
|
+
* Sign a SkillManifest, returning the signed manifest with `motebit.signature`
|
|
80
|
+
* populated. Caller provides the LF-normalized body bytes; signing recipe is
|
|
81
|
+
* spec §5.1.
|
|
82
|
+
*
|
|
83
|
+
* The returned manifest's `motebit.signature.public_key` is hex-encoded and
|
|
84
|
+
* `motebit.signature.value` is base64url-encoded, matching the suite contract.
|
|
85
|
+
*/
|
|
86
|
+
export async function signSkillManifest(unsigned, privateKey, publicKey, body) {
|
|
87
|
+
const publicKeyHex = bytesToLowerHex(publicKey);
|
|
88
|
+
// Stamp the unsigned signature block (suite + public_key) so it participates
|
|
89
|
+
// in canonicalization at sign time.
|
|
90
|
+
const unsignedWithSig = {
|
|
91
|
+
...unsigned,
|
|
92
|
+
motebit: {
|
|
93
|
+
...unsigned.motebit,
|
|
94
|
+
signature: {
|
|
95
|
+
suite: SKILL_SIGNATURE_SUITE,
|
|
96
|
+
public_key: publicKeyHex,
|
|
97
|
+
value: "", // placeholder; stripped by canonicalize
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
const message = canonicalizeSkillManifestBytes(unsignedWithSig, body);
|
|
102
|
+
const sig = await signBySuite(SKILL_SIGNATURE_SUITE, message, privateKey);
|
|
103
|
+
return {
|
|
104
|
+
...unsigned,
|
|
105
|
+
motebit: {
|
|
106
|
+
...unsigned.motebit,
|
|
107
|
+
signature: {
|
|
108
|
+
suite: SKILL_SIGNATURE_SUITE,
|
|
109
|
+
public_key: publicKeyHex,
|
|
110
|
+
value: toBase64Url(sig),
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Sign a SkillEnvelope, returning the signed envelope. Sibling to
|
|
117
|
+
* `signSkillManifest`. Envelope canonicalization is pure JSON (§5.1).
|
|
118
|
+
*/
|
|
119
|
+
export async function signSkillEnvelope(unsigned, privateKey, publicKey) {
|
|
120
|
+
const publicKeyHex = bytesToLowerHex(publicKey);
|
|
121
|
+
const unsignedWithSig = {
|
|
122
|
+
...unsigned,
|
|
123
|
+
signature: {
|
|
124
|
+
suite: SKILL_SIGNATURE_SUITE,
|
|
125
|
+
public_key: publicKeyHex,
|
|
126
|
+
value: "", // placeholder; stripped by canonicalize
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
const message = canonicalizeSkillEnvelopeBytes(unsignedWithSig);
|
|
130
|
+
const sig = await signBySuite(SKILL_SIGNATURE_SUITE, message, privateKey);
|
|
131
|
+
return {
|
|
132
|
+
...unsigned,
|
|
133
|
+
signature: {
|
|
134
|
+
suite: SKILL_SIGNATURE_SUITE,
|
|
135
|
+
public_key: publicKeyHex,
|
|
136
|
+
value: toBase64Url(sig),
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
// ---------------------------------------------------------------------------
|
|
141
|
+
// Verification — fail-closed on every error path
|
|
142
|
+
// ---------------------------------------------------------------------------
|
|
143
|
+
/**
|
|
144
|
+
* Verify a SkillManifest's signature against the provided public key and
|
|
145
|
+
* LF-normalized body bytes. Returns `false` on any failure path:
|
|
146
|
+
*
|
|
147
|
+
* - manifest is unsigned (`motebit.signature` absent)
|
|
148
|
+
* - suite mismatch (only `motebit-jcs-ed25519-b64-v1` accepted in v1)
|
|
149
|
+
* - public_key in the signature doesn't match the supplied public key
|
|
150
|
+
* - signature value fails base64url decode
|
|
151
|
+
* - Ed25519 verification fails
|
|
152
|
+
*
|
|
153
|
+
* Per CLAUDE.md rule 4, this is the third-party self-verification entry
|
|
154
|
+
* point. Only this package + the signer's public key are required.
|
|
155
|
+
*/
|
|
156
|
+
export async function verifySkillManifest(manifest, body, publicKey) {
|
|
157
|
+
return (await verifySkillManifestDetailed(manifest, body, publicKey)).valid;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Companion to `verifySkillManifest` that returns a categorized failure
|
|
161
|
+
* reason for observability. Same recipe; same fail-closed behavior.
|
|
162
|
+
*/
|
|
163
|
+
export async function verifySkillManifestDetailed(manifest, body, publicKey) {
|
|
164
|
+
const sig = manifest.motebit.signature;
|
|
165
|
+
if (!sig)
|
|
166
|
+
return { valid: false, reason: "no_signature" };
|
|
167
|
+
if (sig.suite !== SKILL_SIGNATURE_SUITE)
|
|
168
|
+
return { valid: false, reason: "wrong_suite" };
|
|
169
|
+
const publicKeyHex = bytesToLowerHex(publicKey);
|
|
170
|
+
if (sig.public_key.toLowerCase() !== publicKeyHex) {
|
|
171
|
+
return { valid: false, reason: "bad_public_key" };
|
|
172
|
+
}
|
|
173
|
+
let sigBytes;
|
|
174
|
+
try {
|
|
175
|
+
sigBytes = fromBase64Url(sig.value);
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
return { valid: false, reason: "bad_signature_value" };
|
|
179
|
+
}
|
|
180
|
+
const message = canonicalizeSkillManifestBytes(manifest, body);
|
|
181
|
+
const valid = await verifyBySuite(SKILL_SIGNATURE_SUITE, message, sigBytes, publicKey);
|
|
182
|
+
return { valid, reason: valid ? "ok" : "ed25519_mismatch" };
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Verify a SkillEnvelope's signature. Sibling to `verifySkillManifest` —
|
|
186
|
+
* same suite, same fail-closed semantics. Note: envelope verification does
|
|
187
|
+
* NOT cross-check `body_hash` or `files[].hash` against on-disk bytes; the
|
|
188
|
+
* caller (install-time logic in the registry) is responsible for that pass
|
|
189
|
+
* after signature verification succeeds.
|
|
190
|
+
*/
|
|
191
|
+
export async function verifySkillEnvelope(envelope, publicKey) {
|
|
192
|
+
return (await verifySkillEnvelopeDetailed(envelope, publicKey)).valid;
|
|
193
|
+
}
|
|
194
|
+
export async function verifySkillEnvelopeDetailed(envelope, publicKey) {
|
|
195
|
+
const sig = envelope.signature;
|
|
196
|
+
if (sig.suite !== SKILL_SIGNATURE_SUITE)
|
|
197
|
+
return { valid: false, reason: "wrong_suite" };
|
|
198
|
+
const publicKeyHex = bytesToLowerHex(publicKey);
|
|
199
|
+
if (sig.public_key.toLowerCase() !== publicKeyHex) {
|
|
200
|
+
return { valid: false, reason: "bad_public_key" };
|
|
201
|
+
}
|
|
202
|
+
let sigBytes;
|
|
203
|
+
try {
|
|
204
|
+
sigBytes = fromBase64Url(sig.value);
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
return { valid: false, reason: "bad_signature_value" };
|
|
208
|
+
}
|
|
209
|
+
const message = canonicalizeSkillEnvelopeBytes(envelope);
|
|
210
|
+
const valid = await verifyBySuite(SKILL_SIGNATURE_SUITE, message, sigBytes, publicKey);
|
|
211
|
+
return { valid, reason: valid ? "ok" : "ed25519_mismatch" };
|
|
212
|
+
}
|
|
213
|
+
// ---------------------------------------------------------------------------
|
|
214
|
+
// Helpers
|
|
215
|
+
// ---------------------------------------------------------------------------
|
|
216
|
+
/** Hex-encode a 32-byte public key as 64 lowercase hex chars. */
|
|
217
|
+
function bytesToLowerHex(bytes) {
|
|
218
|
+
let hex = "";
|
|
219
|
+
for (const b of bytes) {
|
|
220
|
+
hex += b.toString(16).padStart(2, "0");
|
|
221
|
+
}
|
|
222
|
+
return hex;
|
|
223
|
+
}
|
|
224
|
+
/** Decode a hex public key from a SkillSignature for caller convenience. */
|
|
225
|
+
export function decodeSkillSignaturePublicKey(sig) {
|
|
226
|
+
return hexToBytes(sig.public_key);
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"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"}
|