@andrewheberle/serverless-ssh-ca 0.22.0 → 0.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/README.md +55 -1
  2. package/dist/api/operations.d.ts +49 -0
  3. package/dist/api/operations.d.ts.map +1 -0
  4. package/dist/api/operations.js +175 -0
  5. package/dist/api/operations.js.map +1 -0
  6. package/dist/api/schema.d.ts +71 -0
  7. package/dist/api/schema.d.ts.map +1 -0
  8. package/dist/api/schema.js +107 -0
  9. package/dist/api/schema.js.map +1 -0
  10. package/dist/api/v3/index.d.ts.map +1 -1
  11. package/dist/api/v3/index.js +13 -202
  12. package/dist/api/v3/index.js.map +1 -1
  13. package/dist/api/v3/schema.d.ts +23 -68
  14. package/dist/api/v3/schema.d.ts.map +1 -1
  15. package/dist/api/v3/schema.js +10 -100
  16. package/dist/api/v3/schema.js.map +1 -1
  17. package/dist/api/v4/index.d.ts +8 -0
  18. package/dist/api/v4/index.d.ts.map +1 -0
  19. package/dist/api/v4/index.js +155 -0
  20. package/dist/api/v4/index.js.map +1 -0
  21. package/dist/api/v4/schema.d.ts +268 -0
  22. package/dist/api/v4/schema.d.ts.map +1 -0
  23. package/dist/api/v4/schema.js +182 -0
  24. package/dist/api/v4/schema.js.map +1 -0
  25. package/dist/certificate.d.ts +9 -6
  26. package/dist/certificate.d.ts.map +1 -1
  27. package/dist/certificate.js +55 -99
  28. package/dist/certificate.js.map +1 -1
  29. package/dist/db/index.d.ts +17 -5
  30. package/dist/db/index.d.ts.map +1 -1
  31. package/dist/db/index.js +39 -23
  32. package/dist/db/index.js.map +1 -1
  33. package/dist/krl.d.ts +1 -1
  34. package/dist/krl.d.ts.map +1 -1
  35. package/dist/krl.js +9 -163
  36. package/dist/krl.js.map +1 -1
  37. package/dist/proof.d.ts +36 -7
  38. package/dist/proof.d.ts.map +1 -1
  39. package/dist/proof.js +53 -21
  40. package/dist/proof.js.map +1 -1
  41. package/dist/router.d.ts.map +1 -1
  42. package/dist/router.js +3 -1
  43. package/dist/router.js.map +1 -1
  44. package/dist/ssh/certificate.d.ts +93 -0
  45. package/dist/ssh/certificate.d.ts.map +1 -0
  46. package/dist/ssh/certificate.js +178 -0
  47. package/dist/ssh/certificate.js.map +1 -0
  48. package/dist/ssh/encoding.d.ts +41 -0
  49. package/dist/ssh/encoding.d.ts.map +1 -0
  50. package/dist/ssh/encoding.js +70 -0
  51. package/dist/ssh/encoding.js.map +1 -0
  52. package/dist/ssh/keys.d.ts +80 -0
  53. package/dist/ssh/keys.d.ts.map +1 -0
  54. package/dist/ssh/keys.js +249 -0
  55. package/dist/ssh/keys.js.map +1 -0
  56. package/dist/ssh/signer.d.ts +35 -0
  57. package/dist/ssh/signer.d.ts.map +1 -0
  58. package/dist/ssh/signer.js +99 -0
  59. package/dist/ssh/signer.js.map +1 -0
  60. package/dist/types.d.ts +12 -17
  61. package/dist/types.d.ts.map +1 -1
  62. package/dist/utils.d.ts +40 -21
  63. package/dist/utils.d.ts.map +1 -1
  64. package/dist/utils.js +87 -54
  65. package/dist/utils.js.map +1 -1
  66. package/openapi.json +1542 -1
  67. package/package.json +4 -3
  68. package/src/api/operations.ts +211 -0
  69. package/src/api/schema.ts +137 -0
  70. package/src/api/v3/index.ts +20 -248
  71. package/src/api/v3/schema.ts +26 -125
  72. package/src/api/v4/index.ts +265 -0
  73. package/src/api/v4/schema.ts +235 -0
  74. package/src/certificate.ts +62 -123
  75. package/src/db/index.ts +41 -26
  76. package/src/krl.ts +10 -195
  77. package/src/proof.ts +65 -31
  78. package/src/router.ts +3 -1
  79. package/src/ssh/certificate.ts +236 -0
  80. package/src/ssh/encoding.ts +81 -0
  81. package/src/ssh/keys.ts +294 -0
  82. package/src/ssh/signer.ts +129 -0
  83. package/src/types.ts +12 -18
  84. package/src/utils.ts +99 -69
