@labacacia/nps-sdk 1.0.0-alpha.3 → 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 (212) hide show
  1. package/CHANGELOG.cn.md +53 -0
  2. package/CHANGELOG.md +62 -0
  3. package/README.cn.md +8 -2
  4. package/README.md +8 -2
  5. package/dist/core/anchor-cache.js +104 -0
  6. package/dist/core/anchor-cache.js.map +1 -0
  7. package/dist/core/cache.js +80 -0
  8. package/dist/core/cache.js.map +1 -0
  9. package/dist/core/canonical-json.js +44 -0
  10. package/dist/core/canonical-json.js.map +1 -0
  11. package/dist/core/codec.js +119 -0
  12. package/dist/core/codec.js.map +1 -0
  13. package/dist/core/codecs/index.js +6 -0
  14. package/dist/core/codecs/index.js.map +1 -0
  15. package/dist/core/codecs/ncp-codec.js +93 -0
  16. package/dist/core/codecs/ncp-codec.js.map +1 -0
  17. package/dist/core/codecs/tier1-json-codec.js +28 -0
  18. package/dist/core/codecs/tier1-json-codec.js.map +1 -0
  19. package/dist/core/codecs/tier2-msgpack-codec.js +26 -0
  20. package/dist/core/codecs/tier2-msgpack-codec.js.map +1 -0
  21. package/dist/core/crypto-provider.js +10 -0
  22. package/dist/core/crypto-provider.js.map +1 -0
  23. package/dist/core/exceptions.js +52 -0
  24. package/dist/core/exceptions.js.map +1 -0
  25. package/dist/core/frame-header.js +185 -0
  26. package/dist/core/frame-header.js.map +1 -0
  27. package/dist/core/frame-registry.js +63 -0
  28. package/dist/core/frame-registry.js.map +1 -0
  29. package/dist/core/frames.js +154 -0
  30. package/dist/core/frames.js.map +1 -0
  31. package/dist/core/index.js +21 -405
  32. package/dist/core/index.js.map +1 -1
  33. package/dist/core/registry.js +17 -0
  34. package/dist/core/registry.js.map +1 -0
  35. package/dist/core/status-codes.js +38 -0
  36. package/dist/core/status-codes.js.map +1 -0
  37. package/dist/index.d.ts +1 -1
  38. package/dist/index.js +9 -5
  39. package/dist/index.js.map +1 -1
  40. package/dist/ncp/frames/anchor-frame.js +54 -0
  41. package/dist/ncp/frames/anchor-frame.js.map +1 -0
  42. package/dist/ncp/frames/caps-frame.js +29 -0
  43. package/dist/ncp/frames/caps-frame.js.map +1 -0
  44. package/dist/ncp/frames/diff-frame.js +37 -0
  45. package/dist/ncp/frames/diff-frame.js.map +1 -0
  46. package/dist/ncp/frames/error-frame.js +13 -0
  47. package/dist/ncp/frames/error-frame.js.map +1 -0
  48. package/dist/ncp/frames/hello-frame.js +25 -0
  49. package/dist/ncp/frames/hello-frame.js.map +1 -0
  50. package/dist/ncp/frames/stream-frame.js +18 -0
  51. package/dist/ncp/frames/stream-frame.js.map +1 -0
  52. package/dist/ncp/frames.js +192 -0
  53. package/dist/ncp/frames.js.map +1 -0
  54. package/dist/ncp/handshake.js +80 -0
  55. package/dist/ncp/handshake.js.map +1 -0
  56. package/dist/ncp/index.d.ts +1 -0
  57. package/dist/ncp/index.d.ts.map +1 -1
  58. package/dist/ncp/index.js +13 -368
  59. package/dist/ncp/index.js.map +1 -1
  60. package/dist/ncp/ncp-error-codes.d.ts +1 -0
  61. package/dist/ncp/ncp-error-codes.d.ts.map +1 -1
  62. package/dist/ncp/ncp-error-codes.js +34 -0
  63. package/dist/ncp/ncp-error-codes.js.map +1 -0
  64. package/dist/ncp/ncp-patch-format.js +13 -0
  65. package/dist/ncp/ncp-patch-format.js.map +1 -0
  66. package/dist/ncp/preamble.d.ts +47 -0
  67. package/dist/ncp/preamble.d.ts.map +1 -0
  68. package/dist/ncp/preamble.js +74 -0
  69. package/dist/ncp/preamble.js.map +1 -0
  70. package/dist/ncp/registry.js +13 -0
  71. package/dist/ncp/registry.js.map +1 -0
  72. package/dist/ncp/stream-manager.js +163 -0
  73. package/dist/ncp/stream-manager.js.map +1 -0
  74. package/dist/ndp/frames.js +87 -0
  75. package/dist/ndp/frames.js.map +1 -0
  76. package/dist/ndp/index.js +6 -223
  77. package/dist/ndp/index.js.map +1 -1
  78. package/dist/ndp/ndp-registry.js +79 -0
  79. package/dist/ndp/ndp-registry.js.map +1 -0
  80. package/dist/ndp/registry.js +10 -0
  81. package/dist/ndp/registry.js.map +1 -0
  82. package/dist/ndp/validator.js +48 -0
  83. package/dist/ndp/validator.js.map +1 -0
  84. package/dist/nip/acme/client.d.ts +31 -0
  85. package/dist/nip/acme/client.d.ts.map +1 -0
  86. package/dist/nip/acme/client.js +136 -0
  87. package/dist/nip/acme/client.js.map +1 -0
  88. package/dist/nip/acme/index.d.ts +6 -0
  89. package/dist/nip/acme/index.d.ts.map +1 -0
  90. package/dist/nip/acme/index.js +8 -0
  91. package/dist/nip/acme/index.js.map +1 -0
  92. package/dist/nip/acme/jws.d.ts +31 -0
  93. package/dist/nip/acme/jws.d.ts.map +1 -0
  94. package/dist/nip/acme/jws.js +76 -0
  95. package/dist/nip/acme/jws.js.map +1 -0
  96. package/dist/nip/acme/messages.d.ts +71 -0
  97. package/dist/nip/acme/messages.d.ts.map +1 -0
  98. package/dist/nip/acme/messages.js +4 -0
  99. package/dist/nip/acme/messages.js.map +1 -0
  100. package/dist/nip/acme/server.d.ts +41 -0
  101. package/dist/nip/acme/server.d.ts.map +1 -0
  102. package/dist/nip/acme/server.js +458 -0
  103. package/dist/nip/acme/server.js.map +1 -0
  104. package/dist/nip/acme/wire.d.ts +19 -0
  105. package/dist/nip/acme/wire.d.ts.map +1 -0
  106. package/dist/nip/acme/wire.js +21 -0
  107. package/dist/nip/acme/wire.js.map +1 -0
  108. package/dist/nip/assurance-level.d.ts +14 -0
  109. package/dist/nip/assurance-level.d.ts.map +1 -0
  110. package/dist/nip/assurance-level.js +33 -0
  111. package/dist/nip/assurance-level.js.map +1 -0
  112. package/dist/nip/cert-format.d.ts +5 -0
  113. package/dist/nip/cert-format.d.ts.map +1 -0
  114. package/dist/nip/cert-format.js +6 -0
  115. package/dist/nip/cert-format.js.map +1 -0
  116. package/dist/nip/error-codes.d.ts +23 -0
  117. package/dist/nip/error-codes.d.ts.map +1 -0
  118. package/dist/nip/error-codes.js +30 -0
  119. package/dist/nip/error-codes.js.map +1 -0
  120. package/dist/nip/frames.d.ts +10 -1
  121. package/dist/nip/frames.d.ts.map +1 -1
  122. package/dist/nip/frames.js +106 -0
  123. package/dist/nip/frames.js.map +1 -0
  124. package/dist/nip/identity.js +94 -0
  125. package/dist/nip/identity.js.map +1 -0
  126. package/dist/nip/index.d.ts +6 -0
  127. package/dist/nip/index.d.ts.map +1 -1
  128. package/dist/nip/index.js +12 -187
  129. package/dist/nip/index.js.map +1 -1
  130. package/dist/nip/registry.js +10 -0
  131. package/dist/nip/registry.js.map +1 -0
  132. package/dist/nip/verifier.d.ts +23 -0
  133. package/dist/nip/verifier.d.ts.map +1 -0
  134. package/dist/nip/verifier.js +90 -0
  135. package/dist/nip/verifier.js.map +1 -0
  136. package/dist/nip/x509/builder.d.ts +35 -0
  137. package/dist/nip/x509/builder.d.ts.map +1 -0
  138. package/dist/nip/x509/builder.js +59 -0
  139. package/dist/nip/x509/builder.js.map +1 -0
  140. package/dist/nip/x509/index.d.ts +4 -0
  141. package/dist/nip/x509/index.d.ts.map +1 -0
  142. package/dist/nip/x509/index.js +6 -0
  143. package/dist/nip/x509/index.js.map +1 -0
  144. package/dist/nip/x509/oids.d.ts +17 -0
  145. package/dist/nip/x509/oids.d.ts.map +1 -0
  146. package/dist/nip/x509/oids.js +23 -0
  147. package/dist/nip/x509/oids.js.map +1 -0
  148. package/dist/nip/x509/verifier.d.ts +26 -0
  149. package/dist/nip/x509/verifier.d.ts.map +1 -0
  150. package/dist/nip/x509/verifier.js +171 -0
  151. package/dist/nip/x509/verifier.js.map +1 -0
  152. package/dist/nop/client.js +90 -0
  153. package/dist/nop/client.js.map +1 -0
  154. package/dist/nop/frames.js +148 -0
  155. package/dist/nop/frames.js.map +1 -0
  156. package/dist/nop/index.js +6 -789
  157. package/dist/nop/index.js.map +1 -1
  158. package/dist/nop/models.js +50 -0
  159. package/dist/nop/models.js.map +1 -0
  160. package/dist/nop/nop-types.js +44 -0
  161. package/dist/nop/nop-types.js.map +1 -0
  162. package/dist/nop/registry.js +11 -0
  163. package/dist/nop/registry.js.map +1 -0
  164. package/dist/nwp/client.js +101 -0
  165. package/dist/nwp/client.js.map +1 -0
  166. package/dist/nwp/frames.js +81 -0
  167. package/dist/nwp/frames.js.map +1 -0
  168. package/dist/nwp/index.js +5 -693
  169. package/dist/nwp/index.js.map +1 -1
  170. package/dist/nwp/registry.js +9 -0
  171. package/dist/nwp/registry.js.map +1 -0
  172. package/dist/setup.js +29 -0
  173. package/dist/setup.js.map +1 -0
  174. package/package.json +2 -1
  175. package/src/index.ts +1 -1
  176. package/src/ncp/index.ts +1 -0
  177. package/src/ncp/ncp-error-codes.ts +2 -0
  178. package/src/ncp/preamble.ts +79 -0
  179. package/src/nip/acme/client.ts +185 -0
  180. package/src/nip/acme/index.ts +8 -0
  181. package/src/nip/acme/jws.ts +109 -0
  182. package/src/nip/acme/messages.ts +85 -0
  183. package/src/nip/acme/server.ts +480 -0
  184. package/src/nip/acme/wire.ts +24 -0
  185. package/src/nip/assurance-level.ts +35 -0
  186. package/src/nip/cert-format.ts +9 -0
  187. package/src/nip/error-codes.ts +36 -0
  188. package/src/nip/frames.ts +35 -3
  189. package/src/nip/index.ts +8 -0
  190. package/src/nip/verifier.ts +122 -0
  191. package/src/nip/x509/builder.ts +91 -0
  192. package/src/nip/x509/index.ts +6 -0
  193. package/src/nip/x509/oids.ts +28 -0
  194. package/src/nip/x509/verifier.ts +214 -0
  195. package/tests/_rfc0002-keys.ts +57 -0
  196. package/tests/ncp/preamble.test.ts +93 -0
  197. package/tests/nip-acme-agent01.test.ts +192 -0
  198. package/tests/nip-x509.test.ts +280 -0
  199. package/dist/core/index.cjs +0 -452
  200. package/dist/core/index.cjs.map +0 -1
  201. package/dist/index.cjs +0 -8
  202. package/dist/index.cjs.map +0 -1
  203. package/dist/ncp/index.cjs +0 -388
  204. package/dist/ncp/index.cjs.map +0 -1
  205. package/dist/ndp/index.cjs +0 -252
  206. package/dist/ndp/index.cjs.map +0 -1
  207. package/dist/nip/index.cjs +0 -214
  208. package/dist/nip/index.cjs.map +0 -1
  209. package/dist/nop/index.cjs +0 -823
  210. package/dist/nop/index.cjs.map +0 -1
  211. package/dist/nwp/index.cjs +0 -720
  212. package/dist/nwp/index.cjs.map +0 -1
