@labacacia/nps-sdk 1.0.0-alpha.2 → 1.0.0-alpha.4

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.
Files changed (315) hide show
  1. package/CHANGELOG.cn.md +73 -2
  2. package/CHANGELOG.md +82 -2
  3. package/README.cn.md +8 -2
  4. package/README.md +8 -2
  5. package/dist/core/anchor-cache.d.ts +0 -0
  6. package/dist/core/anchor-cache.d.ts.map +0 -0
  7. package/dist/core/anchor-cache.js +0 -0
  8. package/dist/core/anchor-cache.js.map +0 -0
  9. package/dist/core/cache.d.ts +0 -0
  10. package/dist/core/cache.d.ts.map +0 -0
  11. package/dist/core/cache.js +0 -0
  12. package/dist/core/cache.js.map +0 -0
  13. package/dist/core/canonical-json.d.ts +0 -0
  14. package/dist/core/canonical-json.d.ts.map +0 -0
  15. package/dist/core/canonical-json.js +0 -0
  16. package/dist/core/canonical-json.js.map +0 -0
  17. package/dist/core/codec.d.ts +0 -0
  18. package/dist/core/codec.d.ts.map +0 -0
  19. package/dist/core/codec.js +0 -0
  20. package/dist/core/codec.js.map +0 -0
  21. package/dist/core/codecs/index.d.ts +0 -0
  22. package/dist/core/codecs/index.d.ts.map +0 -0
  23. package/dist/core/codecs/index.js +0 -0
  24. package/dist/core/codecs/index.js.map +0 -0
  25. package/dist/core/codecs/ncp-codec.d.ts +0 -0
  26. package/dist/core/codecs/ncp-codec.d.ts.map +0 -0
  27. package/dist/core/codecs/ncp-codec.js +0 -0
  28. package/dist/core/codecs/ncp-codec.js.map +0 -0
  29. package/dist/core/codecs/tier1-json-codec.d.ts +0 -0
  30. package/dist/core/codecs/tier1-json-codec.d.ts.map +0 -0
  31. package/dist/core/codecs/tier1-json-codec.js +0 -0
  32. package/dist/core/codecs/tier1-json-codec.js.map +0 -0
  33. package/dist/core/codecs/tier2-msgpack-codec.d.ts +0 -0
  34. package/dist/core/codecs/tier2-msgpack-codec.d.ts.map +0 -0
  35. package/dist/core/codecs/tier2-msgpack-codec.js +0 -0
  36. package/dist/core/codecs/tier2-msgpack-codec.js.map +0 -0
  37. package/dist/core/crypto-provider.d.ts +0 -0
  38. package/dist/core/crypto-provider.d.ts.map +0 -0
  39. package/dist/core/crypto-provider.js +0 -0
  40. package/dist/core/crypto-provider.js.map +0 -0
  41. package/dist/core/exceptions.d.ts +0 -0
  42. package/dist/core/exceptions.d.ts.map +0 -0
  43. package/dist/core/exceptions.js +0 -0
  44. package/dist/core/exceptions.js.map +0 -0
  45. package/dist/core/frame-header.d.ts +0 -0
  46. package/dist/core/frame-header.d.ts.map +0 -0
  47. package/dist/core/frame-header.js +0 -0
  48. package/dist/core/frame-header.js.map +0 -0
  49. package/dist/core/frame-registry.d.ts +0 -0
  50. package/dist/core/frame-registry.d.ts.map +0 -0
  51. package/dist/core/frame-registry.js +0 -0
  52. package/dist/core/frame-registry.js.map +0 -0
  53. package/dist/core/frames.d.ts +0 -0
  54. package/dist/core/frames.d.ts.map +0 -0
  55. package/dist/core/frames.js +0 -0
  56. package/dist/core/frames.js.map +0 -0
  57. package/dist/core/index.d.ts +0 -0
  58. package/dist/core/index.d.ts.map +0 -0
  59. package/dist/core/index.js +0 -0
  60. package/dist/core/index.js.map +0 -0
  61. package/dist/core/registry.d.ts +0 -0
  62. package/dist/core/registry.d.ts.map +0 -0
  63. package/dist/core/registry.js +0 -0
  64. package/dist/core/registry.js.map +0 -0
  65. package/dist/core/status-codes.d.ts +0 -0
  66. package/dist/core/status-codes.d.ts.map +0 -0
  67. package/dist/core/status-codes.js +0 -0
  68. package/dist/core/status-codes.js.map +0 -0
  69. package/dist/index.d.ts +0 -0
  70. package/dist/index.d.ts.map +0 -0
  71. package/dist/index.js +0 -0
  72. package/dist/index.js.map +0 -0
  73. package/dist/ncp/frames/anchor-frame.d.ts +0 -0
  74. package/dist/ncp/frames/anchor-frame.d.ts.map +0 -0
  75. package/dist/ncp/frames/anchor-frame.js +0 -0
  76. package/dist/ncp/frames/anchor-frame.js.map +0 -0
  77. package/dist/ncp/frames/caps-frame.d.ts +0 -0
  78. package/dist/ncp/frames/caps-frame.d.ts.map +0 -0
  79. package/dist/ncp/frames/caps-frame.js +0 -0
  80. package/dist/ncp/frames/caps-frame.js.map +0 -0
  81. package/dist/ncp/frames/diff-frame.d.ts +0 -0
  82. package/dist/ncp/frames/diff-frame.d.ts.map +0 -0
  83. package/dist/ncp/frames/diff-frame.js +0 -0
  84. package/dist/ncp/frames/diff-frame.js.map +0 -0
  85. package/dist/ncp/frames/error-frame.d.ts +0 -0
  86. package/dist/ncp/frames/error-frame.d.ts.map +0 -0
  87. package/dist/ncp/frames/error-frame.js +0 -0
  88. package/dist/ncp/frames/error-frame.js.map +0 -0
  89. package/dist/ncp/frames/hello-frame.d.ts +0 -0
  90. package/dist/ncp/frames/hello-frame.d.ts.map +0 -0
  91. package/dist/ncp/frames/hello-frame.js +0 -0
  92. package/dist/ncp/frames/hello-frame.js.map +0 -0
  93. package/dist/ncp/frames/stream-frame.d.ts +0 -0
  94. package/dist/ncp/frames/stream-frame.d.ts.map +0 -0
  95. package/dist/ncp/frames/stream-frame.js +0 -0
  96. package/dist/ncp/frames/stream-frame.js.map +0 -0
  97. package/dist/ncp/frames.d.ts +0 -0
  98. package/dist/ncp/frames.d.ts.map +0 -0
  99. package/dist/ncp/frames.js +0 -0
  100. package/dist/ncp/frames.js.map +0 -0
  101. package/dist/ncp/handshake.d.ts +0 -0
  102. package/dist/ncp/handshake.d.ts.map +0 -0
  103. package/dist/ncp/handshake.js +0 -0
  104. package/dist/ncp/handshake.js.map +0 -0
  105. package/dist/ncp/index.d.ts +1 -0
  106. package/dist/ncp/index.d.ts.map +1 -1
  107. package/dist/ncp/index.js +1 -0
  108. package/dist/ncp/index.js.map +1 -1
  109. package/dist/ncp/ncp-error-codes.d.ts +1 -0
  110. package/dist/ncp/ncp-error-codes.d.ts.map +1 -1
  111. package/dist/ncp/ncp-error-codes.js +2 -0
  112. package/dist/ncp/ncp-error-codes.js.map +1 -1
  113. package/dist/ncp/ncp-patch-format.d.ts +0 -0
  114. package/dist/ncp/ncp-patch-format.d.ts.map +0 -0
  115. package/dist/ncp/ncp-patch-format.js +0 -0
  116. package/dist/ncp/ncp-patch-format.js.map +0 -0
  117. package/dist/ncp/preamble.d.ts +47 -0
  118. package/dist/ncp/preamble.d.ts.map +1 -0
  119. package/dist/ncp/preamble.js +74 -0
  120. package/dist/ncp/preamble.js.map +1 -0
  121. package/dist/ncp/registry.d.ts +0 -0
  122. package/dist/ncp/registry.d.ts.map +0 -0
  123. package/dist/ncp/registry.js +0 -0
  124. package/dist/ncp/registry.js.map +0 -0
  125. package/dist/ncp/stream-manager.d.ts +0 -0
  126. package/dist/ncp/stream-manager.d.ts.map +0 -0
  127. package/dist/ncp/stream-manager.js +0 -0
  128. package/dist/ncp/stream-manager.js.map +0 -0
  129. package/dist/ndp/frames.d.ts +0 -0
  130. package/dist/ndp/frames.d.ts.map +0 -0
  131. package/dist/ndp/frames.js +0 -0
  132. package/dist/ndp/frames.js.map +0 -0
  133. package/dist/ndp/index.d.ts +0 -0
  134. package/dist/ndp/index.d.ts.map +0 -0
  135. package/dist/ndp/index.js +0 -0
  136. package/dist/ndp/index.js.map +0 -0
  137. package/dist/ndp/ndp-registry.d.ts +0 -0
  138. package/dist/ndp/ndp-registry.d.ts.map +0 -0
  139. package/dist/ndp/ndp-registry.js +0 -0
  140. package/dist/ndp/ndp-registry.js.map +0 -0
  141. package/dist/ndp/registry.d.ts +0 -0
  142. package/dist/ndp/registry.d.ts.map +0 -0
  143. package/dist/ndp/registry.js +0 -0
  144. package/dist/ndp/registry.js.map +0 -0
  145. package/dist/ndp/validator.d.ts +0 -0
  146. package/dist/ndp/validator.d.ts.map +0 -0
  147. package/dist/ndp/validator.js +0 -0
  148. package/dist/ndp/validator.js.map +0 -0
  149. package/dist/nip/acme/client.d.ts +31 -0
  150. package/dist/nip/acme/client.d.ts.map +1 -0
  151. package/dist/nip/acme/client.js +136 -0
  152. package/dist/nip/acme/client.js.map +1 -0
  153. package/dist/nip/acme/index.d.ts +6 -0
  154. package/dist/nip/acme/index.d.ts.map +1 -0
  155. package/dist/nip/acme/index.js +8 -0
  156. package/dist/nip/acme/index.js.map +1 -0
  157. package/dist/nip/acme/jws.d.ts +31 -0
  158. package/dist/nip/acme/jws.d.ts.map +1 -0
  159. package/dist/nip/acme/jws.js +76 -0
  160. package/dist/nip/acme/jws.js.map +1 -0
  161. package/dist/nip/acme/messages.d.ts +71 -0
  162. package/dist/nip/acme/messages.d.ts.map +1 -0
  163. package/dist/nip/acme/messages.js +4 -0
  164. package/dist/nip/acme/messages.js.map +1 -0
  165. package/dist/nip/acme/server.d.ts +41 -0
  166. package/dist/nip/acme/server.d.ts.map +1 -0
  167. package/dist/nip/acme/server.js +458 -0
  168. package/dist/nip/acme/server.js.map +1 -0
  169. package/dist/nip/acme/wire.d.ts +19 -0
  170. package/dist/nip/acme/wire.d.ts.map +1 -0
  171. package/dist/nip/acme/wire.js +21 -0
  172. package/dist/nip/acme/wire.js.map +1 -0
  173. package/dist/nip/assurance-level.d.ts +14 -0
  174. package/dist/nip/assurance-level.d.ts.map +1 -0
  175. package/dist/nip/assurance-level.js +33 -0
  176. package/dist/nip/assurance-level.js.map +1 -0
  177. package/dist/nip/cert-format.d.ts +5 -0
  178. package/dist/nip/cert-format.d.ts.map +1 -0
  179. package/dist/nip/cert-format.js +6 -0
  180. package/dist/nip/cert-format.js.map +1 -0
  181. package/dist/nip/error-codes.d.ts +23 -0
  182. package/dist/nip/error-codes.d.ts.map +1 -0
  183. package/dist/nip/error-codes.js +30 -0
  184. package/dist/nip/error-codes.js.map +1 -0
  185. package/dist/nip/frames.d.ts +10 -1
  186. package/dist/nip/frames.d.ts.map +1 -1
  187. package/dist/nip/frames.js +29 -4
  188. package/dist/nip/frames.js.map +1 -1
  189. package/dist/nip/identity.d.ts +0 -0
  190. package/dist/nip/identity.d.ts.map +0 -0
  191. package/dist/nip/identity.js +0 -0
  192. package/dist/nip/identity.js.map +0 -0
  193. package/dist/nip/index.d.ts +6 -0
  194. package/dist/nip/index.d.ts.map +1 -1
  195. package/dist/nip/index.js +7 -0
  196. package/dist/nip/index.js.map +1 -1
  197. package/dist/nip/registry.d.ts +0 -0
  198. package/dist/nip/registry.d.ts.map +0 -0
  199. package/dist/nip/registry.js +0 -0
  200. package/dist/nip/registry.js.map +0 -0
  201. package/dist/nip/verifier.d.ts +23 -0
  202. package/dist/nip/verifier.d.ts.map +1 -0
  203. package/dist/nip/verifier.js +90 -0
  204. package/dist/nip/verifier.js.map +1 -0
  205. package/dist/nip/x509/builder.d.ts +35 -0
  206. package/dist/nip/x509/builder.d.ts.map +1 -0
  207. package/dist/nip/x509/builder.js +59 -0
  208. package/dist/nip/x509/builder.js.map +1 -0
  209. package/dist/nip/x509/index.d.ts +4 -0
  210. package/dist/nip/x509/index.d.ts.map +1 -0
  211. package/dist/nip/x509/index.js +6 -0
  212. package/dist/nip/x509/index.js.map +1 -0
  213. package/dist/nip/x509/oids.d.ts +17 -0
  214. package/dist/nip/x509/oids.d.ts.map +1 -0
  215. package/dist/nip/x509/oids.js +23 -0
  216. package/dist/nip/x509/oids.js.map +1 -0
  217. package/dist/nip/x509/verifier.d.ts +26 -0
  218. package/dist/nip/x509/verifier.d.ts.map +1 -0
  219. package/dist/nip/x509/verifier.js +171 -0
  220. package/dist/nip/x509/verifier.js.map +1 -0
  221. package/dist/nop/client.d.ts +0 -0
  222. package/dist/nop/client.d.ts.map +0 -0
  223. package/dist/nop/client.js +0 -0
  224. package/dist/nop/client.js.map +0 -0
  225. package/dist/nop/frames.d.ts +0 -0
  226. package/dist/nop/frames.d.ts.map +0 -0
  227. package/dist/nop/frames.js +0 -0
  228. package/dist/nop/frames.js.map +0 -0
  229. package/dist/nop/index.d.ts +0 -0
  230. package/dist/nop/index.d.ts.map +0 -0
  231. package/dist/nop/index.js +0 -0
  232. package/dist/nop/index.js.map +0 -0
  233. package/dist/nop/models.d.ts +0 -0
  234. package/dist/nop/models.d.ts.map +0 -0
  235. package/dist/nop/models.js +0 -0
  236. package/dist/nop/models.js.map +0 -0
  237. package/dist/nop/nop-types.d.ts +0 -0
  238. package/dist/nop/nop-types.d.ts.map +0 -0
  239. package/dist/nop/nop-types.js +0 -0
  240. package/dist/nop/nop-types.js.map +0 -0
  241. package/dist/nop/registry.d.ts +0 -0
  242. package/dist/nop/registry.d.ts.map +0 -0
  243. package/dist/nop/registry.js +0 -0
  244. package/dist/nop/registry.js.map +0 -0
  245. package/dist/nwp/client.d.ts +0 -0
  246. package/dist/nwp/client.d.ts.map +0 -0
  247. package/dist/nwp/client.js +0 -0
  248. package/dist/nwp/client.js.map +0 -0
  249. package/dist/nwp/frames.d.ts +0 -0
  250. package/dist/nwp/frames.d.ts.map +0 -0
  251. package/dist/nwp/frames.js +0 -0
  252. package/dist/nwp/frames.js.map +0 -0
  253. package/dist/nwp/index.d.ts +0 -0
  254. package/dist/nwp/index.d.ts.map +0 -0
  255. package/dist/nwp/index.js +0 -0
  256. package/dist/nwp/index.js.map +0 -0
  257. package/dist/nwp/registry.d.ts +0 -0
  258. package/dist/nwp/registry.d.ts.map +0 -0
  259. package/dist/nwp/registry.js +0 -0
  260. package/dist/nwp/registry.js.map +0 -0
  261. package/dist/setup.d.ts +0 -0
  262. package/dist/setup.d.ts.map +0 -0
  263. package/dist/setup.js +0 -0
  264. package/dist/setup.js.map +0 -0
  265. package/package.json +2 -1
  266. package/src/index.ts +0 -0
  267. package/src/ncp/index.ts +1 -0
  268. package/src/ncp/ncp-error-codes.ts +2 -0
  269. package/src/ncp/preamble.ts +79 -0
  270. package/src/nip/acme/client.ts +185 -0
  271. package/src/nip/acme/index.ts +8 -0
  272. package/src/nip/acme/jws.ts +109 -0
  273. package/src/nip/acme/messages.ts +85 -0
  274. package/src/nip/acme/server.ts +480 -0
  275. package/src/nip/acme/wire.ts +24 -0
  276. package/src/nip/assurance-level.ts +35 -0
  277. package/src/nip/cert-format.ts +9 -0
  278. package/src/nip/error-codes.ts +36 -0
  279. package/src/nip/frames.ts +35 -3
  280. package/src/nip/index.ts +8 -0
  281. package/src/nip/verifier.ts +122 -0
  282. package/src/nip/x509/builder.ts +91 -0
  283. package/src/nip/x509/index.ts +6 -0
  284. package/src/nip/x509/oids.ts +28 -0
  285. package/src/nip/x509/verifier.ts +214 -0
  286. package/tests/_rfc0002-keys.ts +57 -0
  287. package/tests/ncp/preamble.test.ts +93 -0
  288. package/tests/nip-acme-agent01.test.ts +192 -0
  289. package/tests/nip-x509.test.ts +280 -0
  290. package/.npmrc.publish +0 -1
  291. package/dist/codec-CmHeovTV.d.cts +0 -120
  292. package/dist/codec-CmHeovTV.d.ts +0 -120
  293. package/dist/core/index.cjs +0 -371
  294. package/dist/core/index.cjs.map +0 -1
  295. package/dist/core/index.d.cts +0 -41
  296. package/dist/frames-B3qLdl_g.d.cts +0 -77
  297. package/dist/frames-Ff7-ZPUl.d.ts +0 -77
  298. package/dist/index.cjs +0 -1556
  299. package/dist/index.cjs.map +0 -1
  300. package/dist/index.d.cts +0 -21
  301. package/dist/ncp/index.cjs +0 -188
  302. package/dist/ncp/index.cjs.map +0 -1
  303. package/dist/ncp/index.d.cts +0 -6
  304. package/dist/ndp/index.cjs +0 -252
  305. package/dist/ndp/index.cjs.map +0 -1
  306. package/dist/ndp/index.d.cts +0 -86
  307. package/dist/nip/index.cjs +0 -214
  308. package/dist/nip/index.cjs.map +0 -1
  309. package/dist/nip/index.d.cts +0 -65
  310. package/dist/nop/index.cjs +0 -762
  311. package/dist/nop/index.cjs.map +0 -1
  312. package/dist/nop/index.d.cts +0 -155
  313. package/dist/nwp/index.cjs +0 -658
  314. package/dist/nwp/index.cjs.map +0 -1
  315. package/dist/nwp/index.d.cts +0 -65
