@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.
Files changed (182) hide show
  1. package/dist/cjs/src/access/access-fetch.js +1 -2
  2. package/dist/cjs/src/access/access-rpc.js +1 -3
  3. package/dist/cjs/src/access.js +1 -14
  4. package/dist/cjs/src/auth/auth.js +13 -10
  5. package/dist/cjs/src/auth/dpop.js +121 -0
  6. package/dist/cjs/src/auth/oidc-clientcredentials-provider.js +37 -3
  7. package/dist/cjs/src/auth/oidc-externaljwt-provider.js +37 -3
  8. package/dist/cjs/src/auth/oidc-refreshtoken-provider.js +37 -3
  9. package/dist/cjs/src/auth/oidc.js +10 -8
  10. package/dist/cjs/src/auth/providers.js +35 -12
  11. package/dist/cjs/src/crypto/index.js +16 -2
  12. package/dist/cjs/src/crypto/pemPublicToCrypto.js +17 -11
  13. package/dist/cjs/src/opentdf.js +40 -10
  14. package/dist/cjs/tdf3/index.js +4 -2
  15. package/dist/cjs/tdf3/src/assertions.js +71 -31
  16. package/dist/cjs/tdf3/src/ciphers/aes-gcm-cipher.js +1 -1
  17. package/dist/cjs/tdf3/src/ciphers/symmetric-cipher-base.js +4 -2
  18. package/dist/cjs/tdf3/src/client/index.js +23 -33
  19. package/dist/cjs/tdf3/src/crypto/crypto-utils.js +12 -5
  20. package/dist/cjs/tdf3/src/crypto/declarations.js +1 -1
  21. package/dist/cjs/tdf3/src/crypto/index.js +849 -88
  22. package/dist/cjs/tdf3/src/crypto/jose/jwt-claims-set.js +11 -0
  23. package/dist/cjs/tdf3/src/crypto/jose/validate-crit.js +8 -0
  24. package/dist/cjs/tdf3/src/crypto/jose/vendor/lib/buffer_utils.js +41 -0
  25. package/dist/cjs/tdf3/src/crypto/jose/vendor/lib/epoch.js +6 -0
  26. package/dist/cjs/tdf3/src/crypto/jose/vendor/lib/is_object.js +21 -0
  27. package/dist/cjs/tdf3/src/crypto/jose/vendor/lib/jwt_claims_set.js +112 -0
  28. package/dist/cjs/tdf3/src/crypto/jose/vendor/lib/secs.js +60 -0
  29. package/dist/cjs/tdf3/src/crypto/jose/vendor/lib/validate_crit.js +38 -0
  30. package/dist/cjs/tdf3/src/crypto/jose/vendor/util/errors.js +135 -0
  31. package/dist/cjs/tdf3/src/crypto/jwt.js +183 -0
  32. package/dist/cjs/tdf3/src/crypto/salt.js +14 -8
  33. package/dist/cjs/tdf3/src/models/encryption-information.js +17 -20
  34. package/dist/cjs/tdf3/src/models/key-access.js +43 -63
  35. package/dist/cjs/tdf3/src/tdf.js +75 -75
  36. package/dist/cjs/tdf3/src/utils/index.js +5 -39
  37. package/dist/types/src/access/access-fetch.d.ts.map +1 -1
  38. package/dist/types/src/access/access-rpc.d.ts.map +1 -1
  39. package/dist/types/src/access.d.ts +0 -5
  40. package/dist/types/src/access.d.ts.map +1 -1
  41. package/dist/types/src/auth/auth.d.ts +9 -6
  42. package/dist/types/src/auth/auth.d.ts.map +1 -1
  43. package/dist/types/src/auth/dpop.d.ts +60 -0
  44. package/dist/types/src/auth/dpop.d.ts.map +1 -0
  45. package/dist/types/src/auth/oidc-clientcredentials-provider.d.ts +3 -2
  46. package/dist/types/src/auth/oidc-clientcredentials-provider.d.ts.map +1 -1
  47. package/dist/types/src/auth/oidc-externaljwt-provider.d.ts +3 -2
  48. package/dist/types/src/auth/oidc-externaljwt-provider.d.ts.map +1 -1
  49. package/dist/types/src/auth/oidc-refreshtoken-provider.d.ts +3 -2
  50. package/dist/types/src/auth/oidc-refreshtoken-provider.d.ts.map +1 -1
  51. package/dist/types/src/auth/oidc.d.ts +6 -4
  52. package/dist/types/src/auth/oidc.d.ts.map +1 -1
  53. package/dist/types/src/auth/providers.d.ts +5 -4
  54. package/dist/types/src/auth/providers.d.ts.map +1 -1
  55. package/dist/types/src/crypto/index.d.ts +2 -1
  56. package/dist/types/src/crypto/index.d.ts.map +1 -1
  57. package/dist/types/src/crypto/pemPublicToCrypto.d.ts +18 -0
  58. package/dist/types/src/crypto/pemPublicToCrypto.d.ts.map +1 -1
  59. package/dist/types/src/opentdf.d.ts +13 -4
  60. package/dist/types/src/opentdf.d.ts.map +1 -1
  61. package/dist/types/tdf3/index.d.ts +3 -3
  62. package/dist/types/tdf3/index.d.ts.map +1 -1
  63. package/dist/types/tdf3/src/assertions.d.ts +23 -8
  64. package/dist/types/tdf3/src/assertions.d.ts.map +1 -1
  65. package/dist/types/tdf3/src/ciphers/aes-gcm-cipher.d.ts +3 -3
  66. package/dist/types/tdf3/src/ciphers/aes-gcm-cipher.d.ts.map +1 -1
  67. package/dist/types/tdf3/src/ciphers/symmetric-cipher-base.d.ts +4 -4
  68. package/dist/types/tdf3/src/ciphers/symmetric-cipher-base.d.ts.map +1 -1
  69. package/dist/types/tdf3/src/client/builders.d.ts +2 -2
  70. package/dist/types/tdf3/src/client/builders.d.ts.map +1 -1
  71. package/dist/types/tdf3/src/client/index.d.ts +6 -5
  72. package/dist/types/tdf3/src/client/index.d.ts.map +1 -1
  73. package/dist/types/tdf3/src/crypto/crypto-utils.d.ts +14 -4
  74. package/dist/types/tdf3/src/crypto/crypto-utils.d.ts.map +1 -1
  75. package/dist/types/tdf3/src/crypto/declarations.d.ts +283 -18
  76. package/dist/types/tdf3/src/crypto/declarations.d.ts.map +1 -1
  77. package/dist/types/tdf3/src/crypto/index.d.ts +105 -28
  78. package/dist/types/tdf3/src/crypto/index.d.ts.map +1 -1
  79. package/dist/types/tdf3/src/crypto/jose/jwt-claims-set.d.ts +3 -0
  80. package/dist/types/tdf3/src/crypto/jose/jwt-claims-set.d.ts.map +1 -0
  81. package/dist/types/tdf3/src/crypto/jose/validate-crit.d.ts +5 -0
  82. package/dist/types/tdf3/src/crypto/jose/validate-crit.d.ts.map +1 -0
  83. package/dist/types/tdf3/src/crypto/jose/vendor/lib/buffer_utils.d.ts +6 -0
  84. package/dist/types/tdf3/src/crypto/jose/vendor/lib/buffer_utils.d.ts.map +1 -0
  85. package/dist/types/tdf3/src/crypto/jose/vendor/lib/epoch.d.ts +3 -0
  86. package/dist/types/tdf3/src/crypto/jose/vendor/lib/epoch.d.ts.map +1 -0
  87. package/dist/types/tdf3/src/crypto/jose/vendor/lib/is_object.d.ts +3 -0
  88. package/dist/types/tdf3/src/crypto/jose/vendor/lib/is_object.d.ts.map +1 -0
  89. package/dist/types/tdf3/src/crypto/jose/vendor/lib/jwt_claims_set.d.ts +3 -0
  90. package/dist/types/tdf3/src/crypto/jose/vendor/lib/jwt_claims_set.d.ts.map +1 -0
  91. package/dist/types/tdf3/src/crypto/jose/vendor/lib/secs.d.ts +3 -0
  92. package/dist/types/tdf3/src/crypto/jose/vendor/lib/secs.d.ts.map +1 -0
  93. package/dist/types/tdf3/src/crypto/jose/vendor/lib/validate_crit.d.ts +3 -0
  94. package/dist/types/tdf3/src/crypto/jose/vendor/lib/validate_crit.d.ts.map +1 -0
  95. package/dist/types/tdf3/src/crypto/jose/vendor/util/errors.d.ts +76 -0
  96. package/dist/types/tdf3/src/crypto/jose/vendor/util/errors.d.ts.map +1 -0
  97. package/dist/types/tdf3/src/crypto/jwt.d.ts +76 -0
  98. package/dist/types/tdf3/src/crypto/jwt.d.ts.map +1 -0
  99. package/dist/types/tdf3/src/crypto/salt.d.ts +6 -1
  100. package/dist/types/tdf3/src/crypto/salt.d.ts.map +1 -1
  101. package/dist/types/tdf3/src/models/encryption-information.d.ts +4 -4
  102. package/dist/types/tdf3/src/models/encryption-information.d.ts.map +1 -1
  103. package/dist/types/tdf3/src/models/key-access.d.ts +8 -5
  104. package/dist/types/tdf3/src/models/key-access.d.ts.map +1 -1
  105. package/dist/types/tdf3/src/tdf.d.ts +8 -8
  106. package/dist/types/tdf3/src/tdf.d.ts.map +1 -1
  107. package/dist/types/tdf3/src/utils/index.d.ts +4 -3
  108. package/dist/types/tdf3/src/utils/index.d.ts.map +1 -1
  109. package/dist/web/src/access/access-fetch.js +3 -4
  110. package/dist/web/src/access/access-rpc.js +3 -5
  111. package/dist/web/src/access.js +1 -13
  112. package/dist/web/src/auth/auth.js +13 -10
  113. package/dist/web/src/auth/dpop.js +118 -0
  114. package/dist/web/src/auth/oidc-clientcredentials-provider.js +4 -3
  115. package/dist/web/src/auth/oidc-externaljwt-provider.js +4 -3
  116. package/dist/web/src/auth/oidc-refreshtoken-provider.js +4 -3
  117. package/dist/web/src/auth/oidc.js +11 -9
  118. package/dist/web/src/auth/providers.js +13 -12
  119. package/dist/web/src/crypto/index.js +4 -2
  120. package/dist/web/src/crypto/pemPublicToCrypto.js +11 -9
  121. package/dist/web/src/opentdf.js +7 -10
  122. package/dist/web/tdf3/index.js +3 -2
  123. package/dist/web/tdf3/src/assertions.js +71 -31
  124. package/dist/web/tdf3/src/ciphers/aes-gcm-cipher.js +1 -1
  125. package/dist/web/tdf3/src/ciphers/symmetric-cipher-base.js +4 -2
  126. package/dist/web/tdf3/src/client/index.js +25 -35
  127. package/dist/web/tdf3/src/crypto/crypto-utils.js +12 -5
  128. package/dist/web/tdf3/src/crypto/declarations.js +1 -1
  129. package/dist/web/tdf3/src/crypto/index.js +830 -84
  130. package/dist/web/tdf3/src/crypto/jose/jwt-claims-set.js +5 -0
  131. package/dist/web/tdf3/src/crypto/jose/validate-crit.js +3 -0
  132. package/dist/web/tdf3/src/crypto/jose/vendor/lib/buffer_utils.js +35 -0
  133. package/dist/web/tdf3/src/crypto/jose/vendor/lib/epoch.js +4 -0
  134. package/dist/web/tdf3/src/crypto/jose/vendor/lib/is_object.js +19 -0
  135. package/dist/web/tdf3/src/crypto/jose/vendor/lib/jwt_claims_set.js +107 -0
  136. package/dist/web/tdf3/src/crypto/jose/vendor/lib/secs.js +58 -0
  137. package/dist/web/tdf3/src/crypto/jose/vendor/lib/validate_crit.js +36 -0
  138. package/dist/web/tdf3/src/crypto/jose/vendor/util/errors.js +117 -0
  139. package/dist/web/tdf3/src/crypto/jwt.js +174 -0
  140. package/dist/web/tdf3/src/crypto/salt.js +13 -7
  141. package/dist/web/tdf3/src/models/encryption-information.js +11 -14
  142. package/dist/web/tdf3/src/models/key-access.js +44 -31
  143. package/dist/web/tdf3/src/tdf.js +71 -71
  144. package/dist/web/tdf3/src/utils/index.js +5 -6
  145. package/package.json +11 -4
  146. package/src/access/access-fetch.ts +2 -8
  147. package/src/access/access-rpc.ts +0 -7
  148. package/src/access.ts +0 -17
  149. package/src/auth/auth.ts +21 -12
  150. package/src/auth/dpop.ts +222 -0
  151. package/src/auth/oidc-clientcredentials-provider.ts +23 -15
  152. package/src/auth/oidc-externaljwt-provider.ts +23 -15
  153. package/src/auth/oidc-refreshtoken-provider.ts +23 -15
  154. package/src/auth/oidc.ts +21 -10
  155. package/src/auth/providers.ts +46 -29
  156. package/src/crypto/index.ts +21 -1
  157. package/src/crypto/pemPublicToCrypto.ts +11 -9
  158. package/src/opentdf.ts +19 -14
  159. package/tdf3/index.ts +32 -5
  160. package/tdf3/src/assertions.ts +99 -30
  161. package/tdf3/src/ciphers/aes-gcm-cipher.ts +7 -2
  162. package/tdf3/src/ciphers/symmetric-cipher-base.ts +7 -4
  163. package/tdf3/src/client/builders.ts +2 -2
  164. package/tdf3/src/client/index.ts +60 -59
  165. package/tdf3/src/crypto/crypto-utils.ts +15 -8
  166. package/tdf3/src/crypto/declarations.ts +338 -22
  167. package/tdf3/src/crypto/index.ts +1021 -118
  168. package/tdf3/src/crypto/jose/jwt-claims-set.ts +10 -0
  169. package/tdf3/src/crypto/jose/validate-crit.ts +9 -0
  170. package/tdf3/src/crypto/jose/vendor/lib/buffer_utils.ts +34 -0
  171. package/tdf3/src/crypto/jose/vendor/lib/epoch.ts +3 -0
  172. package/tdf3/src/crypto/jose/vendor/lib/is_object.ts +18 -0
  173. package/tdf3/src/crypto/jose/vendor/lib/jwt_claims_set.ts +106 -0
  174. package/tdf3/src/crypto/jose/vendor/lib/secs.ts +57 -0
  175. package/tdf3/src/crypto/jose/vendor/lib/validate_crit.ts +35 -0
  176. package/tdf3/src/crypto/jose/vendor/util/errors.ts +101 -0
  177. package/tdf3/src/crypto/jwt.ts +256 -0
  178. package/tdf3/src/crypto/salt.ts +16 -8
  179. package/tdf3/src/models/encryption-information.ts +14 -21
  180. package/tdf3/src/models/key-access.ts +57 -41
  181. package/tdf3/src/tdf.ts +110 -93
  182. 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 unwrappedKeyBinary: Binary;
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 { unwrappedKeyBinary, unwrappedKeyIvBinary };
63
+ return { unwrappedKey, unwrappedKeyIvBinary };
65
64
  }