@@ -0,0 +1,249 @@
1
+ import { sha256 } from "@noble/hashes/sha2.js";
2
+ import { base64, base64nopad, base64urlnopad } from "@scure/base";
3
+ import * as P from "micro-packed";
4
+ import { toFixedWidth } from "../sshsig/sig_parser.js";
5
+ import { decodePublicKey, SSHBytes, SSHText } from "./encoding.js";
6
+ /**
7
+ * Thrown when a key cannot be parsed
8
+ */
9
+ export class KeyParseError extends Error {
10
+ constructor(message, cause) {
11
+ super(message);
12
+ this.name = "KeyParseError";
13
+ this.cause = cause;
14
+ Object.setPrototypeOf(this, KeyParseError.prototype);
15
+ }
16
+ }
17
+ /**
18
+ * Thrown when a private key is of a type that cannot be used to sign
19
+ */
20
+ export class UnsupportedKeyError extends Error {
21
+ constructor(message) {
22
+ super(message);
23
+ this.name = "UnsupportedKeyError";
24
+ Object.setPrototypeOf(this, UnsupportedKeyError.prototype);
25
+ }
26
+ }
27
+ const equalBytes = (a, b) => {
28
+ return a.length === b.length && a.every((v, i) => v === b[i]);
29
+ };
30
+ /**
31
+ * An SSH public key
32
+ */
33
+ export class PublicKey {
34
+ /** The key type, for example "ssh-ed25519" */
35
+ type;
36
+ /** The wire encoding of the key (RFC 4253 section 6.6) */
37
+ blob;
38
+ /** The comment of the key, if any */
39
+ comment;
40
+ /**
41
+ * @param blob The wire encoding of the key
42
+ * @param comment The comment of the key
43
+ * @throws {@link KeyParseError} when the key cannot be decoded or its type is not supported
44
+ */
45
+ constructor(blob, comment) {
46
+ try {
47
+ this.type = decodePublicKey(blob).type;
48
+ }
49
+ catch (err) {
50
+ throw new KeyParseError(err instanceof Error ? err.message : "public key could not be decoded", err);
51
+ }
52
+ this.blob = blob;
53
+ this.comment = comment === "" ? undefined : comment;
54
+ }
55
+ /**
56
+ * Parses a public key in OpenSSH format, `${type} ${base64}[ ${comment}]`
57
+ *
58
+ * @param text The public key
59
+ * @throws {@link KeyParseError} when the key cannot be parsed or its type is not supported
60
+ */
61
+ static parse(text) {
62
+ const [type, data, ...comment] = text.trim().split(/\s+/);
63
+ if (type === undefined || type === "" || data === undefined) {
64
+ throw new KeyParseError("public key was not in OpenSSH format");
65
+ }
66
+ let blob;
67
+ try {
68
+ blob = base64.decode(data);
69
+ }
70
+ catch (err) {
71
+ throw new KeyParseError("public key was not valid base64", err);
72
+ }
73
+ const key = new PublicKey(blob, comment.join(" "));
74
+ if (key.type !== type) {
75
+ throw new KeyParseError(`public key type ${type} did not match encoded type ${key.type}`);
76
+ }
77
+ return key;
78
+ }
79
+ /**
80
+ * Returns the SHA256 fingerprint of the key, as shown by `ssh-keygen -l`,
81
+ * for example "SHA256:79mq0wtpQMTvS4+Of8VzLN0qmYWNUyTXYmqKwhEgSLs"
82
+ */
83
+ fingerprint() {
84
+ return `SHA256:${base64nopad.encode(sha256(this.blob))}`;
85
+ }
86
+ /**
87
+ * Returns whether this is the same key as another, ignoring comments
88
+ */
89
+ equals(other) {
90
+ return equalBytes(this.blob, other.blob);
91
+ }
92
+ /**
93
+ * Returns a copy of the key with a different comment
94
+ */
95
+ withComment(comment) {
96
+ return new PublicKey(this.blob, comment);
97
+ }
98
+ /**
99
+ * Returns the key in OpenSSH format, `${type} ${base64}[ ${comment}]`
100
+ */
101
+ toString() {
102
+ const key = `${this.type} ${base64.encode(this.blob)}`;
103
+ return this.comment === undefined ? key : `${key} ${this.comment}`;
104
+ }
105
+ }
106
+ const EcdsaCurves = {
107
+ nistp256: { namedCurve: "P-256", size: 32 },
108
+ nistp384: { namedCurve: "P-384", size: 48 },
109
+ nistp521: { namedCurve: "P-521", size: 66 },
110
+ };
111
+ // "openssh-key-v1\0"
112
+ const AUTH_MAGIC = new TextEncoder().encode("openssh-key-v1\0");
113
+ /** The container of an OpenSSH private key (PROTOCOL.key) */
114
+ const OpenSshPrivateKey = P.struct({
115
+ magic: P.magicBytes(AUTH_MAGIC),
116
+ cipherName: SSHText,
117
+ kdfName: SSHText,
118
+ kdfOptions: SSHBytes,
119
+ publicKeys: P.array(P.U32BE, SSHBytes),
120
+ privateKeys: SSHBytes,
121
+ });
122
+ /** The start of the (decrypted) private section of an OpenSSH private key */
123
+ const PrivateSectionStart = P.struct({
124
+ check1: P.U32BE,
125
+ check2: P.U32BE,
126
+ type: SSHText,
127
+ });
128
+ const Ed25519PrivateKey = P.struct({
129
+ check1: P.U32BE,
130
+ check2: P.U32BE,
131
+ type: SSHText,
132
+ publicKey: SSHBytes,
133
+ // the seed followed by the public key
134
+ privateKey: SSHBytes,
135
+ comment: SSHText,
136
+ });
137
+ const EcdsaPrivateKey = P.struct({
138
+ check1: P.U32BE,
139
+ check2: P.U32BE,
140
+ type: SSHText,
141
+ curve: SSHText,
142
+ publicKey: SSHBytes,
143
+ // an mpint
144
+ privateKey: SSHBytes,
145
+ comment: SSHText,
146
+ });
147
+ /**
148
+ * Returns a short name for the type of a key, for example "rsa" for "ssh-rsa"
149
+ */
150
+ const keyTypeName = (type) => {
151
+ return type.replace(/^ssh-/, "").replace(/^ecdsa-sha2-.*$/, "ecdsa");
152
+ };
153
+ /**
154
+ * Parses an unencrypted Ed25519 or ECDSA private key in OpenSSH format, as
155
+ * created by `ssh-keygen`
156
+ *
157
+ * @param text The private key, starting with `-----BEGIN OPENSSH PRIVATE KEY-----`
158
+ * @returns The private key
159
+ * @throws {@link KeyParseError} when the key cannot be parsed or is encrypted
160
+ * @throws {@link UnsupportedKeyError} when the key is not an Ed25519 or ECDSA key
161
+ */
162
+ export const parsePrivateKey = (text) => {
163
+ const match = /-----BEGIN OPENSSH PRIVATE KEY-----([\s\S]*?)-----END OPENSSH PRIVATE KEY-----/.exec(text);
164
+ if (match === null) {
165
+ throw new KeyParseError("private key was not in OpenSSH format, as created by ssh-keygen (starting with -----BEGIN OPENSSH PRIVATE KEY-----)");
166
+ }
167
+ let container;
168
+ try {
169
+ container = OpenSshPrivateKey.decode(base64.decode(match[1].replace(/\s+/g, "")));
170
+ }
171
+ catch (err) {
172
+ throw new KeyParseError("private key could not be decoded", err);
173
+ }
174
+ if (container.cipherName !== "none" || container.kdfName !== "none") {
175
+ throw new KeyParseError("encrypted private keys are not supported");
176
+ }
177
+ if (container.publicKeys.length !== 1) {
178
+ throw new KeyParseError(`private key must contain one key, not ${container.publicKeys.length}`);
179
+ }
180
+ // the private section is padded to a block size, so may have trailing bytes
181
+ const options = { allowUnreadBytes: true };
182
+ let start;
183
+ try {
184
+ start = PrivateSectionStart.decode(container.privateKeys, options);
185
+ }
186
+ catch (err) {
187
+ throw new KeyParseError("private key could not be decoded", err);
188
+ }
189
+ if (start.check1 !== start.check2) {
190
+ throw new KeyParseError("private key check values did not match");
191
+ }
192
+ try {
193
+ if (start.type === "ssh-ed25519") {
194
+ const key = Ed25519PrivateKey.decode(container.privateKeys, options);
195
+ if (key.publicKey.length !== 32 || key.privateKey.length !== 64) {
196
+ throw new KeyParseError("Ed25519 private key was an unexpected length");
197
+ }
198
+ const publicKey = new PublicKey(container.publicKeys[0], key.comment);
199
+ if (!equalBytes(P.struct({ type: SSHText, key: SSHBytes }).encode({ type: start.type, key: key.publicKey }), publicKey.blob)) {
200
+ throw new KeyParseError("private key did not match its public key");
201
+ }
202
+ return {
203
+ type: "ed25519",
204
+ publicKey,
205
+ jwk: {
206
+ kty: "OKP",
207
+ crv: "Ed25519",
208
+ d: base64urlnopad.encode(key.privateKey.subarray(0, 32)),
209
+ x: base64urlnopad.encode(key.publicKey),
210
+ },
211
+ };
212
+ }
213
+ if (start.type.startsWith("ecdsa-sha2-")) {
214
+ const key = EcdsaPrivateKey.decode(container.privateKeys, options);
215
+ const curve = EcdsaCurves[key.curve];
216
+ if (curve === undefined || start.type !== `ecdsa-sha2-${key.curve}`) {
217
+ throw new UnsupportedKeyError(`ECDSA curve ${key.curve} is not supported`);
218
+ }
219
+ if (key.publicKey.length !== 1 + curve.size * 2 || key.publicKey[0] !== 0x04) {
220
+ throw new KeyParseError(`unexpected ECDSA public key encoding for ${key.curve}`);
221
+ }
222
+ const publicKey = new PublicKey(container.publicKeys[0], key.comment);
223
+ if (!equalBytes(P.struct({ type: SSHText, curve: SSHText, key: SSHBytes }).encode({ type: start.type, curve: key.curve, key: key.publicKey }), publicKey.blob)) {
224
+ throw new KeyParseError("private key did not match its public key");
225
+ }
226
+ return {
227
+ type: "ecdsa",
228
+ curve: key.curve,
229
+ publicKey,
230
+ jwk: {
231
+ kty: "EC",
232
+ crv: curve.namedCurve,
233
+ // d is an mpint, so may be short or have a leading sign byte
234
+ d: base64urlnopad.encode(toFixedWidth(key.privateKey, curve.size)),
235
+ x: base64urlnopad.encode(key.publicKey.subarray(1, 1 + curve.size)),
236
+ y: base64urlnopad.encode(key.publicKey.subarray(1 + curve.size)),
237
+ },
238
+ };
239
+ }
240
+ }
241
+ catch (err) {
242
+ if (err instanceof KeyParseError || err instanceof UnsupportedKeyError) {
243
+ throw err;
244
+ }
245
+ throw new KeyParseError("private key could not be decoded", err);
246
+ }
247
+ throw new UnsupportedKeyError(`CA key type ${keyTypeName(start.type)} is not supported, the CA key must be Ed25519 or ECDSA`);
248
+ };
249
+ //# sourceMappingURL=keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/ssh/keys.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { PrivateKey, PublicKey } from "./keys.js";
2
+ /**
3
+ * Signs data with a CA key using WebCrypto, returning signatures in the SSH
4
+ * wire format
5
+ */
6
+ export interface Signer {
7
+ /** The wire encoding of the public key of the signer */
8
+ readonly publicKey: Uint8Array;
9
+ /**
10
+ * Signs data
11
+ *
12
+ * @param data The data to sign
13
+ * @returns The signature in the SSH wire format (RFC 4253 section 6.6)
14
+ */
15
+ sign(data: Uint8Array<ArrayBuffer>): Promise<Uint8Array>;
16
+ }
17
+ /**
18
+ * Creates a {@link Signer} for an Ed25519 or ECDSA (P-256, P-384 or P-521)
19
+ * private key
20
+ *
21
+ * @param key The private key to sign with
22
+ * @returns The signer
23
+ */
24
+ export declare const createSigner: (key: PrivateKey) => Promise<Signer>;
25
+ /**
26
+ * Verifies a signature in the SSH wire format made with an Ed25519 or ECDSA
27
+ * key
28
+ *
29
+ * @param publicKey The key the signature must have been made with
30
+ * @param signature The signature in the SSH wire format
31
+ * @param data The data that was signed
32
+ * @returns true if the signature is valid, false if it is not or the key type is not supported
33
+ */
34
+ export declare const verify: (publicKey: PublicKey, signature: Uint8Array, data: Uint8Array<ArrayBuffer>) => Promise<boolean>;
35
+ //# sourceMappingURL=signer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signer.d.ts","sourceRoot":"","sources":["../../src/ssh/signer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAc,UAAU,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAElE;;;GAGG;AACH,MAAM,WAAW,MAAM;IACtB,wDAAwD;IACxD,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAA;IAC9B;;;;;OAKG;IACH,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;CACxD;AAuBD;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,QAAe,UAAU,KAAG,OAAO,CAAC,MAAM,CAmClE,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,MAAM,cAAqB,SAAS,aAAa,UAAU,QAAQ,UAAU,CAAC,WAAW,CAAC,KAAG,OAAO,CAAC,OAAO,CAiCxH,CAAA"}
@@ -0,0 +1,99 @@
1
+ import * as P from "micro-packed";
2
+ import { toFixedWidth } from "../sshsig/sig_parser.js";
3
+ import { decodePublicKey, SSHBytes, SSHText, SSHUnsignedMpint } from "./encoding.js";
4
+ /** An Ed25519 signature: string algorithm, string signature */
5
+ const Ed25519Signature = P.struct({
6
+ algorithm: SSHText,
7
+ signature: SSHBytes,
8
+ });
9
+ /** An ECDSA signature: string algorithm, string (mpint r, mpint s) */
10
+ const EcdsaSignature = P.struct({
11
+ algorithm: SSHText,
12
+ signature: P.prefix(P.U32BE, P.struct({
13
+ r: SSHUnsignedMpint,
14
+ s: SSHUnsignedMpint,
15
+ })),
16
+ });
17
+ const EcdsaCurves = {
18
+ nistp256: { namedCurve: "P-256", hash: "SHA-256", size: 32 },
19
+ nistp384: { namedCurve: "P-384", hash: "SHA-384", size: 48 },
20
+ nistp521: { namedCurve: "P-521", hash: "SHA-512", size: 66 },
21
+ };
22
+ /**
23
+ * Creates a {@link Signer} for an Ed25519 or ECDSA (P-256, P-384 or P-521)
24
+ * private key
25
+ *
26
+ * @param key The private key to sign with
27
+ * @returns The signer
28
+ */
29
+ export const createSigner = async (key) => {
30
+ const publicKey = key.publicKey.blob;
31
+ if (key.type === "ed25519") {
32
+ const cryptoKey = await crypto.subtle.importKey("jwk", key.jwk, { name: "Ed25519" }, false, ["sign"]);
33
+ return {
34
+ publicKey,
35
+ sign: async (data) => Ed25519Signature.encode({
36
+ algorithm: "ssh-ed25519",
37
+ signature: new Uint8Array(await crypto.subtle.sign({ name: "Ed25519" }, cryptoKey, data)),
38
+ }),
39
+ };
40
+ }
41
+ const curve = EcdsaCurves[key.curve];
42
+ const cryptoKey = await crypto.subtle.importKey("jwk", key.jwk, { name: "ECDSA", namedCurve: curve.namedCurve }, false, ["sign"]);
43
+ return {
44
+ publicKey,
45
+ sign: async (data) => {
46
+ // WebCrypto returns r || s, each the size of the curve
47
+ const signature = new Uint8Array(await crypto.subtle.sign({ name: "ECDSA", hash: { name: curve.hash } }, cryptoKey, data));
48
+ return EcdsaSignature.encode({
49
+ // the algorithm is named for the curve of the key, never
50
+ // worked out from the signature
51
+ algorithm: `ecdsa-sha2-${key.curve}`,
52
+ signature: {
53
+ r: signature.subarray(0, curve.size),
54
+ s: signature.subarray(curve.size),
55
+ },
56
+ });
57
+ },
58
+ };
59
+ };
60
+ /**
61
+ * Verifies a signature in the SSH wire format made with an Ed25519 or ECDSA
62
+ * key
63
+ *
64
+ * @param publicKey The key the signature must have been made with
65
+ * @param signature The signature in the SSH wire format
66
+ * @param data The data that was signed
67
+ * @returns true if the signature is valid, false if it is not or the key type is not supported
68
+ */
69
+ export const verify = async (publicKey, signature, data) => {
70
+ try {
71
+ const { type, fields } = decodePublicKey(publicKey.blob);
72
+ if (type === "ssh-ed25519") {
73
+ const { algorithm, signature: raw } = Ed25519Signature.decode(signature);
74
+ if (algorithm !== type) {
75
+ return false;
76
+ }
77
+ const cryptoKey = await crypto.subtle.importKey("raw", new Uint8Array(fields[0]), { name: "Ed25519" }, false, ["verify"]);
78
+ return await crypto.subtle.verify({ name: "Ed25519" }, cryptoKey, new Uint8Array(raw), data);
79
+ }
80
+ const curveName = type.replace(/^ecdsa-sha2-/, "");
81
+ const curve = EcdsaCurves[curveName];
82
+ if (curve !== undefined && type === `ecdsa-sha2-${curveName}`) {
83
+ const { algorithm, signature: { r, s } } = EcdsaSignature.decode(signature);
84
+ if (algorithm !== type || r.length > curve.size || s.length > curve.size) {
85
+ return false;
86
+ }
87
+ // fields are the curve name and the public point
88
+ const cryptoKey = await crypto.subtle.importKey("raw", new Uint8Array(fields[1]), { name: "ECDSA", namedCurve: curve.namedCurve }, false, ["verify"]);
89
+ const raw = P.utils.concatBytes(toFixedWidth(r, curve.size), toFixedWidth(s, curve.size));
90
+ return await crypto.subtle.verify({ name: "ECDSA", hash: { name: curve.hash } }, cryptoKey, new Uint8Array(raw), data);
91
+ }
92
+ return false;
93
+ }
94
+ catch {
95
+ // a signature or key that cannot be decoded or imported is not valid
96
+ return false;
97
+ }
98
+ };
99
+ //# sourceMappingURL=signer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signer.js","sourceRoot":"","sources":["../../src/ssh/signer.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -14,11 +14,6 @@ export type CertificateRequestJWTPayload = {
14
14
  sub: string;