@@ -0,0 +1,30 @@
1
+ // Copyright 2026 INNO LOTUS PTY LTD
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /** NIP error code wire constants — mirror of `spec/error-codes.md` NIP section. */
4
+ // ── Cert verification (v1 + v2) ──────────────────────────────────────────────
5
+ export const CERT_EXPIRED = "NIP-CERT-EXPIRED";
6
+ export const CERT_REVOKED = "NIP-CERT-REVOKED";
7
+ export const CERT_SIGNATURE_INVALID = "NIP-CERT-SIGNATURE-INVALID";
8
+ export const CERT_UNTRUSTED_ISSUER = "NIP-CERT-UNTRUSTED-ISSUER";
9
+ export const CERT_CAPABILITY_MISSING = "NIP-CERT-CAPABILITY-MISSING";
10
+ export const CERT_SCOPE_VIOLATION = "NIP-CERT-SCOPE-VIOLATION";
11
+ // ── CA service ───────────────────────────────────────────────────────────────
12
+ export const CA_NID_NOT_FOUND = "NIP-CA-NID-NOT-FOUND";
13
+ export const CA_NID_ALREADY_EXISTS = "NIP-CA-NID-ALREADY-EXISTS";
14
+ export const CA_SERIAL_DUPLICATE = "NIP-CA-SERIAL-DUPLICATE";
15
+ export const CA_RENEWAL_TOO_EARLY = "NIP-CA-RENEWAL-TOO-EARLY";
16
+ export const CA_SCOPE_EXPANSION_DENIED = "NIP-CA-SCOPE-EXPANSION-DENIED";
17
+ export const OCSP_UNAVAILABLE = "NIP-OCSP-UNAVAILABLE";
18
+ export const TRUST_FRAME_INVALID = "NIP-TRUST-FRAME-INVALID";
19
+ // ── RFC-0003 (assurance level) ───────────────────────────────────────────────
20
+ export const ASSURANCE_MISMATCH = "NIP-ASSURANCE-MISMATCH";
21
+ export const ASSURANCE_UNKNOWN = "NIP-ASSURANCE-UNKNOWN";
22
+ // ── RFC-0004 (reputation log) ────────────────────────────────────────────────
23
+ export const REPUTATION_ENTRY_INVALID = "NIP-REPUTATION-ENTRY-INVALID";
24
+ export const REPUTATION_LOG_UNREACHABLE = "NIP-REPUTATION-LOG-UNREACHABLE";
25
+ // ── RFC-0002 (X.509 + ACME) ──────────────────────────────────────────────────
26
+ export const CERT_FORMAT_INVALID = "NIP-CERT-FORMAT-INVALID";
27
+ export const CERT_EKU_MISSING = "NIP-CERT-EKU-MISSING";
28
+ export const CERT_SUBJECT_NID_MISMATCH = "NIP-CERT-SUBJECT-NID-MISMATCH";
29
+ export const ACME_CHALLENGE_FAILED = "NIP-ACME-CHALLENGE-FAILED";
30
+ //# sourceMappingURL=error-codes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-codes.js","sourceRoot":"","sources":["../../src/nip/error-codes.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,sCAAsC;AAEtC,mFAAmF;AAEnF,gFAAgF;AAChF,MAAM,CAAC,MAAM,YAAY,GAAc,kBAAkB,CAAC;AAC1D,MAAM,CAAC,MAAM,YAAY,GAAc,kBAAkB,CAAC;AAC1D,MAAM,CAAC,MAAM,sBAAsB,GAAI,4BAA4B,CAAC;AACpE,MAAM,CAAC,MAAM,qBAAqB,GAAK,2BAA2B,CAAC;AACnE,MAAM,CAAC,MAAM,uBAAuB,GAAG,6BAA6B,CAAC;AACrE,MAAM,CAAC,MAAM,oBAAoB,GAAM,0BAA0B,CAAC;AAElE,gFAAgF;AAChF,MAAM,CAAC,MAAM,gBAAgB,GAAY,sBAAsB,CAAC;AAChE,MAAM,CAAC,MAAM,qBAAqB,GAAO,2BAA2B,CAAC;AACrE,MAAM,CAAC,MAAM,mBAAmB,GAAS,yBAAyB,CAAC;AACnE,MAAM,CAAC,MAAM,oBAAoB,GAAQ,0BAA0B,CAAC;AACpE,MAAM,CAAC,MAAM,yBAAyB,GAAG,+BAA+B,CAAC;AAEzE,MAAM,CAAC,MAAM,gBAAgB,GAAO,sBAAsB,CAAC;AAC3D,MAAM,CAAC,MAAM,mBAAmB,GAAI,yBAAyB,CAAC;AAE9D,gFAAgF;AAChF,MAAM,CAAC,MAAM,kBAAkB,GAAG,wBAAwB,CAAC;AAC3D,MAAM,CAAC,MAAM,iBAAiB,GAAI,uBAAuB,CAAC;AAE1D,gFAAgF;AAChF,MAAM,CAAC,MAAM,wBAAwB,GAAM,8BAA8B,CAAC;AAC1E,MAAM,CAAC,MAAM,0BAA0B,GAAI,gCAAgC,CAAC;AAE5E,gFAAgF;AAChF,MAAM,CAAC,MAAM,mBAAmB,GAAS,yBAAyB,CAAC;AACnE,MAAM,CAAC,MAAM,gBAAgB,GAAY,sBAAsB,CAAC;AAChE,MAAM,CAAC,MAAM,yBAAyB,GAAG,+BAA+B,CAAC;AACzE,MAAM,CAAC,MAAM,qBAAqB,GAAO,2BAA2B,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { EncodingTier, FrameType } from "../core/frames.js";
2
2
  import type { NpsFrame } from "../core/codec.js";
