@sebastienrousseau/crypto-server 0.0.8 → 0.0.24
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/README.md +159 -56
- package/dist/@types/types.d.ts +1 -2
- package/dist/@types/types.d.ts.map +1 -1
- package/dist/config/auth-policy.d.ts +18 -0
- package/dist/config/auth-policy.d.ts.map +1 -1
- package/dist/config/auth-policy.js +126 -0
- package/dist/config/constants.d.ts.map +1 -1
- package/dist/config/constants.js +7 -1
- package/dist/enterprise/metering.d.ts.map +1 -1
- package/dist/enterprise/metering.js +2 -4
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/lib/auth.d.ts +4 -1
- package/dist/lib/auth.d.ts.map +1 -1
- package/dist/lib/auth.js +87 -40
- package/dist/lib/kdf-runner.d.ts +18 -0
- package/dist/lib/kdf-runner.d.ts.map +1 -0
- package/dist/lib/kdf-runner.js +27 -0
- package/dist/lib/key-store.d.ts +37 -0
- package/dist/lib/key-store.d.ts.map +1 -0
- package/dist/lib/key-store.js +223 -0
- package/dist/lib/opaque-store.d.ts +34 -0
- package/dist/lib/opaque-store.d.ts.map +1 -0
- package/dist/lib/opaque-store.js +72 -0
- package/dist/lib/problem.d.ts +67 -0
- package/dist/lib/problem.d.ts.map +1 -0
- package/dist/lib/problem.js +162 -0
- package/dist/routes/v1/decrypt.d.ts.map +1 -1
- package/dist/routes/v1/decrypt.js +24 -16
- package/dist/routes/v1/encrypt.d.ts.map +1 -1
- package/dist/routes/v1/encrypt.js +12 -13
- package/dist/routes/v1/generate.d.ts.map +1 -1
- package/dist/routes/v1/generate.js +22 -25
- package/dist/routes/v1/revoke.d.ts.map +1 -1
- package/dist/routes/v1/revoke.js +6 -11
- package/dist/routes/v1/verify.d.ts.map +1 -1
- package/dist/routes/v1/verify.js +10 -12
- package/dist/routes/v2/algorithms.js +1 -1
- package/dist/routes/v2/compliance.js +1 -1
- package/dist/routes/v2/encrypt.d.ts.map +1 -1
- package/dist/routes/v2/encrypt.js +1 -1
- package/dist/routes/v2/hash.d.ts.map +1 -1
- package/dist/routes/v2/hash.js +1 -1
- package/dist/routes/v2/hpke.d.ts +3 -0
- package/dist/routes/v2/hpke.d.ts.map +1 -0
- package/dist/routes/v2/hpke.js +168 -0
- package/dist/routes/v2/index.d.ts.map +1 -1
- package/dist/routes/v2/index.js +6 -0
- package/dist/routes/v2/kdf.d.ts +5 -0
- package/dist/routes/v2/kdf.d.ts.map +1 -1
- package/dist/routes/v2/kdf.js +27 -12
- package/dist/routes/v2/key-wrap.d.ts.map +1 -1
- package/dist/routes/v2/key-wrap.js +9 -3
- package/dist/routes/v2/keys.d.ts.map +1 -1
- package/dist/routes/v2/keys.js +39 -26
- package/dist/routes/v2/kms.d.ts +7 -0
- package/dist/routes/v2/kms.d.ts.map +1 -0
- package/dist/routes/v2/kms.js +310 -0
- package/dist/routes/v2/mac.d.ts.map +1 -1
- package/dist/routes/v2/mac.js +10 -3
- package/dist/routes/v2/multi-recipient.d.ts.map +1 -1
- package/dist/routes/v2/multi-recipient.js +12 -11
- package/dist/routes/v2/opaque.d.ts +4 -0
- package/dist/routes/v2/opaque.d.ts.map +1 -0
- package/dist/routes/v2/opaque.js +174 -0
- package/dist/routes/v2/password-encrypt.d.ts.map +1 -1
- package/dist/routes/v2/password-encrypt.js +13 -46
- package/dist/routes/v2/password.d.ts +4 -0
- package/dist/routes/v2/password.d.ts.map +1 -1
- package/dist/routes/v2/password.js +28 -53
- package/dist/routes/v2/pq-hash-sign.d.ts.map +1 -1
- package/dist/routes/v2/pq-hash-sign.js +33 -24
- package/dist/routes/v2/pq-sign.d.ts.map +1 -1
- package/dist/routes/v2/pq-sign.js +31 -24
- package/dist/routes/v2/pq.d.ts.map +1 -1
- package/dist/routes/v2/pq.js +57 -38
- package/dist/routes/v2/sealedbox.d.ts.map +1 -1
- package/dist/routes/v2/sealedbox.js +32 -14
- package/dist/routes/v2/secretbox.d.ts.map +1 -1
- package/dist/routes/v2/secretbox.js +10 -3
- package/dist/routes/v2/signing.d.ts.map +1 -1
- package/dist/routes/v2/signing.js +17 -13
- package/dist/routes/v2/stream-schemas.d.ts +296 -0
- package/dist/routes/v2/stream-schemas.d.ts.map +1 -0
- package/dist/routes/v2/stream-schemas.js +207 -0
- package/dist/routes/v2/stream.d.ts.map +1 -1
- package/dist/routes/v2/stream.js +144 -151
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +19 -5
- package/dist/utils/keys.d.ts +17 -0
- package/dist/utils/keys.d.ts.map +1 -0
- package/dist/utils/keys.js +36 -0
- package/dist/utils/route-helpers.d.ts +1 -5
- package/dist/utils/route-helpers.d.ts.map +1 -1
- package/dist/utils/route-helpers.js +16 -10
- package/dist/utils/trace.d.ts +12 -0
- package/dist/utils/trace.d.ts.map +1 -0
- package/dist/utils/trace.js +62 -0
- package/dist/utils/validation.d.ts +1 -0
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +17 -9
- package/package.json +22 -18
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.default = hpkeRoute;
|
|
37
|
+
const route_helpers_1 = require("../../utils/route-helpers");
|
|
38
|
+
const keys_1 = require("../../utils/keys");
|
|
39
|
+
const loadHpke = async () => await Promise.resolve().then(() => __importStar(require("@sebastienrousseau/crypto-lib/modern")));
|
|
40
|
+
function ensureHex(text) {
|
|
41
|
+
const isHex = /^[0-9a-fA-F]*$/.test(text) && text.length % 2 === 0;
|
|
42
|
+
return isHex ? text : Buffer.from(text, "utf8").toString("hex");
|
|
43
|
+
}
|
|
44
|
+
const KEYGEN_SCHEMA = {
|
|
45
|
+
tags: ["HPKE"],
|
|
46
|
+
summary: "Generate a server-held HPKE key pair (classical or post-quantum hybrid)",
|
|
47
|
+
body: {
|
|
48
|
+
type: "object",
|
|
49
|
+
additionalProperties: false,
|
|
50
|
+
properties: {
|
|
51
|
+
kem: {
|
|
52
|
+
type: "string",
|
|
53
|
+
enum: ["x25519", "p256", "x25519-ml-kem-768"],
|
|
54
|
+
default: "x25519-ml-kem-768",
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
const SEAL_SCHEMA = {
|
|
60
|
+
tags: ["HPKE"],
|
|
61
|
+
summary: "Encrypt (seal) a message using HPKE (RFC 9180)",
|
|
62
|
+
body: {
|
|
63
|
+
type: "object",
|
|
64
|
+
required: ["recipientPublicKey", "plaintext"],
|
|
65
|
+
additionalProperties: false,
|
|
66
|
+
properties: {
|
|
67
|
+
recipientPublicKey: { type: "string", minLength: 1 },
|
|
68
|
+
plaintext: { type: "string", minLength: 1 },
|
|
69
|
+
kem: { type: "string", enum: ["x25519", "p256", "x25519-ml-kem-768"] },
|
|
70
|
+
aead: { type: "string", enum: ["chacha20-poly1305", "aes-128-gcm"] },
|
|
71
|
+
info: { type: "string" },
|
|
72
|
+
aad: { type: "string" },
|
|
73
|
+
psk: { type: "string" },
|
|
74
|
+
pskId: { type: "string" },
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
const OPEN_SCHEMA = {
|
|
79
|
+
tags: ["HPKE"],
|
|
80
|
+
summary: "Decrypt (open) an HPKE ciphertext with a server-held key",
|
|
81
|
+
body: {
|
|
82
|
+
type: "object",
|
|
83
|
+
required: ["keyId", "encapsulatedKey", "ciphertext"],
|
|
84
|
+
additionalProperties: false,
|
|
85
|
+
properties: {
|
|
86
|
+
keyId: keys_1.KEY_ID_SCHEMA,
|
|
87
|
+
encapsulatedKey: { type: "string", minLength: 1 },
|
|
88
|
+
ciphertext: { type: "string", minLength: 1 },
|
|
89
|
+
aead: { type: "string", enum: ["chacha20-poly1305", "aes-128-gcm"] },
|
|
90
|
+
info: { type: "string" },
|
|
91
|
+
aad: { type: "string" },
|
|
92
|
+
psk: { type: "string" },
|
|
93
|
+
pskId: { type: "string" },
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
function registerKeygen(app) {
|
|
98
|
+
app.post("/v2/hpke/keygen", { schema: KEYGEN_SCHEMA }, async (request, reply) => {
|
|
99
|
+
const { hpkeGenerateKeyPair } = await loadHpke();
|
|
100
|
+
const { kem } = request.body;
|
|
101
|
+
const kp = hpkeGenerateKeyPair(kem);
|
|
102
|
+
const stored = await (0, keys_1.storeKey)(request, kem, { publicKey: kp.publicKey }, { privateKey: kp.privateKey });
|
|
103
|
+
return reply.send({ data: (0, keys_1.publicView)(stored) });
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
function registerSeal(app) {
|
|
107
|
+
app.post("/v2/hpke/seal", { schema: SEAL_SCHEMA }, async (request, reply) => {
|
|
108
|
+
try {
|
|
109
|
+
const { hpkeSeal } = await loadHpke();
|
|
110
|
+
const b = request.body;
|
|
111
|
+
const hexPlaintext = ensureHex(b.plaintext);
|
|
112
|
+
const res = hpkeSeal({
|
|
113
|
+
recipientPublicKey: b.recipientPublicKey,
|
|
114
|
+
plaintext: hexPlaintext,
|
|
115
|
+
suite: {
|
|
116
|
+
kem: b.kem ?? "x25519-ml-kem-768",
|
|
117
|
+
aead: b.aead ?? "chacha20-poly1305",
|
|
118
|
+
},
|
|
119
|
+
...(b.info ? { info: ensureHex(b.info) } : {}),
|
|
120
|
+
...(b.aad ? { aad: ensureHex(b.aad) } : {}),
|
|
121
|
+
...(b.psk && b.pskId ? { psk: { psk: b.psk, pskId: b.pskId } } : {}),
|
|
122
|
+
});
|
|
123
|
+
return reply.send({ data: res });
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
return (0, route_helpers_1.classifyCryptoError)(error, request, reply, "Encryption");
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
function registerOpen(app) {
|
|
131
|
+
app.post("/v2/hpke/open", {
|
|
132
|
+
config: { rateLimit: { max: 100, timeWindow: "1 minute" } },
|
|
133
|
+
schema: OPEN_SCHEMA,
|
|
134
|
+
}, async (request, reply) => {
|
|
135
|
+
const b = request.body;
|
|
136
|
+
const key = await (0, keys_1.resolveKey)(request, b.keyId, [
|
|
137
|
+
"x25519-ml-kem-768",
|
|
138
|
+
"x25519",
|
|
139
|
+
"p256",
|
|
140
|
+
]);
|
|
141
|
+
try {
|
|
142
|
+
const { hpkeOpen } = await loadHpke();
|
|
143
|
+
const res = hpkeOpen({
|
|
144
|
+
recipientPrivateKey: key.privateParts["privateKey"],
|
|
145
|
+
encapsulatedKey: b.encapsulatedKey,
|
|
146
|
+
ciphertext: b.ciphertext,
|
|
147
|
+
suite: {
|
|
148
|
+
kem: key.algorithm,
|
|
149
|
+
aead: b.aead ?? "chacha20-poly1305",
|
|
150
|
+
},
|
|
151
|
+
...(b.info ? { info: ensureHex(b.info) } : {}),
|
|
152
|
+
...(b.aad ? { aad: ensureHex(b.aad) } : {}),
|
|
153
|
+
...(b.psk && b.pskId ? { psk: { psk: b.psk, pskId: b.pskId } } : {}),
|
|
154
|
+
});
|
|
155
|
+
const utf8 = Buffer.from(res.plaintext, "hex").toString("utf8");
|
|
156
|
+
return reply.send({ data: { plaintext: utf8, hex: res.plaintext } });
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
return (0, route_helpers_1.classifyCryptoError)(error, request, reply, "Decryption");
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
function hpkeRoute(app) {
|
|
164
|
+
registerKeygen(app);
|
|
165
|
+
registerSeal(app);
|
|
166
|
+
registerOpen(app);
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=hpke.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/v2/index.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/v2/index.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;yBAwB/B,KAAK,eAAe,KAAG,IAAI;AAA3C,wBAsBE"}
|
package/dist/routes/v2/index.js
CHANGED
|
@@ -21,6 +21,9 @@ const keys_1 = __importDefault(require("./keys"));
|
|
|
21
21
|
const multi_recipient_1 = __importDefault(require("./multi-recipient"));
|
|
22
22
|
const compliance_1 = __importDefault(require("./compliance"));
|
|
23
23
|
const stream_1 = __importDefault(require("./stream"));
|
|
24
|
+
const opaque_1 = __importDefault(require("./opaque"));
|
|
25
|
+
const hpke_1 = __importDefault(require("./hpke"));
|
|
26
|
+
const kms_1 = __importDefault(require("./kms"));
|
|
24
27
|
exports.default = (app) => {
|
|
25
28
|
(0, algorithms_1.default)(app);
|
|
26
29
|
(0, compliance_1.default)(app);
|
|
@@ -40,5 +43,8 @@ exports.default = (app) => {
|
|
|
40
43
|
(0, key_wrap_1.default)(app);
|
|
41
44
|
(0, keys_1.default)(app);
|
|
42
45
|
(0, multi_recipient_1.default)(app);
|
|
46
|
+
(0, opaque_1.default)(app);
|
|
47
|
+
(0, hpke_1.default)(app);
|
|
48
|
+
(0, kms_1.default)(app);
|
|
43
49
|
};
|
|
44
50
|
//# sourceMappingURL=index.js.map
|
package/dist/routes/v2/kdf.d.ts
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import type { FastifyInstance } from "fastify";
|
|
2
|
+
export declare const KDF_FLOORS: Readonly<{
|
|
3
|
+
scryptN: 131072;
|
|
4
|
+
scryptR: 8;
|
|
5
|
+
pbkdf2Iterations: 600000;
|
|
6
|
+
}>;
|
|
2
7
|
declare const _default: (app: FastifyInstance) => void;
|
|
3
8
|
export default _default;
|
|
4
9
|
//# sourceMappingURL=kdf.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kdf.d.ts","sourceRoot":"","sources":["../../../src/routes/v2/kdf.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"kdf.d.ts","sourceRoot":"","sources":["../../../src/routes/v2/kdf.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAc/C,eAAO,MAAM,UAAU;;;;EAIrB,CAAC;yBA+Ca,KAAK,eAAe,KAAG,IAAI;AAA3C,wBAqBE"}
|
package/dist/routes/v2/kdf.js
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
|
|
3
|
+
exports.KDF_FLOORS = void 0;
|
|
4
|
+
const modern_1 = require("@sebastienrousseau/crypto-lib/modern");
|
|
4
5
|
const route_helpers_1 = require("../../utils/route-helpers");
|
|
6
|
+
exports.KDF_FLOORS = Object.freeze({
|
|
7
|
+
scryptN: 131072,
|
|
8
|
+
scryptR: 8,
|
|
9
|
+
pbkdf2Iterations: 600_000,
|
|
10
|
+
});
|
|
5
11
|
const kdfSchema = {
|
|
6
12
|
tags: ["Key Derivation"],
|
|
7
13
|
summary: "Derive a key from a password",
|
|
8
|
-
description: "Key derivation using scrypt, HKDF-SHA256, or PBKDF2-SHA256.",
|
|
14
|
+
description: "Key derivation using scrypt (N = 2^17, r = 8), HKDF-SHA256, or PBKDF2-SHA256 (>= 600,000 iterations). Runs on a worker thread.",
|
|
9
15
|
body: {
|
|
10
16
|
type: "object",
|
|
11
17
|
required: ["algorithm", "password"],
|
|
@@ -19,10 +25,22 @@ const kdfSchema = {
|
|
|
19
25
|
type: "object",
|
|
20
26
|
additionalProperties: false,
|
|
21
27
|
properties: {
|
|
22
|
-
N: {
|
|
23
|
-
|
|
28
|
+
N: {
|
|
29
|
+
type: "integer",
|
|
30
|
+
minimum: exports.KDF_FLOORS.scryptN,
|
|
31
|
+
maximum: exports.KDF_FLOORS.scryptN,
|
|
32
|
+
},
|
|
33
|
+
r: {
|
|
34
|
+
type: "integer",
|
|
35
|
+
minimum: exports.KDF_FLOORS.scryptR,
|
|
36
|
+
maximum: exports.KDF_FLOORS.scryptR,
|
|
37
|
+
},
|
|
24
38
|
p: { type: "integer", minimum: 1, maximum: 4 },
|
|
25
|
-
iterations: {
|
|
39
|
+
iterations: {
|
|
40
|
+
type: "integer",
|
|
41
|
+
minimum: exports.KDF_FLOORS.pbkdf2Iterations,
|
|
42
|
+
maximum: 1000000,
|
|
43
|
+
},
|
|
26
44
|
info: { type: "string", maxLength: 1024 },
|
|
27
45
|
},
|
|
28
46
|
},
|
|
@@ -33,17 +51,14 @@ exports.default = (app) => {
|
|
|
33
51
|
app.post("/v2/kdf", { schema: kdfSchema }, async (request, reply) => {
|
|
34
52
|
try {
|
|
35
53
|
const body = request.body;
|
|
36
|
-
const
|
|
54
|
+
const options = {
|
|
37
55
|
algorithm: body.algorithm,
|
|
38
56
|
password: body.password,
|
|
39
57
|
...(body.salt ? { salt: body.salt } : {}),
|
|
40
58
|
...(body.keyLength ? { keyLength: body.keyLength } : {}),
|
|
41
|
-
...(body.params
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
-
: {}),
|
|
46
|
-
});
|
|
59
|
+
...(body.params ? { params: body.params } : {}),
|
|
60
|
+
};
|
|
61
|
+
const result = await request.server.kdf.run("modern", "kdfDerive", options);
|
|
47
62
|
return reply.send({ data: result });
|
|
48
63
|
}
|
|
49
64
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"key-wrap.d.ts","sourceRoot":"","sources":["../../../src/routes/v2/key-wrap.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"key-wrap.d.ts","sourceRoot":"","sources":["../../../src/routes/v2/key-wrap.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;yBAwF/B,KAAK,eAAe,KAAG,IAAI;AAA3C,wBAGE"}
|
|
@@ -34,7 +34,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
const route_helpers_1 = require("../../utils/route-helpers");
|
|
37
|
-
|
|
37
|
+
function registerKeysWrap(app) {
|
|
38
38
|
app.post("/v2/keys/wrap", {
|
|
39
39
|
schema: {
|
|
40
40
|
tags: ["Key Wrapping"],
|
|
@@ -52,7 +52,7 @@ exports.default = (app) => {
|
|
|
52
52
|
},
|
|
53
53
|
}, async (request, reply) => {
|
|
54
54
|
try {
|
|
55
|
-
const { aesKwWrap, aesKwpWrap } = await Promise.resolve().then(() => __importStar(require("@sebastienrousseau/crypto-lib/
|
|
55
|
+
const { aesKwWrap, aesKwpWrap } = await Promise.resolve().then(() => __importStar(require("@sebastienrousseau/crypto-lib/high-level")));
|
|
56
56
|
const { kek, keyToWrap, algorithm } = request.body;
|
|
57
57
|
const result = algorithm === "aes-kwp"
|
|
58
58
|
? aesKwpWrap(kek, keyToWrap)
|
|
@@ -63,6 +63,8 @@ exports.default = (app) => {
|
|
|
63
63
|
return (0, route_helpers_1.classifyCryptoError)(error, request, reply, "Key wrapping");
|
|
64
64
|
}
|
|
65
65
|
});
|
|
66
|
+
}
|
|
67
|
+
function registerKeysUnwrap(app) {
|
|
66
68
|
app.post("/v2/keys/unwrap", {
|
|
67
69
|
schema: {
|
|
68
70
|
tags: ["Key Wrapping"],
|
|
@@ -80,7 +82,7 @@ exports.default = (app) => {
|
|
|
80
82
|
},
|
|
81
83
|
}, async (request, reply) => {
|
|
82
84
|
try {
|
|
83
|
-
const { aesKwUnwrap, aesKwpUnwrap } = await Promise.resolve().then(() => __importStar(require("@sebastienrousseau/crypto-lib/
|
|
85
|
+
const { aesKwUnwrap, aesKwpUnwrap } = await Promise.resolve().then(() => __importStar(require("@sebastienrousseau/crypto-lib/high-level")));
|
|
84
86
|
const { kek, wrappedKey, algorithm } = request.body;
|
|
85
87
|
const result = algorithm === "aes-kwp"
|
|
86
88
|
? aesKwpUnwrap(kek, wrappedKey)
|
|
@@ -93,5 +95,9 @@ exports.default = (app) => {
|
|
|
93
95
|
return (0, route_helpers_1.classifyCryptoError)(error, request, reply, "Key unwrapping");
|
|
94
96
|
}
|
|
95
97
|
});
|
|
98
|
+
}
|
|
99
|
+
exports.default = (app) => {
|
|
100
|
+
registerKeysWrap(app);
|
|
101
|
+
registerKeysUnwrap(app);
|
|
96
102
|
};
|
|
97
103
|
//# sourceMappingURL=key-wrap.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../../src/routes/v2/keys.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../../src/routes/v2/keys.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;yBAiG/B,KAAK,eAAe,KAAG,IAAI;AAA3C,wBAGE"}
|
package/dist/routes/v2/keys.js
CHANGED
|
@@ -33,12 +33,14 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
const
|
|
37
|
-
|
|
36
|
+
const keys_1 = require("@sebastienrousseau/crypto-lib/keys");
|
|
37
|
+
const keys_2 = require("../../utils/keys");
|
|
38
|
+
function registerGenerate(app) {
|
|
38
39
|
app.post("/v2/keys/generate", {
|
|
39
40
|
schema: {
|
|
40
41
|
tags: ["Key Management"],
|
|
41
|
-
summary: "Generate a key pair for any supported algorithm",
|
|
42
|
+
summary: "Generate a server-held key pair for any supported algorithm",
|
|
43
|
+
description: "Generates a key pair, keeps the private key on the server and returns its keyId with the public key. Use the keyId with the signing, decryption and decapsulation routes.",
|
|
42
44
|
body: {
|
|
43
45
|
type: "object",
|
|
44
46
|
additionalProperties: false,
|
|
@@ -46,20 +48,7 @@ exports.default = (app) => {
|
|
|
46
48
|
algorithm: {
|
|
47
49
|
default: "ed25519",
|
|
48
50
|
type: "string",
|
|
49
|
-
enum: [
|
|
50
|
-
"ed25519",
|
|
51
|
-
"x25519",
|
|
52
|
-
"ed448",
|
|
53
|
-
"x448",
|
|
54
|
-
"p256",
|
|
55
|
-
"p384",
|
|
56
|
-
"ml-kem-512",
|
|
57
|
-
"ml-kem-768",
|
|
58
|
-
"ml-kem-1024",
|
|
59
|
-
"ml-dsa-44",
|
|
60
|
-
"ml-dsa-65",
|
|
61
|
-
"ml-dsa-87",
|
|
62
|
-
],
|
|
51
|
+
enum: [...keys_1.KEY_ALGORITHMS],
|
|
63
52
|
},
|
|
64
53
|
metadata: {
|
|
65
54
|
type: "object",
|
|
@@ -74,15 +63,39 @@ exports.default = (app) => {
|
|
|
74
63
|
},
|
|
75
64
|
},
|
|
76
65
|
}, async (request, reply) => {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
return (0, route_helpers_1.classifyCryptoError)(error, request, reply, "Key generation");
|
|
85
|
-
}
|
|
66
|
+
const { generateKeyPair } = await Promise.resolve().then(() => __importStar(require("@sebastienrousseau/crypto-lib/keys")));
|
|
67
|
+
const { algorithm, metadata } = request.body;
|
|
68
|
+
const pair = generateKeyPair(algorithm, metadata);
|
|
69
|
+
const stored = await (0, keys_2.storeKey)(request, pair.algorithm, { publicKey: pair.publicKey }, { privateKey: pair.privateKey });
|
|
70
|
+
return reply.send({
|
|
71
|
+
data: { ...(0, keys_2.publicView)(stored), kid: pair.kid, metadata: pair.metadata },
|
|
72
|
+
});
|
|
86
73
|
});
|
|
74
|
+
}
|
|
75
|
+
function registerExport(app) {
|
|
76
|
+
app.post("/v2/keys/export", {
|
|
77
|
+
schema: {
|
|
78
|
+
tags: ["Key Management"],
|
|
79
|
+
summary: "Export a server-held private key",
|
|
80
|
+
description: "Returns the private key of a key pair this principal generated. Requires the crypto:keys:export scope, granted explicitly (crypto:admin does not include it).",
|
|
81
|
+
body: {
|
|
82
|
+
type: "object",
|
|
83
|
+
required: ["keyId"],
|
|
84
|
+
additionalProperties: false,
|
|
85
|
+
properties: { keyId: keys_2.KEY_ID_SCHEMA },
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
}, async (request, reply) => {
|
|
89
|
+
const { keyId } = request.body;
|
|
90
|
+
const key = await (0, keys_2.resolveKey)(request, keyId);
|
|
91
|
+
request.log.warn({ keyId }, "Private key exported");
|
|
92
|
+
return reply.send({
|
|
93
|
+
data: { ...(0, keys_2.publicView)(key), ...key.privateParts },
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
exports.default = (app) => {
|
|
98
|
+
registerGenerate(app);
|
|
99
|
+
registerExport(app);
|
|
87
100
|
};
|
|
88
101
|
//# sourceMappingURL=keys.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { FastifyInstance } from "fastify";
|
|
2
|
+
import { type KmsProvider } from "@sebastienrousseau/crypto-kms";
|
|
3
|
+
export declare function registerKmsProvider(name: string, provider: KmsProvider): void;
|
|
4
|
+
export declare function resetKmsProviders(): void;
|
|
5
|
+
export declare function resolveKmsProvider(name?: string): KmsProvider;
|
|
6
|
+
export default function kmsRoute(app: FastifyInstance): void;
|
|
7
|
+
//# sourceMappingURL=kms.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kms.d.ts","sourceRoot":"","sources":["../../../src/routes/v2/kms.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EACL,KAAK,WAAW,EAMjB,MAAM,+BAA+B,CAAC;AAOvC,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,IAAI,CAE7E;AAGD,wBAAgB,iBAAiB,IAAI,IAAI,CAGxC;AA+CD,wBAAgB,kBAAkB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,CAQ7D;AA2SD,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI,CAO3D"}
|