15
15
  [key: string]: string | string[];
16
16
  } & JWTPayload;
17
- export type SSHExtension = {
18
- critical: boolean;
19
- name: string;
20
- data: Buffer<ArrayBuffer>;
21
- };
22
17
  /**
23
18
  * The result of executing a statement via {@link CaPreparedStatement.run} or
24
19
  * {@link CaDatabase.batch}, modelled on a Cloudflare D1 result.
@@ -87,24 +82,24 @@ export interface CaSecret {
87
82
  * {@link CaSecret} for the non-string bindings.
88
83
  */
89
84
  export interface SshCaBindings {
90
- DB: CaDatabase;
85
+ CERTIFICATE_REQUEST_TIME_SKEW_MAX: string;
86
+ JWT_ALGORITHMS: string | string[];
87
+ JWT_AUD?: string | string[];
88
+ JWT_ISSUER: string;
89
+ JWT_JWKS_URL: string;
90
+ JWT_SSH_CERTIFICATE_PRINCIPALS_CLAIM: string;
91
+ LOG_LEVEL?: string;
91
92
  DB_CERTIFICATE_RETENTION: string;
93
+ DB: CaDatabase;
94
+ ISSUER_DN: string;
92
95
  PRIVATE_KEY: CaSecret;
93
96
  SSH_CERTIFICATE_EXTENSIONS: string;
94
- SSH_CERTIFICATE_LIFETIME: string;
95
- SSH_CERTIFICATE_INCLUDE_SELF?: string | boolean;
96
97
  SSH_CERTIFICATE_INCLUDE_SELF_EMAIL?: string | boolean;
98
+ SSH_CERTIFICATE_INCLUDE_SELF?: string | boolean;
99
+ SSH_CERTIFICATE_LIFETIME: string;
97
100
  SSH_CERTIFICATE_PRINCIPALS?: string | string[];
98
- SSH_HOST_CERTIFICATE_LIFETIME: string;
99
101
  SSH_HOST_CERTIFICATE_ALLOWED_EMAILS?: string | string[];
100
102
  SSH_HOST_CERTIFICATE_ALLOWED_ROLES?: string | string[];
101
- ISSUER_DN: string;
102
- JWT_JWKS_URL: string;
103
- JWT_AUD?: string | string[];
104
- JWT_ISSUER: string;
105
- JWT_ALGORITHMS: string | string[];
106
- JWT_SSH_CERTIFICATE_PRINCIPALS_CLAIM: string;
107
- CERTIFICATE_REQUEST_TIME_SKEW_MAX: string;
108
- LOG_LEVEL?: string;
103
+ SSH_HOST_CERTIFICATE_LIFETIME: string;
109
104
  }
