@motebit/verify 0.6.11 → 1.0.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/cli.js ADDED
@@ -0,0 +1,261 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * `motebit-verify` CLI — the canonical motebit artifact verifier.
4
+ *
5
+ * Verifies identity files, execution receipts, credentials, and
6
+ * presentations against their embedded signatures. When a credential
7
+ * carries a `hardware_attestation` claim for `device_check` / `tpm` /
8
+ * `play_integrity` / `webauthn`, the bundled platform adapters verify
9
+ * the chain, nonce, bundle, and identity binding end-to-end.
10
+ *
11
+ * ```
12
+ * motebit-verify <file> # auto-detect, print human
13
+ * motebit-verify <file> --json # structured output
14
+ * motebit-verify <file> --expect credential
15
+ * motebit-verify <file> --clock-skew 30
16
+ *
17
+ * # Platform-specific overrides (all optional; defaults match
18
+ * # motebit's canonical identifiers).
19
+ * motebit-verify <file> \
20
+ * --bundle-id com.example.app \
21
+ * --android-package com.example.app \
22
+ * --rp-id example.com
23
+ * ```
24
+ *
25
+ * Exit codes:
26
+ * 0 artifact verified (including any hardware-attestation channel)
27
+ * 1 artifact detected but signature / hardware-channel invalid
28
+ * 2 usage / I/O error
29
+ *
30
+ * Network-free by design. Every adapter pins its own trust anchor
31
+ * (Apple App Attest Root CA, FIDO roots, TPM vendor roots); Play
32
+ * Integrity's JWKS is fail-closed by default until an operator lands
33
+ * real bytes (see `@motebit/crypto-play-integrity`'s CLAUDE.md).
34
+ *
35
+ * Three-package lineage — mirrors how tools like `git` / `libgit2` or
36
+ * `cargo` / `tokio` separate the verb-tool from the library layer:
37
+ *
38
+ * @motebit/verify — this CLI (Apache-2.0, bundles all 4 adapters)
39
+ * @motebit/verifier — Apache-2.0 library (file I/O, human formatting)
40
+ * @motebit/crypto — Apache-2.0 primitives (verify, sign, suite dispatch)
41
+ */
42
+ import { readFileSync } from "node:fs";
43
+ import { dirname, join } from "node:path";
44
+ import { fileURLToPath } from "node:url";
45
+ import { formatHuman, verifyFile } from "@motebit/verifier";
46
+ import { buildHardwareVerifiers } from "./adapters.js";
47
+ const EXPECT_VALUES = [
48
+ "identity",
49
+ "receipt",
50
+ "credential",
51
+ "presentation",
52
+ ];
53
+ function parseArgs(argv) {
54
+ let file;
55
+ let json = false;
56
+ let expectedType;
57
+ let clockSkewSeconds;
58
+ let bundleId;
59
+ let androidPackage;
60
+ let rpId;
61
+ let help = false;
62
+ let version = false;
63
+ let i = 0;
64
+ while (i < argv.length) {
65
+ const arg = argv[i];
66
+ switch (arg) {
67
+ case "-h":
68
+ case "--help":
69
+ help = true;
70
+ i++;
71
+ break;
72
+ case "-V":
73
+ case "--version":
74
+ version = true;
75
+ i++;
76
+ break;
77
+ case "--json":
78
+ json = true;
79
+ i++;
80
+ break;
81
+ case "--expect":
82
+ case "--expected-type": {
83
+ const value = argv[i + 1];
84
+ if (value === undefined)
85
+ return usage(`${arg} requires a value`);
86
+ if (!EXPECT_VALUES.includes(value)) {
87
+ return usage(`unknown --expect value "${value}" (valid: ${EXPECT_VALUES.join(", ")})`);
88
+ }
89
+ expectedType = value;
90
+ i += 2;
91
+ break;
92
+ }
93
+ case "--clock-skew": {
94
+ const value = argv[i + 1];
95
+ if (value === undefined)
96
+ return usage("--clock-skew requires an integer seconds value");
97
+ const n = Number.parseInt(value, 10);
98
+ if (!Number.isFinite(n) || n < 0) {
99
+ return usage(`--clock-skew must be a non-negative integer (got "${value}")`);
100
+ }
101
+ clockSkewSeconds = n;
102
+ i += 2;
103
+ break;
104
+ }
105
+ case "--bundle-id": {
106
+ const value = argv[i + 1];
107
+ if (value === undefined)
108
+ return usage("--bundle-id requires a value");
109
+ bundleId = value;
110
+ i += 2;
111
+ break;
112
+ }
113
+ case "--android-package": {
114
+ const value = argv[i + 1];
115
+ if (value === undefined)
116
+ return usage("--android-package requires a value");
117
+ androidPackage = value;
118
+ i += 2;
119
+ break;
120
+ }
121
+ case "--rp-id": {
122
+ const value = argv[i + 1];
123
+ if (value === undefined)
124
+ return usage("--rp-id requires a value");
125
+ rpId = value;
126
+ i += 2;
127
+ break;
128
+ }
129
+ default:
130
+ if (arg.startsWith("-"))
131
+ return usage(`unknown flag: ${arg}`);
132
+ if (file !== undefined) {
133
+ return usage(`expected exactly one file argument, got a second: "${arg}" (after "${file}")`);
134
+ }
135
+ file = arg;
136
+ i++;
137
+ break;
138
+ }
139
+ }
140
+ if (help)
141
+ return { mode: "help", json };
142
+ if (version)
143
+ return { mode: "version", json };
144
+ if (file === undefined)
145
+ return usage("missing file argument");
146
+ return {
147
+ mode: "verify",
148
+ file,
149
+ json,
150
+ ...(expectedType !== undefined && { expectedType }),
151
+ ...(clockSkewSeconds !== undefined && { clockSkewSeconds }),
152
+ ...(bundleId !== undefined && { bundleId }),
153
+ ...(androidPackage !== undefined && { androidPackage }),
154
+ ...(rpId !== undefined && { rpId }),
155
+ };
156
+ }
157
+ function usage(message) {
158
+ return { mode: "help", json: false, usageError: message };
159
+ }
160
+ function renderHelp() {
161
+ return [
162
+ "motebit-verify — hardware-attestation-aware verifier for Motebit credentials",
163
+ "",
164
+ "USAGE",
165
+ " motebit-verify <file> [options]",
166
+ "",
167
+ "OPTIONS",
168
+ " --json Print structured JSON instead of human-readable.",
169
+ " --expect <type> Require the artifact to be of the named type.",
170
+ " --clock-skew <seconds> Allow N seconds of clock skew.",
171
+ " --bundle-id <id> Override the expected iOS bundle ID for App Attest",
172
+ " (default: com.motebit.mobile).",
173
+ " --android-package <name> Override the expected Android package name for",
174
+ " Play Integrity (default: com.motebit.mobile).",
175
+ " --rp-id <id> Override the expected WebAuthn Relying Party ID",
176
+ " (default: motebit.com).",
177
+ " -h, --help Show this help.",
178
+ " -V, --version Print version.",
179
+ "",
180
+ "EXIT CODES",
181
+ " 0 Artifact verified (including hardware-attestation channel).",
182
+ " 1 Artifact invalid (signature, expiry, hardware-channel chain / nonce / bundle).",
183
+ " 2 Usage or I/O error.",
184
+ "",
185
+ "PLATFORMS WIRED",
186
+ " device_check Apple App Attest (pinned Apple root)",
187
+ " tpm TPM 2.0 (pinned Infineon / Nuvoton / STMicro / Intel PTT roots)",
188
+ " play_integrity Google Play Integrity (fail-closed; operator pins real JWKS)",
189
+ " webauthn WebAuthn packed attestation (pinned Apple / Yubico / Microsoft)",
190
+ ].join("\n");
191
+ }
192
+ let cachedVersion;
193
+ function getPackageVersion() {
194
+ if (cachedVersion !== undefined)
195
+ return cachedVersion;
196
+ try {
197
+ const here = dirname(fileURLToPath(import.meta.url));
198
+ const pkgPath = join(here, "..", "package.json");
199
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
200
+ cachedVersion = pkg.version ?? "0.0.0";
201
+ }
202
+ catch {
203
+ cachedVersion = "0.0.0";
204
+ }
205
+ return cachedVersion;
206
+ }
207
+ async function main() {
208
+ const args = parseArgs(process.argv.slice(2));
209
+ if (args.mode === "version") {
210
+ process.stdout.write(`${getPackageVersion()}\n`);
211
+ return 0;
212
+ }
213
+ if (args.mode === "help") {
214
+ const help = renderHelp();
215
+ if (args.usageError !== undefined) {
216
+ process.stderr.write(`motebit-verify: ${args.usageError}\n\n${help}\n`);
217
+ return 2;
218
+ }
219
+ process.stdout.write(`${help}\n`);
220
+ return 0;
221
+ }
222
+ if (args.file === undefined) {
223
+ process.stderr.write(`motebit-verify: missing file argument\n\n${renderHelp()}\n`);
224
+ return 2;
225
+ }
226
+ const hardwareAttestation = buildHardwareVerifiers({
227
+ ...(args.bundleId !== undefined && { appAttestBundleId: args.bundleId }),
228
+ ...(args.androidPackage !== undefined && { playIntegrityPackageName: args.androidPackage }),
229
+ ...(args.rpId !== undefined && { webauthnRpId: args.rpId }),
230
+ });
231
+ let result;
232
+ try {
233
+ result = await verifyFile(args.file, {
234
+ ...(args.expectedType !== undefined && { expectedType: args.expectedType }),
235
+ ...(args.clockSkewSeconds !== undefined && { clockSkewSeconds: args.clockSkewSeconds }),
236
+ hardwareAttestation,
237
+ });
238
+ }
239
+ catch (err) {
240
+ const msg = err instanceof Error ? err.message : String(err);
241
+ process.stderr.write(`motebit-verify: cannot read ${args.file}: ${msg}\n`);
242
+ return 2;
243
+ }
244
+ if (args.json) {
245
+ process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
246
+ }
247
+ else {
248
+ process.stdout.write(`${formatHuman(result)}\n`);
249
+ }
250
+ return result.valid ? 0 : 1;
251
+ }
252
+ main()
253
+ .then((code) => {
254
+ process.exit(code);
255
+ })
256
+ .catch((err) => {
257
+ const msg = err instanceof Error ? err.message : String(err);
258
+ process.stderr.write(`motebit-verify: ${msg}\n`);
259
+ process.exit(2);
260
+ });
261
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,224 +1,29 @@
1
1
  /**
2
- * @motebit/verify — Standalone verifier for all Motebit artifacts.
2
+ * @motebit/verify — hardware-attestation-aware companion to
3
+ * `@motebit/verifier`.
3
4
  *
4
- * Verifies identity files, execution receipts, verifiable credentials,
5
- * and verifiable presentations. One function, any artifact, zero config.
5
+ * Bundles the four Apache-2.0 permissive-floor platform verifier leaves
6
+ * into a single `HardwareAttestationVerifiers` record + a CLI
7
+ * `motebit-verify` that hands them to `@motebit/verifier::verifyFile`.
8
+ * A credential with `hardware_attestation: { platform: "device_check" |
9
+ * "tpm" | "play_integrity" | "webauthn", ... }` verifies end-to-end
10
+ * through this package instead of returning the permissive-floor
11
+ * verifier's `adapter not yet shipped` sentinel.
6
12
  *
7
- * Zero monorepo dependencies — only @noble/ed25519 for cryptography.
13
+ * Programmatic use:
8
14
  *
9
- * Usage:
10
- * import { verify } from "@motebit/verify";
11
- *
12
- * // Identity file
13
- * const result = await verify(fs.readFileSync("motebit.md", "utf-8"));
14
- *
15
- * // Execution receipt (JSON)
16
- * const result = await verify(receiptJson);
17
- *
18
- * // Verifiable credential or presentation (JSON)
19
- * const result = await verify(credentialJson);
20
- *
21
- * // With expected type (fail-fast on misclassification)
22
- * const result = await verify(artifact, { expectedType: "receipt" });
23
- */
24
- interface MotebitIdentityFile {
25
- spec: string;
26
- motebit_id: string;
27
- created_at: string;
28
- owner_id: string;
29
- type?: "personal" | "service" | "collaborative";
30
- service_name?: string;
31
- service_description?: string;
32
- service_url?: string;
33
- capabilities?: string[];
34
- terms_url?: string;
35
- identity: {
36
- algorithm: "Ed25519";
37
- public_key: string;
38
- };
39
- governance: {
40
- trust_mode: "full" | "guarded" | "minimal";
41
- max_risk_auto: string;
42
- require_approval_above: string;
43
- deny_above: string;
44
- operator_mode: boolean;
45
- };
46
- privacy: {
47
- default_sensitivity: string;
48
- retention_days: Record<string, number>;
49
- fail_closed: boolean;
50
- };
51
- memory: {
52
- half_life_days: number;
53
- confidence_threshold: number;
54
- per_turn_limit: number;
55
- };
56
- devices: Array<{
57
- device_id: string;
58
- name: string;
59
- public_key: string;
60
- registered_at: string;
61
- }>;
62
- succession?: Array<SuccessionRecord>;
63
- }
64
- interface SuccessionRecord {
65
- old_public_key: string;
66
- new_public_key: string;
67
- timestamp: number;
68
- reason?: string;
69
- old_key_signature: string;
70
- new_key_signature: string;
71
- }
72
- interface ExecutionReceipt {
73
- task_id: string;
74
- motebit_id: string;
75
- /** Signer's Ed25519 public key (hex). Enables verification without relay lookup. */
76
- public_key?: string;
77
- device_id: string;
78
- submitted_at: number;
79
- completed_at: number;
80
- status: string;
81
- result: string;
82
- tools_used: string[];
83
- memories_formed: number;
84
- prompt_hash: string;
85
- result_hash: string;
86
- delegation_receipts?: ExecutionReceipt[];
87
- delegated_scope?: string;
88
- signature: string;
89
- }
90
- interface DataIntegrityProof {
91
- type: "DataIntegrityProof";
92
- cryptosuite: "eddsa-jcs-2022";
93
- created: string;
94
- verificationMethod: string;
95
- proofPurpose: "assertionMethod" | "authentication";
96
- proofValue: string;
97
- }
98
- interface VerifiableCredential {
99
- "@context": string[];
100
- type: string[];
101
- issuer: string;
102
- credentialSubject: Record<string, unknown> & {
103
- id: string;
104
- };
105
- validFrom: string;
106
- validUntil?: string;
107
- credentialStatus?: {
108
- id: string;
109
- type: string;
110
- };
111
- proof: DataIntegrityProof;
112
- }
113
- interface VerifiablePresentation {
114
- "@context": string[];
115
- type: string[];
116
- holder: string;
117
- verifiableCredential: VerifiableCredential[];
118
- proof: DataIntegrityProof;
119
- }
120
- interface VerificationError {
121
- message: string;
122
- path?: string;
123
- }
124
- interface BaseResult {
125
- valid: boolean;
126
- errors?: VerificationError[];
127
- }
128
- interface IdentityVerifyResult extends BaseResult {
129
- type: "identity";
130
- identity: MotebitIdentityFile | null;
131
- did?: string;
132
- /** First error message. Convenience accessor for backward compatibility. */
133
- error?: string;
134
- succession?: {
135
- valid: boolean;
136
- genesis_public_key?: string;
137
- rotations: number;
138
- error?: string;
139
- };
140
- }
141
- interface ReceiptVerifyResult extends BaseResult {
142
- type: "receipt";
143
- receipt: ExecutionReceipt | null;
144
- signer?: string;
145
- delegations?: ReceiptVerifyResult[];
146
- }
147
- interface CredentialVerifyResult extends BaseResult {
148
- type: "credential";
149
- credential: VerifiableCredential | null;
150
- issuer?: string;
151
- subject?: string;
152
- expired?: boolean;
153
- }
154
- interface PresentationVerifyResult extends BaseResult {
155
- type: "presentation";
156
- presentation: VerifiablePresentation | null;
157
- holder?: string;
158
- credentials?: CredentialVerifyResult[];
159
- }
160
- type VerifyResult = IdentityVerifyResult | ReceiptVerifyResult | CredentialVerifyResult | PresentationVerifyResult;
161
- type ArtifactType = VerifyResult["type"];
162
- interface VerifyOptions {
163
- expectedType?: ArtifactType;
164
- /** Clock skew tolerance in seconds for credential expiry checks. Default: 60. */
165
- clockSkewSeconds?: number;
166
- }
167
- /** @deprecated Use VerifyResult instead. Kept for backward compatibility. */
168
- interface LegacyVerifyResult {
169
- valid: boolean;
170
- identity: MotebitIdentityFile | null;
171
- did?: string;
172
- error?: string;
173
- succession?: {
174
- valid: boolean;
175
- genesis_public_key?: string;
176
- rotations: number;
177
- error?: string;
178
- };
179
- }
180
- /**
181
- * Parse a motebit.md file into its components.
182
- * Does not verify the signature — use `verify()` for that.
183
- */
184
- declare function parse(content: string): {
185
- frontmatter: MotebitIdentityFile;
186
- signature: string;
187
- rawFrontmatter: string;
188
- };
189
- /**
190
- * Verify any Motebit artifact: identity file, execution receipt,
191
- * verifiable credential, or verifiable presentation.
192
- *
193
- * Accepts strings (identity files, JSON) or parsed objects (receipts,
194
- * credentials, presentations). Detects the artifact type automatically.
195
- *
196
- * Use `options.expectedType` to fail fast if the artifact doesn't match
197
- * the expected type.
198
- *
199
- * @example
200
15
  * ```ts
201
- * import { verify } from "@motebit/verify";
202
- *
203
- * // Identity file (string)
204
- * const r1 = await verify(identityFileContent);
205
- * if (r1.type === "identity" && r1.valid) console.log(r1.did);
16
+ * import { verifyFile } from "@motebit/verifier";
17
+ * import { buildHardwareVerifiers } from "@motebit/verify";
206
18
  *
207
- * // Execution receipt (object or JSON string)
208
- * const r2 = await verify(receipt, { expectedType: "receipt" });
209
- * if (r2.type === "receipt" && r2.valid) console.log(r2.signer);
210
- *
211
- * // Verifiable credential
212
- * const r3 = await verify(credential);
213
- * if (r3.type === "credential" && r3.valid) console.log(r3.issuer);
19
+ * const result = await verifyFile("cred.json", {
20
+ * hardwareAttestation: buildHardwareVerifiers(),
21
+ * });
214
22
  * ```
215
- */
216
- declare function verify(artifact: unknown, options?: VerifyOptions): Promise<VerifyResult>;
217
- /**
218
- * Verify a motebit.md identity file. Backward-compatible with pre-0.4.0.
219
23
  *
220
- * @deprecated Use `verify(content)` insteadit handles all artifact types.
24
+ * CLI use: `motebit-verify <file>`same args as `motebit-verify`,
25
+ * plus hardware-attestation verification. See `cli.ts`.
221
26
  */
222
- declare function verifyIdentityFile(content: string): Promise<LegacyVerifyResult>;
223
-
224
- export { type ArtifactType, type CredentialVerifyResult, type DataIntegrityProof, type ExecutionReceipt, type IdentityVerifyResult, type LegacyVerifyResult, type MotebitIdentityFile, type PresentationVerifyResult, type ReceiptVerifyResult, type SuccessionRecord, type VerifiableCredential, type VerifiablePresentation, type VerificationError, type VerifyOptions, type VerifyResult, parse, verify, verifyIdentityFile };
27
+ export { buildHardwareVerifiers } from "./adapters.js";
28
+ export type { HardwareVerifierBundleConfig } from "./adapters.js";
29
+ //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,YAAY,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC"}