kxco-verify 1.0.5 → 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/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.1.0 — 2026-07-22
4
+
5
+ Engine modernization. Public API unchanged; all 50 tests pass, including live
6
+ verification of the pinned attestation fixtures.
7
+
8
+ ### Changed
9
+ - **`@noble/post-quantum` bumped `^0.2.1` → `^0.6.1`** (FIPS 203/204/205 final
10
+ reference implementation). Absorbs the upstream breaking change: `ml_dsa65.verify`
11
+ argument order is now `(signature, message, publicKey)`, and the subpath import
12
+ requires the `.js` extension. Both are handled internally — `verifySignature()`
13
+ behaves identically.
14
+ - `engines.node` raised to `>=20.19` to match the `@noble/post-quantum@0.6`
15
+ requirement.
16
+ - `author` set to Shayne Heffernan and John Heffernan.
17
+
3
18
  ## 1.0.0 — 2026-05-24
4
19
 
5
20
  Stable release.
package/README.md CHANGED
@@ -231,9 +231,11 @@ The verifier is architecturally independent of the signer — the two share no c
231
231
 
232
232
  ## Security
233
233
 
234
- Signature verification uses [`@noble/post-quantum`](https://github.com/paulmillr/noble-post-quantum) ML-DSA-65, independently audited by Cure53 (2024) with no transitive dependencies. The library makes no outbound requests beyond the attestation URL you supply and the `pinAt` endpoint declared in the manifest. No data is sent to KXCO.
234
+ Signature verification uses [`@noble/post-quantum`](https://github.com/paulmillr/noble-post-quantum) ML-DSA-65, with no transitive dependencies. That package has **not** been independently audited by a third party; it has been self-audited by its maintainer. Cure53's 2023 NDS-01 audit of the `@noble` ecosystem covered `ciphers`, `curves` and `hashes`, and did not cover `@noble/post-quantum`. We state this plainly because you should not adopt a verification library on the strength of an audit that does not exist.
235
235
 
236
- To report a vulnerability, open a [private security advisory](https://github.com/JackKXCO/kxco-verify/security/advisories/new) or email **security@kxco.ai**.
236
+ The library makes no outbound requests beyond the attestation URL you supply and the `pinAt` endpoint declared in the manifest. No data is sent to KXCO.
237
+
238
+ To report a vulnerability, open a [private security advisory](https://github.com/KnightsbridgeAIQ/kxco-verify/security/advisories/new) or email **john@knightsbridgelaw.com**. Acknowledgement within 2 business days, triage decision within 5. Full policy, including safe harbour for good-faith research: <https://kxco.ai/security>.
237
239
 
238
240
  ---
239
241
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "kxco-verify",
3
- "version": "1.0.5",
4
- "description": "Standalone, browser-safe verifier for KXCO ML-DSA-65 post-quantum signed attestations and credentials \u2014 for auditors, regulators, counterparties, and anyone who needs to confirm a signature without running the full KXCO SDK.",
3
+ "version": "1.2.0",
4
+ "description": "Standalone, browser-safe verifier for KXCO ML-DSA-65 post-quantum signed attestations and credentials, for auditors, regulators, counterparties, and anyone who needs to confirm a signature without running the full KXCO SDK.",
5
5
  "keywords": [
6
6
  "post-quantum",
7
7
  "pqc",
@@ -22,19 +22,23 @@
22
22
  "manifest-verification"
23
23
  ],
24
24
  "license": "Apache-2.0",
25
- "author": "KXCO by Knightsbridge <hello@kxco.ai>",
25
+ "author": "Shayne Heffernan and John Heffernan",
26
26
  "contributors": [
27
- { "name": "Shayne Heffernan" },
28
- { "name": "John Heffernan" }
27
+ {
28
+ "name": "Shayne Heffernan"
29
+ },
30
+ {
31
+ "name": "John Heffernan"
32
+ }
29
33
  ],
30
34
  "homepage": "https://verify.kxco.ai",
31
35
  "funding": "https://kxco.ai",
32
36
  "repository": {
33
37
  "type": "git",
34
- "url": "https://github.com/JackKXCO/kxco-verify.git"
38
+ "url": "https://github.com/KnightsbridgeAIQ/kxco-verify.git"
35
39
  },
36
40
  "bugs": {
37
- "url": "https://github.com/JackKXCO/kxco-verify/issues"
41
+ "url": "https://github.com/KnightsbridgeAIQ/kxco-verify/issues"
38
42
  },
39
43
  "type": "module",
40
44
  "sideEffects": false,
@@ -65,10 +69,10 @@
65
69
  "CHANGELOG.md"
66
70
  ],
67
71
  "engines": {
68
- "node": ">=18"
72
+ "node": ">=20.19"
69
73
  },
70
74
  "dependencies": {
71
- "@noble/post-quantum": "^0.2.1"
75
+ "@noble/post-quantum": "0.7.0"
72
76
  },
73
77
  "scripts": {
74
78
  "test": "node --test --test-reporter=spec test/parse.test.js test/verify.test.js test/fetch.test.js test/index.test.js",
@@ -80,4 +84,4 @@
80
84
  "provenance": true,
81
85
  "access": "public"
82
86
  }
83
- }
87
+ }
package/src/verify.js CHANGED
@@ -5,7 +5,7 @@
5
5
  // from the Web Crypto API where available (browser, Node 20+), fallback to
6
6
  // node:crypto's createHash where SubtleCrypto.digest is not present.
7
7
 
8
- import { ml_dsa65 } from '@noble/post-quantum/ml-dsa'
8
+ import { ml_dsa65 } from '@noble/post-quantum/ml-dsa.js'
9
9
 
10
10
  /**
11
11
  * Hex string → Uint8Array. Throws on malformed input.
@@ -79,10 +79,10 @@ export function verifySignature(publicKey, message, signature) {
79
79
  const pk = typeof publicKey === 'string' ? hexToBytes(publicKey) : publicKey
80
80
  const sig = typeof signature === 'string' ? hexToBytes(signature) : signature
81
81
  const msg = typeof message === 'string' ? utf8(message) : message
82
- // @noble/post-quantum signature: (publicKey, message, signature). Matches
83
- // the canonical wrapper in kxco-post-quantum/src/ml-dsa.js.
82
+ // @noble/post-quantum ≥0.6 signature order: (signature, message, publicKey).
83
+ // Matches the canonical wrapper in kxco-post-quantum/src/ml-dsa.js.
84
84
  try {
85
- return ml_dsa65.verify(pk, msg, sig)
85
+ return ml_dsa65.verify(sig, msg, pk)
86
86
  } catch {
87
87
  return false
88
88
  }