react-native-quick-crypto 1.0.9 → 1.0.10

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 (170) hide show
  1. package/QuickCrypto.podspec +9 -2
  2. package/README.md +13 -9
  3. package/android/CMakeLists.txt +4 -0
  4. package/cpp/cipher/HybridCipherFactory.hpp +15 -1
  5. package/cpp/cipher/OCBCipher.cpp +4 -4
  6. package/cpp/cipher/XChaCha20Poly1305Cipher.cpp +161 -0
  7. package/cpp/cipher/XChaCha20Poly1305Cipher.hpp +43 -0
  8. package/cpp/cipher/XSalsa20Poly1305Cipher.cpp +145 -0
  9. package/cpp/cipher/XSalsa20Poly1305Cipher.hpp +42 -0
  10. package/cpp/dh/HybridDiffieHellman.cpp +10 -0
  11. package/cpp/dh/HybridDiffieHellman.hpp +1 -0
  12. package/cpp/ec/HybridEcKeyPair.cpp +21 -0
  13. package/cpp/ec/HybridEcKeyPair.hpp +1 -0
  14. package/cpp/hash/HybridHash.cpp +1 -1
  15. package/cpp/hash/HybridHash.hpp +1 -1
  16. package/cpp/hmac/HybridHmac.cpp +1 -1
  17. package/cpp/hmac/HybridHmac.hpp +1 -1
  18. package/cpp/keys/HybridKeyObjectHandle.cpp +112 -1
  19. package/cpp/keys/HybridKeyObjectHandle.hpp +5 -1
  20. package/deps/ncrypto/.bazelrc +0 -1
  21. package/deps/ncrypto/.bazelversion +1 -1
  22. package/deps/ncrypto/.github/workflows/commitlint.yml +16 -0
  23. package/deps/ncrypto/.github/workflows/linter.yml +2 -2
  24. package/deps/ncrypto/.github/workflows/release-please.yml +16 -0
  25. package/deps/ncrypto/.github/workflows/ubuntu.yml +82 -0
  26. package/deps/ncrypto/.release-please-manifest.json +3 -0
  27. package/deps/ncrypto/BUILD.bazel +9 -1
  28. package/deps/ncrypto/CHANGELOG.md +37 -0
  29. package/deps/ncrypto/CMakeLists.txt +35 -11
  30. package/deps/ncrypto/MODULE.bazel +16 -1
  31. package/deps/ncrypto/MODULE.bazel.lock +299 -118
  32. package/deps/ncrypto/cmake/ncrypto-flags.cmake +1 -0
  33. package/deps/ncrypto/include/ncrypto/aead.h +137 -0
  34. package/deps/ncrypto/include/ncrypto/version.h +14 -0
  35. package/deps/ncrypto/include/ncrypto.h +85 -230
  36. package/deps/ncrypto/ncrypto.pc.in +10 -0
  37. package/deps/ncrypto/release-please-config.json +11 -0
  38. package/deps/ncrypto/src/CMakeLists.txt +31 -6
  39. package/deps/ncrypto/src/aead.cpp +302 -0
  40. package/deps/ncrypto/src/ncrypto.cpp +274 -556
  41. package/deps/ncrypto/tests/BUILD.bazel +2 -0
  42. package/deps/ncrypto/tests/basic.cpp +772 -2
  43. package/deps/ncrypto/tools/run-clang-format.sh +5 -5
  44. package/lib/commonjs/diffie-hellman.js +4 -1
  45. package/lib/commonjs/diffie-hellman.js.map +1 -1
  46. package/lib/commonjs/ec.js +20 -25
  47. package/lib/commonjs/ec.js.map +1 -1
  48. package/lib/commonjs/ed.js +1 -2
  49. package/lib/commonjs/ed.js.map +1 -1
  50. package/lib/commonjs/hash.js +7 -0
  51. package/lib/commonjs/hash.js.map +1 -1
  52. package/lib/commonjs/index.js +11 -1
  53. package/lib/commonjs/index.js.map +1 -1
  54. package/lib/commonjs/keys/classes.js +9 -5
  55. package/lib/commonjs/keys/classes.js.map +1 -1
  56. package/lib/commonjs/subtle.js +82 -31
  57. package/lib/commonjs/subtle.js.map +1 -1
  58. package/lib/commonjs/utils/types.js.map +1 -1
  59. package/lib/module/diffie-hellman.js +4 -0
  60. package/lib/module/diffie-hellman.js.map +1 -1
  61. package/lib/module/ec.js +19 -25
  62. package/lib/module/ec.js.map +1 -1
  63. package/lib/module/ed.js +1 -2
  64. package/lib/module/ed.js.map +1 -1
  65. package/lib/module/hash.js +6 -0
  66. package/lib/module/hash.js.map +1 -1
  67. package/lib/module/index.js +3 -0
  68. package/lib/module/index.js.map +1 -1
  69. package/lib/module/keys/classes.js +9 -5
  70. package/lib/module/keys/classes.js.map +1 -1
  71. package/lib/module/subtle.js +83 -32
  72. package/lib/module/subtle.js.map +1 -1
  73. package/lib/module/utils/types.js.map +1 -1
  74. package/lib/tsconfig.tsbuildinfo +1 -1
  75. package/lib/typescript/diffie-hellman.d.ts +2 -0
  76. package/lib/typescript/diffie-hellman.d.ts.map +1 -1
  77. package/lib/typescript/ec.d.ts +1 -0
  78. package/lib/typescript/ec.d.ts.map +1 -1
  79. package/lib/typescript/ed.d.ts.map +1 -1
  80. package/lib/typescript/hash.d.ts +2 -0
  81. package/lib/typescript/hash.d.ts.map +1 -1
  82. package/lib/typescript/index.d.ts +5 -0
  83. package/lib/typescript/index.d.ts.map +1 -1
  84. package/lib/typescript/keys/classes.d.ts +2 -0
  85. package/lib/typescript/keys/classes.d.ts.map +1 -1
  86. package/lib/typescript/specs/diffie-hellman.nitro.d.ts +1 -0
  87. package/lib/typescript/specs/diffie-hellman.nitro.d.ts.map +1 -1
  88. package/lib/typescript/specs/ecKeyPair.nitro.d.ts +1 -0
  89. package/lib/typescript/specs/ecKeyPair.nitro.d.ts.map +1 -1
  90. package/lib/typescript/specs/keyObjectHandle.nitro.d.ts +2 -0
  91. package/lib/typescript/specs/keyObjectHandle.nitro.d.ts.map +1 -1
  92. package/lib/typescript/subtle.d.ts.map +1 -1
  93. package/lib/typescript/utils/types.d.ts +12 -5
  94. package/lib/typescript/utils/types.d.ts.map +1 -1
  95. package/nitrogen/generated/android/QuickCrypto+autolinking.cmake +8 -5
  96. package/nitrogen/generated/android/QuickCrypto+autolinking.gradle +1 -1
  97. package/nitrogen/generated/android/QuickCryptoOnLoad.cpp +54 -54
  98. package/nitrogen/generated/android/QuickCryptoOnLoad.hpp +1 -1
  99. package/nitrogen/generated/android/kotlin/com/margelo/nitro/crypto/QuickCryptoOnLoad.kt +1 -1
  100. package/nitrogen/generated/ios/QuickCrypto+autolinking.rb +2 -2
  101. package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.cpp +1 -1
  102. package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.hpp +1 -1
  103. package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Umbrella.hpp +1 -1
  104. package/nitrogen/generated/ios/QuickCryptoAutolinking.mm +54 -54
  105. package/nitrogen/generated/ios/QuickCryptoAutolinking.swift +5 -1
  106. package/nitrogen/generated/shared/c++/AsymmetricKeyType.hpp +1 -1
  107. package/nitrogen/generated/shared/c++/CipherArgs.hpp +34 -19
  108. package/nitrogen/generated/shared/c++/HybridBlake3Spec.cpp +1 -1
  109. package/nitrogen/generated/shared/c++/HybridBlake3Spec.hpp +1 -3
  110. package/nitrogen/generated/shared/c++/HybridCipherFactorySpec.cpp +1 -1
  111. package/nitrogen/generated/shared/c++/HybridCipherFactorySpec.hpp +1 -1
  112. package/nitrogen/generated/shared/c++/HybridCipherSpec.cpp +1 -1
  113. package/nitrogen/generated/shared/c++/HybridCipherSpec.hpp +1 -3
  114. package/nitrogen/generated/shared/c++/HybridDiffieHellmanSpec.cpp +2 -1
  115. package/nitrogen/generated/shared/c++/HybridDiffieHellmanSpec.hpp +3 -3
  116. package/nitrogen/generated/shared/c++/HybridECDHSpec.cpp +1 -1
  117. package/nitrogen/generated/shared/c++/HybridECDHSpec.hpp +2 -3
  118. package/nitrogen/generated/shared/c++/HybridEcKeyPairSpec.cpp +2 -1
  119. package/nitrogen/generated/shared/c++/HybridEcKeyPairSpec.hpp +2 -3
  120. package/nitrogen/generated/shared/c++/HybridEdKeyPairSpec.cpp +1 -1
  121. package/nitrogen/generated/shared/c++/HybridEdKeyPairSpec.hpp +2 -3
  122. package/nitrogen/generated/shared/c++/HybridHashSpec.cpp +1 -1
  123. package/nitrogen/generated/shared/c++/HybridHashSpec.hpp +2 -4
  124. package/nitrogen/generated/shared/c++/HybridHkdfSpec.cpp +1 -1
  125. package/nitrogen/generated/shared/c++/HybridHkdfSpec.hpp +2 -3
  126. package/nitrogen/generated/shared/c++/HybridHmacSpec.cpp +1 -1
  127. package/nitrogen/generated/shared/c++/HybridHmacSpec.hpp +3 -4
  128. package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.cpp +3 -1
  129. package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.hpp +8 -4
  130. package/nitrogen/generated/shared/c++/HybridMlDsaKeyPairSpec.cpp +1 -1
  131. package/nitrogen/generated/shared/c++/HybridMlDsaKeyPairSpec.hpp +2 -3
  132. package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.cpp +1 -1
  133. package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.hpp +2 -3
  134. package/nitrogen/generated/shared/c++/HybridRandomSpec.cpp +1 -1
  135. package/nitrogen/generated/shared/c++/HybridRandomSpec.hpp +2 -3
  136. package/nitrogen/generated/shared/c++/HybridRsaCipherSpec.cpp +1 -1
  137. package/nitrogen/generated/shared/c++/HybridRsaCipherSpec.hpp +1 -3
  138. package/nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.cpp +1 -1
  139. package/nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.hpp +1 -3
  140. package/nitrogen/generated/shared/c++/HybridScryptSpec.cpp +1 -1
  141. package/nitrogen/generated/shared/c++/HybridScryptSpec.hpp +2 -3
  142. package/nitrogen/generated/shared/c++/HybridSignHandleSpec.cpp +1 -1
  143. package/nitrogen/generated/shared/c++/HybridSignHandleSpec.hpp +1 -3
  144. package/nitrogen/generated/shared/c++/HybridUtilsSpec.cpp +1 -1
  145. package/nitrogen/generated/shared/c++/HybridUtilsSpec.hpp +2 -3
  146. package/nitrogen/generated/shared/c++/HybridVerifyHandleSpec.cpp +1 -1
  147. package/nitrogen/generated/shared/c++/HybridVerifyHandleSpec.hpp +1 -3
  148. package/nitrogen/generated/shared/c++/JWK.hpp +84 -68
  149. package/nitrogen/generated/shared/c++/JWKkty.hpp +5 -1
  150. package/nitrogen/generated/shared/c++/JWKuse.hpp +1 -1
  151. package/nitrogen/generated/shared/c++/KFormatType.hpp +1 -1
  152. package/nitrogen/generated/shared/c++/KeyDetail.hpp +39 -23
  153. package/nitrogen/generated/shared/c++/KeyEncoding.hpp +1 -1
  154. package/nitrogen/generated/shared/c++/KeyObject.hpp +21 -5
  155. package/nitrogen/generated/shared/c++/KeyType.hpp +1 -1
  156. package/nitrogen/generated/shared/c++/KeyUsage.hpp +1 -1
  157. package/nitrogen/generated/shared/c++/NamedCurve.hpp +1 -1
  158. package/package.json +1 -1
  159. package/src/diffie-hellman.ts +6 -0
  160. package/src/ec.ts +23 -19
  161. package/src/ed.ts +1 -2
  162. package/src/hash.ts +11 -0
  163. package/src/index.ts +3 -0
  164. package/src/keys/classes.ts +10 -3
  165. package/src/specs/diffie-hellman.nitro.ts +1 -0
  166. package/src/specs/ecKeyPair.nitro.ts +2 -0
  167. package/src/specs/keyObjectHandle.nitro.ts +2 -0
  168. package/src/subtle.ts +131 -32
  169. package/src/utils/types.ts +18 -3
  170. package/deps/ncrypto/WORKSPACE +0 -15
