🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

@quantakrypto/qprobe

Package Overview
Dependencies
Maintainers
1
Versions
6
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@quantakrypto/qprobe - npm Package Compare versions

Comparing version
0.5.0
to
0.6.0
+1
-1
dist/mlkem768.d.ts.map

@@ -1,1 +0,1 @@

{"version":3,"file":"mlkem768.d.ts","sourceRoot":"","sources":["../src/mlkem768.ts"],"names":[],"mappings":"AAiBA,eAAO,MAAM,QAAQ,OAAO,CAAC;AAG7B,iFAAiF;AACjF,eAAO,MAAM,mBAAmB,QAAe,CAAC;AAEhD,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAW9D;AAED,iEAAiE;AACjE,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAQpD;AAcD;;;;;GAKG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAK7C"}
{"version":3,"file":"mlkem768.d.ts","sourceRoot":"","sources":["../src/mlkem768.ts"],"names":[],"mappings":"AAiBA,eAAO,MAAM,QAAQ,OAAO,CAAC;AAG7B,iFAAiF;AACjF,eAAO,MAAM,mBAAmB,QAAe,CAAC;AAEhD,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAW9D;AAED,iEAAiE;AACjE,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAQpD;AA0BD;;;;;GAKG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAK7C"}

@@ -47,10 +47,22 @@ /**

}
/** A random polynomial with all coefficients in [0, q) (throwaway, not uniform). */
/** A random polynomial with all coefficients uniform in [0, q) (throwaway probe key). */
function randomInRangePoly() {
const raw = randomBytes(N * 2);
// Rejection sampling from 16-bit draws to avoid modulo bias. The key is a
// throwaway (never used for real security), but a security tool should not
// ship biased "randomness" even here.
const MAX = Math.floor(0x10000 / ML_KEM_Q) * ML_KEM_Q;
const poly = new Array(N);
let pool = randomBytes(N * 4);
let off = 0;
for (let i = 0; i < N; i++) {
// 16-bit sample reduced mod q — biased but always in [0, q), which is all the
// server's modulus check requires. This is a throwaway key.
poly[i] = raw.readUInt16BE(i * 2) % ML_KEM_Q;
let v;
do {
if (off + 2 > pool.length) {
pool = randomBytes(N * 4);
off = 0;
}
v = pool.readUInt16BE(off);
off += 2;
} while (v >= MAX);
poly[i] = v % ML_KEM_Q;
}

@@ -57,0 +69,0 @@ return poly;

@@ -1,1 +0,1 @@

{"version":3,"file":"mlkem768.js","sourceRoot":"","sources":["../src/mlkem768.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Minimal ML-KEM-768 (FIPS 203) encapsulation-key ENCODING — just enough to put a\n * WELL-FORMED encapsulation key into a TLS X25519MLKEM768 key_share so that a\n * server which supports the hybrid group selects it directly (rather than only via\n * a HelloRetryRequest, which misses servers that support-but-don't-prefer it).\n *\n * qProbe never completes the handshake, so it does NOT need real ML-KEM key\n * generation (no NTT, matrix A, or CBD sampling). It only needs bytes the server's\n * ML-KEM.Encaps input check accepts — a `ByteEncode₁₂` of coefficients in `[0, q)`\n * plus a 32-byte ρ. FIPS 203 §7.2's \"modulus check\" (ByteEncode(ByteDecode(ek))==ek)\n * passes for any in-range coefficients, so a random valid-range vector is accepted.\n * The value is throwaway; we discard the (uncomputable-by-us) shared secret.\n *\n * Pure and unit-tested (encode/decode round-trip, length, in-range).\n */\nimport { randomBytes } from \"node:crypto\";\n\nexport const ML_KEM_Q = 3329;\nconst N = 256; // coefficients per polynomial\nconst K = 3; // ML-KEM-768 rank\n/** Encoded encapsulation-key length: 384·k bytes of ByteEncode₁₂ + 32-byte ρ. */\nexport const ML_KEM_768_EK_BYTES = 384 * K + 32; // 1184\n\n/** ByteEncode₁₂: pack 256 12-bit coefficients (each in [0, q)) into 384 bytes. */\nexport function byteEncode12(coeffs: readonly number[]): Buffer {\n if (coeffs.length !== N) throw new RangeError(`byteEncode12 expects ${N} coefficients`);\n const out = Buffer.alloc((N * 12) / 8); // 384\n for (let i = 0, o = 0; i < N; i += 2, o += 3) {\n const a = coeffs[i] & 0xfff;\n const b = coeffs[i + 1] & 0xfff;\n out[o] = a & 0xff;\n out[o + 1] = (a >> 8) | ((b & 0x0f) << 4);\n out[o + 2] = b >> 4;\n }\n return out;\n}\n\n/** ByteDecode₁₂: inverse of {@link byteEncode12} (for tests). */\nexport function byteDecode12(bytes: Buffer): number[] {\n if (bytes.length !== 384) throw new RangeError(\"byteDecode12 expects 384 bytes\");\n const out: number[] = new Array(N);\n for (let i = 0, o = 0; i < N; i += 2, o += 3) {\n out[i] = bytes[o] | ((bytes[o + 1] & 0x0f) << 8);\n out[i + 1] = (bytes[o + 1] >> 4) | (bytes[o + 2] << 4);\n }\n return out;\n}\n\n/** A random polynomial with all coefficients in [0, q) (throwaway, not uniform). */\nfunction randomInRangePoly(): number[] {\n const raw = randomBytes(N * 2);\n const poly: number[] = new Array(N);\n for (let i = 0; i < N; i++) {\n // 16-bit sample reduced mod q — biased but always in [0, q), which is all the\n // server's modulus check requires. This is a throwaway key.\n poly[i] = raw.readUInt16BE(i * 2) % ML_KEM_Q;\n }\n return poly;\n}\n\n/**\n * Build a WELL-FORMED ML-KEM-768 encapsulation key (1184 bytes): `ByteEncode₁₂` of\n * a random in-range `t̂` (k=3 polynomials) followed by a 32-byte ρ. Accepted by a\n * FIPS 203 encaps input check; the corresponding secret is not recoverable by us\n * (and is not needed — we only observe which group the server selects).\n */\nexport function wellFormedMlKem768Ek(): Buffer {\n const parts: Buffer[] = [];\n for (let i = 0; i < K; i++) parts.push(byteEncode12(randomInRangePoly()));\n parts.push(randomBytes(32)); // ρ\n return Buffer.concat(parts);\n}\n"]}
{"version":3,"file":"mlkem768.js","sourceRoot":"","sources":["../src/mlkem768.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Minimal ML-KEM-768 (FIPS 203) encapsulation-key ENCODING — just enough to put a\n * WELL-FORMED encapsulation key into a TLS X25519MLKEM768 key_share so that a\n * server which supports the hybrid group selects it directly (rather than only via\n * a HelloRetryRequest, which misses servers that support-but-don't-prefer it).\n *\n * qProbe never completes the handshake, so it does NOT need real ML-KEM key\n * generation (no NTT, matrix A, or CBD sampling). It only needs bytes the server's\n * ML-KEM.Encaps input check accepts — a `ByteEncode₁₂` of coefficients in `[0, q)`\n * plus a 32-byte ρ. FIPS 203 §7.2's \"modulus check\" (ByteEncode(ByteDecode(ek))==ek)\n * passes for any in-range coefficients, so a random valid-range vector is accepted.\n * The value is throwaway; we discard the (uncomputable-by-us) shared secret.\n *\n * Pure and unit-tested (encode/decode round-trip, length, in-range).\n */\nimport { randomBytes } from \"node:crypto\";\n\nexport const ML_KEM_Q = 3329;\nconst N = 256; // coefficients per polynomial\nconst K = 3; // ML-KEM-768 rank\n/** Encoded encapsulation-key length: 384·k bytes of ByteEncode₁₂ + 32-byte ρ. */\nexport const ML_KEM_768_EK_BYTES = 384 * K + 32; // 1184\n\n/** ByteEncode₁₂: pack 256 12-bit coefficients (each in [0, q)) into 384 bytes. */\nexport function byteEncode12(coeffs: readonly number[]): Buffer {\n if (coeffs.length !== N) throw new RangeError(`byteEncode12 expects ${N} coefficients`);\n const out = Buffer.alloc((N * 12) / 8); // 384\n for (let i = 0, o = 0; i < N; i += 2, o += 3) {\n const a = coeffs[i] & 0xfff;\n const b = coeffs[i + 1] & 0xfff;\n out[o] = a & 0xff;\n out[o + 1] = (a >> 8) | ((b & 0x0f) << 4);\n out[o + 2] = b >> 4;\n }\n return out;\n}\n\n/** ByteDecode₁₂: inverse of {@link byteEncode12} (for tests). */\nexport function byteDecode12(bytes: Buffer): number[] {\n if (bytes.length !== 384) throw new RangeError(\"byteDecode12 expects 384 bytes\");\n const out: number[] = new Array(N);\n for (let i = 0, o = 0; i < N; i += 2, o += 3) {\n out[i] = bytes[o] | ((bytes[o + 1] & 0x0f) << 8);\n out[i + 1] = (bytes[o + 1] >> 4) | (bytes[o + 2] << 4);\n }\n return out;\n}\n\n/** A random polynomial with all coefficients uniform in [0, q) (throwaway probe key). */\nfunction randomInRangePoly(): number[] {\n // Rejection sampling from 16-bit draws to avoid modulo bias. The key is a\n // throwaway (never used for real security), but a security tool should not\n // ship biased \"randomness\" even here.\n const MAX = Math.floor(0x10000 / ML_KEM_Q) * ML_KEM_Q;\n const poly: number[] = new Array(N);\n let pool = randomBytes(N * 4);\n let off = 0;\n for (let i = 0; i < N; i++) {\n let v: number;\n do {\n if (off + 2 > pool.length) {\n pool = randomBytes(N * 4);\n off = 0;\n }\n v = pool.readUInt16BE(off);\n off += 2;\n } while (v >= MAX);\n poly[i] = v % ML_KEM_Q;\n }\n return poly;\n}\n\n/**\n * Build a WELL-FORMED ML-KEM-768 encapsulation key (1184 bytes): `ByteEncode₁₂` of\n * a random in-range `t̂` (k=3 polynomials) followed by a 32-byte ρ. Accepted by a\n * FIPS 203 encaps input check; the corresponding secret is not recoverable by us\n * (and is not needed — we only observe which group the server selects).\n */\nexport function wellFormedMlKem768Ek(): Buffer {\n const parts: Buffer[] = [];\n for (let i = 0; i < K; i++) parts.push(byteEncode12(randomInRangePoly()));\n parts.push(randomBytes(32)); // ρ\n return Buffer.concat(parts);\n}\n"]}
/** qProbe version, surfaced in JSON output. Keep in sync with package.json. */
export declare const VERSION = "0.5.0";
export declare const VERSION = "0.6.0";
//# sourceMappingURL=version.d.ts.map
/** qProbe version, surfaced in JSON output. Keep in sync with package.json. */
export const VERSION = "0.5.0";
export const VERSION = "0.6.0";
//# sourceMappingURL=version.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC","sourcesContent":["/** qProbe version, surfaced in JSON output. Keep in sync with package.json. */\nexport const VERSION = \"0.5.0\";\n"]}
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC","sourcesContent":["/** qProbe version, surfaced in JSON output. Keep in sync with package.json. */\nexport const VERSION = \"0.6.0\";\n"]}
{
"name": "@quantakrypto/qprobe",
"version": "0.5.0",
"version": "0.6.0",
"description": "qProbe — actively inspect live TLS/SSH endpoints you OWN for post-quantum readiness (hybrid KEX, classical certs). Gated behind an ownership attestation. Zero runtime dependencies.",

@@ -40,3 +40,3 @@ "license": "Apache-2.0",

"dependencies": {
"@quantakrypto/core": "0.5.0"
"@quantakrypto/core": "0.6.0"
},

@@ -43,0 +43,0 @@ "scripts": {