66
65
 
67
66
  async encrypt(
68
67
  contentBinary: Binary,
69
- keyBinary: Binary,
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, keyBinary, ivBinary);
72
+ return this.cipher.encrypt(contentBinary, key, ivBinary);
74
73
  }
75
74
 
76
- async decrypt(content: Uint8Array, keyBinary: Binary): Promise<DecryptResult> {
77
- return this.cipher.decrypt(content, keyBinary);
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 unwrappedKeySplitBuffers = await keySplit(
85
- new Uint8Array(keyInfo.unwrappedKeyBinary.asByteArray()),
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, unwrappedKeySplitBuffers[index]])
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 unwrappedKeySplitBuffer = splitsByName[item.sid || ''];
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
- unwrappedKeySplitBinary,
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 * as cryptoService from '../crypto/index.js';
8
- import { ztdfSalt } from '../crypto/salt.js';
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<CryptoKeyPair>;
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
- this.ephemeralKeyPair = crypto.subtle.generateKey(
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: Uint8Array,
31
+ dek: SymmetricKey,
40
32
  encryptedMetadataStr: string
41
33
  ): Promise<KeyAccessObject> {
42
34
  const policyStr = JSON.stringify(policy);
43
- const [ek, clientPublicKey] = await Promise.all([
44
- this.ephemeralKeyPair,
45
- pemPublicToCrypto(this.publicKey),
46
- ]);
47
- const kek = await keyAgreement(ek.privateKey, clientPublicKey, {
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
- const iv = generateRandomNumber(12);
52
- const cek = await crypto.subtle.encrypt({ name: 'AES-GCM', iv, tagLength: 128 }, kek, dek);
53
- const entityWrappedKey = new Uint8Array(iv.length + cek.byteLength);
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(new Uint8Array(cek), iv.length);
67
+ entityWrappedKey.set(ciphertext, iv.length);
68
+ entityWrappedKey.set(authTag, iv.length + ciphertext.length);
56
69
 
57
- const policyBinding = await cryptoService.hmac(
58
- hex.encodeArrayBuffer(dek),
59
- base64.encode(policyStr)
70
+ const policyBinding = hex.encodeArrayBuffer(
71
+ (await this.cryptoService.hmac(new TextEncoder().encode(base64.encode(policyStr)), dek))
72
+ .buffer
60
73
  );
61
74
 
62
- const ephemeralPublicKeyPEM = await cryptoPublicToPem(ek.publicKey);
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: ephemeralPublicKeyPEM,
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
- keyBuffer: Uint8Array,
117
+ key: SymmetricKey,
102
118
  encryptedMetadataStr: string
103
119
  ): Promise<KeyAccessObject> {
104
120
  const policyStr = JSON.stringify(policy);
105
- const unwrappedKeyBinary = Binary.fromArrayBuffer(keyBuffer.buffer);
106
- const wrappedKeyBinary = await cryptoService.encryptWithPublicKey(
107
- unwrappedKeyBinary,
108
- this.publicKey
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 = await cryptoService.hmac(
112
- hex.encodeArrayBuffer(keyBuffer),
113
- base64.encode(policyStr)
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 = {