@sebastienrousseau/crypto-kms 0.0.7
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/LICENSE +8 -0
- package/README.md +320 -0
- package/dist/errors.d.ts +8 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +15 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/providers/aws.d.ts +36 -0
- package/dist/providers/aws.d.ts.map +1 -0
- package/dist/providers/aws.js +214 -0
- package/dist/providers/azure.d.ts +29 -0
- package/dist/providers/azure.d.ts.map +1 -0
- package/dist/providers/azure.js +52 -0
- package/dist/providers/gcp.d.ts +31 -0
- package/dist/providers/gcp.d.ts.map +1 -0
- package/dist/providers/gcp.js +53 -0
- package/dist/providers/local.d.ts +30 -0
- package/dist/providers/local.d.ts.map +1 -0
- package/dist/providers/local.js +139 -0
- package/dist/providers/pkcs11.d.ts +53 -0
- package/dist/providers/pkcs11.d.ts.map +1 -0
- package/dist/providers/pkcs11.js +165 -0
- package/dist/providers/vault.d.ts +34 -0
- package/dist/providers/vault.d.ts.map +1 -0
- package/dist/providers/vault.js +63 -0
- package/dist/providers/versioned-key.d.ts +26 -0
- package/dist/providers/versioned-key.d.ts.map +1 -0
- package/dist/providers/versioned-key.js +141 -0
- package/dist/types.d.ts +48 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/package.json +71 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { KmsProvider, KmsKeyMetadata, KmsEncryptResult, KmsDecryptResult, KmsSignResult } from "../types";
|
|
2
|
+
export interface AzureKmsOptions {
|
|
3
|
+
vaultUrl: string;
|
|
4
|
+
}
|
|
5
|
+
export declare class AzureKmsProvider implements KmsProvider {
|
|
6
|
+
readonly name = "azure";
|
|
7
|
+
private readonly _vaultUrl;
|
|
8
|
+
constructor(options: AzureKmsOptions);
|
|
9
|
+
get vaultUrl(): string;
|
|
10
|
+
listKeys(_filters?: {
|
|
11
|
+
usage?: string;
|
|
12
|
+
enabled?: boolean;
|
|
13
|
+
}): Promise<KmsKeyMetadata[]>;
|
|
14
|
+
getKey(_keyId: string): Promise<KmsKeyMetadata>;
|
|
15
|
+
createKey(_algorithm: string, _usage: "encrypt" | "sign" | "wrap", _metadata?: Record<string, string>): Promise<KmsKeyMetadata>;
|
|
16
|
+
enableKey(_keyId: string): Promise<void>;
|
|
17
|
+
disableKey(_keyId: string): Promise<void>;
|
|
18
|
+
scheduleKeyDeletion(_keyId: string, _pendingWindowDays?: number): Promise<void>;
|
|
19
|
+
encrypt(_keyId: string, _plaintext: Uint8Array, _context?: Record<string, string>): Promise<KmsEncryptResult>;
|
|
20
|
+
decrypt(_keyId: string, _ciphertext: string, _context?: Record<string, string>): Promise<KmsDecryptResult>;
|
|
21
|
+
sign(_keyId: string, _data: Uint8Array, _algorithm?: string): Promise<KmsSignResult>;
|
|
22
|
+
verify(_keyId: string, _data: Uint8Array, _signature: string, _algorithm?: string): Promise<boolean>;
|
|
23
|
+
rotateKey(_keyId: string): Promise<KmsKeyMetadata>;
|
|
24
|
+
generateDataKey(_keyId: string, _keySpec?: string): Promise<{
|
|
25
|
+
plaintext: Uint8Array;
|
|
26
|
+
ciphertext: string;
|
|
27
|
+
}>;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=azure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"azure.d.ts","sourceRoot":"","sources":["../../src/providers/azure.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACd,MAAM,UAAU,CAAC;AAalB,MAAM,WAAW,eAAe;IAE9B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAgBD,qBAAa,gBAAiB,YAAW,WAAW;IAElD,QAAQ,CAAC,IAAI,WAAW;IAExB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAGvB,OAAO,EAAE,eAAe;IAKpC,IAAI,QAAQ,IAAI,MAAM,CAErB;IAGD,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAU7B,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAU/C,SAAS,CACP,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,EACnC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC,OAAO,CAAC,cAAc,CAAC;IAU1B,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUxC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUzC,mBAAmB,CACjB,MAAM,EAAE,MAAM,EACd,kBAAkB,CAAC,EAAE,MAAM,GAC1B,OAAO,CAAC,IAAI,CAAC;IAUhB,OAAO,CACL,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,UAAU,EACtB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,OAAO,CAAC,gBAAgB,CAAC;IAU5B,OAAO,CACL,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,OAAO,CAAC,gBAAgB,CAAC;IAU5B,IAAI,CACF,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,UAAU,EACjB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,aAAa,CAAC;IAUzB,MAAM,CACJ,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,UAAU,EACjB,UAAU,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC;IAUnB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAUlD,eAAe,CACb,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC;QAET,SAAS,EAAE,UAAU,CAAC;QAEtB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CAQH"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AzureKmsProvider = void 0;
|
|
4
|
+
const errors_1 = require("../errors");
|
|
5
|
+
class AzureKmsProvider {
|
|
6
|
+
name = "azure";
|
|
7
|
+
_vaultUrl;
|
|
8
|
+
constructor(options) {
|
|
9
|
+
this._vaultUrl = options.vaultUrl;
|
|
10
|
+
}
|
|
11
|
+
get vaultUrl() {
|
|
12
|
+
return this._vaultUrl;
|
|
13
|
+
}
|
|
14
|
+
listKeys(_filters) {
|
|
15
|
+
return Promise.reject(new errors_1.KmsError("NOT_IMPLEMENTED", "Not implemented: install @azure/keyvault-keys"));
|
|
16
|
+
}
|
|
17
|
+
getKey(_keyId) {
|
|
18
|
+
return Promise.reject(new errors_1.KmsError("NOT_IMPLEMENTED", "Not implemented: install @azure/keyvault-keys"));
|
|
19
|
+
}
|
|
20
|
+
createKey(_algorithm, _usage, _metadata) {
|
|
21
|
+
return Promise.reject(new errors_1.KmsError("NOT_IMPLEMENTED", "Not implemented: install @azure/keyvault-keys"));
|
|
22
|
+
}
|
|
23
|
+
enableKey(_keyId) {
|
|
24
|
+
return Promise.reject(new errors_1.KmsError("NOT_IMPLEMENTED", "Not implemented: install @azure/keyvault-keys"));
|
|
25
|
+
}
|
|
26
|
+
disableKey(_keyId) {
|
|
27
|
+
return Promise.reject(new errors_1.KmsError("NOT_IMPLEMENTED", "Not implemented: install @azure/keyvault-keys"));
|
|
28
|
+
}
|
|
29
|
+
scheduleKeyDeletion(_keyId, _pendingWindowDays) {
|
|
30
|
+
return Promise.reject(new errors_1.KmsError("NOT_IMPLEMENTED", "Not implemented: install @azure/keyvault-keys"));
|
|
31
|
+
}
|
|
32
|
+
encrypt(_keyId, _plaintext, _context) {
|
|
33
|
+
return Promise.reject(new errors_1.KmsError("NOT_IMPLEMENTED", "Not implemented: install @azure/keyvault-keys"));
|
|
34
|
+
}
|
|
35
|
+
decrypt(_keyId, _ciphertext, _context) {
|
|
36
|
+
return Promise.reject(new errors_1.KmsError("NOT_IMPLEMENTED", "Not implemented: install @azure/keyvault-keys"));
|
|
37
|
+
}
|
|
38
|
+
sign(_keyId, _data, _algorithm) {
|
|
39
|
+
return Promise.reject(new errors_1.KmsError("NOT_IMPLEMENTED", "Not implemented: install @azure/keyvault-keys"));
|
|
40
|
+
}
|
|
41
|
+
verify(_keyId, _data, _signature, _algorithm) {
|
|
42
|
+
return Promise.reject(new errors_1.KmsError("NOT_IMPLEMENTED", "Not implemented: install @azure/keyvault-keys"));
|
|
43
|
+
}
|
|
44
|
+
rotateKey(_keyId) {
|
|
45
|
+
return Promise.reject(new errors_1.KmsError("NOT_IMPLEMENTED", "Not implemented: install @azure/keyvault-keys"));
|
|
46
|
+
}
|
|
47
|
+
generateDataKey(_keyId, _keySpec) {
|
|
48
|
+
return Promise.reject(new errors_1.KmsError("NOT_IMPLEMENTED", "Not implemented: install @azure/keyvault-keys"));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
exports.AzureKmsProvider = AzureKmsProvider;
|
|
52
|
+
//# sourceMappingURL=azure.js.map
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { KmsProvider, KmsKeyMetadata, KmsEncryptResult, KmsDecryptResult, KmsSignResult } from "../types";
|
|
2
|
+
export interface GcpKmsOptions {
|
|
3
|
+
projectId: string;
|
|
4
|
+
locationId: string;
|
|
5
|
+
keyRingId: string;
|
|
6
|
+
}
|
|
7
|
+
export declare class GcpKmsProvider implements KmsProvider {
|
|
8
|
+
readonly name = "gcp";
|
|
9
|
+
private readonly options;
|
|
10
|
+
constructor(options: GcpKmsOptions);
|
|
11
|
+
private getParent;
|
|
12
|
+
listKeys(_filters?: {
|
|
13
|
+
usage?: string;
|
|
14
|
+
enabled?: boolean;
|
|
15
|
+
}): Promise<KmsKeyMetadata[]>;
|
|
16
|
+
getKey(_keyId: string): Promise<KmsKeyMetadata>;
|
|
17
|
+
createKey(_algorithm: string, _usage: "encrypt" | "sign" | "wrap", _metadata?: Record<string, string>): Promise<KmsKeyMetadata>;
|
|
18
|
+
enableKey(_keyId: string): Promise<void>;
|
|
19
|
+
disableKey(_keyId: string): Promise<void>;
|
|
20
|
+
scheduleKeyDeletion(_keyId: string, _pendingWindowDays?: number): Promise<void>;
|
|
21
|
+
encrypt(_keyId: string, _plaintext: Uint8Array, _context?: Record<string, string>): Promise<KmsEncryptResult>;
|
|
22
|
+
decrypt(_keyId: string, _ciphertext: string, _context?: Record<string, string>): Promise<KmsDecryptResult>;
|
|
23
|
+
sign(_keyId: string, _data: Uint8Array, _algorithm?: string): Promise<KmsSignResult>;
|
|
24
|
+
verify(_keyId: string, _data: Uint8Array, _signature: string, _algorithm?: string): Promise<boolean>;
|
|
25
|
+
rotateKey(_keyId: string): Promise<KmsKeyMetadata>;
|
|
26
|
+
generateDataKey(_keyId: string, _keySpec?: string): Promise<{
|
|
27
|
+
plaintext: Uint8Array;
|
|
28
|
+
ciphertext: string;
|
|
29
|
+
}>;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=gcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gcp.d.ts","sourceRoot":"","sources":["../../src/providers/gcp.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACd,MAAM,UAAU,CAAC;AAelB,MAAM,WAAW,aAAa;IAE5B,SAAS,EAAE,MAAM,CAAC;IAElB,UAAU,EAAE,MAAM,CAAC;IAEnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAkBD,qBAAa,cAAe,YAAW,WAAW;IAEhD,QAAQ,CAAC,IAAI,SAAS;IAEtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;gBAG5B,OAAO,EAAE,aAAa;IAKlC,OAAO,CAAC,SAAS;IAKjB,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAW7B,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAU/C,SAAS,CACP,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,EACnC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC,OAAO,CAAC,cAAc,CAAC;IAU1B,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUxC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUzC,mBAAmB,CACjB,MAAM,EAAE,MAAM,EACd,kBAAkB,CAAC,EAAE,MAAM,GAC1B,OAAO,CAAC,IAAI,CAAC;IAUhB,OAAO,CACL,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,UAAU,EACtB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,OAAO,CAAC,gBAAgB,CAAC;IAU5B,OAAO,CACL,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,OAAO,CAAC,gBAAgB,CAAC;IAU5B,IAAI,CACF,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,UAAU,EACjB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,aAAa,CAAC;IAUzB,MAAM,CACJ,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,UAAU,EACjB,UAAU,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC;IAUnB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAUlD,eAAe,CACb,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC;QAET,SAAS,EAAE,UAAU,CAAC;QAEtB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CAQH"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GcpKmsProvider = void 0;
|
|
4
|
+
const errors_1 = require("../errors");
|
|
5
|
+
class GcpKmsProvider {
|
|
6
|
+
name = "gcp";
|
|
7
|
+
options;
|
|
8
|
+
constructor(options) {
|
|
9
|
+
this.options = options;
|
|
10
|
+
}
|
|
11
|
+
getParent() {
|
|
12
|
+
return `projects/${this.options.projectId}/locations/${this.options.locationId}/keyRings/${this.options.keyRingId}`;
|
|
13
|
+
}
|
|
14
|
+
listKeys(_filters) {
|
|
15
|
+
void this.getParent();
|
|
16
|
+
return Promise.reject(new errors_1.KmsError("NOT_IMPLEMENTED", "Not implemented: install @google-cloud/kms"));
|
|
17
|
+
}
|
|
18
|
+
getKey(_keyId) {
|
|
19
|
+
return Promise.reject(new errors_1.KmsError("NOT_IMPLEMENTED", "Not implemented: install @google-cloud/kms"));
|
|
20
|
+
}
|
|
21
|
+
createKey(_algorithm, _usage, _metadata) {
|
|
22
|
+
return Promise.reject(new errors_1.KmsError("NOT_IMPLEMENTED", "Not implemented: install @google-cloud/kms"));
|
|
23
|
+
}
|
|
24
|
+
enableKey(_keyId) {
|
|
25
|
+
return Promise.reject(new errors_1.KmsError("NOT_IMPLEMENTED", "Not implemented: install @google-cloud/kms"));
|
|
26
|
+
}
|
|
27
|
+
disableKey(_keyId) {
|
|
28
|
+
return Promise.reject(new errors_1.KmsError("NOT_IMPLEMENTED", "Not implemented: install @google-cloud/kms"));
|
|
29
|
+
}
|
|
30
|
+
scheduleKeyDeletion(_keyId, _pendingWindowDays) {
|
|
31
|
+
return Promise.reject(new errors_1.KmsError("NOT_IMPLEMENTED", "Not implemented: install @google-cloud/kms"));
|
|
32
|
+
}
|
|
33
|
+
encrypt(_keyId, _plaintext, _context) {
|
|
34
|
+
return Promise.reject(new errors_1.KmsError("NOT_IMPLEMENTED", "Not implemented: install @google-cloud/kms"));
|
|
35
|
+
}
|
|
36
|
+
decrypt(_keyId, _ciphertext, _context) {
|
|
37
|
+
return Promise.reject(new errors_1.KmsError("NOT_IMPLEMENTED", "Not implemented: install @google-cloud/kms"));
|
|
38
|
+
}
|
|
39
|
+
sign(_keyId, _data, _algorithm) {
|
|
40
|
+
return Promise.reject(new errors_1.KmsError("NOT_IMPLEMENTED", "Not implemented: install @google-cloud/kms"));
|
|
41
|
+
}
|
|
42
|
+
verify(_keyId, _data, _signature, _algorithm) {
|
|
43
|
+
return Promise.reject(new errors_1.KmsError("NOT_IMPLEMENTED", "Not implemented: install @google-cloud/kms"));
|
|
44
|
+
}
|
|
45
|
+
rotateKey(_keyId) {
|
|
46
|
+
return Promise.reject(new errors_1.KmsError("NOT_IMPLEMENTED", "Not implemented: install @google-cloud/kms"));
|
|
47
|
+
}
|
|
48
|
+
generateDataKey(_keyId, _keySpec) {
|
|
49
|
+
return Promise.reject(new errors_1.KmsError("NOT_IMPLEMENTED", "Not implemented: install @google-cloud/kms"));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
exports.GcpKmsProvider = GcpKmsProvider;
|
|
53
|
+
//# sourceMappingURL=gcp.js.map
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { KmsProvider, KmsKeyMetadata, KmsEncryptResult, KmsDecryptResult, KmsSignResult } from "../types";
|
|
2
|
+
export declare class LocalKmsProvider implements KmsProvider {
|
|
3
|
+
readonly name = "local";
|
|
4
|
+
private readonly store;
|
|
5
|
+
private record;
|
|
6
|
+
private enabledRecord;
|
|
7
|
+
private cipherRecord;
|
|
8
|
+
private snapshot;
|
|
9
|
+
listKeys(filters?: {
|
|
10
|
+
usage?: string;
|
|
11
|
+
enabled?: boolean;
|
|
12
|
+
}): Promise<KmsKeyMetadata[]>;
|
|
13
|
+
getKey(keyId: string): Promise<KmsKeyMetadata>;
|
|
14
|
+
createKey(algorithm: string, usage: "encrypt" | "sign" | "wrap", _metadata?: Record<string, string>): Promise<KmsKeyMetadata>;
|
|
15
|
+
enableKey(keyId: string): Promise<void>;
|
|
16
|
+
disableKey(keyId: string): Promise<void>;
|
|
17
|
+
scheduleKeyDeletion(keyId: string, pendingWindowDays?: number): Promise<void>;
|
|
18
|
+
encrypt(keyId: string, plaintext: Uint8Array, context?: Record<string, string>): Promise<KmsEncryptResult>;
|
|
19
|
+
decrypt(keyId: string, ciphertext: string, context?: Record<string, string>): Promise<KmsDecryptResult>;
|
|
20
|
+
private signingRecord;
|
|
21
|
+
sign(keyId: string, data: Uint8Array, _algorithm?: string): Promise<KmsSignResult>;
|
|
22
|
+
verify(keyId: string, data: Uint8Array, signature: string, _algorithm?: string): Promise<boolean>;
|
|
23
|
+
rotateKey(keyId: string): Promise<KmsKeyMetadata>;
|
|
24
|
+
destroyKeyVersion(keyId: string, version: number): Promise<void>;
|
|
25
|
+
generateDataKey(keyId: string, _keySpec?: string): Promise<{
|
|
26
|
+
plaintext: Uint8Array;
|
|
27
|
+
ciphertext: string;
|
|
28
|
+
}>;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=local.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/providers/local.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACd,MAAM,UAAU,CAAC;AAqDlB,qBAAa,gBAAiB,YAAW,WAAW;IAElD,QAAQ,CAAC,IAAI,WAAW;IAExB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqC;IAG3D,OAAO,CAAC,MAAM;IASd,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,QAAQ;IAQV,QAAQ,CAAC,OAAO,CAAC,EAAE;QACvB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAevB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAK9C,SAAS,CACb,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,EAClC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC,OAAO,CAAC,cAAc,CAAC;IAqBpB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvC,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxC,mBAAmB,CACvB,KAAK,EAAE,MAAM,EACb,iBAAiB,SAAK,GACrB,OAAO,CAAC,IAAI,CAAC;IAUV,OAAO,CACX,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,UAAU,EACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAAC,gBAAgB,CAAC;IAetB,OAAO,CACX,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAAC,gBAAgB,CAAC;IAO5B,OAAO,CAAC,aAAa;IAYf,IAAI,CACR,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,UAAU,EAChB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,aAAa,CAAC;IAanB,MAAM,CACV,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC;IASb,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAajD,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKhE,eAAe,CACnB,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC;QAET,SAAS,EAAE,UAAU,CAAC;QAEtB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CAQH"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LocalKmsProvider = void 0;
|
|
4
|
+
const node_crypto_1 = require("node:crypto");
|
|
5
|
+
const crypto_lib_1 = require("@sebastienrousseau/crypto-lib");
|
|
6
|
+
const errors_1 = require("../errors");
|
|
7
|
+
const versioned_key_1 = require("./versioned-key");
|
|
8
|
+
function generateId() {
|
|
9
|
+
return `local-${(0, crypto_lib_1.bytesToHex)((0, node_crypto_1.randomBytes)(16))}`;
|
|
10
|
+
}
|
|
11
|
+
class LocalKmsProvider {
|
|
12
|
+
name = "local";
|
|
13
|
+
store = new Map();
|
|
14
|
+
record(keyId) {
|
|
15
|
+
const record = this.store.get(keyId);
|
|
16
|
+
if (!record) {
|
|
17
|
+
throw new errors_1.KmsError("NOT_FOUND", `Key not found: ${keyId}`, keyId);
|
|
18
|
+
}
|
|
19
|
+
return record;
|
|
20
|
+
}
|
|
21
|
+
enabledRecord(keyId) {
|
|
22
|
+
const record = this.record(keyId);
|
|
23
|
+
if (!record.metadata.enabled) {
|
|
24
|
+
throw new errors_1.KmsError("DISABLED", `Key is disabled: ${keyId}`, keyId);
|
|
25
|
+
}
|
|
26
|
+
return record;
|
|
27
|
+
}
|
|
28
|
+
cipherRecord(keyId, purpose) {
|
|
29
|
+
const record = this.enabledRecord(keyId);
|
|
30
|
+
if (record.metadata.usage === "sign") {
|
|
31
|
+
throw new errors_1.KmsError("INVALID_USAGE", `Key ${keyId} is a signing key, ${purpose}`, keyId);
|
|
32
|
+
}
|
|
33
|
+
return record;
|
|
34
|
+
}
|
|
35
|
+
snapshot(record) {
|
|
36
|
+
return {
|
|
37
|
+
...record.metadata,
|
|
38
|
+
currentVersion: (0, versioned_key_1.currentVersion)(record.key).version,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
async listKeys(filters) {
|
|
42
|
+
const keys = Array.from(this.store.values())
|
|
43
|
+
.filter((r) => !r.pendingDeletion)
|
|
44
|
+
.map((r) => this.snapshot(r));
|
|
45
|
+
if (!filters)
|
|
46
|
+
return keys;
|
|
47
|
+
return keys.filter((k) => (filters.usage === undefined || k.usage === filters.usage) &&
|
|
48
|
+
(filters.enabled === undefined || k.enabled === filters.enabled));
|
|
49
|
+
}
|
|
50
|
+
async getKey(keyId) {
|
|
51
|
+
return this.snapshot(this.record(keyId));
|
|
52
|
+
}
|
|
53
|
+
async createKey(algorithm, usage, _metadata) {
|
|
54
|
+
const keyId = generateId();
|
|
55
|
+
const metadata = {
|
|
56
|
+
keyId,
|
|
57
|
+
algorithm,
|
|
58
|
+
usage,
|
|
59
|
+
createdAt: new Date().toISOString(),
|
|
60
|
+
enabled: true,
|
|
61
|
+
provider: "local",
|
|
62
|
+
};
|
|
63
|
+
const record = {
|
|
64
|
+
metadata,
|
|
65
|
+
key: (0, versioned_key_1.createVersionedKey)(usage),
|
|
66
|
+
pendingDeletion: undefined,
|
|
67
|
+
deletionDate: undefined,
|
|
68
|
+
};
|
|
69
|
+
this.store.set(keyId, record);
|
|
70
|
+
return this.snapshot(record);
|
|
71
|
+
}
|
|
72
|
+
async enableKey(keyId) {
|
|
73
|
+
this.record(keyId).metadata.enabled = true;
|
|
74
|
+
}
|
|
75
|
+
async disableKey(keyId) {
|
|
76
|
+
this.record(keyId).metadata.enabled = false;
|
|
77
|
+
}
|
|
78
|
+
async scheduleKeyDeletion(keyId, pendingWindowDays = 30) {
|
|
79
|
+
const record = this.record(keyId);
|
|
80
|
+
record.pendingDeletion = true;
|
|
81
|
+
record.metadata.enabled = false;
|
|
82
|
+
const deletionDate = new Date();
|
|
83
|
+
deletionDate.setDate(deletionDate.getDate() + pendingWindowDays);
|
|
84
|
+
record.deletionDate = deletionDate.toISOString();
|
|
85
|
+
}
|
|
86
|
+
async encrypt(keyId, plaintext, context) {
|
|
87
|
+
const record = this.cipherRecord(keyId, "not an encryption key");
|
|
88
|
+
const sealed = (0, versioned_key_1.sealCurrent)(record.key, plaintext, context);
|
|
89
|
+
const result = {
|
|
90
|
+
ciphertext: sealed.ciphertext,
|
|
91
|
+
keyId,
|
|
92
|
+
keyVersion: sealed.version,
|
|
93
|
+
};
|
|
94
|
+
if (context) {
|
|
95
|
+
result.context = context;
|
|
96
|
+
}
|
|
97
|
+
return result;
|
|
98
|
+
}
|
|
99
|
+
async decrypt(keyId, ciphertext, context) {
|
|
100
|
+
const record = this.cipherRecord(keyId, "not an encryption key");
|
|
101
|
+
const opened = (0, versioned_key_1.openVersioned)(record.key, keyId, ciphertext, context);
|
|
102
|
+
return { plaintext: opened.plaintext, keyId, keyVersion: opened.version };
|
|
103
|
+
}
|
|
104
|
+
signingRecord(keyId, record) {
|
|
105
|
+
if (record.metadata.usage !== "sign") {
|
|
106
|
+
throw new errors_1.KmsError("INVALID_USAGE", `Key ${keyId} is not a signing key`, keyId);
|
|
107
|
+
}
|
|
108
|
+
return record.key;
|
|
109
|
+
}
|
|
110
|
+
async sign(keyId, data, _algorithm) {
|
|
111
|
+
const key = this.signingRecord(keyId, this.enabledRecord(keyId));
|
|
112
|
+
return {
|
|
113
|
+
signature: (0, crypto_lib_1.bytesToBase64)((0, versioned_key_1.signCurrent)(key, data)),
|
|
114
|
+
keyId,
|
|
115
|
+
algorithm: "ed25519",
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
async verify(keyId, data, signature, _algorithm) {
|
|
119
|
+
const key = this.signingRecord(keyId, this.record(keyId));
|
|
120
|
+
return (0, versioned_key_1.verifyAnyVersion)(key, data, (0, crypto_lib_1.base64ToBytes)(signature));
|
|
121
|
+
}
|
|
122
|
+
async rotateKey(keyId) {
|
|
123
|
+
const record = this.record(keyId);
|
|
124
|
+
const next = (0, versioned_key_1.rotateVersionedKey)(record.key);
|
|
125
|
+
record.metadata.createdAt = next.createdAt;
|
|
126
|
+
return this.snapshot(record);
|
|
127
|
+
}
|
|
128
|
+
async destroyKeyVersion(keyId, version) {
|
|
129
|
+
(0, versioned_key_1.destroyVersion)(this.record(keyId).key, version, keyId);
|
|
130
|
+
}
|
|
131
|
+
async generateDataKey(keyId, _keySpec) {
|
|
132
|
+
this.cipherRecord(keyId, "cannot generate data key");
|
|
133
|
+
const dek = new Uint8Array((0, node_crypto_1.randomBytes)(32));
|
|
134
|
+
const wrapped = await this.encrypt(keyId, dek);
|
|
135
|
+
return { plaintext: dek, ciphertext: wrapped.ciphertext };
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
exports.LocalKmsProvider = LocalKmsProvider;
|
|
139
|
+
//# sourceMappingURL=local.js.map
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { KmsProvider, KmsKeyMetadata, KmsEncryptResult, KmsDecryptResult, KmsSignResult } from "../types";
|
|
2
|
+
export interface Pkcs11HsmOptions {
|
|
3
|
+
modulePath?: string;
|
|
4
|
+
slotIndex?: number;
|
|
5
|
+
tokenLabel?: string;
|
|
6
|
+
pin?: string;
|
|
7
|
+
hsmModel?: "thales-luna" | "aws-cloudhsm" | "utimaco" | "yubihsm2" | "generic";
|
|
8
|
+
simulate?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface HsmSessionInfo {
|
|
11
|
+
model: string;
|
|
12
|
+
slotIndex: number;
|
|
13
|
+
tokenLabel: string;
|
|
14
|
+
fipsLevel: string;
|
|
15
|
+
simulated: boolean;
|
|
16
|
+
authenticated: boolean;
|
|
17
|
+
sessionState: "CKS_RO_USER_FUNCTIONS" | "CKS_RW_USER_FUNCTIONS";
|
|
18
|
+
}
|
|
19
|
+
export declare class Pkcs11HsmProvider implements KmsProvider {
|
|
20
|
+
readonly name = "pkcs11";
|
|
21
|
+
readonly hsmModel: string;
|
|
22
|
+
readonly slotIndex: number;
|
|
23
|
+
readonly tokenLabel: string;
|
|
24
|
+
private readonly store;
|
|
25
|
+
private handleCounter;
|
|
26
|
+
private isAuthenticated;
|
|
27
|
+
constructor(options?: Pkcs11HsmOptions);
|
|
28
|
+
getHsmSessionInfo(): HsmSessionInfo;
|
|
29
|
+
private record;
|
|
30
|
+
private enabledRecord;
|
|
31
|
+
private requireUsage;
|
|
32
|
+
private snapshot;
|
|
33
|
+
listKeys(filters?: {
|
|
34
|
+
usage?: string;
|
|
35
|
+
enabled?: boolean;
|
|
36
|
+
}): Promise<KmsKeyMetadata[]>;
|
|
37
|
+
getKey(keyId: string): Promise<KmsKeyMetadata>;
|
|
38
|
+
createKey(algorithm: string, usage: "encrypt" | "sign" | "wrap", _metadata?: Record<string, string>): Promise<KmsKeyMetadata>;
|
|
39
|
+
enableKey(keyId: string): Promise<void>;
|
|
40
|
+
disableKey(keyId: string): Promise<void>;
|
|
41
|
+
scheduleKeyDeletion(keyId: string, pendingWindowDays?: number): Promise<void>;
|
|
42
|
+
encrypt(keyId: string, plaintext: Uint8Array, context?: Record<string, string>): Promise<KmsEncryptResult>;
|
|
43
|
+
decrypt(keyId: string, ciphertext: string, context?: Record<string, string>): Promise<KmsDecryptResult>;
|
|
44
|
+
sign(keyId: string, data: Uint8Array, algorithm?: string): Promise<KmsSignResult>;
|
|
45
|
+
verify(keyId: string, data: Uint8Array, signature: string, _algorithm?: string): Promise<boolean>;
|
|
46
|
+
rotateKey(keyId: string): Promise<KmsKeyMetadata>;
|
|
47
|
+
destroyKeyVersion(keyId: string, version: number): Promise<void>;
|
|
48
|
+
generateDataKey(keyId: string, _keySpec?: string): Promise<{
|
|
49
|
+
plaintext: Uint8Array;
|
|
50
|
+
ciphertext: string;
|
|
51
|
+
}>;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=pkcs11.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pkcs11.d.ts","sourceRoot":"","sources":["../../src/providers/pkcs11.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Pkcs11HsmProvider = void 0;
|
|
4
|
+
const node_crypto_1 = require("node:crypto");
|
|
5
|
+
const crypto_lib_1 = require("@sebastienrousseau/crypto-lib");
|
|
6
|
+
const errors_1 = require("../errors");
|
|
7
|
+
const versioned_key_1 = require("./versioned-key");
|
|
8
|
+
function generateHsmKeyId(model) {
|
|
9
|
+
return `pkcs11-${model}-${(0, crypto_lib_1.bytesToHex)((0, node_crypto_1.randomBytes)(12))}`;
|
|
10
|
+
}
|
|
11
|
+
class Pkcs11HsmProvider {
|
|
12
|
+
name = "pkcs11";
|
|
13
|
+
hsmModel;
|
|
14
|
+
slotIndex;
|
|
15
|
+
tokenLabel;
|
|
16
|
+
store = new Map();
|
|
17
|
+
handleCounter = 1000;
|
|
18
|
+
isAuthenticated = false;
|
|
19
|
+
constructor(options = {}) {
|
|
20
|
+
if (options.simulate !== true) {
|
|
21
|
+
throw new Error("Pkcs11HsmProvider: no real PKCS#11 backend is implemented. " +
|
|
22
|
+
"Pass { simulate: true } to use the in-memory software simulation " +
|
|
23
|
+
"(tests and CI only; it provides no hardware key isolation).");
|
|
24
|
+
}
|
|
25
|
+
this.hsmModel = options.hsmModel ?? "generic";
|
|
26
|
+
this.slotIndex = options.slotIndex ?? 0;
|
|
27
|
+
this.tokenLabel = options.tokenLabel ?? "HSM-DEFAULT-TOKEN";
|
|
28
|
+
this.isAuthenticated = Boolean(options.pin);
|
|
29
|
+
}
|
|
30
|
+
getHsmSessionInfo() {
|
|
31
|
+
return {
|
|
32
|
+
model: this.hsmModel,
|
|
33
|
+
slotIndex: this.slotIndex,
|
|
34
|
+
tokenLabel: this.tokenLabel,
|
|
35
|
+
fipsLevel: "none (software simulation)",
|
|
36
|
+
simulated: true,
|
|
37
|
+
authenticated: this.isAuthenticated,
|
|
38
|
+
sessionState: "CKS_RW_USER_FUNCTIONS",
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
record(keyId) {
|
|
42
|
+
const record = this.store.get(keyId);
|
|
43
|
+
if (!record) {
|
|
44
|
+
throw new errors_1.KmsError("NOT_FOUND", `HSM key not found: ${keyId}`, keyId);
|
|
45
|
+
}
|
|
46
|
+
return record;
|
|
47
|
+
}
|
|
48
|
+
enabledRecord(keyId) {
|
|
49
|
+
const record = this.record(keyId);
|
|
50
|
+
if (!record.metadata.enabled) {
|
|
51
|
+
throw new errors_1.KmsError("DISABLED", `HSM key is disabled: ${keyId}`, keyId);
|
|
52
|
+
}
|
|
53
|
+
return record;
|
|
54
|
+
}
|
|
55
|
+
requireUsage(keyId, record, expected) {
|
|
56
|
+
const usage = record.metadata.usage;
|
|
57
|
+
const ok = expected === "sign" ? usage === "sign" : usage !== "sign";
|
|
58
|
+
if (!ok) {
|
|
59
|
+
throw new errors_1.KmsError("INVALID_USAGE", `HSM key usage is '${usage}', expected '${expected}'`, keyId);
|
|
60
|
+
}
|
|
61
|
+
return record.key;
|
|
62
|
+
}
|
|
63
|
+
snapshot(record) {
|
|
64
|
+
return {
|
|
65
|
+
...record.metadata,
|
|
66
|
+
currentVersion: (0, versioned_key_1.currentVersion)(record.key).version,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
async listKeys(filters) {
|
|
70
|
+
const keys = Array.from(this.store.values())
|
|
71
|
+
.filter((r) => !r.pendingDeletion)
|
|
72
|
+
.map((r) => this.snapshot(r));
|
|
73
|
+
if (!filters)
|
|
74
|
+
return keys;
|
|
75
|
+
return keys.filter((k) => (filters.usage === undefined || k.usage === filters.usage) &&
|
|
76
|
+
(filters.enabled === undefined || k.enabled === filters.enabled));
|
|
77
|
+
}
|
|
78
|
+
async getKey(keyId) {
|
|
79
|
+
return this.snapshot(this.record(keyId));
|
|
80
|
+
}
|
|
81
|
+
async createKey(algorithm, usage, _metadata) {
|
|
82
|
+
const keyId = generateHsmKeyId(this.hsmModel);
|
|
83
|
+
const record = {
|
|
84
|
+
metadata: {
|
|
85
|
+
keyId,
|
|
86
|
+
algorithm,
|
|
87
|
+
usage,
|
|
88
|
+
createdAt: new Date().toISOString(),
|
|
89
|
+
enabled: true,
|
|
90
|
+
provider: "pkcs11",
|
|
91
|
+
},
|
|
92
|
+
key: (0, versioned_key_1.createVersionedKey)(usage),
|
|
93
|
+
hsmHandle: ++this.handleCounter,
|
|
94
|
+
};
|
|
95
|
+
this.store.set(keyId, record);
|
|
96
|
+
return this.snapshot(record);
|
|
97
|
+
}
|
|
98
|
+
async enableKey(keyId) {
|
|
99
|
+
this.record(keyId).metadata.enabled = true;
|
|
100
|
+
}
|
|
101
|
+
async disableKey(keyId) {
|
|
102
|
+
this.record(keyId).metadata.enabled = false;
|
|
103
|
+
}
|
|
104
|
+
async scheduleKeyDeletion(keyId, pendingWindowDays = 7) {
|
|
105
|
+
const record = this.record(keyId);
|
|
106
|
+
record.pendingDeletion = true;
|
|
107
|
+
const date = new Date();
|
|
108
|
+
date.setDate(date.getDate() + pendingWindowDays);
|
|
109
|
+
record.deletionDate = date.toISOString();
|
|
110
|
+
record.metadata.enabled = false;
|
|
111
|
+
}
|
|
112
|
+
async encrypt(keyId, plaintext, context) {
|
|
113
|
+
const record = this.enabledRecord(keyId);
|
|
114
|
+
const key = this.requireUsage(keyId, record, "encrypt");
|
|
115
|
+
const sealed = (0, versioned_key_1.sealCurrent)(key, plaintext, context);
|
|
116
|
+
const result = {
|
|
117
|
+
ciphertext: sealed.ciphertext,
|
|
118
|
+
keyId,
|
|
119
|
+
keyVersion: sealed.version,
|
|
120
|
+
};
|
|
121
|
+
if (context !== undefined) {
|
|
122
|
+
result.context = context;
|
|
123
|
+
}
|
|
124
|
+
return result;
|
|
125
|
+
}
|
|
126
|
+
async decrypt(keyId, ciphertext, context) {
|
|
127
|
+
const record = this.enabledRecord(keyId);
|
|
128
|
+
const key = this.requireUsage(keyId, record, "encrypt");
|
|
129
|
+
const opened = (0, versioned_key_1.openVersioned)(key, keyId, ciphertext, context);
|
|
130
|
+
return { plaintext: opened.plaintext, keyId, keyVersion: opened.version };
|
|
131
|
+
}
|
|
132
|
+
async sign(keyId, data, algorithm = "Ed25519") {
|
|
133
|
+
const record = this.enabledRecord(keyId);
|
|
134
|
+
const key = this.requireUsage(keyId, record, "sign");
|
|
135
|
+
return {
|
|
136
|
+
signature: (0, crypto_lib_1.bytesToBase64)((0, versioned_key_1.signCurrent)(key, data)),
|
|
137
|
+
keyId,
|
|
138
|
+
algorithm,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
async verify(keyId, data, signature, _algorithm) {
|
|
142
|
+
const key = this.requireUsage(keyId, this.record(keyId), "sign");
|
|
143
|
+
return (0, versioned_key_1.verifyAnyVersion)(key, data, (0, crypto_lib_1.base64ToBytes)(signature));
|
|
144
|
+
}
|
|
145
|
+
async rotateKey(keyId) {
|
|
146
|
+
const record = this.record(keyId);
|
|
147
|
+
const next = (0, versioned_key_1.rotateVersionedKey)(record.key);
|
|
148
|
+
record.hsmHandle = ++this.handleCounter;
|
|
149
|
+
record.metadata.createdAt = next.createdAt;
|
|
150
|
+
return this.snapshot(record);
|
|
151
|
+
}
|
|
152
|
+
async destroyKeyVersion(keyId, version) {
|
|
153
|
+
(0, versioned_key_1.destroyVersion)(this.record(keyId).key, version, keyId);
|
|
154
|
+
}
|
|
155
|
+
async generateDataKey(keyId, _keySpec = "AES_256") {
|
|
156
|
+
const plaintext = new Uint8Array((0, node_crypto_1.randomBytes)(32));
|
|
157
|
+
const enc = await this.encrypt(keyId, plaintext);
|
|
158
|
+
return {
|
|
159
|
+
plaintext,
|
|
160
|
+
ciphertext: enc.ciphertext,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
exports.Pkcs11HsmProvider = Pkcs11HsmProvider;
|
|
165
|
+
//# sourceMappingURL=pkcs11.js.map
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { KmsProvider, KmsKeyMetadata, KmsEncryptResult, KmsDecryptResult, KmsSignResult } from "../types";
|
|
2
|
+
export interface VaultKmsOptions {
|
|
3
|
+
address: string;
|
|
4
|
+
token: string;
|
|
5
|
+
mountPath?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare class VaultKmsProvider implements KmsProvider {
|
|
8
|
+
readonly name = "vault";
|
|
9
|
+
private readonly _address;
|
|
10
|
+
private readonly _token;
|
|
11
|
+
private readonly _mount;
|
|
12
|
+
constructor(options: VaultKmsOptions);
|
|
13
|
+
buildUrl(path: string): string;
|
|
14
|
+
buildHeaders(): Record<string, string>;
|
|
15
|
+
listKeys(_filters?: {
|
|
16
|
+
usage?: string;
|
|
17
|
+
enabled?: boolean;
|
|
18
|
+
}): Promise<KmsKeyMetadata[]>;
|
|
19
|
+
getKey(_keyId: string): Promise<KmsKeyMetadata>;
|
|
20
|
+
createKey(_algorithm: string, _usage: "encrypt" | "sign" | "wrap", _metadata?: Record<string, string>): Promise<KmsKeyMetadata>;
|
|
21
|
+
enableKey(_keyId: string): Promise<void>;
|
|
22
|
+
disableKey(_keyId: string): Promise<void>;
|
|
23
|
+
scheduleKeyDeletion(_keyId: string, _pendingWindowDays?: number): Promise<void>;
|
|
24
|
+
encrypt(_keyId: string, _plaintext: Uint8Array, _context?: Record<string, string>): Promise<KmsEncryptResult>;
|
|
25
|
+
decrypt(_keyId: string, _ciphertext: string, _context?: Record<string, string>): Promise<KmsDecryptResult>;
|
|
26
|
+
sign(_keyId: string, _data: Uint8Array, _algorithm?: string): Promise<KmsSignResult>;
|
|
27
|
+
verify(_keyId: string, _data: Uint8Array, _signature: string, _algorithm?: string): Promise<boolean>;
|
|
28
|
+
rotateKey(_keyId: string): Promise<KmsKeyMetadata>;
|
|
29
|
+
generateDataKey(_keyId: string, _keySpec?: string): Promise<{
|
|
30
|
+
plaintext: Uint8Array;
|
|
31
|
+
ciphertext: string;
|
|
32
|
+
}>;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=vault.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../../src/providers/vault.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACd,MAAM,UAAU,CAAC;AAelB,MAAM,WAAW,eAAe;IAE9B,OAAO,EAAE,MAAM,CAAC;IAEhB,KAAK,EAAE,MAAM,CAAC;IAEd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAkBD,qBAAa,gBAAiB,YAAW,WAAW;IAElD,QAAQ,CAAC,IAAI,WAAW;IAExB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAElC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAEhC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAGpB,OAAO,EAAE,eAAe;IAOpC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAM9B,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAQtC,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAU7B,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAU/C,SAAS,CACP,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,EACnC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC,OAAO,CAAC,cAAc,CAAC;IAU1B,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUxC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUzC,mBAAmB,CACjB,MAAM,EAAE,MAAM,EACd,kBAAkB,CAAC,EAAE,MAAM,GAC1B,OAAO,CAAC,IAAI,CAAC;IAUhB,OAAO,CACL,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,UAAU,EACtB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,OAAO,CAAC,gBAAgB,CAAC;IAU5B,OAAO,CACL,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,OAAO,CAAC,gBAAgB,CAAC;IAU5B,IAAI,CACF,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,UAAU,EACjB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,aAAa,CAAC;IAUzB,MAAM,CACJ,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,UAAU,EACjB,UAAU,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC;IAUnB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAUlD,eAAe,CACb,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC;QAET,SAAS,EAAE,UAAU,CAAC;QAEtB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CAQH"}
|