package/src/subtle.ts CHANGED
@@ -14,10 +14,11 @@ import type {
14
14
  AesCtrParams,
15
15
  AesCbcParams,
16
16
  AesGcmParams,
17
+ AesOcbParams,
17
18
  RsaOaepParams,
18
19
  ChaCha20Poly1305Params,
19
20
  } from './utils';
20
- import { KFormatType, KeyEncoding } from './utils';
21
+ import { KFormatType, KeyEncoding, KeyType } from './utils';
21
22
  import {
22
23
  CryptoKey,
23
24
  KeyObject,
@@ -90,7 +91,22 @@ function normalizeAlgorithm(
90
91
  }
91
92
 
92
93
  function getAlgorithmName(name: string, length: number): string {
93
- return `${name}${length}`;
94
+ switch (name) {
95
+ case 'AES-CBC':
96
+ return `A${length}CBC`;
97
+ case 'AES-CTR':
98
+ return `A${length}CTR`;
99
+ case 'AES-GCM':
100
+ return `A${length}GCM`;
101
+ case 'AES-KW':
102
+ return `A${length}KW`;
103
+ case 'AES-OCB':
104
+ return `A${length}OCB`;
105
+ case 'ChaCha20-Poly1305':
106
+ return 'C20P';
107
+ default:
108
+ return `${name}${length}`;
109
+ }
94
110
  }
95
111
 
96
112
  // Placeholder implementations for missing functions
@@ -198,6 +214,8 @@ async function aesCipher(
198
214
  return aesCbcCipher(mode, key, data, algorithm as AesCbcParams);
199
215
  case 'AES-GCM':
200
216
  return aesGcmCipher(mode, key, data, algorithm as AesGcmParams);
217
+ case 'AES-OCB':
218
+ return aesOcbCipher(mode, key, data, algorithm as AesOcbParams);
201
219
  default:
202
220
  throw lazyDOMException(
203
221
  `Unsupported AES algorithm: ${name}`,
@@ -294,45 +312,45 @@ async function aesCbcCipher(
294
312
  return result.buffer;
295
313
  }
296
314
 
297
- async function aesGcmCipher(
315
+ interface AeadCipherConfig {
316
+ algorithmName: string;
317
+ validTagLengths: number[];
318
+ cipherSuffix: string;
319
+ iv: ArrayBuffer;
320
+ }
321
+
322
+ async function aesAeadCipher(
298
323
  mode: CipherOrWrapMode,
299
324
  key: CryptoKey,
300
325
  data: ArrayBuffer,
301
- algorithm: AesGcmParams,
326
+ config: AeadCipherConfig,
327
+ additionalData?: BufferLike,
328
+ tagLength: number = 128,
302
329
  ): Promise<ArrayBuffer> {
303
- const { tagLength = 128 } = algorithm;
304
-
305
- // Validate tag length
306
- const validTagLengths = [32, 64, 96, 104, 112, 120, 128];
307
- if (!validTagLengths.includes(tagLength)) {
330
+ if (!config.validTagLengths.includes(tagLength)) {
308
331
  throw lazyDOMException(
309
- `${tagLength} is not a valid AES-GCM tag length`,
332
+ `${tagLength} is not a valid ${config.algorithmName} tag length`,
310
333
  'OperationError',
311
334
  );
312
335
  }
313
336
 
314
337
  const tagByteLength = tagLength / 8;
315
-
316
- // Get cipher type based on key length
317
338
  const keyLength = (key.algorithm as { length: number }).length;
318
- const cipherType = `aes-${keyLength}-gcm`;
339
+ const cipherType = `aes-${keyLength}-${config.cipherSuffix}`;
319
340
 
320
- // Create cipher
321
341
  const factory =
322
342
  NitroModules.createHybridObject<CipherFactory>('CipherFactory');
323
343
  const cipher = factory.createCipher({
324
344
  isCipher: mode === CipherOrWrapMode.kWebCryptoCipherEncrypt,
325
345
  cipherType,
326
346
  cipherKey: bufferLikeToArrayBuffer(key.keyObject.export()),
327
- iv: bufferLikeToArrayBuffer(algorithm.iv),
347
+ iv: config.iv,
328
348
  authTagLen: tagByteLength,
329
349
  });
330
350
 
331
351
  let processData: ArrayBuffer;
332
- let authTag: ArrayBuffer | undefined;
333
352
 
334
353
  if (mode === CipherOrWrapMode.kWebCryptoCipherDecrypt) {
335
- // For decryption, extract auth tag from end of data
336
354
  const dataView = new Uint8Array(data);
337
355
 
338
356
  if (dataView.byteLength < tagByteLength) {
@@ -342,28 +360,22 @@ async function aesGcmCipher(
342
360
  );
343
361
  }
344
362
 
345
- // Split data and tag
346
363
  const ciphertextLength = dataView.byteLength - tagByteLength;
347
364
  processData = dataView.slice(0, ciphertextLength).buffer;
348
- authTag = dataView.slice(ciphertextLength).buffer;
349
-
350
- // Set auth tag for verification
365
+ const authTag = dataView.slice(ciphertextLength).buffer;
351
366
  cipher.setAuthTag(authTag);
352
367
  } else {
353
368
  processData = data;
354
369
  }
355
370
 
356
- // Set additional authenticated data if provided
357
- if (algorithm.additionalData) {
358
- cipher.setAAD(bufferLikeToArrayBuffer(algorithm.additionalData));
371
+ if (additionalData) {
372
+ cipher.setAAD(bufferLikeToArrayBuffer(additionalData));
359
373
  }
360
374
 
361
- // Process data
362
375
  const updated = cipher.update(processData);
363
376
  const final = cipher.final();
364
377
 
365
378
  if (mode === CipherOrWrapMode.kWebCryptoCipherEncrypt) {
366
- // For encryption, append auth tag to result
367
379
  const tag = cipher.getAuthTag();
368
380
  const result = new Uint8Array(
369
381
  updated.byteLength + final.byteLength + tag.byteLength,
@@ -373,7 +385,6 @@ async function aesGcmCipher(
373
385
  result.set(new Uint8Array(tag), updated.byteLength + final.byteLength);
374
386
  return result.buffer;
375
387
  } else {
376
- // For decryption, just concatenate plaintext
377
388
  const result = new Uint8Array(updated.byteLength + final.byteLength);
378
389
  result.set(new Uint8Array(updated), 0);
379
390
  result.set(new Uint8Array(final), updated.byteLength);
@@ -381,6 +392,56 @@ async function aesGcmCipher(
381
392
  }
382
393
  }
383
394
 
395
+ async function aesGcmCipher(
396
+ mode: CipherOrWrapMode,
397
+ key: CryptoKey,
398
+ data: ArrayBuffer,
399
+ algorithm: AesGcmParams,
400
+ ): Promise<ArrayBuffer> {
401
+ return aesAeadCipher(
402
+ mode,
403
+ key,
404
+ data,
405
+ {
406
+ algorithmName: 'AES-GCM',
407
+ validTagLengths: [32, 64, 96, 104, 112, 120, 128],
408
+ cipherSuffix: 'gcm',
409
+ iv: bufferLikeToArrayBuffer(algorithm.iv),
410
+ },
411
+ algorithm.additionalData,
412
+ algorithm.tagLength,
413
+ );
414
+ }
415
+
416
+ async function aesOcbCipher(
417
+ mode: CipherOrWrapMode,
418
+ key: CryptoKey,
419
+ data: ArrayBuffer,
420
+ algorithm: AesOcbParams,
421
+ ): Promise<ArrayBuffer> {
422
+ const ivBuffer = bufferLikeToArrayBuffer(algorithm.iv);
423
+ if (ivBuffer.byteLength < 1 || ivBuffer.byteLength > 15) {
424
+ throw lazyDOMException(
425
+ 'AES-OCB algorithm.iv must be between 1 and 15 bytes',
426
+ 'OperationError',
427
+ );
428
+ }
429
+
430
+ return aesAeadCipher(
431
+ mode,
432
+ key,
433
+ data,
434
+ {
435
+ algorithmName: 'AES-OCB',
436
+ validTagLengths: [64, 96, 128],
437
+ cipherSuffix: 'ocb',
438
+ iv: ivBuffer,
439
+ },
440
+ algorithm.additionalData,
441
+ algorithm.tagLength,
442
+ );
443
+ }
444
+
384
445
  async function aesKwCipher(
385
446
  mode: CipherOrWrapMode,
386
447
  key: CryptoKey,
@@ -891,7 +952,7 @@ async function aesImportKey(
891
952
 
892
953
  function edImportKey(
893
954
  format: ImportFormat,
894
- data: BufferLike,
955
+ data: BufferLike | JWK,
895
956
  algorithm: SubtleAlgorithm,
896
957
  extractable: boolean,
897
958
  keyUsages: KeyUsage[],
@@ -915,7 +976,7 @@ function edImportKey(
915
976
 
916
977
  if (format === 'spki') {
917
978
  // Import public key
918
- const keyData = bufferLikeToArrayBuffer(data);
979
+ const keyData = bufferLikeToArrayBuffer(data as BufferLike);
919
980
  keyObject = KeyObject.createKeyObject(
920
981
  'public',
921
982
  keyData,
@@ -924,7 +985,7 @@ function edImportKey(
924
985
  );
925
986
  } else if (format === 'pkcs8') {
926
987
  // Import private key
927
- const keyData = bufferLikeToArrayBuffer(data);
988
+ const keyData = bufferLikeToArrayBuffer(data as BufferLike);
928
989
  keyObject = KeyObject.createKeyObject(
929
990
  'private',
930
991
  keyData,
@@ -933,13 +994,26 @@ function edImportKey(
933
994
  );
934
995
  } else if (format === 'raw') {
935
996
  // Raw format - public key only for Ed keys
936
- const keyData = bufferLikeToArrayBuffer(data);
997
+ const keyData = bufferLikeToArrayBuffer(data as BufferLike);
937
998
  const handle =
938
999
  NitroModules.createHybridObject<KeyObjectHandle>('KeyObjectHandle');
939
1000
  // For raw Ed keys, we need to create them differently
940
1001
  // Raw public keys are just the key bytes
941
1002
  handle.init(1, keyData); // 1 = public key type
942
1003
  keyObject = new PublicKeyObject(handle);
1004
+ } else if (format === 'jwk') {
1005
+ const jwkData = data as JWK;
1006
+ const handle =
1007
+ NitroModules.createHybridObject<KeyObjectHandle>('KeyObjectHandle');
1008
+ const keyType = handle.initJwk(jwkData);
1009
+ if (keyType === undefined) {
1010
+ throw lazyDOMException('Invalid JWK data', 'DataError');
1011
+ }
1012
+ if (keyType === KeyType.PRIVATE) {
1013
+ keyObject = new PrivateKeyObject(handle);
1014
+ } else {
1015
+ keyObject = new PublicKeyObject(handle);
1016
+ }
943
1017
  } else {
944
1018
  throw lazyDOMException(
945
1019
  `Unsupported format for ${name} import: ${format}`,
@@ -1133,6 +1207,8 @@ const exportKeyRaw = (key: CryptoKey): ArrayBuffer | unknown => {
1133
1207
  // Fall through
1134
1208
  case 'AES-KW':
1135
1209
  // Fall through
1210
+ case 'AES-OCB':
1211
+ // Fall through
1136
1212
  case 'ChaCha20-Poly1305':
1137
1213
  // Fall through
1138
1214
  case 'HMAC': {
@@ -1177,6 +1253,14 @@ const exportKeyJWK = (key: CryptoKey): ArrayBuffer | unknown => {
1177
1253
  case 'ECDH':
1178
1254
  jwk.crv ||= key.algorithm.namedCurve;
1179
1255
  return jwk;
1256
+ case 'Ed25519':
1257
+ // Fall through
1258
+ case 'Ed448':
1259
+ // Fall through
1260
+ case 'X25519':
1261
+ // Fall through
1262
+ case 'X448':
1263
+ return jwk;
1180
1264
  case 'AES-CTR':
1181
1265
  // Fall through
1182
1266
  case 'AES-CBC':
@@ -1185,6 +1269,8 @@ const exportKeyJWK = (key: CryptoKey): ArrayBuffer | unknown => {
1185
1269
  // Fall through
1186
1270
  case 'AES-KW':
1187
1271
  // Fall through
1272
+ case 'AES-OCB':
1273
+ // Fall through
1188
1274
  case 'ChaCha20-Poly1305':
1189
1275
  if (key.algorithm.length === undefined) {
1190
1276
  throw lazyDOMException(
@@ -1503,6 +1589,8 @@ const cipherOrWrap = async (
1503
1589
  case 'AES-CBC':
1504
1590
  // Fall through
1505
1591
  case 'AES-GCM':
1592
+ // Fall through
1593
+ case 'AES-OCB':
1506
1594
  return aesCipher(mode, key, data, algorithm);
1507
1595
  case 'AES-KW':
1508
1596
  return aesKwCipher(mode, key, data);
@@ -1613,6 +1701,9 @@ export class Subtle {
1613
1701
  case 'X448':
1614
1702
  derivedBits = await xDeriveBits(algorithm, baseKey, length);
1615
1703
  break;
1704
+ case 'ECDH':
1705
+ derivedBits = await ecDeriveBits(algorithm, baseKey, length);
1706
+ break;
1616
1707
  case 'HKDF':
1617
1708
  derivedBits = hkdfDeriveBits(
1618
1709
  algorithm as unknown as HkdfAlgorithm,
@@ -1657,6 +1748,8 @@ export class Subtle {
1657
1748
  ): Promise<ArrayBuffer | JWK> {
1658
1749
  if (!key.extractable) throw new Error('key is not extractable');
1659
1750
 
1751
+ if (format === 'raw-secret') format = 'raw';
1752
+
1660
1753
  switch (format) {
1661
1754
  case 'spki':
1662
1755
  return (await exportKeySpki(key)) as ArrayBuffer;
@@ -1811,6 +1904,8 @@ export class Subtle {
1811
1904
  case 'AES-GCM':
1812
1905
  // Fall through
1813
1906
  case 'AES-KW':
1907
+ // Fall through
1908
+ case 'AES-OCB':
1814
1909
  result = await aesGenerateKey(
1815
1910
  algorithm as AesKeyGenParams,
1816
1911
  extractable,
@@ -1889,6 +1984,7 @@ export class Subtle {
1889
1984
  extractable: boolean,
1890
1985
  keyUsages: KeyUsage[],
1891
1986
  ): Promise<CryptoKey> {
1987
+ if (format === 'raw-secret') format = 'raw';
1892
1988
  const normalizedAlgorithm = normalizeAlgorithm(algorithm, 'importKey');
1893
1989
  let result: CryptoKey;
1894
1990
  switch (normalizedAlgorithm.name) {
@@ -1933,6 +2029,8 @@ export class Subtle {
1933
2029
  // Fall through
1934
2030
  case 'AES-KW':
1935
2031
  // Fall through
2032
+ case 'AES-OCB':
2033
+ // Fall through
1936
2034
  case 'ChaCha20-Poly1305':
1937
2035
  result = await aesImportKey(
1938
2036
  normalizedAlgorithm,
@@ -1969,7 +2067,7 @@ export class Subtle {
1969
2067
  case 'Ed448':
1970
2068
  result = edImportKey(
1971
2069
  format,
1972
- data as BufferLike,
2070
+ data as BufferLike | JWK,
1973
2071
  normalizedAlgorithm,
1974
2072
  extractable,
1975
2073
  keyUsages,
@@ -2121,6 +2219,7 @@ function getKeyLength(algorithm: SubtleAlgorithm): number {
2121
2219
  case 'AES-CBC':
2122
2220
  case 'AES-GCM':
2123
2221
  case 'AES-KW':
2222
+ case 'AES-OCB':
2124
2223
  case 'ChaCha20-Poly1305':
2125
2224
  return (algorithm as AesKeyGenParams).length || 256;
2126
2225
 
@@ -80,7 +80,12 @@ export type KeyPairAlgorithm =
80
80
  | CFRGKeyPairAlgorithm
81
81
  | PQCKeyPairAlgorithm;
82
82
 
83
- export type AESAlgorithm = 'AES-CTR' | 'AES-CBC' | 'AES-GCM' | 'AES-KW';
83
+ export type AESAlgorithm =
84
+ | 'AES-CTR'
85
+ | 'AES-CBC'
86
+ | 'AES-GCM'
87
+ | 'AES-KW'
88
+ | 'AES-OCB';
84
89
 
85
90
  export type SecretKeyAlgorithm = 'HMAC' | AESAlgorithm;
86
91
 
@@ -108,6 +113,7 @@ export type EncryptDecryptAlgorithm =
108
113
  | 'AES-CBC'
109
114
  | 'AES-GCM'
110
115
  | 'AES-KW'
116
+ | 'AES-OCB'
111
117
  | 'ChaCha20-Poly1305';
112
118
 
113
119
  export type RsaOaepParams = {
@@ -140,6 +146,13 @@ export type ChaCha20Poly1305Params = {
140
146
  additionalData?: BufferLike;
141
147
  };
142
148
 
149
+ export type AesOcbParams = {
150
+ name: 'AES-OCB';
151
+ iv: BufferLike;
152
+ tagLength?: 64 | 96 | 128;
153
+ additionalData?: BufferLike;
154
+ };
155
+
143
156
  export type AesKwParams = {
144
157
  name: 'AES-KW';
145
158
  wrappingKey?: BufferLike;
@@ -158,6 +171,7 @@ export type EncryptDecryptParams =
158
171
  | AesCbcParams
159
172
  | AesCtrParams
160
173
  | AesGcmParams
174
+ | AesOcbParams
161
175
  | AesKwParams
162
176
  | RsaOaepParams
163
177
  | ChaCha20Poly1305Params;
@@ -187,6 +201,7 @@ export type SubtleAlgorithm = {
187
201
  modulusLength?: number;
188
202
  publicExponent?: number | Uint8Array;
189
203
  saltLength?: number;
204
+ public?: CryptoKey;
190
205
  };
191
206
 
192
207
  export type KeyPairType =
@@ -264,7 +279,7 @@ export type AsymmetricKeyType =
264
279
  | CFRGKeyPairType
265
280
  | PQCKeyPairType;
266
281
 
267
- type JWKkty = 'AES' | 'RSA' | 'EC' | 'oct';
282
+ type JWKkty = 'AES' | 'RSA' | 'EC' | 'oct' | 'OKP';
268
283
  type JWKuse = 'sig' | 'enc';
269
284
 
270
285
  export interface JWK {
@@ -447,7 +462,7 @@ export type DiffieHellmanCallback = (
447
462
  // from @paulmillr/noble-curves
448
463
  export type Hex = string | Uint8Array;
449
464
 
450
- export type ImportFormat = 'raw' | 'pkcs8' | 'spki' | 'jwk';
465
+ export type ImportFormat = 'raw' | 'raw-secret' | 'pkcs8' | 'spki' | 'jwk';
451
466
 
452
467
  export type Operation =
453
468
  | 'encrypt'
@@ -1,15 +0,0 @@
1
- workspace(name = "ncrypto")
2
-
3
- load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
4
-
5
- http_archive(
6
- name = "ssl",
7
- sha256 = "64529449ef458381346b163302523a1fb876e5b667bec4a4bd38d0d2fff8b42b",
8
- strip_prefix = "boringssl-0.20250818.0",
9
- type = "tgz",
10
- urls = ["https://github.com/google/boringssl/archive/refs/tags/0.20250818.0.tar.gz"],
11
- patches = [
12
- "@ncrypto//:patches/0001-Expose-libdecrepit-so-NodeJS-can-use-it-for-ncrypto.patch"
13
- ],
14
- patch_strip = 1
15
- )