110
105
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAA;AAGjC,MAAM,MAAM,wBAAwB,GAAG;IACnC,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,yBAAyB,GAAG;IACpC,WAAW,EAAE,MAAM,CAAA;CACtB,CAAA;AAGD,MAAM,MAAM,4BAA4B,GAAG;IACvC,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAA;CACnC,GAAG,UAAU,CAAA;AAEd,MAAM,MAAM,YAAY,GAAG;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,WAAW,CAAC,CAAA;CAC5B,CAAA;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC7B,kDAAkD;IAClD,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE;QACH,kDAAkD;QAClD,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,yCAAyC;QACzC,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,6DAA6D;QAC7D,QAAQ,CAAC,EAAE,MAAM,CAAA;KACpB,CAAA;CACJ;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAsB,SAAQ,gBAAgB;IAC3D,iEAAiE;IACjE,OAAO,EAAE,OAAO,EAAE,CAAA;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,yEAAyE;IACzE,IAAI,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,mBAAmB,CAAA;IAC/C,gDAAgD;IAChD,GAAG,IAAI,OAAO,CAAC,qBAAqB,CAAC,CAAA;IACrC,mDAAmD;IACnD,GAAG,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAA;CACnC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,UAAU;IACvB,yEAAyE;IACzE,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,CAAA;IAC3C,kFAAkF;IAClF,KAAK,CAAC,UAAU,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAA;IACrE,4DAA4D;IAC5D,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CACxC;AAED;;;;GAIG;AACH,MAAM,WAAW,QAAQ;IACrB,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAA;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC1B,EAAE,EAAE,UAAU,CAAA;IACd,wBAAwB,EAAE,MAAM,CAAA;IAChC,WAAW,EAAE,QAAQ,CAAA;IACrB,0BAA0B,EAAE,MAAM,CAAA;IAClC,wBAAwB,EAAE,MAAM,CAAA;IAChC,4BAA4B,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IAC/C,kCAAkC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IACrD,0BAA0B,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IAC9C,6BAA6B,EAAE,MAAM,CAAA;IACrC,mCAAmC,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACvD,kCAAkC,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACtD,SAAS,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IAC3B,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACjC,oCAAoC,EAAE,MAAM,CAAA;IAC5C,iCAAiC,EAAE,MAAM,CAAA;IACzC,SAAS,CAAC,EAAE,MAAM,CAAA;CAClB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/utils.d.ts CHANGED
@@ -1,9 +1,11 @@
1
1
  import type { SshCaBindings } from "./types.js";