@@ -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"}
@@ -0,0 +1,106 @@
1
+ // Copyright 2026 INNO LOTUS PTY LTD
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { EncodingTier, FrameType } from "../core/frames.js";
4
+ import { AssuranceLevel } from "./assurance-level.js";
5
+ export class IdentFrame {
6
+ nid;
7
+ pubKey;
8
+ metadata;
9
+ signature;
10
+ frameType = FrameType.IDENT;
11
+ preferredTier = EncodingTier.MSGPACK;
12
+ assuranceLevel;
13
+ certFormat;
14
+ certChain;
15
+ constructor(nid, pubKey, metadata, signature, options = {}) {
16
+ this.nid = nid;
17
+ this.pubKey = pubKey;
18
+ this.metadata = metadata;
19
+ this.signature = signature;
20
+ this.assuranceLevel = options.assuranceLevel ?? null;
21
+ this.certFormat = options.certFormat ?? null;
22
+ this.certChain = options.certChain ?? null;
23
+ }
24
+ unsignedDict() {
25
+ const out = {
26
+ nid: this.nid,
27
+ pub_key: this.pubKey,
28
+ metadata: this.metadata,
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;
35
+ }
36
+ toDict() {
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;
43
+ }
44
+ static fromDict(data) {
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
+ });
54
+ }
55
+ }
56
+ export class TrustFrame {
57
+ issuerNid;
58
+ subjectNid;
59
+ scopes;
60
+ expiresAt;
61
+ signature;
62
+ frameType = FrameType.TRUST;
63
+ preferredTier = EncodingTier.MSGPACK;
64
+ constructor(issuerNid, subjectNid, scopes, expiresAt, signature) {
65
+ this.issuerNid = issuerNid;
66
+ this.subjectNid = subjectNid;
67
+ this.scopes = scopes;
68
+ this.expiresAt = expiresAt;
69
+ this.signature = signature;
70
+ }
71
+ toDict() {
72
+ return {
73
+ issuer_nid: this.issuerNid,
74
+ subject_nid: this.subjectNid,
75
+ scopes: this.scopes,
76
+ expires_at: this.expiresAt,
77
+ signature: this.signature,
78
+ };
79
+ }
80
+ static fromDict(data) {
81
+ return new TrustFrame(data["issuer_nid"], data["subject_nid"], data["scopes"], data["expires_at"], data["signature"]);
82
+ }
83
+ }
84
+ export class RevokeFrame {
85
+ nid;
86
+ reason;
87
+ revokedAt;
88
+ frameType = FrameType.REVOKE;
89
+ preferredTier = EncodingTier.MSGPACK;
90
+ constructor(nid, reason, revokedAt) {
91
+ this.nid = nid;
92
+ this.reason = reason;
93
+ this.revokedAt = revokedAt;
94
+ }
95
+ toDict() {
96
+ return {
97
+ nid: this.nid,
98
+ reason: this.reason ?? null,
99
+ revoked_at: this.revokedAt ?? null,
100
+ };
101
+ }
102
+ static fromDict(data) {
103
+ return new RevokeFrame(data["nid"], data["reason"] ?? undefined, data["revoked_at"] ?? undefined);
104
+ }
105
+ }
106
+ //# sourceMappingURL=frames.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frames.js","sourceRoot":"","sources":["../../src/nip/frames.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ // Copyright 2026 INNO LOTUS PTY LTD
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * NipIdentity — Ed25519 key management and signing for NPS NID identity.
5
+ * Uses @noble/ed25519 for signing; node:crypto for key storage encryption.
6
+ */
7
+ import * as ed25519 from "@noble/ed25519";
8
+ import { sha512 } from "@noble/hashes/sha512";
9
+ import { createCipheriv, createDecipheriv, pbkdf2Sync, randomBytes } from "node:crypto";
10
+ import { readFileSync, writeFileSync } from "node:fs";
11
+ // noble/ed25519 requires sha512 to be set explicitly in Node environments
12
+ ed25519.etc.sha512Sync = (...m) => sha512(ed25519.etc.concatBytes(...m));
13
+ const KEY_FILE_VERSION = 1;
14
+ const PBKDF2_ITERS = 600_000;
15
+ const SALT_BYTES = 16;
16
+ const IV_BYTES = 12;
17
+ const KEY_BYTES = 32;
18
+ export class NipIdentity {
19
+ _privKey;
20
+ pubKey;
21
+ constructor(_privKey, pubKey) {
22
+ this._privKey = _privKey;
23
+ this.pubKey = pubKey;
24
+ }
25
+ // ── Factory ───────────────────────────────────────────────────────────────
26
+ static generate() {
27
+ const priv = ed25519.utils.randomPrivateKey();
28
+ const pub = ed25519.getPublicKey(priv);
29
+ return new NipIdentity(priv, pub);
30
+ }
31
+ static fromPrivateKey(privKey) {
32
+ const pub = ed25519.getPublicKey(privKey);
33
+ return new NipIdentity(privKey, pub);
34
+ }
35
+ /** Load from an AES-256-GCM encrypted key file. */
36
+ static load(path, passphrase) {
37
+ const envelope = JSON.parse(readFileSync(path, "utf8"));
38
+ const salt = Buffer.from(envelope.salt, "hex");
39
+ const iv = Buffer.from(envelope.iv, "hex");
40
+ const ct = Buffer.from(envelope.ciphertext, "hex");
41
+ const dk = pbkdf2Sync(passphrase, salt, PBKDF2_ITERS, KEY_BYTES, "sha256");
42
+ const decipher = createDecipheriv("aes-256-gcm", dk, iv);
43
+ // Last 16 bytes of ciphertext are the GCM auth tag
44
+ const authTag = ct.slice(ct.length - 16);
45
+ const body = ct.slice(0, ct.length - 16);
46
+ decipher.setAuthTag(authTag);
47
+ const priv = Buffer.concat([decipher.update(body), decipher.final()]);
48
+ return NipIdentity.fromPrivateKey(new Uint8Array(priv));
49
+ }
50
+ /** Save to an AES-256-GCM encrypted key file. */
51
+ save(path, passphrase) {
52
+ const salt = randomBytes(SALT_BYTES);
53
+ const iv = randomBytes(IV_BYTES);
54
+ const dk = pbkdf2Sync(passphrase, salt, PBKDF2_ITERS, KEY_BYTES, "sha256");
55
+ const cipher = createCipheriv("aes-256-gcm", dk, iv);
56
+ const body = Buffer.concat([cipher.update(Buffer.from(this._privKey)), cipher.final()]);
57
+ const tag = cipher.getAuthTag();
58
+ const envelope = {
59
+ version: KEY_FILE_VERSION,
60
+ salt: salt.toString("hex"),
61
+ iv: iv.toString("hex"),
62
+ ciphertext: Buffer.concat([body, tag]).toString("hex"),
63
+ pubKey: Buffer.from(this.pubKey).toString("hex"),
64
+ };
65
+ writeFileSync(path, JSON.stringify(envelope, null, 2), "utf8");
66
+ }
67
+ // ── Signing ───────────────────────────────────────────────────────────────
68
+ /** Sign a dict payload. Returns `ed25519:<base64url>`. */
69
+ sign(payload) {
70
+ const canonical = JSON.stringify(payload, Object.keys(payload).sort());
71
+ const bytes = new TextEncoder().encode(canonical);
72
+ const sig = ed25519.sign(bytes, this._privKey);
73
+ return `ed25519:${Buffer.from(sig).toString("base64")}`;
74
+ }
75
+ /** Verify a signature string against a dict payload. */
76
+ verify(payload, signature) {
77
+ if (!signature.startsWith("ed25519:"))
78
+ return false;
79
+ try {
80
+ const canonical = JSON.stringify(payload, Object.keys(payload).sort());
81
+ const bytes = new TextEncoder().encode(canonical);
82
+ const sigBytes = Buffer.from(signature.slice("ed25519:".length), "base64");
83
+ return ed25519.verify(sigBytes, bytes, this.pubKey);
84
+ }
85
+ catch {
86
+ return false;
87
+ }
88
+ }
89
+ /** Public key as `ed25519:<hex>` string. */
90
+ get pubKeyString() {
91
+ return `ed25519:${Buffer.from(this.pubKey).toString("hex")}`;
92
+ }
93
+ }
94
+ //# sourceMappingURL=identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/nip/identity.ts"],"names":[],"mappings":"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"}
@@ -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
@@ -1,188 +1,13 @@
1
- import * as ed25519 from '@noble/ed25519';
2
- import { sha512 } from '@noble/hashes/sha512';
3
- import { pbkdf2Sync, createDecipheriv, randomBytes, createCipheriv } from 'crypto';
4
- import { readFileSync, writeFileSync } from 'fs';
5
-
6
- // src/nip/frames.ts
7
- var IdentFrame = class _IdentFrame {
8
- constructor(nid, pubKey, metadata, signature) {
9
- this.nid = nid;
10
- this.pubKey = pubKey;
11
- this.metadata = metadata;
12
- this.signature = signature;
13
- }
14
- nid;
15
- pubKey;
16
- metadata;
17
- signature;
18
- frameType = 32 /* IDENT */;
19
- preferredTier = 1 /* MSGPACK */;
20
- unsignedDict() {
21
- return {
22
- nid: this.nid,
23
- pub_key: this.pubKey,
24
- metadata: this.metadata
25
- };
26
- }
27
- toDict() {
28
- return { ...this.unsignedDict(), signature: this.signature };
29
- }
30
- static fromDict(data) {
31
- return new _IdentFrame(
32
- data["nid"],
33
- data["pub_key"],
34
- data["metadata"],
35
- data["signature"]
36
- );
37
- }
38
- };
39
- var TrustFrame = class _TrustFrame {
40
- constructor(issuerNid, subjectNid, scopes, expiresAt, signature) {
41
- this.issuerNid = issuerNid;
42
- this.subjectNid = subjectNid;
43
- this.scopes = scopes;
44
- this.expiresAt = expiresAt;
45
- this.signature = signature;
46
- }
47
- issuerNid;
48
- subjectNid;
49
- scopes;
50
- expiresAt;
51
- signature;
52
- frameType = 33 /* TRUST */;
53
- preferredTier = 1 /* MSGPACK */;
54
- toDict() {
55
- return {
56
- issuer_nid: this.issuerNid,
57
- subject_nid: this.subjectNid,
58
- scopes: this.scopes,
59
- expires_at: this.expiresAt,
60
- signature: this.signature
61
- };
62
- }
63
- static fromDict(data) {
64
- return new _TrustFrame(
65
- data["issuer_nid"],
66
- data["subject_nid"],
67
- data["scopes"],
68
- data["expires_at"],
69
- data["signature"]
70
- );
71
- }
72
- };
73
- var RevokeFrame = class _RevokeFrame {
74
- constructor(nid, reason, revokedAt) {
75
- this.nid = nid;
76
- this.reason = reason;
77
- this.revokedAt = revokedAt;
78
- }
79
- nid;
80
- reason;
81
- revokedAt;
82
- frameType = 34 /* REVOKE */;
83
- preferredTier = 1 /* MSGPACK */;
84
- toDict() {
85
- return {
86
- nid: this.nid,
87
- reason: this.reason ?? null,
88
- revoked_at: this.revokedAt ?? null
89
- };
90
- }
91
- static fromDict(data) {
92
- return new _RevokeFrame(
93
- data["nid"],
94
- data["reason"] ?? void 0,
95
- data["revoked_at"] ?? void 0
96
- );
97
- }
98
- };
99
- ed25519.etc.sha512Sync = (...m) => sha512(ed25519.etc.concatBytes(...m));
100
- var KEY_FILE_VERSION = 1;
101
- var PBKDF2_ITERS = 6e5;
102
- var SALT_BYTES = 16;
103
- var IV_BYTES = 12;
104
- var KEY_BYTES = 32;
105
- var NipIdentity = class _NipIdentity {
106
- constructor(_privKey, pubKey) {
107
- this._privKey = _privKey;
108
- this.pubKey = pubKey;
109
- }
110
- _privKey;
111
- pubKey;
112
- // ── Factory ───────────────────────────────────────────────────────────────
113
- static generate() {
114
- const priv = ed25519.utils.randomPrivateKey();
115
- const pub = ed25519.getPublicKey(priv);
116
- return new _NipIdentity(priv, pub);
117
- }
118
- static fromPrivateKey(privKey) {
119
- const pub = ed25519.getPublicKey(privKey);
120
- return new _NipIdentity(privKey, pub);
121
- }
122
- /** Load from an AES-256-GCM encrypted key file. */
123
- static load(path, passphrase) {
124
- const envelope = JSON.parse(readFileSync(path, "utf8"));
125
- const salt = Buffer.from(envelope.salt, "hex");
126
- const iv = Buffer.from(envelope.iv, "hex");
127
- const ct = Buffer.from(envelope.ciphertext, "hex");
128
- const dk = pbkdf2Sync(passphrase, salt, PBKDF2_ITERS, KEY_BYTES, "sha256");
129
- const decipher = createDecipheriv("aes-256-gcm", dk, iv);
130
- const authTag = ct.slice(ct.length - 16);
131
- const body = ct.slice(0, ct.length - 16);
132
- decipher.setAuthTag(authTag);
133
- const priv = Buffer.concat([decipher.update(body), decipher.final()]);
134
- return _NipIdentity.fromPrivateKey(new Uint8Array(priv));
135
- }
136
- /** Save to an AES-256-GCM encrypted key file. */
137
- save(path, passphrase) {
138
- const salt = randomBytes(SALT_BYTES);
139
- const iv = randomBytes(IV_BYTES);
140
- const dk = pbkdf2Sync(passphrase, salt, PBKDF2_ITERS, KEY_BYTES, "sha256");
141
- const cipher = createCipheriv("aes-256-gcm", dk, iv);
142
- const body = Buffer.concat([cipher.update(Buffer.from(this._privKey)), cipher.final()]);
143
- const tag = cipher.getAuthTag();
144
- const envelope = {
145
- version: KEY_FILE_VERSION,
146
- salt: salt.toString("hex"),
147
- iv: iv.toString("hex"),
148
- ciphertext: Buffer.concat([body, tag]).toString("hex"),
149
- pubKey: Buffer.from(this.pubKey).toString("hex")
150
- };
151
- writeFileSync(path, JSON.stringify(envelope, null, 2), "utf8");
152
- }
153
- // ── Signing ───────────────────────────────────────────────────────────────
154
- /** Sign a dict payload. Returns `ed25519:<base64url>`. */
155
- sign(payload) {
156
- const canonical = JSON.stringify(payload, Object.keys(payload).sort());
157
- const bytes = new TextEncoder().encode(canonical);
158
- const sig = ed25519.sign(bytes, this._privKey);
159
- return `ed25519:${Buffer.from(sig).toString("base64")}`;
160
- }
161
- /** Verify a signature string against a dict payload. */
162
- verify(payload, signature) {
163
- if (!signature.startsWith("ed25519:")) return false;
164
- try {
165
- const canonical = JSON.stringify(payload, Object.keys(payload).sort());
166
- const bytes = new TextEncoder().encode(canonical);
167
- const sigBytes = Buffer.from(signature.slice("ed25519:".length), "base64");
168
- return ed25519.verify(sigBytes, bytes, this.pubKey);
169
- } catch {
170
- return false;
171
- }
172
- }
173
- /** Public key as `ed25519:<hex>` string. */
174
- get pubKeyString() {
175
- return `ed25519:${Buffer.from(this.pubKey).toString("hex")}`;
176
- }
177
- };
178
-
179
- // src/nip/registry.ts
180
- function registerNipFrames(registry) {
181
- registry.register(32 /* IDENT */, IdentFrame);
182
- registry.register(33 /* TRUST */, TrustFrame);
183
- registry.register(34 /* REVOKE */, RevokeFrame);
184
- }
185
-
186
- export { IdentFrame, NipIdentity, RevokeFrame, TrustFrame, registerNipFrames };
187
- //# sourceMappingURL=index.js.map
1
+ // Copyright 2026 INNO LOTUS PTY LTD
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ export * from "./frames.js";
4
+ export * from "./identity.js";
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";
188
13
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/nip/frames.ts","../../src/nip/identity.ts","../../src/nip/registry.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["// Copyright 2026 INNO LOTUS PTY LTD\n// SPDX-License-Identifier: Apache-2.0\n\nimport { EncodingTier, FrameType } from \"../core/frames.js\";\nimport type { NpsFrame } from \"../core/codec.js\";\n\nexport interface IdentMetadata {\n issuer: string;\n issuedAt: string;\n expiresAt?: string;\n capabilities?: readonly string[];\n scopes?: readonly string[];\n}\n\nexport class IdentFrame implements NpsFrame {\n readonly frameType = FrameType.IDENT;\n readonly preferredTier = EncodingTier.MSGPACK;\n\n constructor(\n public readonly nid: string,\n public readonly pubKey: string,\n public readonly metadata: IdentMetadata,\n public readonly signature: string,\n ) {}\n\n unsignedDict(): Record<string, unknown> {\n return {\n nid: this.nid,\n pub_key: this.pubKey,\n metadata: this.metadata,\n };\n }\n\n toDict(): Record<string, unknown> {\n return { ...this.unsignedDict(), signature: this.signature };\n }\n\n static fromDict(data: Record<string, unknown>): IdentFrame {\n return new IdentFrame(\n data[\"nid\"] as string,\n data[\"pub_key\"] as string,\n data[\"metadata\"] as IdentMetadata,\n data[\"signature\"] as string,\n );\n }\n}\n\nexport class TrustFrame implements NpsFrame {\n readonly frameType = FrameType.TRUST;\n readonly preferredTier = EncodingTier.MSGPACK;\n\n constructor(\n public readonly issuerNid: string,\n public readonly subjectNid: string,\n public readonly scopes: readonly string[],\n public readonly expiresAt: string,\n public readonly signature: string,\n ) {}\n\n toDict(): Record<string, unknown> {\n return {\n issuer_nid: this.issuerNid,\n subject_nid: this.subjectNid,\n scopes: this.scopes,\n expires_at: this.expiresAt,\n signature: this.signature,\n };\n }\n\n static fromDict(data: Record<string, unknown>): TrustFrame {\n return new TrustFrame(\n data[\"issuer_nid\"] as string,\n data[\"subject_nid\"] as string,\n data[\"scopes\"] as string[],\n data[\"expires_at\"] as string,\n data[\"signature\"] as string,\n );\n }\n}\n\nexport class RevokeFrame implements NpsFrame {\n readonly frameType = FrameType.REVOKE;\n readonly preferredTier = EncodingTier.MSGPACK;\n\n constructor(\n public readonly nid: string,\n public readonly reason?: string,\n public readonly revokedAt?: string,\n ) {}\n\n toDict(): Record<string, unknown> {\n return {\n nid: this.nid,\n reason: this.reason ?? null,\n revoked_at: this.revokedAt ?? null,\n };\n }\n\n static fromDict(data: Record<string, unknown>): RevokeFrame {\n return new RevokeFrame(\n data[\"nid\"] as string,\n (data[\"reason\"] as string | null) ?? undefined,\n (data[\"revoked_at\"] as string | null) ?? undefined,\n );\n }\n}\n","// Copyright 2026 INNO LOTUS PTY LTD\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * NipIdentity — Ed25519 key management and signing for NPS NID identity.\n * Uses @noble/ed25519 for signing; node:crypto for key storage encryption.\n */\n\nimport * as ed25519 from \"@noble/ed25519\";\nimport { sha512 } from \"@noble/hashes/sha512\";\nimport { createCipheriv, createDecipheriv, pbkdf2Sync, randomBytes } from \"node:crypto\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\n\n// noble/ed25519 requires sha512 to be set explicitly in Node environments\ned25519.etc.sha512Sync = (...m) => sha512(ed25519.etc.concatBytes(...m));\n\nconst KEY_FILE_VERSION = 1;\nconst PBKDF2_ITERS = 600_000;\nconst SALT_BYTES = 16;\nconst IV_BYTES = 12;\nconst KEY_BYTES = 32;\n\ninterface KeyFileEnvelope {\n version: number;\n salt: string; // hex\n iv: string; // hex\n ciphertext: string; // hex\n pubKey: string; // hex\n}\n\nexport class NipIdentity {\n private constructor(\n private readonly _privKey: Uint8Array,\n public readonly pubKey: Uint8Array,\n ) {}\n\n // ── Factory ───────────────────────────────────────────────────────────────\n\n static generate(): NipIdentity {\n const priv = ed25519.utils.randomPrivateKey();\n const pub = ed25519.getPublicKey(priv);\n return new NipIdentity(priv, pub);\n }\n\n static fromPrivateKey(privKey: Uint8Array): NipIdentity {\n const pub = ed25519.getPublicKey(privKey);\n return new NipIdentity(privKey, pub);\n }\n\n /** Load from an AES-256-GCM encrypted key file. */\n static load(path: string, passphrase: string): NipIdentity {\n const envelope = JSON.parse(readFileSync(path, \"utf8\")) as KeyFileEnvelope;\n const salt = Buffer.from(envelope.salt, \"hex\");\n const iv = Buffer.from(envelope.iv, \"hex\");\n const ct = Buffer.from(envelope.ciphertext, \"hex\");\n\n const dk = pbkdf2Sync(passphrase, salt, PBKDF2_ITERS, KEY_BYTES, \"sha256\");\n const decipher = createDecipheriv(\"aes-256-gcm\", dk, iv);\n // Last 16 bytes of ciphertext are the GCM auth tag\n const authTag = ct.slice(ct.length - 16);\n const body = ct.slice(0, ct.length - 16);\n (decipher as ReturnType<typeof createDecipheriv> & { setAuthTag(tag: Buffer): void }).setAuthTag(authTag);\n const priv = Buffer.concat([decipher.update(body), decipher.final()]);\n return NipIdentity.fromPrivateKey(new Uint8Array(priv));\n }\n\n /** Save to an AES-256-GCM encrypted key file. */\n save(path: string, passphrase: string): void {\n const salt = randomBytes(SALT_BYTES);\n const iv = randomBytes(IV_BYTES);\n const dk = pbkdf2Sync(passphrase, salt, PBKDF2_ITERS, KEY_BYTES, \"sha256\");\n const cipher = createCipheriv(\"aes-256-gcm\", dk, iv);\n const body = Buffer.concat([cipher.update(Buffer.from(this._privKey)), cipher.final()]);\n const tag = (cipher as ReturnType<typeof createCipheriv> & { getAuthTag(): Buffer }).getAuthTag();\n\n const envelope: KeyFileEnvelope = {\n version: KEY_FILE_VERSION,\n salt: salt.toString(\"hex\"),\n iv: iv.toString(\"hex\"),\n ciphertext: Buffer.concat([body, tag]).toString(\"hex\"),\n pubKey: Buffer.from(this.pubKey).toString(\"hex\"),\n };\n writeFileSync(path, JSON.stringify(envelope, null, 2), \"utf8\");\n }\n\n // ── Signing ───────────────────────────────────────────────────────────────\n\n /** Sign a dict payload. Returns `ed25519:<base64url>`. */\n sign(payload: Record<string, unknown>): string {\n const canonical = JSON.stringify(payload, Object.keys(payload).sort());\n const bytes = new TextEncoder().encode(canonical);\n const sig = ed25519.sign(bytes, this._privKey);\n return `ed25519:${Buffer.from(sig).toString(\"base64\")}`;\n }\n\n /** Verify a signature string against a dict payload. */\n verify(payload: Record<string, unknown>, signature: string): boolean {\n if (!signature.startsWith(\"ed25519:\")) return false;\n try {\n const canonical = JSON.stringify(payload, Object.keys(payload).sort());\n const bytes = new TextEncoder().encode(canonical);\n const sigBytes = Buffer.from(signature.slice(\"ed25519:\".length), \"base64\");\n return ed25519.verify(sigBytes, bytes, this.pubKey);\n } catch {\n return false;\n }\n }\n\n /** Public key as `ed25519:<hex>` string. */\n get pubKeyString(): string {\n return `ed25519:${Buffer.from(this.pubKey).toString(\"hex\")}`;\n }\n}\n","// Copyright 2026 INNO LOTUS PTY LTD\n// SPDX-License-Identifier: Apache-2.0\n\nimport { FrameRegistry } from \"../core/registry.js\";\nimport { FrameType } from \"../core/frames.js\";\nimport { IdentFrame, TrustFrame, RevokeFrame } from \"./frames.js\";\n\nexport function registerNipFrames(registry: FrameRegistry): void {\n registry.register(FrameType.IDENT, IdentFrame);\n registry.register(FrameType.TRUST, TrustFrame);\n registry.register(FrameType.REVOKE, RevokeFrame);\n}\n"]}
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"}
@@ -0,0 +1,10 @@
1
+ // Copyright 2026 INNO LOTUS PTY LTD
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { FrameType } from "../core/frames.js";
4
+ import { IdentFrame, TrustFrame, RevokeFrame } from "./frames.js";
5
+ export function registerNipFrames(registry) {
6
+ registry.register(FrameType.IDENT, IdentFrame);
7
+ registry.register(FrameType.TRUST, TrustFrame);
8
+ registry.register(FrameType.REVOKE, RevokeFrame);
9
+ }
10
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/nip/registry.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,sCAAsC;AAGtC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAElE,MAAM,UAAU,iBAAiB,CAAC,QAAuB;IACvD,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAG,UAAU,CAAC,CAAC;IAChD,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAG,UAAU,CAAC,CAAC;IAChD,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AACnD,CAAC"}
@@ -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"}