@opentdf/sdk 0.9.0-beta.91 → 0.9.0-beta.93
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/dist/cjs/src/access/access-fetch.js +1 -2
- package/dist/cjs/src/access/access-rpc.js +1 -3
- package/dist/cjs/src/access.js +1 -14
- package/dist/cjs/src/auth/auth.js +13 -10
- package/dist/cjs/src/auth/dpop.js +121 -0
- package/dist/cjs/src/auth/oidc-clientcredentials-provider.js +37 -3
- package/dist/cjs/src/auth/oidc-externaljwt-provider.js +37 -3
- package/dist/cjs/src/auth/oidc-refreshtoken-provider.js +37 -3
- package/dist/cjs/src/auth/oidc.js +10 -8
- package/dist/cjs/src/auth/providers.js +35 -12
- package/dist/cjs/src/crypto/index.js +16 -2
- package/dist/cjs/src/crypto/pemPublicToCrypto.js +17 -11
- package/dist/cjs/src/opentdf.js +40 -10
- package/dist/cjs/tdf3/index.js +4 -2
- package/dist/cjs/tdf3/src/assertions.js +71 -31
- package/dist/cjs/tdf3/src/ciphers/aes-gcm-cipher.js +1 -1
- package/dist/cjs/tdf3/src/ciphers/symmetric-cipher-base.js +4 -2
- package/dist/cjs/tdf3/src/client/index.js +23 -33
- package/dist/cjs/tdf3/src/crypto/crypto-utils.js +12 -5
- package/dist/cjs/tdf3/src/crypto/declarations.js +1 -1
- package/dist/cjs/tdf3/src/crypto/index.js +849 -88
- package/dist/cjs/tdf3/src/crypto/jose/jwt-claims-set.js +11 -0
- package/dist/cjs/tdf3/src/crypto/jose/validate-crit.js +8 -0
- package/dist/cjs/tdf3/src/crypto/jose/vendor/lib/buffer_utils.js +41 -0
- package/dist/cjs/tdf3/src/crypto/jose/vendor/lib/epoch.js +6 -0
- package/dist/cjs/tdf3/src/crypto/jose/vendor/lib/is_object.js +21 -0
- package/dist/cjs/tdf3/src/crypto/jose/vendor/lib/jwt_claims_set.js +112 -0
- package/dist/cjs/tdf3/src/crypto/jose/vendor/lib/secs.js +60 -0
- package/dist/cjs/tdf3/src/crypto/jose/vendor/lib/validate_crit.js +38 -0
- package/dist/cjs/tdf3/src/crypto/jose/vendor/util/errors.js +135 -0
- package/dist/cjs/tdf3/src/crypto/jwt.js +183 -0
- package/dist/cjs/tdf3/src/crypto/salt.js +14 -8
- package/dist/cjs/tdf3/src/models/encryption-information.js +17 -20
- package/dist/cjs/tdf3/src/models/key-access.js +43 -63
- package/dist/cjs/tdf3/src/tdf.js +75 -75
- package/dist/cjs/tdf3/src/utils/index.js +5 -39
- package/dist/types/src/access/access-fetch.d.ts.map +1 -1
- package/dist/types/src/access/access-rpc.d.ts.map +1 -1
- package/dist/types/src/access.d.ts +0 -5
- package/dist/types/src/access.d.ts.map +1 -1
- package/dist/types/src/auth/auth.d.ts +9 -6
- package/dist/types/src/auth/auth.d.ts.map +1 -1
- package/dist/types/src/auth/dpop.d.ts +60 -0
- package/dist/types/src/auth/dpop.d.ts.map +1 -0
- package/dist/types/src/auth/oidc-clientcredentials-provider.d.ts +3 -2
- package/dist/types/src/auth/oidc-clientcredentials-provider.d.ts.map +1 -1
- package/dist/types/src/auth/oidc-externaljwt-provider.d.ts +3 -2
- package/dist/types/src/auth/oidc-externaljwt-provider.d.ts.map +1 -1
- package/dist/types/src/auth/oidc-refreshtoken-provider.d.ts +3 -2
- package/dist/types/src/auth/oidc-refreshtoken-provider.d.ts.map +1 -1
- package/dist/types/src/auth/oidc.d.ts +6 -4
- package/dist/types/src/auth/oidc.d.ts.map +1 -1
- package/dist/types/src/auth/providers.d.ts +5 -4
- package/dist/types/src/auth/providers.d.ts.map +1 -1
- package/dist/types/src/crypto/index.d.ts +2 -1
- package/dist/types/src/crypto/index.d.ts.map +1 -1
- package/dist/types/src/crypto/pemPublicToCrypto.d.ts +18 -0
- package/dist/types/src/crypto/pemPublicToCrypto.d.ts.map +1 -1
- package/dist/types/src/opentdf.d.ts +13 -4
- package/dist/types/src/opentdf.d.ts.map +1 -1
- package/dist/types/tdf3/index.d.ts +3 -3
- package/dist/types/tdf3/index.d.ts.map +1 -1
- package/dist/types/tdf3/src/assertions.d.ts +23 -8
- package/dist/types/tdf3/src/assertions.d.ts.map +1 -1
- package/dist/types/tdf3/src/ciphers/aes-gcm-cipher.d.ts +3 -3
- package/dist/types/tdf3/src/ciphers/aes-gcm-cipher.d.ts.map +1 -1
- package/dist/types/tdf3/src/ciphers/symmetric-cipher-base.d.ts +4 -4
- package/dist/types/tdf3/src/ciphers/symmetric-cipher-base.d.ts.map +1 -1
- package/dist/types/tdf3/src/client/builders.d.ts +2 -2
- package/dist/types/tdf3/src/client/builders.d.ts.map +1 -1
- package/dist/types/tdf3/src/client/index.d.ts +6 -5
- package/dist/types/tdf3/src/client/index.d.ts.map +1 -1
- package/dist/types/tdf3/src/crypto/crypto-utils.d.ts +14 -4
- package/dist/types/tdf3/src/crypto/crypto-utils.d.ts.map +1 -1
- package/dist/types/tdf3/src/crypto/declarations.d.ts +283 -18
- package/dist/types/tdf3/src/crypto/declarations.d.ts.map +1 -1
- package/dist/types/tdf3/src/crypto/index.d.ts +105 -28
- package/dist/types/tdf3/src/crypto/index.d.ts.map +1 -1
- package/dist/types/tdf3/src/crypto/jose/jwt-claims-set.d.ts +3 -0
- package/dist/types/tdf3/src/crypto/jose/jwt-claims-set.d.ts.map +1 -0
- package/dist/types/tdf3/src/crypto/jose/validate-crit.d.ts +5 -0
- package/dist/types/tdf3/src/crypto/jose/validate-crit.d.ts.map +1 -0
- package/dist/types/tdf3/src/crypto/jose/vendor/lib/buffer_utils.d.ts +6 -0
- package/dist/types/tdf3/src/crypto/jose/vendor/lib/buffer_utils.d.ts.map +1 -0
- package/dist/types/tdf3/src/crypto/jose/vendor/lib/epoch.d.ts +3 -0
- package/dist/types/tdf3/src/crypto/jose/vendor/lib/epoch.d.ts.map +1 -0
- package/dist/types/tdf3/src/crypto/jose/vendor/lib/is_object.d.ts +3 -0
- package/dist/types/tdf3/src/crypto/jose/vendor/lib/is_object.d.ts.map +1 -0
- package/dist/types/tdf3/src/crypto/jose/vendor/lib/jwt_claims_set.d.ts +3 -0
- package/dist/types/tdf3/src/crypto/jose/vendor/lib/jwt_claims_set.d.ts.map +1 -0
- package/dist/types/tdf3/src/crypto/jose/vendor/lib/secs.d.ts +3 -0
- package/dist/types/tdf3/src/crypto/jose/vendor/lib/secs.d.ts.map +1 -0
- package/dist/types/tdf3/src/crypto/jose/vendor/lib/validate_crit.d.ts +3 -0
- package/dist/types/tdf3/src/crypto/jose/vendor/lib/validate_crit.d.ts.map +1 -0
- package/dist/types/tdf3/src/crypto/jose/vendor/util/errors.d.ts +76 -0
- package/dist/types/tdf3/src/crypto/jose/vendor/util/errors.d.ts.map +1 -0
- package/dist/types/tdf3/src/crypto/jwt.d.ts +76 -0
- package/dist/types/tdf3/src/crypto/jwt.d.ts.map +1 -0
- package/dist/types/tdf3/src/crypto/salt.d.ts +6 -1
- package/dist/types/tdf3/src/crypto/salt.d.ts.map +1 -1
- package/dist/types/tdf3/src/models/encryption-information.d.ts +4 -4
- package/dist/types/tdf3/src/models/encryption-information.d.ts.map +1 -1
- package/dist/types/tdf3/src/models/key-access.d.ts +8 -5
- package/dist/types/tdf3/src/models/key-access.d.ts.map +1 -1
- package/dist/types/tdf3/src/tdf.d.ts +8 -8
- package/dist/types/tdf3/src/tdf.d.ts.map +1 -1
- package/dist/types/tdf3/src/utils/index.d.ts +4 -3
- package/dist/types/tdf3/src/utils/index.d.ts.map +1 -1
- package/dist/web/src/access/access-fetch.js +3 -4
- package/dist/web/src/access/access-rpc.js +3 -5
- package/dist/web/src/access.js +1 -13
- package/dist/web/src/auth/auth.js +13 -10
- package/dist/web/src/auth/dpop.js +118 -0
- package/dist/web/src/auth/oidc-clientcredentials-provider.js +4 -3
- package/dist/web/src/auth/oidc-externaljwt-provider.js +4 -3
- package/dist/web/src/auth/oidc-refreshtoken-provider.js +4 -3
- package/dist/web/src/auth/oidc.js +11 -9
- package/dist/web/src/auth/providers.js +13 -12
- package/dist/web/src/crypto/index.js +4 -2
- package/dist/web/src/crypto/pemPublicToCrypto.js +11 -9
- package/dist/web/src/opentdf.js +7 -10
- package/dist/web/tdf3/index.js +3 -2
- package/dist/web/tdf3/src/assertions.js +71 -31
- package/dist/web/tdf3/src/ciphers/aes-gcm-cipher.js +1 -1
- package/dist/web/tdf3/src/ciphers/symmetric-cipher-base.js +4 -2
- package/dist/web/tdf3/src/client/index.js +25 -35
- package/dist/web/tdf3/src/crypto/crypto-utils.js +12 -5
- package/dist/web/tdf3/src/crypto/declarations.js +1 -1
- package/dist/web/tdf3/src/crypto/index.js +830 -84
- package/dist/web/tdf3/src/crypto/jose/jwt-claims-set.js +5 -0
- package/dist/web/tdf3/src/crypto/jose/validate-crit.js +3 -0
- package/dist/web/tdf3/src/crypto/jose/vendor/lib/buffer_utils.js +35 -0
- package/dist/web/tdf3/src/crypto/jose/vendor/lib/epoch.js +4 -0
- package/dist/web/tdf3/src/crypto/jose/vendor/lib/is_object.js +19 -0
- package/dist/web/tdf3/src/crypto/jose/vendor/lib/jwt_claims_set.js +107 -0
- package/dist/web/tdf3/src/crypto/jose/vendor/lib/secs.js +58 -0
- package/dist/web/tdf3/src/crypto/jose/vendor/lib/validate_crit.js +36 -0
- package/dist/web/tdf3/src/crypto/jose/vendor/util/errors.js +117 -0
- package/dist/web/tdf3/src/crypto/jwt.js +174 -0
- package/dist/web/tdf3/src/crypto/salt.js +13 -7
- package/dist/web/tdf3/src/models/encryption-information.js +11 -14
- package/dist/web/tdf3/src/models/key-access.js +44 -31
- package/dist/web/tdf3/src/tdf.js +71 -71
- package/dist/web/tdf3/src/utils/index.js +5 -6
- package/package.json +11 -4
- package/src/access/access-fetch.ts +2 -8
- package/src/access/access-rpc.ts +0 -7
- package/src/access.ts +0 -17
- package/src/auth/auth.ts +21 -12
- package/src/auth/dpop.ts +222 -0
- package/src/auth/oidc-clientcredentials-provider.ts +23 -15
- package/src/auth/oidc-externaljwt-provider.ts +23 -15
- package/src/auth/oidc-refreshtoken-provider.ts +23 -15
- package/src/auth/oidc.ts +21 -10
- package/src/auth/providers.ts +46 -29
- package/src/crypto/index.ts +21 -1
- package/src/crypto/pemPublicToCrypto.ts +11 -9
- package/src/opentdf.ts +19 -14
- package/tdf3/index.ts +32 -5
- package/tdf3/src/assertions.ts +99 -30
- package/tdf3/src/ciphers/aes-gcm-cipher.ts +7 -2
- package/tdf3/src/ciphers/symmetric-cipher-base.ts +7 -4
- package/tdf3/src/client/builders.ts +2 -2
- package/tdf3/src/client/index.ts +60 -59
- package/tdf3/src/crypto/crypto-utils.ts +15 -8
- package/tdf3/src/crypto/declarations.ts +338 -22
- package/tdf3/src/crypto/index.ts +1021 -118
- package/tdf3/src/crypto/jose/jwt-claims-set.ts +10 -0
- package/tdf3/src/crypto/jose/validate-crit.ts +9 -0
- package/tdf3/src/crypto/jose/vendor/lib/buffer_utils.ts +34 -0
- package/tdf3/src/crypto/jose/vendor/lib/epoch.ts +3 -0
- package/tdf3/src/crypto/jose/vendor/lib/is_object.ts +18 -0
- package/tdf3/src/crypto/jose/vendor/lib/jwt_claims_set.ts +106 -0
- package/tdf3/src/crypto/jose/vendor/lib/secs.ts +57 -0
- package/tdf3/src/crypto/jose/vendor/lib/validate_crit.ts +35 -0
- package/tdf3/src/crypto/jose/vendor/util/errors.ts +101 -0
- package/tdf3/src/crypto/jwt.ts +256 -0
- package/tdf3/src/crypto/salt.ts +16 -8
- package/tdf3/src/models/encryption-information.ts +14 -21
- package/tdf3/src/models/key-access.ts +57 -41
- package/tdf3/src/tdf.ts +110 -93
- package/tdf3/src/utils/index.ts +5 -6
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { keySplit } from '../utils/index.js';
|
|
2
1
|
import { base64, hex } from '../../../src/encodings/index.js';
|
|
3
2
|
import { Binary } from '../binary.js';
|
|
4
3
|
import { type SymmetricCipher } from '../ciphers/symmetric-cipher-base.js';
|
|
@@ -8,12 +7,13 @@ import {
|
|
|
8
7
|
type CryptoService,
|
|
9
8
|
type DecryptResult,
|
|
10
9
|
type EncryptResult,
|
|
10
|
+
type SymmetricKey,
|
|
11
11
|
} from '../crypto/declarations.js';
|
|
12
12
|
import { IntegrityAlgorithm } from '../tdf.js';
|
|
13
13
|
import { ConfigurationError } from '../../../src/errors.js';
|
|
14
14
|
|
|
15
15
|
export type KeyInfo = {
|
|
16
|
-
readonly
|
|
16
|
+
readonly unwrappedKey: SymmetricKey;
|
|
17
17
|
readonly unwrappedKeyIvBinary: Binary;
|
|
18
18
|
};
|
|
19
19
|
|
|
@@ -59,42 +59,39 @@ export class SplitKey {
|
|
|
59
59
|
|
|
60
60
|
async generateKey(): Promise<KeyInfo> {
|
|
61
61
|
const unwrappedKey = await this.cipher.generateKey();
|
|
62
|
-
const unwrappedKeyBinary = Binary.fromString(hex.decode(unwrappedKey));
|
|
63
62
|
const unwrappedKeyIvBinary = await this.generateIvBinary();
|
|
64
|
-
return {
|
|
63
|
+
return { unwrappedKey, unwrappedKeyIvBinary };
|
|
65
64
|
}
|
|
66
65
|
|
|
67
66
|
async encrypt(
|
|
68
67
|
contentBinary: Binary,
|
|
69
|
-
|
|
68
|
+
key: SymmetricKey,
|
|
70
69
|
ivBinaryOptional?: Binary
|
|
71
70
|
): Promise<EncryptResult> {
|
|
72
71
|
const ivBinary = ivBinaryOptional || (await this.generateIvBinary());
|
|
73
|
-
return this.cipher.encrypt(contentBinary,
|
|
72
|
+
return this.cipher.encrypt(contentBinary, key, ivBinary);
|
|
74
73
|
}
|
|
75
74
|
|
|
76
|
-
async decrypt(content: Uint8Array,
|
|
77
|
-
return this.cipher.decrypt(content,
|
|
75
|
+
async decrypt(content: Uint8Array, key: SymmetricKey): Promise<DecryptResult> {
|
|
76
|
+
return this.cipher.decrypt(content, key);
|
|
78
77
|
}
|
|
79
78
|
|
|
80
79
|
async getKeyAccessObjects(policy: Policy, keyInfo: KeyInfo): Promise<KeyAccessObject[]> {
|
|
81
80
|
const splitIds = [...new Set(this.keyAccess.map(({ sid }) => sid))].sort((a = '', b = '') =>
|
|
82
81
|
a.localeCompare(b)
|
|
83
82
|
);
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
splitIds.length
|
|
87
|
-
this.cryptoService
|
|
83
|
+
const unwrappedKeySplits = await this.cryptoService.splitSymmetricKey(
|
|
84
|
+
keyInfo.unwrappedKey,
|
|
85
|
+
splitIds.length
|
|
88
86
|
);
|
|
89
87
|
const splitsByName = Object.fromEntries(
|
|
90
|
-
splitIds.map((sid, index) => [sid,
|
|
88
|
+
splitIds.map((sid, index) => [sid, unwrappedKeySplits[index]])
|
|
91
89
|
);
|
|
92
90
|
|
|
93
91
|
const keyAccessObjects = [];
|
|
94
92
|
for (const item of this.keyAccess) {
|
|
95
93
|
// use the key split to encrypt metadata for each key access object
|
|
96
|
-
const
|
|
97
|
-
const unwrappedKeySplitBinary = Binary.fromArrayBuffer(unwrappedKeySplitBuffer.buffer);
|
|
94
|
+
const unwrappedKeySplit = splitsByName[item.sid || ''];
|
|
98
95
|
|
|
99
96
|
const metadata = item.metadata || '';
|
|
100
97
|
const metadataStr = (
|
|
@@ -113,7 +110,7 @@ export class SplitKey {
|
|
|
113
110
|
|
|
114
111
|
const encryptedMetadataResult = await this.encrypt(
|
|
115
112
|
metadataBinary,
|
|
116
|
-
|
|
113
|
+
unwrappedKeySplit,
|
|
117
114
|
keyInfo.unwrappedKeyIvBinary
|
|
118
115
|
);
|
|
119
116
|
|
|
@@ -123,11 +120,7 @@ export class SplitKey {
|
|
|
123
120
|
};
|
|
124
121
|
|
|
125
122
|
const encryptedMetadataStr = JSON.stringify(encryptedMetadataOb);
|
|
126
|
-
const keyAccessObject = await item.write(
|
|
127
|
-
policy,
|
|
128
|
-
unwrappedKeySplitBuffer,
|
|
129
|
-
encryptedMetadataStr
|
|
130
|
-
);
|
|
123
|
+
const keyAccessObject = await item.write(policy, unwrappedKeySplit, encryptedMetadataStr);
|
|
131
124
|
keyAccessObjects.push(keyAccessObject);
|
|
132
125
|
}
|
|
133
126
|
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
import { base64, hex } from '../../../src/encodings/index.js';
|
|
2
|
-
import { generateRandomNumber } from '../../../src/crypto/generateRandomNumber.js';
|
|
3
|
-
import { keyAgreement } from '../../../src/crypto/keyAgreement.js';
|
|
4
|
-
import { pemPublicToCrypto } from '../../../src/crypto/pemPublicToCrypto.js';
|
|
5
|
-
import { cryptoPublicToPem } from '../../../src/utils.js';
|
|
6
2
|
import { Binary } from '../binary.js';
|
|
7
|
-
import
|
|
8
|
-
import {
|
|
3
|
+
import type { CryptoService, KeyPair, SymmetricKey } from '../crypto/declarations.js';
|
|
4
|
+
import { getZtdfSalt } from '../crypto/salt.js';
|
|
5
|
+
import { Algorithms } from '../ciphers/index.js';
|
|
9
6
|
import { Policy } from './policy.js';
|
|
10
7
|
|
|
11
8
|
export type KeyAccessType = 'remote' | 'wrapped' | 'ec-wrapped';
|
|
@@ -14,7 +11,7 @@ export const schemaVersion = '1.0';
|
|
|
14
11
|
|
|
15
12
|
export class ECWrapped {
|
|
16
13
|
readonly type = 'ec-wrapped';
|
|
17
|
-
readonly ephemeralKeyPair: Promise<
|
|
14
|
+
readonly ephemeralKeyPair: Promise<KeyPair>;
|
|
18
15
|
keyAccessObject?: KeyAccessObject;
|
|
19
16
|
|
|
20
17
|
constructor(
|
|
@@ -22,44 +19,62 @@ export class ECWrapped {
|
|
|
22
19
|
public readonly kid: string | undefined,
|
|
23
20
|
public readonly publicKey: string,
|
|
24
21
|
public readonly metadata: unknown,
|
|
22
|
+
public readonly cryptoService: CryptoService,
|
|
25
23
|
public readonly sid?: string
|
|
26
24
|
) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
name: 'ECDH',
|
|
30
|
-
namedCurve: 'P-256',
|
|
31
|
-
},
|
|
32
|
-
false,
|
|
33
|
-
['deriveBits', 'deriveKey']
|
|
34
|
-
);
|
|
25
|
+
// Generate EC key pair using CryptoService - returns opaque keys
|
|
26
|
+
this.ephemeralKeyPair = this.cryptoService.generateECKeyPair('P-256');
|
|
35
27
|
}
|
|
36
28
|
|
|
37
29
|
async write(
|
|
38
30
|
policy: Policy,
|
|
39
|
-
dek:
|
|
31
|
+
dek: SymmetricKey,
|
|
40
32
|
encryptedMetadataStr: string
|
|
41
33
|
): Promise<KeyAccessObject> {
|
|
42
34
|
const policyStr = JSON.stringify(policy);
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
hkdfSalt: await ztdfSalt,
|
|
49
|
-
hkdfHash: 'SHA-256',
|
|
35
|
+
const ek = await this.ephemeralKeyPair;
|
|
36
|
+
|
|
37
|
+
// Import KAS public key from PEM
|
|
38
|
+
const kasPublicKey = await this.cryptoService.importPublicKey(this.publicKey, {
|
|
39
|
+
usage: 'derive',
|
|
50
40
|
});
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
const
|
|
41
|
+
|
|
42
|
+
// Derive encryption key using ECDH + HKDF via CryptoService
|
|
43
|
+
const derivedKey = await this.cryptoService.deriveKeyFromECDH(ek.privateKey, kasPublicKey, {
|
|
44
|
+
hash: 'SHA-256',
|
|
45
|
+
salt: await getZtdfSalt(this.cryptoService),
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
// Generate random IV
|
|
49
|
+
const iv = await this.cryptoService.randomBytes(12);
|
|
50
|
+
|
|
51
|
+
// Encrypt DEK using derived key with AES-GCM
|
|
52
|
+
// Payload is SymmetricKey (the DEK), key is SymmetricKey (derived from ECDH)
|
|
53
|
+
const encryptResult = await this.cryptoService.encrypt(
|
|
54
|
+
dek,
|
|
55
|
+
derivedKey,
|
|
56
|
+
Binary.fromArrayBuffer(iv.buffer),
|
|
57
|
+
Algorithms.AES_256_GCM
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
// Combine IV, ciphertext, and authTag to form the wrapped key.
|
|
61
|
+
const ciphertext = new Uint8Array(encryptResult.payload.asArrayBuffer());
|
|
62
|
+
const authTag = encryptResult.authTag
|
|
63
|
+
? new Uint8Array(encryptResult.authTag.asArrayBuffer())
|
|
64
|
+
: new Uint8Array(0);
|
|
65
|
+
const entityWrappedKey = new Uint8Array(iv.length + ciphertext.length + authTag.length);
|
|
54
66
|
entityWrappedKey.set(iv);
|
|
55
|
-
entityWrappedKey.set(
|
|
67
|
+
entityWrappedKey.set(ciphertext, iv.length);
|
|
68
|
+
entityWrappedKey.set(authTag, iv.length + ciphertext.length);
|
|
56
69
|
|
|
57
|
-
const policyBinding =
|
|
58
|
-
|
|
59
|
-
|
|
70
|
+
const policyBinding = hex.encodeArrayBuffer(
|
|
71
|
+
(await this.cryptoService.hmac(new TextEncoder().encode(base64.encode(policyStr)), dek))
|
|
72
|
+
.buffer
|
|
60
73
|
);
|
|
61
74
|
|
|
62
|
-
|
|
75
|
+
// Export ephemeral public key to PEM for manifest
|
|
76
|
+
const ephemeralPublicKeyPem = await this.cryptoService.exportPublicKeyPem(ek.publicKey);
|
|
77
|
+
|
|
63
78
|
const kao: KeyAccessObject = {
|
|
64
79
|
type: 'ec-wrapped',
|
|
65
80
|
url: this.url,
|
|
@@ -71,7 +86,7 @@ export class ECWrapped {
|
|
|
71
86
|
hash: base64.encode(policyBinding),
|
|
72
87
|
},
|
|
73
88
|
schemaVersion,
|
|
74
|
-
ephemeralPublicKey:
|
|
89
|
+
ephemeralPublicKey: ephemeralPublicKeyPem,
|
|
75
90
|
};
|
|
76
91
|
if (this.kid) {
|
|
77
92
|
kao.kid = this.kid;
|
|
@@ -93,24 +108,25 @@ export class Wrapped {
|
|
|
93
108
|
public readonly kid: string | undefined,
|
|
94
109
|
public readonly publicKey: string,
|
|
95
110
|
public readonly metadata: unknown,
|
|
111
|
+
public readonly cryptoService: CryptoService,
|
|
96
112
|
public readonly sid?: string
|
|
97
113
|
) {}
|
|
98
114
|
|
|
99
115
|
async write(
|
|
100
116
|
policy: Policy,
|
|
101
|
-
|
|
117
|
+
key: SymmetricKey,
|
|
102
118
|
encryptedMetadataStr: string
|
|
103
119
|
): Promise<KeyAccessObject> {
|
|
104
120
|
const policyStr = JSON.stringify(policy);
|
|
105
|
-
|
|
106
|
-
const
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
);
|
|
121
|
+
// Import KAS public key from PEM
|
|
122
|
+
const kasPublicKey = await this.cryptoService.importPublicKey(this.publicKey, {
|
|
123
|
+
usage: 'encrypt',
|
|
124
|
+
});
|
|
125
|
+
const wrappedKeyBinary = await this.cryptoService.encryptWithPublicKey(key, kasPublicKey);
|
|
110
126
|
|
|
111
|
-
const policyBinding =
|
|
112
|
-
|
|
113
|
-
|
|
127
|
+
const policyBinding = hex.encodeArrayBuffer(
|
|
128
|
+
(await this.cryptoService.hmac(new TextEncoder().encode(base64.encode(policyStr)), key))
|
|
129
|
+
.buffer
|
|
114
130
|
);
|
|
115
131
|
|
|
116
132
|
this.keyAccessObject = {
|