2
- import type { Certificate, Key, PrivateKey } from "sshpk";
2
+ import { SshCertificate } from "./ssh/certificate.js";
3
+ import { PublicKey, UnsupportedKeyError, type PrivateKey } from "./ssh/keys.js";
3
4
  import z from "zod";
4
5
  import { CertificateRequestJWTPayload } from "./types.js";
5
6
  import { RenewalProofOfPossession, ProofOfPossession } from "./proof.js";
6
7
  import type { isRevoked as IsRevokedFn } from "./db/index.js";
8
+ export { UnsupportedKeyError };
7
9
  export declare const fatalIssue: (ctx: z.RefinementCtx, message: string, val: unknown) => never;
8
10
  export declare const transformProofOfPossession: (env: SshCaBindings, val: string, ctx: z.core.$RefinementCtx<string>) => ProofOfPossession | never;
9
11
  type AccessToken = {
@@ -11,7 +13,13 @@ type AccessToken = {
11
13
  sub: string;
12
14
  };
13
15
  export declare const transformAuthorizationHeader: (env: SshCaBindings, val: string, ctx: z.RefinementCtx) => Promise<AccessToken | never>;
14
- export declare const transformPublicKey: (val: string | Buffer<ArrayBufferLike>, ctx: z.RefinementCtx) => Key | never;
16
+ /**
17
+ * Parses a public key in OpenSSH format, `${type} ${base64}[ ${comment}]`
18
+ *
19
+ * @param val The public key, either base64 encoded or as bytes
20
+ * @param ctx The Zod context for any errors
21
+ */
22
+ export declare const transformPublicKey: (val: string | Buffer<ArrayBufferLike>, ctx: z.RefinementCtx) => PublicKey | never;
15
23
  /**
16
24
  * Thrown by {@link identityPrincipals} when the principals claim of an
17
25
  * identity token is not a string or an array of strings.
@@ -32,10 +40,10 @@ export declare const transformIdentityToken: (env: SshCaBindings, val: string, c
32
40
  * @param ctx The Zod context for any errors
33
41
  * @returns
34
42
  */
35
- export declare const transformCertificate: (val: string | Buffer<ArrayBufferLike>, ctx: z.RefinementCtx) => Certificate | never;
43
+ export declare const transformCertificate: (val: string | Buffer<ArrayBufferLike>, ctx: z.RefinementCtx) => SshCertificate | never;
36
44
  type ParsedCertificateRequest = {
37
45
  proof: ProofOfPossession;
38
- public_key: Key;
46
+ public_key: PublicKey;
39
47
  lifetime: number;
40
48
  identity: IdentityToken;
41
49
  extensions: string[];
@@ -43,7 +51,7 @@ type ParsedCertificateRequest = {
43
51
  export declare const refineCertificateRequest: (env: SshCaBindings, val: ParsedCertificateRequest, ctx: z.RefinementCtx) => Promise<never>;
44
52
  export declare const transformRenewalProofOfPossession: (env: SshCaBindings, val: string, ctx: z.RefinementCtx) => RenewalProofOfPossession | never;
45
53
  type HostCertificateRequest = {
46
- public_key: Key;
54
+ public_key: PublicKey;
47
55
  lifetime: number;
48
56
  };
49
57
  type ParsedHostCertificateRequest = {
@@ -52,36 +60,47 @@ type ParsedHostCertificateRequest = {
52
60
  } & HostCertificateRequest;
53
61
  export declare const refineHostCertificateRequest: (env: SshCaBindings, val: ParsedHostCertificateRequest, ctx: z.RefinementCtx) => Promise<never>;
54
62
  type ParsedHostCertificateRenewal = {
55
- certificate: Certificate;
63
+ certificate: SshCertificate;
56
64
  proof: RenewalProofOfPossession;
57
65
  } & HostCertificateRequest;
66
+ /**
67
+ * Checks a certificate presented for renewal was issued by this CA, is a host
68
+ * certificate, is within its validity period and has not been revoked.
69
+ *
70
+ * @param env The CA bindings
71
+ * @param isRevoked Returns whether a serial has been revoked
72
+ * @param certificate The certificate presented for renewal
73
+ * @returns The reason the certificate cannot be renewed, or undefined if it can be
74
+ * @throws {@link UnsupportedKeyError} when the CA key is not supported
75
+ */
76
+ export declare const checkRenewableCertificate: (env: SshCaBindings, isRevoked: typeof IsRevokedFn, certificate: SshCertificate) => Promise<string | undefined>;
77
+ /**
78
+ * Refines a host certificate renewal so only a certificate that can be
79
+ * renewed (see {@link checkRenewableCertificate}) is accepted.
80
+ */
81
+ export declare const refineRenewableCertificate: (env: SshCaBindings, isRevoked: typeof IsRevokedFn, val: {
82
+ certificate: SshCertificate;
83
+ }, ctx: z.RefinementCtx) => Promise<never>;
58
84
  export declare const refineHostCertificateRenewal: (env: SshCaBindings, isRevoked: typeof IsRevokedFn, val: ParsedHostCertificateRenewal, ctx: z.RefinementCtx) => Promise<never>;
59
85
  type ParsedRevokeCertificate = {
60
86
  serial: bigint;
61
- public_key: Key;
87
+ public_key: PublicKey;
62
88
  proof: ProofOfPossession;
63
89
  };
64
90
  export declare const refineRevokeCertificate: (env: SshCaBindings, val: ParsedRevokeCertificate, ctx: z.RefinementCtx) => Promise<never>;
65
91
  export declare const split: (v?: string | string[]) => string[];
66
- /**
67
- * Thrown by {@link getPrivateKey} when the CA private key is of a type that
68
- * cannot be used.
69
- */
70
- export declare class UnsupportedKeyError extends Error {
71
- constructor(message: string);
72
- }
73
92
  /**
74
93
  * Load and parse the CA private key from the `PRIVATE_KEY` secret.
75
94
  *
76
- * Only Ed25519 and ECDSA keys are supported. RSA keys are rejected because
77
- * sshpk signs RSA certificates with SHA-1 (`ssh-rsa`), which OpenSSH 8.2 and
78
- * later refuse by default, and because RSA keys in OpenSSH format are
79
- * converted with invalid CRT parameters that the Workers runtime rejects.
95
+ * Only Ed25519 and ECDSA keys are supported, as these are the key types that
96
+ * certificates and KRLs are signed with (see `createSigner` in `ssh/signer.ts`).
80
97
  *
81
- * @throws KeyParseError when the secret cannot be parsed.
98
+ * @throws {@link KeyParseError} when the secret cannot be parsed.
82
99
  * @throws {@link UnsupportedKeyError} when the key is not Ed25519 or ECDSA.
83
100
  */
84
101
  export declare const getPrivateKey: (env: SshCaBindings) => Promise<PrivateKey>;
85
- export declare const getPublic: (env: SshCaBindings, key?: PrivateKey) => Promise<Key>;
86
- export {};
102
+ /**
103
+ * Returns the public key of the CA, with `ISSUER_DN` as its comment
104
+ */
105
+ export declare const getPublic: (env: SshCaBindings, key?: PrivateKey) => Promise<PublicKey>;
87
106
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}