3
+ import { AssuranceLevel } from "./assurance-level.js";
3
4
  export interface IdentMetadata {
4
5
  issuer: string;
5
6
  issuedAt: string;
@@ -7,6 +8,11 @@ export interface IdentMetadata {
7
8
  capabilities?: readonly string[];
8
9
  scopes?: readonly string[];
9
10
  }
11
+ export interface IdentFrameOptions {
12
+ assuranceLevel?: AssuranceLevel | null;
13
+ certFormat?: string | null;
14
+ certChain?: readonly string[] | null;
15
+ }
10
16
  export declare class IdentFrame implements NpsFrame {
11
17
  readonly nid: string;
12
18
  readonly pubKey: string;
@@ -14,7 +20,10 @@ export declare class IdentFrame implements NpsFrame {
14
20
  readonly signature: string;
15
21
  readonly frameType = FrameType.IDENT;
16
22
  readonly preferredTier = EncodingTier.MSGPACK;
17
- constructor(nid: string, pubKey: string, metadata: IdentMetadata, signature: string);
23
+ readonly assuranceLevel: AssuranceLevel | null;
24
+ readonly certFormat: string | null;
25
+ readonly certChain: readonly string[] | null;
26
+ constructor(nid: string, pubKey: string, metadata: IdentMetadata, signature: string, options?: IdentFrameOptions);
18
27
  unsignedDict(): Record<string, unknown>;
19
28
  toDict(): Record<string, unknown>;
20
29
  static fromDict(data: Record<string, unknown>): IdentFrame;
@@ -1 +1 @@
1
- {"version":3,"file":"frames.d.ts","sourceRoot":"","sources":["../../src/nip/frames.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAQ,MAAM,CAAC;IACrB,QAAQ,EAAM,MAAM,CAAC;IACrB,SAAS,CAAC,EAAI,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,MAAM,CAAC,EAAQ,SAAS,MAAM,EAAE,CAAC;CAClC;AAED,qBAAa,UAAW,YAAW,QAAQ;aAKvB,GAAG,EAAQ,MAAM;aACjB,MAAM,EAAK,MAAM;aACjB,QAAQ,EAAG,aAAa;aACxB,SAAS,EAAE,MAAM;IAPnC,QAAQ,CAAC,SAAS,mBAAuB;IACzC,QAAQ,CAAC,aAAa,wBAAwB;gBAG5B,GAAG,EAAQ,MAAM,EACjB,MAAM,EAAK,MAAM,EACjB,QAAQ,EAAG,aAAa,EACxB,SAAS,EAAE,MAAM;IAGnC,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAQvC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAIjC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU;CAQ3D;AAED,qBAAa,UAAW,YAAW,QAAQ;aAKvB,SAAS,EAAG,MAAM;aAClB,UAAU,EAAE,MAAM;aAClB,MAAM,EAAM,SAAS,MAAM,EAAE;aAC7B,SAAS,EAAG,MAAM;aAClB,SAAS,EAAG,MAAM;IARpC,QAAQ,CAAC,SAAS,mBAAuB;IACzC,QAAQ,CAAC,aAAa,wBAAwB;gBAG5B,SAAS,EAAG,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAM,SAAS,MAAM,EAAE,EAC7B,SAAS,EAAG,MAAM,EAClB,SAAS,EAAG,MAAM;IAGpC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAUjC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU;CAS3D;AAED,qBAAa,WAAY,YAAW,QAAQ;aAKxB,GAAG,EAAQ,MAAM;aACjB,MAAM,CAAC,EAAI,MAAM;aACjB,SAAS,CAAC,EAAE,MAAM;IANpC,QAAQ,CAAC,SAAS,oBAAwB;IAC1C,QAAQ,CAAC,aAAa,wBAAwB;gBAG5B,GAAG,EAAQ,MAAM,EACjB,MAAM,CAAC,EAAI,MAAM,YAAA,EACjB,SAAS,CAAC,EAAE,MAAM,YAAA;IAGpC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAQjC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW;CAO5D"}
1
+ {"version":3,"file":"frames.d.ts","sourceRoot":"","sources":["../../src/nip/frames.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAQ,MAAM,CAAC;IACrB,QAAQ,EAAM,MAAM,CAAC;IACrB,SAAS,CAAC,EAAI,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,MAAM,CAAC,EAAQ,SAAS,MAAM,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,iBAAiB;IAChC,cAAc,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IACvC,UAAU,CAAC,EAAM,MAAM,GAAG,IAAI,CAAC;IAC/B,SAAS,CAAC,EAAO,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;CAC3C;AAED,qBAAa,UAAW,YAAW,QAAQ;aASvB,GAAG,EAAQ,MAAM;aACjB,MAAM,EAAK,MAAM;aACjB,QAAQ,EAAG,aAAa;aACxB,SAAS,EAAE,MAAM;IAXnC,QAAQ,CAAC,SAAS,mBAAuB;IACzC,QAAQ,CAAC,aAAa,wBAAwB;IAE9C,QAAQ,CAAC,cAAc,EAAE,cAAc,GAAG,IAAI,CAAC;IAC/C,QAAQ,CAAC,UAAU,EAAM,MAAM,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,SAAS,EAAO,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;gBAGhC,GAAG,EAAQ,MAAM,EACjB,MAAM,EAAK,MAAM,EACjB,QAAQ,EAAG,aAAa,EACxB,SAAS,EAAE,MAAM,EACjC,OAAO,GAAqB,iBAAsB;IAOpD,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAYvC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAOjC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU;CAiB3D;AAED,qBAAa,UAAW,YAAW,QAAQ;aAKvB,SAAS,EAAG,MAAM;aAClB,UAAU,EAAE,MAAM;aAClB,MAAM,EAAM,SAAS,MAAM,EAAE;aAC7B,SAAS,EAAG,MAAM;aAClB,SAAS,EAAG,MAAM;IARpC,QAAQ,CAAC,SAAS,mBAAuB;IACzC,QAAQ,CAAC,aAAa,wBAAwB;gBAG5B,SAAS,EAAG,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAM,SAAS,MAAM,EAAE,EAC7B,SAAS,EAAG,MAAM,EAClB,SAAS,EAAG,MAAM;IAGpC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAUjC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU;CAS3D;AAED,qBAAa,WAAY,YAAW,QAAQ;aAKxB,GAAG,EAAQ,MAAM;aACjB,MAAM,CAAC,EAAI,MAAM;aACjB,SAAS,CAAC,EAAE,MAAM;IANpC,QAAQ,CAAC,SAAS,oBAAwB;IAC1C,QAAQ,CAAC,aAAa,wBAAwB;gBAG5B,GAAG,EAAQ,MAAM,EACjB,MAAM,CAAC,EAAI,MAAM,YAAA,EACjB,SAAS,CAAC,EAAE,MAAM,YAAA;IAGpC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAQjC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW;CAO5D"}
@@ -1,6 +1,7 @@
1
1
  // Copyright 2026 INNO LOTUS PTY LTD
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  import { EncodingTier, FrameType } from "../core/frames.js";
4
+ import { AssuranceLevel } from "./assurance-level.js";
4
5
  export class IdentFrame {
5
6
  nid;
6
7
  pubKey;
@@ -8,24 +9,48 @@ export class IdentFrame {
8
9
  signature;
9
10
  frameType = FrameType.IDENT;
10
11
  preferredTier = EncodingTier.MSGPACK;
11
- constructor(nid, pubKey, metadata, signature) {
12
+ assuranceLevel;
13
+ certFormat;
14
+ certChain;
15
+ constructor(nid, pubKey, metadata, signature, options = {}) {
12
16
  this.nid = nid;
13
17
  this.pubKey = pubKey;
14
18
  this.metadata = metadata;
15
19
  this.signature = signature;
20
+ this.assuranceLevel = options.assuranceLevel ?? null;
21
+ this.certFormat = options.certFormat ?? null;
22
+ this.certChain = options.certChain ?? null;
16
23
  }
17
24
  unsignedDict() {
18
- return {
25
+ const out = {
19
26
  nid: this.nid,
20
27
  pub_key: this.pubKey,
21
28
  metadata: this.metadata,
22
29
  };
30
+ if (this.assuranceLevel !== null)
31
+ out["assurance_level"] = this.assuranceLevel.wire;
32
+ // cert_format / cert_chain deliberately excluded from the signed payload —
33
+ // the v1 Ed25519 signature covers only (nid, pub_key, metadata, [assurance_level]).
34
+ return out;
23
35
  }
24
36
  toDict() {
25
- return { ...this.unsignedDict(), signature: this.signature };
37
+ const out = { ...this.unsignedDict(), signature: this.signature };
38
+ if (this.certFormat !== null)
39
+ out["cert_format"] = this.certFormat;
40
+ if (this.certChain !== null)
41
+ out["cert_chain"] = [...this.certChain];
42
+ return out;
26
43
  }
27
44
  static fromDict(data) {
28
- return new IdentFrame(data["nid"], data["pub_key"], data["metadata"], data["signature"]);
45
+ const lvl = data["assurance_level"];
46
+ const assuranceLevel = typeof lvl === "string" ? AssuranceLevel.fromWire(lvl) : null;
47
+ const chainRaw = data["cert_chain"];
48
+ const certChain = Array.isArray(chainRaw) ? chainRaw : null;
49
+ return new IdentFrame(data["nid"], data["pub_key"], data["metadata"], data["signature"], {
50
+ assuranceLevel,
51
+ certFormat: data["cert_format"] ?? null,
52
+ certChain,
53
+ });
29
54
  }
30
55
  }
31
56
  export class TrustFrame {
@@ -1 +1 @@
1
- {"version":3,"file":"frames.js","sourceRoot":"","sources":["../../src/nip/frames.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"frames.js","sourceRoot":"","sources":["../../src/nip/frames.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,sCAAsC;AAEtC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE5D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAgBtD,MAAM,OAAO,UAAU;IASH;IACA;IACA;IACA;IAXT,SAAS,GAAO,SAAS,CAAC,KAAK,CAAC;IAChC,aAAa,GAAG,YAAY,CAAC,OAAO,CAAC;IAErC,cAAc,CAAwB;IACtC,UAAU,CAAoB;IAC9B,SAAS,CAAgC;IAElD,YACkB,GAAiB,EACjB,MAAiB,EACjB,QAAwB,EACxB,SAAiB,EACjC,UAAgD,EAAE;QAJlC,QAAG,GAAH,GAAG,CAAc;QACjB,WAAM,GAAN,MAAM,CAAW;QACjB,aAAQ,GAAR,QAAQ,CAAgB;QACxB,cAAS,GAAT,SAAS,CAAQ;QAGjC,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC;QACrD,IAAI,CAAC,UAAU,GAAO,OAAO,CAAC,UAAU,IAAQ,IAAI,CAAC;QACrD,IAAI,CAAC,SAAS,GAAQ,OAAO,CAAC,SAAS,IAAS,IAAI,CAAC;IACvD,CAAC;IAED,YAAY;QACV,MAAM,GAAG,GAA4B;YACnC,GAAG,EAAO,IAAI,CAAC,GAAG;YAClB,OAAO,EAAG,IAAI,CAAC,MAAM;YACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC;QACF,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI;YAAE,GAAG,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;QACpF,2EAA2E;QAC3E,oFAAoF;QACpF,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM;QACJ,MAAM,GAAG,GAA4B,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;QAC3F,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI;YAAE,GAAG,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC;QACnE,IAAI,IAAI,CAAC,SAAS,KAAM,IAAI;YAAE,GAAG,CAAC,YAAY,CAAC,GAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;QACvE,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,IAA6B;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACpC,MAAM,cAAc,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACrF,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;QACpC,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAE,QAAqB,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1E,OAAO,IAAI,UAAU,CACnB,IAAI,CAAC,KAAK,CAAiB,EAC3B,IAAI,CAAC,SAAS,CAAa,EAC3B,IAAI,CAAC,UAAU,CAAmB,EAClC,IAAI,CAAC,WAAW,CAAW,EAC3B;YACE,cAAc;YACd,UAAU,EAAG,IAAI,CAAC,aAAa,CAAwB,IAAI,IAAI;YAC/D,SAAS;SACV,CACF,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,UAAU;IAKH;IACA;IACA;IACA;IACA;IART,SAAS,GAAO,SAAS,CAAC,KAAK,CAAC;IAChC,aAAa,GAAG,YAAY,CAAC,OAAO,CAAC;IAE9C,YACkB,SAAkB,EAClB,UAAkB,EAClB,MAA6B,EAC7B,SAAkB,EAClB,SAAkB;QAJlB,cAAS,GAAT,SAAS,CAAS;QAClB,eAAU,GAAV,UAAU,CAAQ;QAClB,WAAM,GAAN,MAAM,CAAuB;QAC7B,cAAS,GAAT,SAAS,CAAS;QAClB,cAAS,GAAT,SAAS,CAAS;IACjC,CAAC;IAEJ,MAAM;QACJ,OAAO;YACL,UAAU,EAAG,IAAI,CAAC,SAAS;YAC3B,WAAW,EAAE,IAAI,CAAC,UAAU;YAC5B,MAAM,EAAO,IAAI,CAAC,MAAM;YACxB,UAAU,EAAG,IAAI,CAAC,SAAS;YAC3B,SAAS,EAAI,IAAI,CAAC,SAAS;SAC5B,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,IAA6B;QAC3C,OAAO,IAAI,UAAU,CACnB,IAAI,CAAC,YAAY,CAAY,EAC7B,IAAI,CAAC,aAAa,CAAW,EAC7B,IAAI,CAAC,QAAQ,CAAkB,EAC/B,IAAI,CAAC,YAAY,CAAY,EAC7B,IAAI,CAAC,WAAW,CAAa,CAC9B,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,WAAW;IAKJ;IACA;IACA;IANT,SAAS,GAAO,SAAS,CAAC,MAAM,CAAC;IACjC,aAAa,GAAG,YAAY,CAAC,OAAO,CAAC;IAE9C,YACkB,GAAiB,EACjB,MAAiB,EACjB,SAAkB;QAFlB,QAAG,GAAH,GAAG,CAAc;QACjB,WAAM,GAAN,MAAM,CAAW;QACjB,cAAS,GAAT,SAAS,CAAS;IACjC,CAAC;IAEJ,MAAM;QACJ,OAAO;YACL,GAAG,EAAS,IAAI,CAAC,GAAG;YACpB,MAAM,EAAM,IAAI,CAAC,MAAM,IAAQ,IAAI;YACnC,UAAU,EAAE,IAAI,CAAC,SAAS,IAAK,IAAI;SACpC,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,IAA6B;QAC3C,OAAO,IAAI,WAAW,CACpB,IAAI,CAAC,KAAK,CAAkB,EAC3B,IAAI,CAAC,QAAQ,CAAuB,IAAI,SAAS,EACjD,IAAI,CAAC,YAAY,CAAmB,IAAI,SAAS,CACnD,CAAC;IACJ,CAAC;CACF"}
File without changes
File without changes
File without changes
File without changes
@@ -1,4 +1,10 @@
1
1
  export * from "./frames.js";
2
2
  export * from "./identity.js";
3
3
  export { registerNipFrames } from "./registry.js";
4
+ export * from "./assurance-level.js";
5
+ export * from "./cert-format.js";
6
+ export * from "./error-codes.js";
7
+ export * from "./verifier.js";
8
+ export * as x509 from "./x509/index.js";
9
+ export * as acme from "./acme/index.js";
4
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/nip/index.ts"],"names":[],"mappings":"AAGA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/nip/index.ts"],"names":[],"mappings":"AAGA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGlD,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,iBAAiB,CAAC;AACxC,OAAO,KAAK,IAAI,MAAM,iBAAiB,CAAC"}
package/dist/nip/index.js CHANGED
@@ -3,4 +3,11 @@
3
3
  export * from "./frames.js";
4
4
  export * from "./identity.js";
5
5
  export { registerNipFrames } from "./registry.js";
6
+ // RFC-0002 / RFC-0003 — X.509 + ACME + dual-trust verifier
7
+ export * from "./assurance-level.js";
8
+ export * from "./cert-format.js";
9
+ export * from "./error-codes.js";
10
+ export * from "./verifier.js";
11
+ export * as x509 from "./x509/index.js";
12
+ export * as acme from "./acme/index.js";
6
13
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/nip/index.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,sCAAsC;AAEtC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/nip/index.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,sCAAsC;AAEtC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,2DAA2D;AAC3D,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,iBAAiB,CAAC;AACxC,OAAO,KAAK,IAAI,MAAM,iBAAiB,CAAC"}
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,23 @@
1
+ import type { X509Certificate } from "@peculiar/x509";
2
+ import { AssuranceLevel } from "./assurance-level.js";
3
+ import type { IdentFrame } from "./frames.js";
4
+ export interface NipVerifierOptions {
5
+ /** Map of issuer NID → CA public key string (`ed25519:<hex>`). */
6
+ trustedCaPublicKeys?: Readonly<Record<string, string>>;
7
+ /** X.509 trust anchors. Empty/undefined makes Step 3b reject v2 frames. */
8
+ trustedX509Roots?: readonly X509Certificate[];
9
+ /** Minimum required assurance level (NPS-RFC-0003). */
10
+ minAssuranceLevel?: AssuranceLevel;
11
+ }
12
+ export interface NipIdentVerifyResult {
13
+ valid: boolean;
14
+ stepFailed: number;
15
+ errorCode?: string;
16
+ message?: string;
17
+ }
18
+ export declare class NipIdentVerifier {
19
+ readonly options: NipVerifierOptions;
20
+ constructor(options: NipVerifierOptions);
21
+ verify(frame: IdentFrame, issuerNid: string): Promise<NipIdentVerifyResult>;
22
+ }
23
+ //# sourceMappingURL=verifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifier.d.ts","sourceRoot":"","sources":["../../src/nip/verifier.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAM9C,MAAM,WAAW,kBAAkB;IACjC,kEAAkE;IAClE,mBAAmB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACvD,2EAA2E;IAC3E,gBAAgB,CAAC,EAAK,SAAS,eAAe,EAAE,CAAC;IACjD,uDAAuD;IACvD,iBAAiB,CAAC,EAAI,cAAc,CAAC;CACtC;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAO,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAI,MAAM,CAAC;CACpB;AAQD,qBAAa,gBAAgB;aACC,OAAO,EAAE,kBAAkB;gBAA3B,OAAO,EAAE,kBAAkB;IAEjD,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;CAsDlF"}
@@ -0,0 +1,90 @@
1
+ // Copyright 2026 INNO LOTUS PTY LTD
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * NipIdentVerifier — Phase 1 dual-trust IdentFrame verifier per NPS-RFC-0002 §8.1.
5
+ *
6
+ * Steps:
7
+ * 1. v1 Ed25519 signature check against the issuer's CA public key.
8
+ * 2. Optional minimum assurance level check.
9
+ * 3b. X.509 chain validation (only if `cert_format === "v2-x509"` AND
10
+ * `trustedX509Roots` is configured).
11
+ */
12
+ import * as ed25519 from "@noble/ed25519";
13
+ import { sha512 } from "@noble/hashes/sha512";
14
+ import { AssuranceLevel } from "./assurance-level.js";
15
+ import * as cf from "./cert-format.js";
16
+ import * as ec from "./error-codes.js";
17
+ import { verify as verifyX509 } from "./x509/verifier.js";
18
+ // noble/ed25519 needs sha512 wired up.
19
+ ed25519.etc.sha512Sync = (...m) => sha512(ed25519.etc.concatBytes(...m));
20
+ function ok() { return { valid: true, stepFailed: 0 }; }
21
+ function fail(stepFailed, errorCode, message) {
22
+ return { valid: false, stepFailed, errorCode, message };
23
+ }
24
+ export class NipIdentVerifier {
25
+ options;
26
+ constructor(options) {
27
+ this.options = options;
28
+ }
29
+ async verify(frame, issuerNid) {
30
+ // Step 1: v1 Ed25519 signature check ────────────────────────────────
31
+ const caPubKeyStr = this.options.trustedCaPublicKeys?.[issuerNid];
32
+ if (caPubKeyStr === undefined) {
33
+ return fail(1, ec.CERT_UNTRUSTED_ISSUER, `no trusted CA public key for issuer: ${issuerNid}`);
34
+ }
35
+ if (!frame.signature?.startsWith("ed25519:")) {
36
+ return fail(1, ec.CERT_SIGNATURE_INVALID, "missing or malformed signature");
37
+ }
38
+ try {
39
+ const caPubBytes = parsePubKeyString(caPubKeyStr);
40
+ const sigBytes = Buffer.from(frame.signature.slice("ed25519:".length), "base64");
41
+ const canonical = canonicalJson(frame.unsignedDict());
42
+ const msg = new TextEncoder().encode(canonical);
43
+ if (!ed25519.verify(sigBytes, msg, caPubBytes)) {
44
+ return fail(1, ec.CERT_SIGNATURE_INVALID, "v1 Ed25519 signature did not verify against issuer CA key");
45
+ }
46
+ }
47
+ catch (e) {
48
+ return fail(1, ec.CERT_SIGNATURE_INVALID, `v1 signature verification error: ${e.message}`);
49
+ }
50
+ // Step 2: minimum assurance level ───────────────────────────────────
51
+ const minLevel = this.options.minAssuranceLevel;
52
+ if (minLevel !== undefined) {
53
+ const got = frame.assuranceLevel ?? AssuranceLevel.ANONYMOUS;
54
+ if (!got.meetsOrExceeds(minLevel)) {
55
+ return fail(2, ec.ASSURANCE_MISMATCH, `assurance_level (${got.wire}) below required minimum (${minLevel.wire})`);
56
+ }
57
+ }
58
+ // Step 3b: X.509 chain check (only if both opt-ins present) ──────────
59
+ const trustedRoots = this.options.trustedX509Roots ?? [];
60
+ const hasV2Trust = trustedRoots.length > 0;
61
+ const isV2Frame = frame.certFormat === cf.V2_X509;
62
+ if (hasV2Trust && isV2Frame) {
63
+ const x509Result = await verifyX509({
64
+ certChainBase64UrlDer: frame.certChain ?? [],
65
+ assertedNid: frame.nid,
66
+ assertedAssuranceLevel: frame.assuranceLevel,
67
+ trustedRootCerts: trustedRoots,
68
+ });
69
+ if (!x509Result.valid) {
70
+ return fail(3, x509Result.errorCode ?? ec.CERT_FORMAT_INVALID, x509Result.message ?? "X.509 chain validation failed");
71
+ }
72
+ }
73
+ return ok();
74
+ }
75
+ }
76
+ /**
77
+ * Canonical JSON matching NipIdentity.sign — top-level keys filtered/ordered
78
+ * via `Object.keys(payload).sort()` as JSON.stringify replacer.
79
+ */
80
+ function canonicalJson(payload) {
81
+ return JSON.stringify(payload, Object.keys(payload).sort());
82
+ }
83
+ /** Parse `ed25519:<hex>` into a 32-byte Uint8Array public key. */
84
+ function parsePubKeyString(s) {
85
+ if (!s.startsWith("ed25519:")) {
86
+ throw new Error(`Unsupported public key format: ${s}`);
87
+ }
88
+ return new Uint8Array(Buffer.from(s.slice("ed25519:".length), "hex"));
89
+ }
90
+ //# sourceMappingURL=verifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifier.js","sourceRoot":"","sources":["../../src/nip/verifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Issues NPS X.509 NID certificates per NPS-RFC-0002 §4.
3
+ *
4
+ * Backed by @peculiar/x509 + Web Crypto Ed25519 (Node 22+).
5
+ *
6
+ * Two factory functions:
7
+ * - {@link issueLeaf} — leaf cert with critical NPS EKU + SAN URI = NID + assurance-level extension.
8
+ * - {@link issueRoot} — self-signed root for testing / private-CA use.
9
+ */
10
+ import * as x509 from "@peculiar/x509";
11
+ import { AssuranceLevel } from "../assurance-level.js";
12
+ export type LeafRole = "agent" | "node";
13
+ export interface IssueLeafOptions {
14
+ subjectNid: string;
15
+ subjectPublicKey: CryptoKey;
16
+ caKeys: CryptoKeyPair;
17
+ issuerNid: string;
18
+ role: LeafRole;
19
+ assuranceLevel: AssuranceLevel;
20
+ notBefore: Date;
21
+ notAfter: Date;
22
+ serialNumber: string;
23
+ }
24
+ export interface IssueRootOptions {
25
+ caNid: string;
26
+ caKeys: CryptoKeyPair;
27
+ notBefore: Date;
28
+ notAfter: Date;
29
+ serialNumber: string;
30
+ }
31
+ /** Issue a leaf NPS NID certificate (RFC-0002 §4.1). */
32
+ export declare function issueLeaf(opts: IssueLeafOptions): Promise<x509.X509Certificate>;
33
+ /** Issue a self-signed CA root cert (testing / private CA). */
34
+ export declare function issueRoot(opts: IssueRootOptions): Promise<x509.X509Certificate>;
35
+ //# sourceMappingURL=builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../../src/nip/x509/builder.ts"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AAEH,OAAO,KAAK,IAAI,MAAM,gBAAgB,CAAC;AAEvC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAOvD,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AAExC,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAU,MAAM,CAAC;IAC3B,gBAAgB,EAAI,SAAS,CAAC;IAC9B,MAAM,EAAc,aAAa,CAAC;IAClC,SAAS,EAAW,MAAM,CAAC;IAC3B,IAAI,EAAgB,QAAQ,CAAC;IAC7B,cAAc,EAAM,cAAc,CAAC;IACnC,SAAS,EAAW,IAAI,CAAC;IACzB,QAAQ,EAAY,IAAI,CAAC;IACzB,YAAY,EAAQ,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAe,MAAM,CAAC;IAC3B,MAAM,EAAc,aAAa,CAAC;IAClC,SAAS,EAAW,IAAI,CAAC;IACzB,QAAQ,EAAY,IAAI,CAAC;IACzB,YAAY,EAAQ,MAAM,CAAC;CAC5B;AAED,wDAAwD;AACxD,wBAAsB,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAuBrF;AAED,+DAA+D;AAC/D,wBAAsB,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAcrF"}
@@ -0,0 +1,59 @@
1
+ // Copyright 2026 INNO LOTUS PTY LTD
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * Issues NPS X.509 NID certificates per NPS-RFC-0002 §4.
5
+ *
6
+ * Backed by @peculiar/x509 + Web Crypto Ed25519 (Node 22+).
7
+ *
8
+ * Two factory functions:
9
+ * - {@link issueLeaf} — leaf cert with critical NPS EKU + SAN URI = NID + assurance-level extension.
10
+ * - {@link issueRoot} — self-signed root for testing / private-CA use.
11
+ */
12
+ import * as x509 from "@peculiar/x509";
13
+ import { EKU_AGENT_IDENTITY, EKU_NODE_IDENTITY, NID_ASSURANCE_LEVEL } from "./oids.js";
14
+ // Initialize @peculiar/x509 cryptoProvider once on first import. Web Crypto
15
+ // (globalThis.crypto) supports Ed25519 in Node 18+.
16
+ x509.cryptoProvider.set(globalThis.crypto);
17
+ /** Issue a leaf NPS NID certificate (RFC-0002 §4.1). */
18
+ export async function issueLeaf(opts) {
19
+ const ekuOid = opts.role === "node" ? EKU_NODE_IDENTITY : EKU_AGENT_IDENTITY;
20
+ // ASN.1 ENUMERATED encoding of assurance level: tag=0x0A, len=0x01, value=<rank>.
21
+ const assuranceDer = new Uint8Array([0x0A, 0x01, opts.assuranceLevel.rank]);
22
+ return x509.X509CertificateGenerator.create({
23
+ serialNumber: opts.serialNumber,
24
+ issuer: `CN=${escapeDn(opts.issuerNid)}`,
25
+ subject: `CN=${escapeDn(opts.subjectNid)}`,
26
+ notBefore: opts.notBefore,
27
+ notAfter: opts.notAfter,
28
+ publicKey: opts.subjectPublicKey,
29
+ signingAlgorithm: { name: "Ed25519" },
30
+ signingKey: opts.caKeys.privateKey,
31
+ extensions: [
32
+ new x509.BasicConstraintsExtension(false, undefined, true),
33
+ new x509.KeyUsagesExtension(x509.KeyUsageFlags.digitalSignature, true),
34
+ new x509.ExtendedKeyUsageExtension([ekuOid], true),
35
+ new x509.SubjectAlternativeNameExtension([{ type: "url", value: opts.subjectNid }], false),
36
+ new x509.Extension(NID_ASSURANCE_LEVEL, false, assuranceDer),
37
+ ],
38
+ });
39
+ }
40
+ /** Issue a self-signed CA root cert (testing / private CA). */
41
+ export async function issueRoot(opts) {
42
+ return x509.X509CertificateGenerator.createSelfSigned({
43
+ serialNumber: opts.serialNumber,
44
+ name: `CN=${escapeDn(opts.caNid)}`,
45
+ notBefore: opts.notBefore,
46
+ notAfter: opts.notAfter,
47
+ signingAlgorithm: { name: "Ed25519" },
48
+ keys: opts.caKeys,
49
+ extensions: [
50
+ new x509.BasicConstraintsExtension(true, undefined, true),
51
+ new x509.KeyUsagesExtension(x509.KeyUsageFlags.keyCertSign | x509.KeyUsageFlags.cRLSign, true),
52
+ ],
53
+ });
54
+ }
55
+ function escapeDn(value) {
56
+ // Escape characters that have special meaning in RFC 4514 DN syntax.
57
+ return value.replace(/([",+;<>\\])/g, "\\$1");
58
+ }
59
+ //# sourceMappingURL=builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../../../src/nip/x509/builder.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,sCAAsC;AAEtC;;;;;;;;GAQG;AAEH,OAAO,KAAK,IAAI,MAAM,gBAAgB,CAAC;AAGvC,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEvF,4EAA4E;AAC5E,oDAAoD;AACpD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAwB3C,wDAAwD;AACxD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAsB;IACpD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,kBAAkB,CAAC;IAE7E,kFAAkF;IAClF,MAAM,YAAY,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;IAE5E,OAAO,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC;QAC1C,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,MAAM,EAAQ,MAAM,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;QAC9C,OAAO,EAAO,MAAM,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;QAC/C,SAAS,EAAK,IAAI,CAAC,SAAS;QAC5B,QAAQ,EAAM,IAAI,CAAC,QAAQ;QAC3B,SAAS,EAAK,IAAI,CAAC,gBAAgB;QACnC,gBAAgB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QACrC,UAAU,EAAI,IAAI,CAAC,MAAM,CAAC,UAAU;QACpC,UAAU,EAAE;YACV,IAAI,IAAI,CAAC,yBAAyB,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC;YAC1D,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC;YACtE,IAAI,IAAI,CAAC,yBAAyB,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC;YAClD,IAAI,IAAI,CAAC,+BAA+B,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,KAAK,CAAC;YAC1F,IAAI,IAAI,CAAC,SAAS,CAAC,mBAAmB,EAAE,KAAK,EAAE,YAAY,CAAC;SAC7D;KACF,CAAC,CAAC;AACL,CAAC;AAED,+DAA+D;AAC/D,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAsB;IACpD,OAAO,IAAI,CAAC,wBAAwB,CAAC,gBAAgB,CAAC;QACpD,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,IAAI,EAAU,MAAM,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;QAC1C,SAAS,EAAK,IAAI,CAAC,SAAS;QAC5B,QAAQ,EAAM,IAAI,CAAC,QAAQ;QAC3B,gBAAgB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QACrC,IAAI,EAAU,IAAI,CAAC,MAAM;QACzB,UAAU,EAAE;YACV,IAAI,IAAI,CAAC,yBAAyB,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC;YACzD,IAAI,IAAI,CAAC,kBAAkB,CACzB,IAAI,CAAC,aAAa,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC;SACrE;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa;IAC7B,qEAAqE;IACrE,OAAO,KAAK,CAAC,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from "./builder.js";
2
+ export * from "./oids.js";
3
+ export * from "./verifier.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/nip/x509/index.ts"],"names":[],"mappings":"AAGA,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC"}
@@ -0,0 +1,6 @@
1
+ // Copyright 2026 INNO LOTUS PTY LTD
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ export * from "./builder.js";
4
+ export * from "./oids.js";
5
+ export * from "./verifier.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/nip/x509/index.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,sCAAsC;AAEtC,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * OID constants for NPS X.509 certificates per NPS-RFC-0002 §4.
3
+ *
4
+ * The 1.3.6.1.4.1.99999 arc is provisional pending IANA Private Enterprise
5
+ * Number assignment (RFC-0002 §10 OQ-2). All implementations MUST update
6
+ * these constants when the official PEN is granted.
7
+ */
8
+ export declare const LAB_ACACIA_PEN_ARC = "1.3.6.1.4.1.99999";
9
+ export declare const EKU_ARC = "1.3.6.1.4.1.99999.1";
10
+ export declare const EXTENSION_ARC = "1.3.6.1.4.1.99999.2";
11
+ export declare const EKU_AGENT_IDENTITY = "1.3.6.1.4.1.99999.1.1";
12
+ export declare const EKU_NODE_IDENTITY = "1.3.6.1.4.1.99999.1.2";
13
+ export declare const EKU_CA_INTERMEDIATE_AGENT = "1.3.6.1.4.1.99999.1.3";
14
+ export declare const NID_ASSURANCE_LEVEL = "1.3.6.1.4.1.99999.2.1";
15
+ export declare const ED25519 = "1.3.101.112";
16
+ export declare const OID_EXTENDED_KEY_USAGE = "2.5.29.37";
17
+ //# sourceMappingURL=oids.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oids.d.ts","sourceRoot":"","sources":["../../../src/nip/x509/oids.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AAEH,eAAO,MAAM,kBAAkB,sBAAsB,CAAC;AACtD,eAAO,MAAM,OAAO,wBAAuC,CAAC;AAC5D,eAAO,MAAM,aAAa,wBAAiC,CAAC;AAG5D,eAAO,MAAM,kBAAkB,0BAAwB,CAAC;AACxD,eAAO,MAAM,iBAAiB,0BAAyB,CAAC;AACxD,eAAO,MAAM,yBAAyB,0BAAiB,CAAC;AAGxD,eAAO,MAAM,mBAAmB,0BAAuB,CAAC;AAGxD,eAAO,MAAM,OAAO,gBAAgB,CAAC;AAGrC,eAAO,MAAM,sBAAsB,cAAc,CAAC"}
@@ -0,0 +1,23 @@
1
+ // Copyright 2026 INNO LOTUS PTY LTD
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * OID constants for NPS X.509 certificates per NPS-RFC-0002 §4.
5
+ *
6
+ * The 1.3.6.1.4.1.99999 arc is provisional pending IANA Private Enterprise
7
+ * Number assignment (RFC-0002 §10 OQ-2). All implementations MUST update
8
+ * these constants when the official PEN is granted.
9
+ */
10
+ export const LAB_ACACIA_PEN_ARC = "1.3.6.1.4.1.99999";
11
+ export const EKU_ARC = `${LAB_ACACIA_PEN_ARC}.1`;
12
+ export const EXTENSION_ARC = `${LAB_ACACIA_PEN_ARC}.2`;
13
+ // ── EKUs (NPS-RFC-0002 §4.1) ─────────────────────────────────────────────────
14
+ export const EKU_AGENT_IDENTITY = `${EKU_ARC}.1`;
15
+ export const EKU_NODE_IDENTITY = `${EKU_ARC}.2`;
16
+ export const EKU_CA_INTERMEDIATE_AGENT = `${EKU_ARC}.3`;
17
+ // ── Custom extensions ────────────────────────────────────────────────────────
18
+ export const NID_ASSURANCE_LEVEL = `${EXTENSION_ARC}.1`;
19
+ // ── Ed25519 algorithm OID per RFC 8410 ───────────────────────────────────────
20
+ export const ED25519 = "1.3.101.112";
21
+ // ── Standard X.509 OIDs we reference ─────────────────────────────────────────
22
+ export const OID_EXTENDED_KEY_USAGE = "2.5.29.37";
23
+ //# sourceMappingURL=oids.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oids.js","sourceRoot":"","sources":["../../../src/nip/x509/oids.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,sCAAsC;AAEtC;;;;;;GAMG;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,mBAAmB,CAAC;AACtD,MAAM,CAAC,MAAM,OAAO,GAAc,GAAG,kBAAkB,IAAI,CAAC;AAC5D,MAAM,CAAC,MAAM,aAAa,GAAQ,GAAG,kBAAkB,IAAI,CAAC;AAE5D,gFAAgF;AAChF,MAAM,CAAC,MAAM,kBAAkB,GAAU,GAAG,OAAO,IAAI,CAAC;AACxD,MAAM,CAAC,MAAM,iBAAiB,GAAW,GAAG,OAAO,IAAI,CAAC;AACxD,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAG,OAAO,IAAI,CAAC;AAExD,gFAAgF;AAChF,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,aAAa,IAAI,CAAC;AAExD,gFAAgF;AAChF,MAAM,CAAC,MAAM,OAAO,GAAG,aAAa,CAAC;AAErC,gFAAgF;AAChF,MAAM,CAAC,MAAM,sBAAsB,GAAG,WAAW,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Verifies NPS X.509 NID certificate chains per NPS-RFC-0002 §4.
3
+ *
4
+ * Stages (RFC §4.6):
5
+ * 1. Decode chain (base64url DER → @peculiar/x509 X509Certificate).
6
+ * 2. Leaf EKU check — critical, contains agent-identity OR node-identity OID.
7
+ * 3. Subject CN / SAN URI match against asserted NID.
8
+ * 4. Assurance-level extension match against asserted level (if both present).
9
+ * 5. Chain signature verification — leaf → intermediates → trusted root.
10
+ */
11
+ import * as x509 from "@peculiar/x509";
12
+ import { AssuranceLevel } from "../assurance-level.js";
13
+ export interface NipX509VerifyResult {
14
+ valid: boolean;
15
+ errorCode?: string;
16
+ message?: string;
17
+ leaf?: x509.X509Certificate;
18
+ }
19
+ export interface VerifyOptions {
20
+ certChainBase64UrlDer: readonly string[];
21
+ assertedNid: string;
22
+ assertedAssuranceLevel: AssuranceLevel | null;
23
+ trustedRootCerts: readonly x509.X509Certificate[];
24
+ }
25
+ export declare function verify(opts: VerifyOptions): Promise<NipX509VerifyResult>;
26
+ //# sourceMappingURL=verifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifier.d.ts","sourceRoot":"","sources":["../../../src/nip/x509/verifier.ts"],"names":[],"mappings":"AAGA;;;;;;;;;GASG;AAEH,OAAO,KAAK,IAAI,MAAM,gBAAgB,CAAC;AAEvC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAWvD,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAQ,OAAO,CAAC;IACrB,SAAS,CAAC,EAAG,MAAM,CAAC;IACpB,OAAO,CAAC,EAAK,MAAM,CAAC;IACpB,IAAI,CAAC,EAAQ,IAAI,CAAC,eAAe,CAAC;CACnC;AAUD,MAAM,WAAW,aAAa;IAC5B,qBAAqB,EAAK,SAAS,MAAM,EAAE,CAAC;IAC5C,WAAW,EAAe,MAAM,CAAC;IACjC,sBAAsB,EAAI,cAAc,GAAG,IAAI,CAAC;IAChD,gBAAgB,EAAU,SAAS,IAAI,CAAC,eAAe,EAAE,CAAC;CAC3D;AAED,wBAAsB,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA+B9E"}