@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.
- package/CHANGELOG.cn.md +53 -0
- package/CHANGELOG.md +62 -0
- package/README.cn.md +8 -2
- package/README.md +8 -2
- package/dist/core/anchor-cache.js +104 -0
- package/dist/core/anchor-cache.js.map +1 -0
- package/dist/core/cache.js +80 -0
- package/dist/core/cache.js.map +1 -0
- package/dist/core/canonical-json.js +44 -0
- package/dist/core/canonical-json.js.map +1 -0
- package/dist/core/codec.js +119 -0
- package/dist/core/codec.js.map +1 -0
- package/dist/core/codecs/index.js +6 -0
- package/dist/core/codecs/index.js.map +1 -0
- package/dist/core/codecs/ncp-codec.js +93 -0
- package/dist/core/codecs/ncp-codec.js.map +1 -0
- package/dist/core/codecs/tier1-json-codec.js +28 -0
- package/dist/core/codecs/tier1-json-codec.js.map +1 -0
- package/dist/core/codecs/tier2-msgpack-codec.js +26 -0
- package/dist/core/codecs/tier2-msgpack-codec.js.map +1 -0
- package/dist/core/crypto-provider.js +10 -0
- package/dist/core/crypto-provider.js.map +1 -0
- package/dist/core/exceptions.js +52 -0
- package/dist/core/exceptions.js.map +1 -0
- package/dist/core/frame-header.js +185 -0
- package/dist/core/frame-header.js.map +1 -0
- package/dist/core/frame-registry.js +63 -0
- package/dist/core/frame-registry.js.map +1 -0
- package/dist/core/frames.js +154 -0
- package/dist/core/frames.js.map +1 -0
- package/dist/core/index.js +21 -405
- package/dist/core/index.js.map +1 -1
- package/dist/core/registry.js +17 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/status-codes.js +38 -0
- package/dist/core/status-codes.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +9 -5
- package/dist/index.js.map +1 -1
- package/dist/ncp/frames/anchor-frame.js +54 -0
- package/dist/ncp/frames/anchor-frame.js.map +1 -0
- package/dist/ncp/frames/caps-frame.js +29 -0
- package/dist/ncp/frames/caps-frame.js.map +1 -0
- package/dist/ncp/frames/diff-frame.js +37 -0
- package/dist/ncp/frames/diff-frame.js.map +1 -0
- package/dist/ncp/frames/error-frame.js +13 -0
- package/dist/ncp/frames/error-frame.js.map +1 -0
- package/dist/ncp/frames/hello-frame.js +25 -0
- package/dist/ncp/frames/hello-frame.js.map +1 -0
- package/dist/ncp/frames/stream-frame.js +18 -0
- package/dist/ncp/frames/stream-frame.js.map +1 -0
- package/dist/ncp/frames.js +192 -0
- package/dist/ncp/frames.js.map +1 -0
- package/dist/ncp/handshake.js +80 -0
- package/dist/ncp/handshake.js.map +1 -0
- package/dist/ncp/index.d.ts +1 -0
- package/dist/ncp/index.d.ts.map +1 -1
- package/dist/ncp/index.js +13 -368
- package/dist/ncp/index.js.map +1 -1
- package/dist/ncp/ncp-error-codes.d.ts +1 -0
- package/dist/ncp/ncp-error-codes.d.ts.map +1 -1
- package/dist/ncp/ncp-error-codes.js +34 -0
- package/dist/ncp/ncp-error-codes.js.map +1 -0
- package/dist/ncp/ncp-patch-format.js +13 -0
- package/dist/ncp/ncp-patch-format.js.map +1 -0
- package/dist/ncp/preamble.d.ts +47 -0
- package/dist/ncp/preamble.d.ts.map +1 -0
- package/dist/ncp/preamble.js +74 -0
- package/dist/ncp/preamble.js.map +1 -0
- package/dist/ncp/registry.js +13 -0
- package/dist/ncp/registry.js.map +1 -0
- package/dist/ncp/stream-manager.js +163 -0
- package/dist/ncp/stream-manager.js.map +1 -0
- package/dist/ndp/frames.js +87 -0
- package/dist/ndp/frames.js.map +1 -0
- package/dist/ndp/index.js +6 -223
- package/dist/ndp/index.js.map +1 -1
- package/dist/ndp/ndp-registry.js +79 -0
- package/dist/ndp/ndp-registry.js.map +1 -0
- package/dist/ndp/registry.js +10 -0
- package/dist/ndp/registry.js.map +1 -0
- package/dist/ndp/validator.js +48 -0
- package/dist/ndp/validator.js.map +1 -0
- package/dist/nip/acme/client.d.ts +31 -0
- package/dist/nip/acme/client.d.ts.map +1 -0
- package/dist/nip/acme/client.js +136 -0
- package/dist/nip/acme/client.js.map +1 -0
- package/dist/nip/acme/index.d.ts +6 -0
- package/dist/nip/acme/index.d.ts.map +1 -0
- package/dist/nip/acme/index.js +8 -0
- package/dist/nip/acme/index.js.map +1 -0
- package/dist/nip/acme/jws.d.ts +31 -0
- package/dist/nip/acme/jws.d.ts.map +1 -0
- package/dist/nip/acme/jws.js +76 -0
- package/dist/nip/acme/jws.js.map +1 -0
- package/dist/nip/acme/messages.d.ts +71 -0
- package/dist/nip/acme/messages.d.ts.map +1 -0
- package/dist/nip/acme/messages.js +4 -0
- package/dist/nip/acme/messages.js.map +1 -0
- package/dist/nip/acme/server.d.ts +41 -0
- package/dist/nip/acme/server.d.ts.map +1 -0
- package/dist/nip/acme/server.js +458 -0
- package/dist/nip/acme/server.js.map +1 -0
- package/dist/nip/acme/wire.d.ts +19 -0
- package/dist/nip/acme/wire.d.ts.map +1 -0
- package/dist/nip/acme/wire.js +21 -0
- package/dist/nip/acme/wire.js.map +1 -0
- package/dist/nip/assurance-level.d.ts +14 -0
- package/dist/nip/assurance-level.d.ts.map +1 -0
- package/dist/nip/assurance-level.js +33 -0
- package/dist/nip/assurance-level.js.map +1 -0
- package/dist/nip/cert-format.d.ts +5 -0
- package/dist/nip/cert-format.d.ts.map +1 -0
- package/dist/nip/cert-format.js +6 -0
- package/dist/nip/cert-format.js.map +1 -0
- package/dist/nip/error-codes.d.ts +23 -0
- package/dist/nip/error-codes.d.ts.map +1 -0
- package/dist/nip/error-codes.js +30 -0
- package/dist/nip/error-codes.js.map +1 -0
- package/dist/nip/frames.d.ts +10 -1
- package/dist/nip/frames.d.ts.map +1 -1
- package/dist/nip/frames.js +106 -0
- package/dist/nip/frames.js.map +1 -0
- package/dist/nip/identity.js +94 -0
- package/dist/nip/identity.js.map +1 -0
- package/dist/nip/index.d.ts +6 -0
- package/dist/nip/index.d.ts.map +1 -1
- package/dist/nip/index.js +12 -187
- package/dist/nip/index.js.map +1 -1
- package/dist/nip/registry.js +10 -0
- package/dist/nip/registry.js.map +1 -0
- package/dist/nip/verifier.d.ts +23 -0
- package/dist/nip/verifier.d.ts.map +1 -0
- package/dist/nip/verifier.js +90 -0
- package/dist/nip/verifier.js.map +1 -0
- package/dist/nip/x509/builder.d.ts +35 -0
- package/dist/nip/x509/builder.d.ts.map +1 -0
- package/dist/nip/x509/builder.js +59 -0
- package/dist/nip/x509/builder.js.map +1 -0
- package/dist/nip/x509/index.d.ts +4 -0
- package/dist/nip/x509/index.d.ts.map +1 -0
- package/dist/nip/x509/index.js +6 -0
- package/dist/nip/x509/index.js.map +1 -0
- package/dist/nip/x509/oids.d.ts +17 -0
- package/dist/nip/x509/oids.d.ts.map +1 -0
- package/dist/nip/x509/oids.js +23 -0
- package/dist/nip/x509/oids.js.map +1 -0
- package/dist/nip/x509/verifier.d.ts +26 -0
- package/dist/nip/x509/verifier.d.ts.map +1 -0
- package/dist/nip/x509/verifier.js +171 -0
- package/dist/nip/x509/verifier.js.map +1 -0
- package/dist/nop/client.js +90 -0
- package/dist/nop/client.js.map +1 -0
- package/dist/nop/frames.js +148 -0
- package/dist/nop/frames.js.map +1 -0
- package/dist/nop/index.js +6 -789
- package/dist/nop/index.js.map +1 -1
- package/dist/nop/models.js +50 -0
- package/dist/nop/models.js.map +1 -0
- package/dist/nop/nop-types.js +44 -0
- package/dist/nop/nop-types.js.map +1 -0
- package/dist/nop/registry.js +11 -0
- package/dist/nop/registry.js.map +1 -0
- package/dist/nwp/client.js +101 -0
- package/dist/nwp/client.js.map +1 -0
- package/dist/nwp/frames.js +81 -0
- package/dist/nwp/frames.js.map +1 -0
- package/dist/nwp/index.js +5 -693
- package/dist/nwp/index.js.map +1 -1
- package/dist/nwp/registry.js +9 -0
- package/dist/nwp/registry.js.map +1 -0
- package/dist/setup.js +29 -0
- package/dist/setup.js.map +1 -0
- package/package.json +2 -1
- package/src/index.ts +1 -1
- package/src/ncp/index.ts +1 -0
- package/src/ncp/ncp-error-codes.ts +2 -0
- package/src/ncp/preamble.ts +79 -0
- package/src/nip/acme/client.ts +185 -0
- package/src/nip/acme/index.ts +8 -0
- package/src/nip/acme/jws.ts +109 -0
- package/src/nip/acme/messages.ts +85 -0
- package/src/nip/acme/server.ts +480 -0
- package/src/nip/acme/wire.ts +24 -0
- package/src/nip/assurance-level.ts +35 -0
- package/src/nip/cert-format.ts +9 -0
- package/src/nip/error-codes.ts +36 -0
- package/src/nip/frames.ts +35 -3
- package/src/nip/index.ts +8 -0
- package/src/nip/verifier.ts +122 -0
- package/src/nip/x509/builder.ts +91 -0
- package/src/nip/x509/index.ts +6 -0
- package/src/nip/x509/oids.ts +28 -0
- package/src/nip/x509/verifier.ts +214 -0
- package/tests/_rfc0002-keys.ts +57 -0
- package/tests/ncp/preamble.test.ts +93 -0
- package/tests/nip-acme-agent01.test.ts +192 -0
- package/tests/nip-x509.test.ts +280 -0
- package/dist/core/index.cjs +0 -452
- package/dist/core/index.cjs.map +0 -1
- package/dist/index.cjs +0 -8
- package/dist/index.cjs.map +0 -1
- package/dist/ncp/index.cjs +0 -388
- package/dist/ncp/index.cjs.map +0 -1
- package/dist/ndp/index.cjs +0 -252
- package/dist/ndp/index.cjs.map +0 -1
- package/dist/nip/index.cjs +0 -214
- package/dist/nip/index.cjs.map +0 -1
- package/dist/nop/index.cjs +0 -823
- package/dist/nop/index.cjs.map +0 -1
- package/dist/nwp/index.cjs +0 -720
- package/dist/nwp/index.cjs.map +0 -1
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// Copyright 2026 INNO LOTUS PTY LTD
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
export class InMemoryNdpRegistry {
|
|
4
|
+
_store = new Map();
|
|
5
|
+
// Replaceable for testing
|
|
6
|
+
clock = () => Date.now();
|
|
7
|
+
announce(frame) {
|
|
8
|
+
const expiresAt = this.clock() + frame.ttl * 1000;
|
|
9
|
+
if (frame.ttl === 0) {
|
|
10
|
+
this._store.delete(frame.nid);
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
this._store.set(frame.nid, { frame, expiresAt });
|
|
14
|
+
}
|
|
15
|
+
getByNid(nid) {
|
|
16
|
+
const entry = this._store.get(nid);
|
|
17
|
+
if (entry === undefined)
|
|
18
|
+
return undefined;
|
|
19
|
+
if (this.clock() > entry.expiresAt) {
|
|
20
|
+
this._store.delete(nid);
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
return entry.frame;
|
|
24
|
+
}
|
|
25
|
+
resolve(target) {
|
|
26
|
+
for (const [nid, entry] of this._store) {
|
|
27
|
+
if (this.clock() > entry.expiresAt) {
|
|
28
|
+
this._store.delete(nid);
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
if (!InMemoryNdpRegistry.nwpTargetMatchesNid(nid, target))
|
|
32
|
+
continue;
|
|
33
|
+
const addr = entry.frame.addresses[0];
|
|
34
|
+
if (addr === undefined)
|
|
35
|
+
continue;
|
|
36
|
+
return { host: addr.host, port: addr.port, ttl: entry.frame.ttl };
|
|
37
|
+
}
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
getAll() {
|
|
41
|
+
const now = this.clock();
|
|
42
|
+
const result = [];
|
|
43
|
+
for (const [nid, entry] of this._store) {
|
|
44
|
+
if (now > entry.expiresAt) {
|
|
45
|
+
this._store.delete(nid);
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
result.push(entry.frame);
|
|
49
|
+
}
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
static nwpTargetMatchesNid(nid, target) {
|
|
53
|
+
// NID: urn:nps:node:{authority}:{path-segment}
|
|
54
|
+
// target: nwp://{authority}/{path}
|
|
55
|
+
const nidParts = nid.split(":");
|
|
56
|
+
if (nidParts.length < 5 || nidParts[0] !== "urn" || nidParts[1] !== "nps" || nidParts[2] !== "node") {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
if (!target.startsWith("nwp://"))
|
|
60
|
+
return false;
|
|
61
|
+
const nidAuthority = nidParts[3];
|
|
62
|
+
const nidPath = nidParts[4];
|
|
63
|
+
const rest = target.slice("nwp://".length);
|
|
64
|
+
const slashIdx = rest.indexOf("/");
|
|
65
|
+
if (slashIdx === -1)
|
|
66
|
+
return false;
|
|
67
|
+
const urlAuthority = rest.slice(0, slashIdx);
|
|
68
|
+
const urlPath = rest.slice(slashIdx + 1); // without leading slash
|
|
69
|
+
if (urlAuthority !== nidAuthority)
|
|
70
|
+
return false;
|
|
71
|
+
// nidPath must be a prefix of urlPath at a segment boundary
|
|
72
|
+
if (urlPath === nidPath)
|
|
73
|
+
return true;
|
|
74
|
+
if (urlPath.startsWith(nidPath + "/"))
|
|
75
|
+
return true;
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=ndp-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ndp-registry.js","sourceRoot":"","sources":["../../src/ndp/ndp-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -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 { AnnounceFrame, GraphFrame, ResolveFrame } from "./frames.js";
|
|
5
|
+
export function registerNdpFrames(registry) {
|
|
6
|
+
registry.register(FrameType.ANNOUNCE, AnnounceFrame);
|
|
7
|
+
registry.register(FrameType.RESOLVE, ResolveFrame);
|
|
8
|
+
registry.register(FrameType.GRAPH, GraphFrame);
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/ndp/registry.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,sCAAsC;AAGtC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEtE,MAAM,UAAU,iBAAiB,CAAC,QAAuB;IACvD,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACrD,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAG,YAAY,CAAC,CAAC;IACpD,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAK,UAAU,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// Copyright 2026 INNO LOTUS PTY LTD
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import * as ed25519 from "@noble/ed25519";
|
|
4
|
+
import { sha512 } from "@noble/hashes/sha512";
|
|
5
|
+
ed25519.etc.sha512Sync = (...m) => sha512(ed25519.etc.concatBytes(...m));
|
|
6
|
+
export const NdpAnnounceResult = {
|
|
7
|
+
ok: () => ({ isValid: true }),
|
|
8
|
+
fail: (errorCode, message) => ({ isValid: false, errorCode, message }),
|
|
9
|
+
};
|
|
10
|
+
export class NdpAnnounceValidator {
|
|
11
|
+
_keys = new Map(); // nid → "ed25519:<hex>"
|
|
12
|
+
registerPublicKey(nid, encodedPubKey) {
|
|
13
|
+
this._keys.set(nid, encodedPubKey);
|
|
14
|
+
}
|
|
15
|
+
removePublicKey(nid) {
|
|
16
|
+
this._keys.delete(nid);
|
|
17
|
+
}
|
|
18
|
+
get knownPublicKeys() {
|
|
19
|
+
return this._keys;
|
|
20
|
+
}
|
|
21
|
+
validate(frame) {
|
|
22
|
+
const encoded = this._keys.get(frame.nid);
|
|
23
|
+
if (encoded === undefined) {
|
|
24
|
+
return NdpAnnounceResult.fail("NDP-ANNOUNCE-NID-MISMATCH", `No public key registered for NID: ${frame.nid}`);
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
const prefix = "ed25519:";
|
|
28
|
+
const pubHex = encoded.startsWith(prefix) ? encoded.slice(prefix.length) : encoded;
|
|
29
|
+
const pubKey = Buffer.from(pubHex, "hex");
|
|
30
|
+
const sig = frame.signature;
|
|
31
|
+
if (!sig.startsWith(prefix)) {
|
|
32
|
+
return NdpAnnounceResult.fail("NDP-ANNOUNCE-SIG-INVALID", "Signature must start with 'ed25519:'");
|
|
33
|
+
}
|
|
34
|
+
const sigBytes = Buffer.from(sig.slice(prefix.length), "base64");
|
|
35
|
+
const unsigned = frame.unsignedDict();
|
|
36
|
+
const canonical = JSON.stringify(unsigned, Object.keys(unsigned).sort());
|
|
37
|
+
const message = new TextEncoder().encode(canonical);
|
|
38
|
+
const valid = ed25519.verify(sigBytes, message, pubKey);
|
|
39
|
+
if (!valid)
|
|
40
|
+
return NdpAnnounceResult.fail("NDP-ANNOUNCE-SIG-INVALID", "Ed25519 signature verification failed.");
|
|
41
|
+
return NdpAnnounceResult.ok();
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return NdpAnnounceResult.fail("NDP-ANNOUNCE-SIG-INVALID", "Ed25519 signature verification failed.");
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/ndp/validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export interface AcmeClientOptions {
|
|
2
|
+
/** ACME directory URL. */
|
|
3
|
+
directoryUrl: string;
|
|
4
|
+
/** Account/agent Ed25519 private key (32-byte raw). */
|
|
5
|
+
privateKey: Uint8Array;
|
|
6
|
+
/** Account/agent Ed25519 public key (32-byte raw). */
|
|
7
|
+
publicKey: Uint8Array;
|
|
8
|
+
/** Web Crypto Ed25519 keypair for CSR signing (must match privateKey). */
|
|
9
|
+
webCryptoKeys: CryptoKeyPair;
|
|
10
|
+
}
|
|
11
|
+
export declare class AcmeClient {
|
|
12
|
+
readonly options: AcmeClientOptions;
|
|
13
|
+
private directory;
|
|
14
|
+
private accountUrl;
|
|
15
|
+
private lastNonce;
|
|
16
|
+
constructor(options: AcmeClientOptions);
|
|
17
|
+
/** Drive the full agent-01 flow for `nid`. Returns issued PEM cert chain. */
|
|
18
|
+
issueAgentCert(nid: string): Promise<string>;
|
|
19
|
+
private ensureDirectory;
|
|
20
|
+
private refreshNonce;
|
|
21
|
+
private newAccount;
|
|
22
|
+
private newOrder;
|
|
23
|
+
private fetchAuthz;
|
|
24
|
+
private respondAgent01;
|
|
25
|
+
private finalizeOrder;
|
|
26
|
+
private downloadPem;
|
|
27
|
+
private post;
|
|
28
|
+
private captureNonce;
|
|
29
|
+
private buildCsr;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/nip/acme/client.ts"],"names":[],"mappings":"AAwBA,MAAM,WAAW,iBAAiB;IAChC,0BAA0B;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,uDAAuD;IACvD,UAAU,EAAI,UAAU,CAAC;IACzB,sDAAsD;IACtD,SAAS,EAAK,UAAU,CAAC;IACzB,0EAA0E;IAC1E,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED,qBAAa,UAAU;aAKO,OAAO,EAAE,iBAAiB;IAJtD,OAAO,CAAC,SAAS,CAA2B;IAC5C,OAAO,CAAC,UAAU,CAA0B;IAC5C,OAAO,CAAC,SAAS,CAA2B;gBAEhB,OAAO,EAAE,iBAAiB;IAEtD,6EAA6E;IACvE,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAYpC,eAAe;YAQf,YAAY;YASZ,UAAU;YAcV,QAAQ;YAcR,UAAU;YAYV,cAAc;YAiBd,aAAa;YAYb,WAAW;YAaX,IAAI;IAQlB,OAAO,CAAC,YAAY;YAKN,QAAQ;CAWvB"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
// Copyright 2026 INNO LOTUS PTY LTD
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
/**
|
|
4
|
+
* ACME client implementing the `agent-01` challenge type per NPS-RFC-0002 §4.4.
|
|
5
|
+
*
|
|
6
|
+
* Flow: newNonce → newAccount → newOrder → fetch authz → sign challenge token →
|
|
7
|
+
* finalize with CSR → fetch leaf cert.
|
|
8
|
+
*/
|
|
9
|
+
import * as ed25519 from "@noble/ed25519";
|
|
10
|
+
import { sha512 } from "@noble/hashes/sha512";
|
|
11
|
+
import * as x509 from "@peculiar/x509";
|
|
12
|
+
import * as Jws from "./jws.js";
|
|
13
|
+
import * as wire from "./wire.js";
|
|
14
|
+
ed25519.etc.sha512Sync = (...m) => sha512(ed25519.etc.concatBytes(...m));
|
|
15
|
+
x509.cryptoProvider.set(globalThis.crypto);
|
|
16
|
+
export class AcmeClient {
|
|
17
|
+
options;
|
|
18
|
+
directory = null;
|
|
19
|
+
accountUrl = null;
|
|
20
|
+
lastNonce = null;
|
|
21
|
+
constructor(options) {
|
|
22
|
+
this.options = options;
|
|
23
|
+
}
|
|
24
|
+
/** Drive the full agent-01 flow for `nid`. Returns issued PEM cert chain. */
|
|
25
|
+
async issueAgentCert(nid) {
|
|
26
|
+
await this.ensureDirectory();
|
|
27
|
+
if (this.accountUrl === null)
|
|
28
|
+
await this.newAccount();
|
|
29
|
+
const order = await this.newOrder(nid);
|
|
30
|
+
const authz = await this.fetchAuthz(order.authorizations[0]);
|
|
31
|
+
await this.respondAgent01(authz);
|
|
32
|
+
const finalized = await this.finalizeOrder(order, nid);
|
|
33
|
+
return this.downloadPem(finalized.certificate);
|
|
34
|
+
}
|
|
35
|
+
// ── Stages ───────────────────────────────────────────────────────────────
|
|
36
|
+
async ensureDirectory() {
|
|
37
|
+
if (this.directory !== null)
|
|
38
|
+
return;
|
|
39
|
+
const resp = await fetch(this.options.directoryUrl);
|
|
40
|
+
ensureSuccess(resp);
|
|
41
|
+
this.directory = await resp.json();
|
|
42
|
+
await this.refreshNonce();
|
|
43
|
+
}
|
|
44
|
+
async refreshNonce() {
|
|
45
|
+
const resp = await fetch(this.directory.newNonce, { method: "HEAD" });
|
|
46
|
+
ensureSuccess(resp);
|
|
47
|
+
this.lastNonce = resp.headers.get("Replay-Nonce");
|
|
48
|
+
if (this.lastNonce === null) {
|
|
49
|
+
throw new Error("server omitted Replay-Nonce");
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async newAccount() {
|
|
53
|
+
const jwk = Jws.jwkFromPublicKey(this.options.publicKey);
|
|
54
|
+
const env = Jws.sign({ alg: Jws.ALG_EDDSA, nonce: this.lastNonce, url: this.directory.newAccount, jwk }, { termsOfServiceAgreed: true }, this.options.privateKey);
|
|
55
|
+
const resp = await this.post(this.directory.newAccount, env);
|
|
56
|
+
ensureSuccess(resp);
|
|
57
|
+
this.accountUrl = resp.headers.get("Location");
|
|
58
|
+
if (this.accountUrl === null)
|
|
59
|
+
throw new Error("server omitted account Location");
|
|
60
|
+
this.captureNonce(resp);
|
|
61
|
+
}
|
|
62
|
+
async newOrder(nid) {
|
|
63
|
+
const env = Jws.sign({ alg: Jws.ALG_EDDSA, nonce: this.lastNonce, url: this.directory.newOrder, kid: this.accountUrl }, {
|
|
64
|
+
identifiers: [{ type: wire.IDENTIFIER_TYPE_NID, value: nid }],
|
|
65
|
+
}, this.options.privateKey);
|
|
66
|
+
const resp = await this.post(this.directory.newOrder, env);
|
|
67
|
+
ensureSuccess(resp);
|
|
68
|
+
this.captureNonce(resp);
|
|
69
|
+
return await resp.json();
|
|
70
|
+
}
|
|
71
|
+
async fetchAuthz(url) {
|
|
72
|
+
// POST-as-GET (RFC 8555 §6.3).
|
|
73
|
+
const env = Jws.sign({ alg: Jws.ALG_EDDSA, nonce: this.lastNonce, url, kid: this.accountUrl }, null, this.options.privateKey);
|
|
74
|
+
const resp = await this.post(url, env);
|
|
75
|
+
ensureSuccess(resp);
|
|
76
|
+
this.captureNonce(resp);
|
|
77
|
+
return await resp.json();
|
|
78
|
+
}
|
|
79
|
+
async respondAgent01(authz) {
|
|
80
|
+
const challenge = authz.challenges.find((c) => c.type === wire.CHALLENGE_AGENT_01);
|
|
81
|
+
if (!challenge)
|
|
82
|
+
throw new Error("authz has no agent-01 challenge");
|
|
83
|
+
// Sign the challenge token with the account/NID private key.
|
|
84
|
+
const tokenBytes = new TextEncoder().encode(challenge.token);
|
|
85
|
+
const sig = ed25519.sign(tokenBytes, this.options.privateKey);
|
|
86
|
+
const env = Jws.sign({ alg: Jws.ALG_EDDSA, nonce: this.lastNonce, url: challenge.url, kid: this.accountUrl }, { agent_signature: Jws.b64uEncode(sig) }, this.options.privateKey);
|
|
87
|
+
const resp = await this.post(challenge.url, env);
|
|
88
|
+
ensureSuccess(resp);
|
|
89
|
+
this.captureNonce(resp);
|
|
90
|
+
}
|
|
91
|
+
async finalizeOrder(order, nid) {
|
|
92
|
+
const csrDer = await this.buildCsr(nid);
|
|
93
|
+
const env = Jws.sign({ alg: Jws.ALG_EDDSA, nonce: this.lastNonce, url: order.finalize, kid: this.accountUrl }, { csr: Jws.b64uEncode(csrDer) }, this.options.privateKey);
|
|
94
|
+
const resp = await this.post(order.finalize, env);
|
|
95
|
+
ensureSuccess(resp);
|
|
96
|
+
this.captureNonce(resp);
|
|
97
|
+
return await resp.json();
|
|
98
|
+
}
|
|
99
|
+
async downloadPem(certUrl) {
|
|
100
|
+
const env = Jws.sign({ alg: Jws.ALG_EDDSA, nonce: this.lastNonce, url: certUrl, kid: this.accountUrl }, null, this.options.privateKey);
|
|
101
|
+
const resp = await this.post(certUrl, env);
|
|
102
|
+
ensureSuccess(resp);
|
|
103
|
+
this.captureNonce(resp);
|
|
104
|
+
return await resp.text();
|
|
105
|
+
}
|
|
106
|
+
// ── helpers ──────────────────────────────────────────────────────────────
|
|
107
|
+
async post(url, env) {
|
|
108
|
+
return await fetch(url, {
|
|
109
|
+
method: "POST",
|
|
110
|
+
headers: { "Content-Type": wire.CONTENT_TYPE_JOSE_JSON },
|
|
111
|
+
body: JSON.stringify(env),
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
captureNonce(resp) {
|
|
115
|
+
const nonce = resp.headers.get("Replay-Nonce");
|
|
116
|
+
if (nonce !== null)
|
|
117
|
+
this.lastNonce = nonce;
|
|
118
|
+
}
|
|
119
|
+
async buildCsr(nid) {
|
|
120
|
+
const csr = await x509.Pkcs10CertificateRequestGenerator.create({
|
|
121
|
+
name: `CN=${nid.replace(/([",+;<>\\])/g, "\\$1")}`,
|
|
122
|
+
keys: this.options.webCryptoKeys,
|
|
123
|
+
signingAlgorithm: { name: "Ed25519" },
|
|
124
|
+
extensions: [
|
|
125
|
+
new x509.SubjectAlternativeNameExtension([{ type: "url", value: nid }], false),
|
|
126
|
+
],
|
|
127
|
+
});
|
|
128
|
+
return new Uint8Array(csr.rawData);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
function ensureSuccess(resp) {
|
|
132
|
+
if (!resp.ok) {
|
|
133
|
+
throw new Error(`ACME ${resp.url} HTTP ${resp.status}`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/nip/acme/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/nip/acme/index.ts"],"names":[],"mappings":"AAGA,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/nip/acme/index.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,sCAAsC;AAEtC,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export declare const ALG_EDDSA = "EdDSA";
|
|
2
|
+
export declare const KTY_OKP = "OKP";
|
|
3
|
+
export declare const CRV_ED25519 = "Ed25519";
|
|
4
|
+
export interface Jwk {
|
|
5
|
+
kty: string;
|
|
6
|
+
crv: string;
|
|
7
|
+
x: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ProtectedHeader {
|
|
10
|
+
alg: string;
|
|
11
|
+
nonce: string;
|
|
12
|
+
url: string;
|
|
13
|
+
jwk?: Jwk;
|
|
14
|
+
kid?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface Envelope {
|
|
17
|
+
protected: string;
|
|
18
|
+
payload: string;
|
|
19
|
+
signature: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function jwkFromPublicKey(rawPubKey: Uint8Array): Jwk;
|
|
22
|
+
export declare function publicKeyFromJwk(jwk: Jwk): Uint8Array;
|
|
23
|
+
/** RFC 7638 §3 thumbprint of an Ed25519 JWK (lex-sorted compact JSON, SHA-256, base64url). */
|
|
24
|
+
export declare function thumbprint(jwk: Jwk): string;
|
|
25
|
+
export declare function sign(header: ProtectedHeader, payload: unknown | null, privKey: Uint8Array): Envelope;
|
|
26
|
+
/** Verify a JWS envelope. Returns the parsed protected header on success, else null. */
|
|
27
|
+
export declare function verify(envelope: Envelope, pubKey: Uint8Array): ProtectedHeader | null;
|
|
28
|
+
export declare function decodePayload<T = unknown>(envelope: Envelope): T | null;
|
|
29
|
+
export declare function b64uEncode(bytes: Uint8Array): string;
|
|
30
|
+
export declare function b64uDecode(s: string): Uint8Array;
|
|
31
|
+
//# sourceMappingURL=jws.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jws.d.ts","sourceRoot":"","sources":["../../../src/nip/acme/jws.ts"],"names":[],"mappings":"AAoBA,eAAO,MAAM,SAAS,UAAY,CAAC;AACnC,eAAO,MAAM,OAAO,QAAY,CAAC;AACjC,eAAO,MAAM,WAAW,YAAY,CAAC;AAErC,MAAM,WAAW,GAAG;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,CAAC,EAAI,MAAM,CAAC;CACb;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAK,MAAM,CAAC;IACf,KAAK,EAAG,MAAM,CAAC;IACf,GAAG,EAAK,MAAM,CAAC;IACf,GAAG,CAAC,EAAI,GAAG,CAAC;IACZ,GAAG,CAAC,EAAI,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAI,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,UAAU,GAAG,GAAG,CAK3D;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,GAAG,GAAG,UAAU,CAKrD;AAED,8FAA8F;AAC9F,wBAAgB,UAAU,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAG3C;AAED,wBAAgB,IAAI,CAClB,MAAM,EAAI,eAAe,EACzB,OAAO,EAAG,OAAO,GAAG,IAAI,EACxB,OAAO,EAAG,UAAU,GACnB,QAAQ,CASV;AAED,wFAAwF;AACxF,wBAAgB,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,GAAG,eAAe,GAAG,IAAI,CAUrF;AAED,wBAAgB,aAAa,CAAC,CAAC,GAAG,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,CAAC,GAAG,IAAI,CAGvE;AAID,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAGpD;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,UAAU,CAIhD"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
// Copyright 2026 INNO LOTUS PTY LTD
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
/**
|
|
4
|
+
* JWS signing helpers for ACME with Ed25519 (`alg: "EdDSA"` per RFC 8037).
|
|
5
|
+
*
|
|
6
|
+
* Wire shape (RFC 8555 §6.2 + RFC 7515 flattened JWS JSON serialization):
|
|
7
|
+
* {
|
|
8
|
+
* "protected": base64url(JSON({alg, nonce, url, [jwk|kid]})),
|
|
9
|
+
* "payload": base64url(JSON(payload)),
|
|
10
|
+
* "signature": base64url(Ed25519(protected || "." || payload))
|
|
11
|
+
* }
|
|
12
|
+
*/
|
|
13
|
+
import * as ed25519 from "@noble/ed25519";
|
|
14
|
+
import { sha512 } from "@noble/hashes/sha512";
|
|
15
|
+
import { sha256 } from "@noble/hashes/sha2";
|
|
16
|
+
ed25519.etc.sha512Sync = (...m) => sha512(ed25519.etc.concatBytes(...m));
|
|
17
|
+
export const ALG_EDDSA = "EdDSA"; // RFC 8037 §3.1
|
|
18
|
+
export const KTY_OKP = "OKP"; // RFC 8037 §2
|
|
19
|
+
export const CRV_ED25519 = "Ed25519"; // RFC 8037 §2
|
|
20
|
+
export function jwkFromPublicKey(rawPubKey) {
|
|
21
|
+
if (rawPubKey.length !== 32) {
|
|
22
|
+
throw new Error(`Ed25519 public key must be 32 bytes, got ${rawPubKey.length}`);
|
|
23
|
+
}
|
|
24
|
+
return { kty: KTY_OKP, crv: CRV_ED25519, x: b64uEncode(rawPubKey) };
|
|
25
|
+
}
|
|
26
|
+
export function publicKeyFromJwk(jwk) {
|
|
27
|
+
if (jwk.kty !== KTY_OKP || jwk.crv !== CRV_ED25519) {
|
|
28
|
+
throw new Error(`JWK is not OKP/Ed25519: kty=${jwk.kty} crv=${jwk.crv}`);
|
|
29
|
+
}
|
|
30
|
+
return b64uDecode(jwk.x);
|
|
31
|
+
}
|
|
32
|
+
/** RFC 7638 §3 thumbprint of an Ed25519 JWK (lex-sorted compact JSON, SHA-256, base64url). */
|
|
33
|
+
export function thumbprint(jwk) {
|
|
34
|
+
const canonical = `{"crv":"${jwk.crv}","kty":"${jwk.kty}","x":"${jwk.x}"}`;
|
|
35
|
+
return b64uEncode(sha256(new TextEncoder().encode(canonical)));
|
|
36
|
+
}
|
|
37
|
+
export function sign(header, payload, privKey) {
|
|
38
|
+
const headerBytes = new TextEncoder().encode(JSON.stringify(header));
|
|
39
|
+
const headerB64u = b64uEncode(headerBytes);
|
|
40
|
+
const payloadB64u = payload === null
|
|
41
|
+
? ""
|
|
42
|
+
: b64uEncode(new TextEncoder().encode(JSON.stringify(payload)));
|
|
43
|
+
const signingInput = new TextEncoder().encode(`${headerB64u}.${payloadB64u}`);
|
|
44
|
+
const sig = ed25519.sign(signingInput, privKey);
|
|
45
|
+
return { protected: headerB64u, payload: payloadB64u, signature: b64uEncode(sig) };
|
|
46
|
+
}
|
|
47
|
+
/** Verify a JWS envelope. Returns the parsed protected header on success, else null. */
|
|
48
|
+
export function verify(envelope, pubKey) {
|
|
49
|
+
try {
|
|
50
|
+
const signingInput = new TextEncoder().encode(`${envelope.protected}.${envelope.payload}`);
|
|
51
|
+
const sigBytes = b64uDecode(envelope.signature);
|
|
52
|
+
if (!ed25519.verify(sigBytes, signingInput, pubKey))
|
|
53
|
+
return null;
|
|
54
|
+
const headerJson = new TextDecoder().decode(b64uDecode(envelope.protected));
|
|
55
|
+
return JSON.parse(headerJson);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export function decodePayload(envelope) {
|
|
62
|
+
if (!envelope.payload)
|
|
63
|
+
return null;
|
|
64
|
+
return JSON.parse(new TextDecoder().decode(b64uDecode(envelope.payload)));
|
|
65
|
+
}
|
|
66
|
+
// ── helpers ──────────────────────────────────────────────────────────────────
|
|
67
|
+
export function b64uEncode(bytes) {
|
|
68
|
+
return Buffer.from(bytes).toString("base64").replace(/=+$/, "")
|
|
69
|
+
.replace(/\+/g, "-").replace(/\//g, "_");
|
|
70
|
+
}
|
|
71
|
+
export function b64uDecode(s) {
|
|
72
|
+
const padded = s + "=".repeat((4 - (s.length % 4)) % 4);
|
|
73
|
+
const std = padded.replace(/-/g, "+").replace(/_/g, "/");
|
|
74
|
+
return new Uint8Array(Buffer.from(std, "base64"));
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=jws.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jws.js","sourceRoot":"","sources":["../../../src/nip/acme/jws.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/** ACME wire-level DTOs (RFC 8555 + NPS-RFC-0002 §4.4) — plain interfaces. */
|
|
2
|
+
export interface DirectoryMeta {
|
|
3
|
+
termsOfService?: string;
|
|
4
|
+
website?: string;
|
|
5
|
+
caaIdentities?: readonly string[];
|
|
6
|
+
externalAccountRequired?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface Directory {
|
|
9
|
+
newNonce: string;
|
|
10
|
+
newAccount: string;
|
|
11
|
+
newOrder: string;
|
|
12
|
+
revokeCert?: string;
|
|
13
|
+
keyChange?: string;
|
|
14
|
+
meta?: DirectoryMeta;
|
|
15
|
+
}
|
|
16
|
+
export interface NewAccountPayload {
|
|
17
|
+
termsOfServiceAgreed?: boolean;
|
|
18
|
+
contact?: readonly string[];
|
|
19
|
+
onlyReturnExisting?: boolean;
|
|
20
|
+
}
|
|
21
|
+
export interface Account {
|
|
22
|
+
status: string;
|
|
23
|
+
contact?: readonly string[];
|
|
24
|
+
orders?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface Identifier {
|
|
27
|
+
type: string;
|
|
28
|
+
value: string;
|
|
29
|
+
}
|
|
30
|
+
export interface NewOrderPayload {
|
|
31
|
+
identifiers: readonly Identifier[];
|
|
32
|
+
notBefore?: string;
|
|
33
|
+
notAfter?: string;
|
|
34
|
+
}
|
|
35
|
+
export interface ProblemDetail {
|
|
36
|
+
type: string;
|
|
37
|
+
detail?: string;
|
|
38
|
+
status?: number;
|
|
39
|
+
}
|
|
40
|
+
export interface Order {
|
|
41
|
+
status: string;
|
|
42
|
+
expires?: string;
|
|
43
|
+
identifiers: readonly Identifier[];
|
|
44
|
+
authorizations: readonly string[];
|
|
45
|
+
finalize: string;
|
|
46
|
+
certificate?: string;
|
|
47
|
+
error?: ProblemDetail;
|
|
48
|
+
}
|
|
49
|
+
export interface Challenge {
|
|
50
|
+
type: string;
|
|
51
|
+
url: string;
|
|
52
|
+
status: string;
|
|
53
|
+
token: string;
|
|
54
|
+
validated?: string;
|
|
55
|
+
error?: ProblemDetail;
|
|
56
|
+
}
|
|
57
|
+
export interface Authorization {
|
|
58
|
+
status: string;
|
|
59
|
+
expires?: string;
|
|
60
|
+
identifier: Identifier;
|
|
61
|
+
challenges: readonly Challenge[];
|
|
62
|
+
}
|
|
63
|
+
export interface ChallengeRespondPayload {
|
|
64
|
+
/** base64url(Ed25519(token)) per NPS-RFC-0002 §4.4. */
|
|
65
|
+
agent_signature: string;
|
|
66
|
+
}
|
|
67
|
+
export interface FinalizePayload {
|
|
68
|
+
/** base64url(CSR DER). */
|
|
69
|
+
csr: string;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=messages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../src/nip/acme/messages.ts"],"names":[],"mappings":"AAGA,8EAA8E;AAE9E,MAAM,WAAW,aAAa;IAC5B,cAAc,CAAC,EAAW,MAAM,CAAC;IACjC,OAAO,CAAC,EAAkB,MAAM,CAAC;IACjC,aAAa,CAAC,EAAY,SAAS,MAAM,EAAE,CAAC;IAC5C,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAK,MAAM,CAAC;IACpB,UAAU,EAAG,MAAM,CAAC;IACpB,QAAQ,EAAK,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAG,MAAM,CAAC;IACpB,IAAI,CAAC,EAAQ,aAAa,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,OAAO,CAAC,EAAe,SAAS,MAAM,EAAE,CAAC;IACzC,kBAAkB,CAAC,EAAI,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,OAAO;IACtB,MAAM,EAAK,MAAM,CAAC;IAClB,OAAO,CAAC,EAAG,SAAS,MAAM,EAAE,CAAC;IAC7B,MAAM,CAAC,EAAI,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAG,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;IACnC,SAAS,CAAC,EAAG,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAI,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAK,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,KAAK;IACpB,MAAM,EAAU,MAAM,CAAC;IACvB,OAAO,CAAC,EAAQ,MAAM,CAAC;IACvB,WAAW,EAAK,SAAS,UAAU,EAAE,CAAC;IACtC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,EAAQ,MAAM,CAAC;IACvB,WAAW,CAAC,EAAI,MAAM,CAAC;IACvB,KAAK,CAAC,EAAU,aAAa,CAAC;CAC/B;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAQ,MAAM,CAAC;IACnB,GAAG,EAAS,MAAM,CAAC;IACnB,MAAM,EAAM,MAAM,CAAC;IACnB,KAAK,EAAO,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAM,aAAa,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAM,MAAM,CAAC;IACnB,OAAO,CAAC,EAAI,MAAM,CAAC;IACnB,UAAU,EAAE,UAAU,CAAC;IACvB,UAAU,EAAE,SAAS,SAAS,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,uBAAuB;IACtC,uDAAuD;IACvD,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,0BAA0B;IAC1B,GAAG,EAAE,MAAM,CAAC;CACb"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../src/nip/acme/messages.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,sCAAsC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import * as x509 from "@peculiar/x509";
|
|
2
|
+
export interface AcmeServerOptions {
|
|
3
|
+
caNid: string;
|
|
4
|
+
caKeys: CryptoKeyPair;
|
|
5
|
+
caRootCert: x509.X509Certificate;
|
|
6
|
+
certValidityMs: number;
|
|
7
|
+
}
|
|
8
|
+
export declare class AcmeServer {
|
|
9
|
+
readonly options: AcmeServerOptions;
|
|
10
|
+
private readonly server;
|
|
11
|
+
private readonly nonces;
|
|
12
|
+
private readonly accountJwks;
|
|
13
|
+
private readonly orders;
|
|
14
|
+
private readonly authzs;
|
|
15
|
+
private readonly challenges;
|
|
16
|
+
private readonly certs;
|
|
17
|
+
private boundPort;
|
|
18
|
+
constructor(options: AcmeServerOptions);
|
|
19
|
+
start(): Promise<this>;
|
|
20
|
+
close(): Promise<void>;
|
|
21
|
+
get baseUrl(): string;
|
|
22
|
+
get directoryUrl(): string;
|
|
23
|
+
private dispatch;
|
|
24
|
+
private handleDirectory;
|
|
25
|
+
private handleNewNonce;
|
|
26
|
+
private handleNewAccount;
|
|
27
|
+
private handleNewOrder;
|
|
28
|
+
private handleAuthz;
|
|
29
|
+
private handleChallenge;
|
|
30
|
+
private handleFinalize;
|
|
31
|
+
private handleCert;
|
|
32
|
+
private handleOrder;
|
|
33
|
+
private mintNonce;
|
|
34
|
+
private consumeNonce;
|
|
35
|
+
private verifyAccount;
|
|
36
|
+
private readEnvelope;
|
|
37
|
+
private parseHeader;
|
|
38
|
+
private sendJson;
|
|
39
|
+
private sendProblem;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/nip/acme/server.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,IAAI,MAAM,gBAAgB,CAAC;AAevC,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAY,MAAM,CAAC;IACxB,MAAM,EAAW,aAAa,CAAC;IAC/B,UAAU,EAAO,IAAI,CAAC,eAAe,CAAC;IACtC,cAAc,EAAG,MAAM,CAAC;CACzB;AA6BD,qBAAa,UAAU;aAUO,OAAO,EAAE,iBAAiB;IATtD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2B;IAClD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA+B;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuC;IAC9D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuC;IAC9D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuC;IAClE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoC;IAC1D,OAAO,CAAC,SAAS,CAAgB;gBAEL,OAAO,EAAE,iBAAiB;IAIhD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,IAAI,OAAO,IAAU,MAAM,CAAiD;IAC5E,IAAI,YAAY,IAAK,MAAM,CAAwC;YAIrD,QAAQ;IAsBtB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,cAAc;YAOR,gBAAgB;YAgChB,cAAc;YAwDd,WAAW;YA2BX,eAAe;YAyDf,cAAc;YAuEd,UAAU;YAmBV,WAAW;IAuBzB,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,aAAa;YAOP,YAAY;IAe1B,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,QAAQ;IAMhB,OAAO,CAAC,WAAW;CAKpB"}
|