@quantakrypto/sieve 0.5.0 → 0.7.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/protocol.d.ts.map +1 -1
- package/dist/protocol.js +7 -1
- package/dist/protocol.js.map +1 -1
- package/package.json +1 -1
package/dist/protocol.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
|
package/dist/protocol.js
CHANGED
|
@@ -107,7 +107,13 @@ export function toB64(bytes) {
|
|
|
107
107
|
export function fromB64(b64) {
|
|
108
108
|
const buf = Buffer.from(b64, "base64");
|
|
109
109
|
// Buffer.from is lenient; sanity-check by re-encoding the canonical form.
|
|
110
|
-
|
|
110
|
+
const trimEq = (x) => {
|
|
111
|
+
let n = x.length;
|
|
112
|
+
while (n > 0 && x[n - 1] === "=")
|
|
113
|
+
n--;
|
|
114
|
+
return x.slice(0, n);
|
|
115
|
+
};
|
|
116
|
+
if (trimEq(buf.toString("base64")) !== trimEq(b64.replace(/\s/g, ""))) {
|
|
111
117
|
throw new ProtocolError("invalid base64", b64);
|
|
112
118
|
}
|
|
113
119
|
return new Uint8Array(buf);
|
package/dist/protocol.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The Sieve <-> SUT wire protocol.\n *\n * Sieve drives a system-under-test (SUT) — any ML-KEM / ML-DSA implementation\n * the user provides — by spawning it as a child process and exchanging\n * newline-delimited JSON (NDJSON) over stdin/stdout. One request per line, one\n * response per line. All byte fields are base64-encoded strings.\n *\n * This module defines the request/response TypeScript types and the\n * (de)serialization + validation logic. It performs NO cryptography. See\n * PROTOCOL.md for the human-readable specification.\n */\n\nimport type { Family, ParamSet } from \"./sizes.js\";\n\n/** Protocol version. Bumped on any breaking wire change. */\nexport const PROTOCOL_VERSION = 1 as const;\n\n// ---------------------------------------------------------------------------\n// Request types\n// ---------------------------------------------------------------------------\n\n/** Operation names, shared across families where the semantics overlap. */\ntype Op = \"keygen\" | \"encaps\" | \"decaps\" | \"sign\" | \"verify\";\n\n/** Families that support the signature operations (sign / verify). */\nexport type SignatureFamily = \"ml-dsa\" | \"slh-dsa\";\n\n/** Fields common to every request. */\ninterface RequestBase {\n /** Correlation id; the SUT MUST echo it back on the matching response. */\n id: number;\n /** Algorithm family this request targets. */\n family: Family;\n /** Parameter-set identifier, e.g. \"ml-kem-768\". */\n param: ParamSet;\n /** Operation to perform. */\n op: Op;\n}\n\n/** ML-KEM / ML-DSA key generation. `seed` (base64) makes it deterministic. */\ninterface KeygenRequest extends RequestBase {\n op: \"keygen\";\n /** Optional base64 seed for deterministic keygen (impl-defined length). */\n seed?: string;\n}\n\n/** ML-KEM encapsulation against a public key. */\ninterface EncapsRequest extends RequestBase {\n family: \"ml-kem\";\n op: \"encaps\";\n /** Base64 public (encapsulation) key. */\n pk: string;\n /** Optional base64 coins/randomness for deterministic encapsulation. */\n coins?: string;\n}\n\n/** ML-KEM decapsulation of a ciphertext with a secret key. */\ninterface DecapsRequest extends RequestBase {\n family: \"ml-kem\";\n op: \"decaps\";\n /** Base64 secret (decapsulation) key. */\n sk: string;\n /** Base64 ciphertext. */\n ct: string;\n}\n\n/** ML-DSA / SLH-DSA signature generation. */\ninterface SignRequest extends RequestBase {\n family: SignatureFamily;\n op: \"sign\";\n /** Base64 secret (signing) key. */\n sk: string;\n /** Base64 message to sign. */\n msg: string;\n}\n\n/** ML-DSA / SLH-DSA signature verification. */\ninterface VerifyRequest extends RequestBase {\n family: SignatureFamily;\n op: \"verify\";\n /** Base64 public (verification) key. */\n pk: string;\n /** Base64 message. */\n msg: string;\n /** Base64 signature. */\n sig: string;\n}\n\n/** Any request Sieve may send. */\nexport type Request = KeygenRequest | EncapsRequest | DecapsRequest | SignRequest | VerifyRequest;\n\n/**\n * Omit that distributes over a union, so each variant keeps its own fields\n * (plain `Omit<Request, \"id\">` would collapse to only the common keys).\n */\ntype DistributiveOmit<T, K extends keyof T> = T extends unknown ? Omit<T, K> : never;\n\n/** A request as handed to the runner — the `id` is assigned by the runner. */\nexport type RequestInput = DistributiveOmit<Request, \"id\"> & { id?: number };\n\n// ---------------------------------------------------------------------------\n// Response types\n// ---------------------------------------------------------------------------\n\n/** Successful keygen result. */\ninterface KeygenResult {\n id: number;\n ok: true;\n /** Base64 public key. */\n pk: string;\n /** Base64 secret key. */\n sk: string;\n}\n\n/** Successful encapsulation result. */\ninterface EncapsResult {\n id: number;\n ok: true;\n /** Base64 ciphertext. */\n ct: string;\n /** Base64 shared secret. */\n ss: string;\n}\n\n/** Successful decapsulation result. */\ninterface DecapsResult {\n id: number;\n ok: true;\n /** Base64 shared secret. */\n ss: string;\n}\n\n/** Successful signing result. */\ninterface SignResult {\n id: number;\n ok: true;\n /** Base64 signature. */\n sig: string;\n}\n\n/** Successful verification result. `valid` is the verification verdict. */\nexport interface VerifyResult {\n id: number;\n ok: true;\n /** Whether the signature verified against (pk, msg). */\n valid: boolean;\n}\n\n/**\n * A defined, well-formed error. The SUT MUST return this (not crash, not hang,\n * not silently produce garbage) when it cannot or will not honor a request —\n * for example when given a wrong-length key. Sieve treats a clean `error`\n * response as a *correct* rejection in the size/robustness categories.\n */\ninterface ErrorResult {\n id: number;\n ok: false;\n /** Short machine-readable code, e.g. \"invalid-length\", \"unsupported\". */\n code: string;\n /** Human-readable detail. */\n message: string;\n}\n\n/** Any response the SUT may emit. */\nexport type Response =\n | KeygenResult\n | EncapsResult\n | DecapsResult\n | SignResult\n | VerifyResult\n | ErrorResult;\n\n// ---------------------------------------------------------------------------\n// Serialization\n// ---------------------------------------------------------------------------\n\n/** Serialize a request to a single NDJSON line (including the trailing \"\\n\"). */\nexport function encodeRequest(req: Request): string {\n return JSON.stringify(req) + \"\\n\";\n}\n\n/** Raised when a line from the SUT cannot be parsed into a valid Response. */\nexport class ProtocolError extends Error {\n /** The offending raw line, truncated for safety. */\n readonly raw: string;\n constructor(message: string, raw: string) {\n super(message);\n this.name = \"ProtocolError\";\n this.raw = raw.length > 512 ? raw.slice(0, 512) + \"…\" : raw;\n }\n}\n\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\nfunction isStr(v: unknown): v is string {\n return typeof v === \"string\";\n}\n\n/**\n * Parse one NDJSON line from the SUT into a validated {@link Response}.\n *\n * Validates structural shape only (presence and types of fields); it does NOT\n * validate cryptographic content or byte lengths — that is the categories'\n * job. Throws {@link ProtocolError} on malformed input.\n */\nexport function decodeResponse(line: string): Response {\n const trimmed = line.trim();\n if (trimmed.length === 0) {\n throw new ProtocolError(\"empty line\", line);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed);\n } catch (err) {\n throw new ProtocolError(`not valid JSON: ${(err as Error).message}`, line);\n }\n\n if (!isObject(parsed)) {\n throw new ProtocolError(\"response is not a JSON object\", line);\n }\n\n const id = parsed[\"id\"];\n if (typeof id !== \"number\" || !Number.isInteger(id)) {\n throw new ProtocolError(\"missing/invalid integer 'id'\", line);\n }\n\n const ok = parsed[\"ok\"];\n if (typeof ok !== \"boolean\") {\n throw new ProtocolError(\"missing/invalid boolean 'ok'\", line);\n }\n\n if (ok === false) {\n const code = parsed[\"code\"];\n const message = parsed[\"message\"];\n if (!isStr(code) || !isStr(message)) {\n throw new ProtocolError(\"error response must have string 'code' and 'message'\", line);\n }\n return { id, ok: false, code, message };\n }\n\n // ok === true: discriminate by which payload fields are present.\n if (isStr(parsed[\"pk\"]) && isStr(parsed[\"sk\"])) {\n return { id, ok: true, pk: parsed[\"pk\"], sk: parsed[\"sk\"] };\n }\n if (isStr(parsed[\"ct\"]) && isStr(parsed[\"ss\"])) {\n return { id, ok: true, ct: parsed[\"ct\"], ss: parsed[\"ss\"] };\n }\n if (isStr(parsed[\"ss\"])) {\n return { id, ok: true, ss: parsed[\"ss\"] };\n }\n if (isStr(parsed[\"sig\"])) {\n return { id, ok: true, sig: parsed[\"sig\"] };\n }\n if (typeof parsed[\"valid\"] === \"boolean\") {\n return { id, ok: true, valid: parsed[\"valid\"] };\n }\n\n throw new ProtocolError(\n \"ok response has no recognizable payload \" + \"(expected pk+sk, ct+ss, ss, sig, or valid)\",\n line,\n );\n}\n\n// ---------------------------------------------------------------------------\n// Base64 helpers (Node built-in Buffer — no external dependency)\n// ---------------------------------------------------------------------------\n\n/** Encode raw bytes to a base64 string. */\nexport function toB64(bytes: Uint8Array): string {\n return Buffer.from(bytes).toString(\"base64\");\n}\n\n/**\n * Decode a base64 string to bytes.\n *\n * @throws {ProtocolError} if the input is not valid base64 (i.e. re-encoding\n * the decoded bytes does not reproduce the canonical form).\n */\nexport function fromB64(b64: string): Uint8Array {\n const buf = Buffer.from(b64, \"base64\");\n // Buffer.from is lenient; sanity-check by re-encoding the canonical form.\n if (buf.toString(\"base64\").replace(/=+$/, \"\") !== b64.replace(/\\s/g, \"\").replace(/=+$/, \"\")) {\n throw new ProtocolError(\"invalid base64\", b64);\n }\n return new Uint8Array(buf);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The Sieve <-> SUT wire protocol.\n *\n * Sieve drives a system-under-test (SUT) — any ML-KEM / ML-DSA implementation\n * the user provides — by spawning it as a child process and exchanging\n * newline-delimited JSON (NDJSON) over stdin/stdout. One request per line, one\n * response per line. All byte fields are base64-encoded strings.\n *\n * This module defines the request/response TypeScript types and the\n * (de)serialization + validation logic. It performs NO cryptography. See\n * PROTOCOL.md for the human-readable specification.\n */\n\nimport type { Family, ParamSet } from \"./sizes.js\";\n\n/** Protocol version. Bumped on any breaking wire change. */\nexport const PROTOCOL_VERSION = 1 as const;\n\n// ---------------------------------------------------------------------------\n// Request types\n// ---------------------------------------------------------------------------\n\n/** Operation names, shared across families where the semantics overlap. */\ntype Op = \"keygen\" | \"encaps\" | \"decaps\" | \"sign\" | \"verify\";\n\n/** Families that support the signature operations (sign / verify). */\nexport type SignatureFamily = \"ml-dsa\" | \"slh-dsa\";\n\n/** Fields common to every request. */\ninterface RequestBase {\n /** Correlation id; the SUT MUST echo it back on the matching response. */\n id: number;\n /** Algorithm family this request targets. */\n family: Family;\n /** Parameter-set identifier, e.g. \"ml-kem-768\". */\n param: ParamSet;\n /** Operation to perform. */\n op: Op;\n}\n\n/** ML-KEM / ML-DSA key generation. `seed` (base64) makes it deterministic. */\ninterface KeygenRequest extends RequestBase {\n op: \"keygen\";\n /** Optional base64 seed for deterministic keygen (impl-defined length). */\n seed?: string;\n}\n\n/** ML-KEM encapsulation against a public key. */\ninterface EncapsRequest extends RequestBase {\n family: \"ml-kem\";\n op: \"encaps\";\n /** Base64 public (encapsulation) key. */\n pk: string;\n /** Optional base64 coins/randomness for deterministic encapsulation. */\n coins?: string;\n}\n\n/** ML-KEM decapsulation of a ciphertext with a secret key. */\ninterface DecapsRequest extends RequestBase {\n family: \"ml-kem\";\n op: \"decaps\";\n /** Base64 secret (decapsulation) key. */\n sk: string;\n /** Base64 ciphertext. */\n ct: string;\n}\n\n/** ML-DSA / SLH-DSA signature generation. */\ninterface SignRequest extends RequestBase {\n family: SignatureFamily;\n op: \"sign\";\n /** Base64 secret (signing) key. */\n sk: string;\n /** Base64 message to sign. */\n msg: string;\n}\n\n/** ML-DSA / SLH-DSA signature verification. */\ninterface VerifyRequest extends RequestBase {\n family: SignatureFamily;\n op: \"verify\";\n /** Base64 public (verification) key. */\n pk: string;\n /** Base64 message. */\n msg: string;\n /** Base64 signature. */\n sig: string;\n}\n\n/** Any request Sieve may send. */\nexport type Request = KeygenRequest | EncapsRequest | DecapsRequest | SignRequest | VerifyRequest;\n\n/**\n * Omit that distributes over a union, so each variant keeps its own fields\n * (plain `Omit<Request, \"id\">` would collapse to only the common keys).\n */\ntype DistributiveOmit<T, K extends keyof T> = T extends unknown ? Omit<T, K> : never;\n\n/** A request as handed to the runner — the `id` is assigned by the runner. */\nexport type RequestInput = DistributiveOmit<Request, \"id\"> & { id?: number };\n\n// ---------------------------------------------------------------------------\n// Response types\n// ---------------------------------------------------------------------------\n\n/** Successful keygen result. */\ninterface KeygenResult {\n id: number;\n ok: true;\n /** Base64 public key. */\n pk: string;\n /** Base64 secret key. */\n sk: string;\n}\n\n/** Successful encapsulation result. */\ninterface EncapsResult {\n id: number;\n ok: true;\n /** Base64 ciphertext. */\n ct: string;\n /** Base64 shared secret. */\n ss: string;\n}\n\n/** Successful decapsulation result. */\ninterface DecapsResult {\n id: number;\n ok: true;\n /** Base64 shared secret. */\n ss: string;\n}\n\n/** Successful signing result. */\ninterface SignResult {\n id: number;\n ok: true;\n /** Base64 signature. */\n sig: string;\n}\n\n/** Successful verification result. `valid` is the verification verdict. */\nexport interface VerifyResult {\n id: number;\n ok: true;\n /** Whether the signature verified against (pk, msg). */\n valid: boolean;\n}\n\n/**\n * A defined, well-formed error. The SUT MUST return this (not crash, not hang,\n * not silently produce garbage) when it cannot or will not honor a request —\n * for example when given a wrong-length key. Sieve treats a clean `error`\n * response as a *correct* rejection in the size/robustness categories.\n */\ninterface ErrorResult {\n id: number;\n ok: false;\n /** Short machine-readable code, e.g. \"invalid-length\", \"unsupported\". */\n code: string;\n /** Human-readable detail. */\n message: string;\n}\n\n/** Any response the SUT may emit. */\nexport type Response =\n | KeygenResult\n | EncapsResult\n | DecapsResult\n | SignResult\n | VerifyResult\n | ErrorResult;\n\n// ---------------------------------------------------------------------------\n// Serialization\n// ---------------------------------------------------------------------------\n\n/** Serialize a request to a single NDJSON line (including the trailing \"\\n\"). */\nexport function encodeRequest(req: Request): string {\n return JSON.stringify(req) + \"\\n\";\n}\n\n/** Raised when a line from the SUT cannot be parsed into a valid Response. */\nexport class ProtocolError extends Error {\n /** The offending raw line, truncated for safety. */\n readonly raw: string;\n constructor(message: string, raw: string) {\n super(message);\n this.name = \"ProtocolError\";\n this.raw = raw.length > 512 ? raw.slice(0, 512) + \"…\" : raw;\n }\n}\n\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\nfunction isStr(v: unknown): v is string {\n return typeof v === \"string\";\n}\n\n/**\n * Parse one NDJSON line from the SUT into a validated {@link Response}.\n *\n * Validates structural shape only (presence and types of fields); it does NOT\n * validate cryptographic content or byte lengths — that is the categories'\n * job. Throws {@link ProtocolError} on malformed input.\n */\nexport function decodeResponse(line: string): Response {\n const trimmed = line.trim();\n if (trimmed.length === 0) {\n throw new ProtocolError(\"empty line\", line);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed);\n } catch (err) {\n throw new ProtocolError(`not valid JSON: ${(err as Error).message}`, line);\n }\n\n if (!isObject(parsed)) {\n throw new ProtocolError(\"response is not a JSON object\", line);\n }\n\n const id = parsed[\"id\"];\n if (typeof id !== \"number\" || !Number.isInteger(id)) {\n throw new ProtocolError(\"missing/invalid integer 'id'\", line);\n }\n\n const ok = parsed[\"ok\"];\n if (typeof ok !== \"boolean\") {\n throw new ProtocolError(\"missing/invalid boolean 'ok'\", line);\n }\n\n if (ok === false) {\n const code = parsed[\"code\"];\n const message = parsed[\"message\"];\n if (!isStr(code) || !isStr(message)) {\n throw new ProtocolError(\"error response must have string 'code' and 'message'\", line);\n }\n return { id, ok: false, code, message };\n }\n\n // ok === true: discriminate by which payload fields are present.\n if (isStr(parsed[\"pk\"]) && isStr(parsed[\"sk\"])) {\n return { id, ok: true, pk: parsed[\"pk\"], sk: parsed[\"sk\"] };\n }\n if (isStr(parsed[\"ct\"]) && isStr(parsed[\"ss\"])) {\n return { id, ok: true, ct: parsed[\"ct\"], ss: parsed[\"ss\"] };\n }\n if (isStr(parsed[\"ss\"])) {\n return { id, ok: true, ss: parsed[\"ss\"] };\n }\n if (isStr(parsed[\"sig\"])) {\n return { id, ok: true, sig: parsed[\"sig\"] };\n }\n if (typeof parsed[\"valid\"] === \"boolean\") {\n return { id, ok: true, valid: parsed[\"valid\"] };\n }\n\n throw new ProtocolError(\n \"ok response has no recognizable payload \" + \"(expected pk+sk, ct+ss, ss, sig, or valid)\",\n line,\n );\n}\n\n// ---------------------------------------------------------------------------\n// Base64 helpers (Node built-in Buffer — no external dependency)\n// ---------------------------------------------------------------------------\n\n/** Encode raw bytes to a base64 string. */\nexport function toB64(bytes: Uint8Array): string {\n return Buffer.from(bytes).toString(\"base64\");\n}\n\n/**\n * Decode a base64 string to bytes.\n *\n * @throws {ProtocolError} if the input is not valid base64 (i.e. re-encoding\n * the decoded bytes does not reproduce the canonical form).\n */\nexport function fromB64(b64: string): Uint8Array {\n const buf = Buffer.from(b64, \"base64\");\n // Buffer.from is lenient; sanity-check by re-encoding the canonical form.\n const trimEq = (x: string): string => {\n let n = x.length;\n while (n > 0 && x[n - 1] === \"=\") n--;\n return x.slice(0, n);\n };\n if (trimEq(buf.toString(\"base64\")) !== trimEq(b64.replace(/\\s/g, \"\"))) {\n throw new ProtocolError(\"invalid base64\", b64);\n }\n return new Uint8Array(buf);\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@quantakrypto/sieve",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "Sieve — conformance battery for ML-KEM / ML-DSA implementations. Drives any implementation over a simple stdin/stdout JSON protocol. Zero runtime dependencies.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Dandelion Labs <hello@dandelionlabs.io> (https://dandelionlabs.io)",
|