@motebit/crypto
v3.19.1
Published
Sign and verify every Motebit artifact — identity files, execution receipts, credentials, delegations, succession records, credential anchors. Ed25519 today, cryptosuite-agile for post-quantum tomorrow. Apache-2.0, zero monorepo dependencies.
Maintainers
Readme
@motebit/crypto
Protocol cryptography for Motebit — sign and verify all artifacts.
Receipts, credentials, delegations, successions, presentations. Zero runtime dependencies. Apache-2.0 licensed (with explicit patent grant).
Install
npm install @motebit/cryptoVerify
import fs from "node:fs";
import { verify } from "@motebit/crypto";
// Identity file
const r1 = await verify(fs.readFileSync("motebit.md", "utf-8"));
if (r1.type === "identity" && r1.valid) {
console.log(r1.did); // did:key:z...
}
// Execution receipt (object or JSON string)
const receipt = JSON.parse(fs.readFileSync("receipt.json", "utf-8"));
const r2 = await verify(receipt);
if (r2.type === "receipt" && r2.valid) {
console.log(r2.signer); // did:key of the signing agent
}
// Verifiable credential
const credential = JSON.parse(fs.readFileSync("credential.json", "utf-8"));
const r3 = await verify(credential);
if (r3.type === "credential" && r3.valid) {
console.log(r3.issuer); // did:key of the issuer
}Sign
import { signExecutionReceipt, generateKeypair } from "@motebit/crypto";
const { publicKey, privateKey } = await generateKeypair();
const signed = await signExecutionReceipt(receipt, privateKey, publicKey);
// signed.signature is base64url Ed25519 over canonical JSONimport { signDelegation } from "@motebit/crypto";
const token = await signDelegation(
{
delegator_id,
delegator_public_key,
delegate_id,
delegate_public_key,
scope,
issued_at,
expires_at,
},
delegatorPrivateKey,
);import { issueReputationCredential } from "@motebit/crypto";
const vc = await issueReputationCredential(
{
success_rate: 0.95,
avg_latency_ms: 120,
task_count: 50,
trust_score: 0.8,
availability: 0.99,
measured_at: Date.now(),
},
privateKey,
publicKey,
subjectDid,
);API
Verification
verify(artifact, options?)— Verify any artifact. Detects type automatically. Returns discriminated union.parse(content)— Parse amotebit.mdwithout verifying.verifyReceiptVerdict(receipt)— StructuredVerificationVerdictfor a signed receipt: independent axes (integrity, identityBinding, authority, revocation, temporalBasis, evidenceBasis) + a first-classrepair, with no top-levelvalidboolean to over-read. Seedocs/doctrine/verify-family-fail-closed.md.verifyDelegationTokenVerdict(token, grant, options?)— StructuredVerificationVerdictfor a per-tick token against its standing grant. Keepsauthorityandrevocationorthogonal (a revoked grant readsauthority: "valid"+revocation: "revoked");temporalMode: "wall_clock" | "ordering"selectstemporalBasis(local_clockvsclockless) so a clock-rollback is load-bearing in one and irrelevant in the other.isFullyVerified(verdict)— Fail-closed collapse of a verdict to a boolean:trueonly when every load-bearing axis passes (integrity verified, identity bound, authority valid, revocation fresh). Stricter than the legacy per-function booleans by design.verifyEvalAttestation(attestation)— Verify the envelope of a signed third-party-measurement artifact (EvalAttestation, subject ≠ signer): pinnedEVAL_ATTESTATION_SUITE, closed-registryeval_kindintake (mirrored locally asEVAL_KINDS_MIRROR— crypto keeps zero runtime monorepo deps; locked to the protocol registry bycheck-eval-kind-canonical), non-empty results, issuer-key shape, and the signature over canonical bytes. Establishes "this issuer said this about this subject" — deliberately never measurement truth, issuer authority, key→id binding, or freshness. Seespec/eval-attestation-v1.md.signRoutingTranscript(body, delegatorPrivateKey)/verifyRoutingTranscript(transcript)— Sign and verify the routing-decision transcript (RoutingDecisionTranscript, subject = signer — receipt-family: the delegator's own record of why a worker won a paid hire). The verify law is the INTEGRITY rung: pinnedROUTING_TRANSCRIPT_SUITE, spec discriminator (mirrored locally asROUTING_TRANSCRIPT_SPEC_MIRROR), non-empty frozen candidate set, winner-membership, key/signature shape, signature over canonical bytes — deliberately never decision faithfulness (the recomputation rung in@motebit/semiring), input truth, or key→id binding. Seespec/routing-transcript-v1.md.verifyEvidenceProvenance(bytes, provenance, { resolveProjection? })— Re-verify a verdict's evidence down to the primary record: the namedspanis an exact substring ofprojection(bytes), where the bytes content-address todigest. Re-verifiable PRESENCE, never truth, no oracle. The projection is an injected seam (domain-blind — absent ⇒ raw bytes; present + no resolver ⇒ fails closed). Seedocs/doctrine/evidence-provenance.md.
Signing
signEvalAttestation(body, issuerPrivateKey)— Sign an eval attestation with the issuer's identity key (JCS + Ed25519 + base64url under the pinned suite). The body carriesissuer.public_keyself-describingly; each result embeds a whole per-axisVerificationVerdict.signExecutionReceipt(receipt, privateKey, publicKey?)— Sign a receipt with Ed25519.signSovereignPaymentReceipt(input, privateKey, publicKey)— Sign a sovereign onchain payment receipt.signDelegation(delegation, delegatorPrivateKey)— Sign a delegation token.signKeySuccession(oldPrivateKey, newPrivateKey, newPublicKey, oldPublicKey)— Sign a key rotation.signCollaborativeReceipt(receipt, initiatorPrivateKey)— Sign a collaborative receipt.signVerifiableCredential(vc, privateKey, publicKey)— Sign a W3C VC (eddsa-jcs-2022).signVerifiablePresentation(vp, privateKey, publicKey)— Sign a W3C VP.
Remote Command Envelopes ([email protected])
signAgentCommandEnvelope(opts)— Sign a remote command targeting an agent: the agent's own identity signs, audience-bound toagentCommandAudience(motebitId)(agent-command/{motebit_id}), digest-bound toagentCommandPayload(command, args).verifyAgentCommandEnvelope(opts)— Fail-closed verification consumers run before executing a relay-forwardedcommand_request; returns anAgentCommandVerdictwith an honest rejection reason (missing envelope, foreign identity, bad signature, stale timestamp, audience mismatch, payload tamper).agentCommandAudience(motebitId)/agentCommandPayload(command, args?)— the shared audience + canonical-payload convention both sides bind to.
Credential Issuance
issueGradientCredential(snapshot, privateKey, publicKey)— Issue an intelligence gradient VC.issueReputationCredential(snapshot, privateKey, publicKey, subjectDid)— Issue a reputation VC.issueTrustCredential(trustRecord, privateKey, publicKey, subjectDid)— Issue a trust VC.createPresentation(credentials, privateKey, publicKey)— Bundle VCs into a signed VP.
Chain Verification
verifyReceiptChain(receipt, knownKeys)— Recursively verify a delegation receipt tree.verifyReceiptSequence(chain)— Verify a flat sequence of receipts.verifyDelegation(delegation, options?)— Verify a delegation token signature.verifyDelegationChain(chain)— Verify a chain of delegations with scope narrowing.verifyKeySuccession(record, guardianPublicKeyHex?)— Verify a key rotation record.verifySuccessionChain(chain, guardianPublicKeyHex?)— Verify a full key rotation chain.verifyKeyBindingAtTime(identity, signingKeyHex, atTimestampMs, guardianPublicKeyHex?)— Sovereign-root identity binding with time-windowing: was this key the motebit's legitimate key at a given time? Verifies the succession chain, then checks the key's active window. ReturnsKeyBindingResult.identityLogLeaf(motebitId, currentKeyHex)— Canonical SHA-256 leaf of the identity-transparency log (the operator'smotebit_id → current keycommitment). Shared convention for the relay producer and the verifier.verifyIdentityBindingAnchored(identity, signingKeyHex, atTimestampMs, proof, guardianPublicKeyHex?)— Anchored binding: sovereign-root binding AND Merkle inclusion of the current key in the transparency log underproof.anchoredRoot. Confirming the root is on-chain is the caller's cross-check.deriveSovereignMotebitId(genesisPublicKeyHex)— The sovereign commitment of a genesis key: a deterministic UUIDv8 fromsha256(genesisKey). A sovereign-minted motebit'smotebit_idIS this value, so the id↔key binding is self-certifying (offline, no operator). Second-preimage resistance ~2^122.verifySovereignBinding(motebitId, genesisPublicKeyHex)— True iffmotebitIdis the sovereign commitment to the genesis key.verifyKeyBindingAtTimesetssovereign: trueon its result when this holds.verifyMigratingKeyBinding(motebitId, presentedKeyHex, identityFile?)— DoespresentedKeyHexlegitimately controlmotebitIdright now? The migration key↔id check (spec/migration-v1.md§8.2 step 6), fail-closed: a never-rotated sovereign id binds its key directly; a rotated key binds via the identity file's sovereign-rooted succession chain. ComposesverifySovereignBindingandverifyKeyBindingAtTime.
Settlement anchoring
verifyAgentSettlementAnchor(record, proof, chainVerifier?)— Worker-side self-verification of a per-agent settlement Merkle inclusion proof (spec/agent-settlement-anchor-v1.md): the heldSettlementRecordhashes to the anchored leaf, the Merkle path reconstructs to the root, and the relay's batch signature (suiteAGENT_SETTLEMENT_ANCHOR_SUITE) checks out — all offline, with only the record, the proof, and the relay's public key. SCITT / RFC 6962 shape. The optionalchainVerifieradds the onchain non-repudiation cross-check.computeAgentSettlementLeaf(record)— The leaf hash for aSettlementRecord:SHA-256(canonicalJson(record))over the whole signed object (never a field projection), so producer and holder derive the identical leaf from the bytes they each hold.verifyFederationSettlementAnchor(record, proof, chainVerifier?)— Peer-side self-verification of an inter-relay settlement Merkle inclusion proof (spec/relay-federation-v1.md§7.6): the heldFederationSettlementRecordhashes to the anchored leaf, the Merkle path reconstructs to the root, and the relay's batch signature (suiteFEDERATION_SETTLEMENT_ANCHOR_SUITE) checks out — all offline, with only the record, the proof, and the relay's public key. The federation analogue ofverifyAgentSettlementAnchor; same SCITT / RFC 6962 shape. The optionalchainVerifieradds the onchain non-repudiation cross-check.computeFederationSettlementLeaf(record)— The leaf hash for aFederationSettlementRecord:SHA-256(canonicalJson(record))over the whole signed object (never a field projection), so producer and holder derive the identical leaf from the bytes they each hold.
Hardware attestation
verifyHardwareAttestationClaim(claim, expectedIdentityPublicKeyHex, verifiers?, deviceCheckContext?)— Verify aHardwareAttestationClaim: a platform trust anchor's hardware-backed key signs a canonical body binding itself to the motebit's Ed25519 identity key (deviceCheckContextsupplies the fields an injected App Attest verifier re-derives that body from).secure_enclave(Apple Secure Enclave, ECDSA P-256) verifies natively; the hardware platforms with published leaf packages dispatch to a verifier injected at the call site —@motebit/crypto-appattest(device_check),@motebit/crypto-android-keystore,@motebit/crypto-tpm,@motebit/crypto-webauthn. This package never imports a platform adapter — theHardwareAttestationVerifiersinjection keeps dispatch explicit, auditable, and tree-shakable, and a claim whose platform has no verifier wired fails closed with a named-missing-adapter error. Hardware attestation is additive scoring on top of the software identity floor, never an admission gate. Seedocs/doctrine/hardware-attestation.md.
Primitives
generateKeypair()— Generate an Ed25519 keypair.ed25519Sign(message, privateKey)— Raw Ed25519 sign.ed25519Verify(signature, message, publicKey)— Raw Ed25519 verify.canonicalJson(obj)— Deterministic JSON serialization (JCS/RFC 8785).hash(data)— SHA-256 hex string. Async; takes raw bytes (Uint8Array), never a string — for objects, usecanonicalSha256.canonicalSha256(obj)— Hex SHA-256 of the UTF-8 bytes ofcanonicalJson(obj). The canonical object-hashing path.hashLeaf(entry, treeHashVersion?)— Merkle leaf hash under aMerkleTreeVersion:SHA-256(entry)formerkle-sha256-plain-v1(default),SHA-256(0x00 ‖ entry)for the RFC 6962 §2.1merkle-sha256-rfc6962-v2leaf tag. The single dispatch point every leaf builder routes through; throws on an unimplemented version.canonicalLeaf(value, treeHashVersion?)— JCS-canonicalizevaluethenhashLeafit.canonicalLeaf(x)(v1 default) is byte-identical tocanonicalSha256(x).resolveTreeHashVersion(raw)— Verifier-boundary resolver for a proof's wiretree_hash_version:absent ⇒ merkle-sha256-plain-v1, a known value to itself, an unknown string tonullso the caller rejects fail-closed (never silent-downgrade). Seedocs/doctrine/merkle-tree-hash-versioning.md.createSignedToken(payload, privateKey)— Create a signed auth token.verifySignedToken(token, publicKey)— Verify a signed auth token.publicKeyToDidKey(publicKey)/didKeyToPublicKey(did)— did:key conversion.
Cryptosuite dispatch (@motebit/crypto/suite-dispatch)
The published ./suite-dispatch subpath is the cryptosuite-agility entry point: verifyBySuite / signBySuite map a wire artifact's suite value — a complete verification recipe (algorithm + canonicalization + encoding) — to the underlying primitive, fail-closed on missing or unknown suites. Every verifier in this package routes through it; a new suite (post-quantum ML-DSA / SLH-DSA) is a registry addition plus a dispatch arm, never a wire-format break.
What can it do?
| Operation | Artifacts | Format | | --------- | ------------------------------------------------------------------------------------------ | --------------------------- | | Sign | Receipts, delegations, credentials, presentations, successions, payment receipts | Ed25519 over canonical JSON | | Verify | Identity files, receipts, credentials, presentations, delegation chains, succession chains | Offline — no network calls | | Issue | Gradient, reputation, and trust credentials | W3C VC 2.0, eddsa-jcs-2022 |
All operations are offline — no network calls, no relay lookup, no runtime dependency. Everything needed for signing and verification is in the artifact itself.
Related
@motebit/verifier— library that wrapsverify()for third-party offline verification@motebit/verify— themotebit-verifyCLI, with every hardware-attestation platform verifier bundled@motebit/crypto-appattest— iOS App Attest chain verifier (hardware-attestation leaf)@motebit/crypto-android-keystore— Android Hardware-Backed Keystore Attestation verifier (hardware-attestation leaf)@motebit/crypto-tpm— Windows / Linux TPM 2.0 EK chain verifier (hardware-attestation leaf)@motebit/crypto-webauthn— WebAuthn platform-authenticator attestation verifier (hardware-attestation leaf)@motebit/protocol— wire-format types for the artifacts this package signs and verifies@motebit/sdk— developer contract for building Motebit-powered agentscreate-motebit— scaffold a signed agent identitymotebit— reference runtime and operator console- Motebit docs — guides and reference for the whole protocol surface
License
Apache-2.0 — see LICENSE.
"Motebit" is a trademark. The Apache License grants rights to this software, not to any Motebit trademarks, logos, or branding. You may not use Motebit branding in a way that suggests endorsement or affiliation without written permission.
