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.
- package/QuickCrypto.podspec +9 -2
- package/README.md +13 -9
- package/android/CMakeLists.txt +4 -0
- package/cpp/cipher/HybridCipherFactory.hpp +15 -1
- package/cpp/cipher/OCBCipher.cpp +4 -4
- package/cpp/cipher/XChaCha20Poly1305Cipher.cpp +161 -0
- package/cpp/cipher/XChaCha20Poly1305Cipher.hpp +43 -0
- package/cpp/cipher/XSalsa20Poly1305Cipher.cpp +145 -0
- package/cpp/cipher/XSalsa20Poly1305Cipher.hpp +42 -0
- package/cpp/dh/HybridDiffieHellman.cpp +10 -0
- package/cpp/dh/HybridDiffieHellman.hpp +1 -0
- package/cpp/ec/HybridEcKeyPair.cpp +21 -0
- package/cpp/ec/HybridEcKeyPair.hpp +1 -0
- package/cpp/hash/HybridHash.cpp +1 -1
- package/cpp/hash/HybridHash.hpp +1 -1
- package/cpp/hmac/HybridHmac.cpp +1 -1
- package/cpp/hmac/HybridHmac.hpp +1 -1
- package/cpp/keys/HybridKeyObjectHandle.cpp +112 -1
- package/cpp/keys/HybridKeyObjectHandle.hpp +5 -1
- package/deps/ncrypto/.bazelrc +0 -1
- package/deps/ncrypto/.bazelversion +1 -1
- package/deps/ncrypto/.github/workflows/commitlint.yml +16 -0
- package/deps/ncrypto/.github/workflows/linter.yml +2 -2
- package/deps/ncrypto/.github/workflows/release-please.yml +16 -0
- package/deps/ncrypto/.github/workflows/ubuntu.yml +82 -0
- package/deps/ncrypto/.release-please-manifest.json +3 -0
- package/deps/ncrypto/BUILD.bazel +9 -1
- package/deps/ncrypto/CHANGELOG.md +37 -0
- package/deps/ncrypto/CMakeLists.txt +35 -11
- package/deps/ncrypto/MODULE.bazel +16 -1
- package/deps/ncrypto/MODULE.bazel.lock +299 -118
- package/deps/ncrypto/cmake/ncrypto-flags.cmake +1 -0
- package/deps/ncrypto/include/ncrypto/aead.h +137 -0
- package/deps/ncrypto/include/ncrypto/version.h +14 -0
- package/deps/ncrypto/include/ncrypto.h +85 -230
- package/deps/ncrypto/ncrypto.pc.in +10 -0
- package/deps/ncrypto/release-please-config.json +11 -0
- package/deps/ncrypto/src/CMakeLists.txt +31 -6
- package/deps/ncrypto/src/aead.cpp +302 -0
- package/deps/ncrypto/src/ncrypto.cpp +274 -556
- package/deps/ncrypto/tests/BUILD.bazel +2 -0
- package/deps/ncrypto/tests/basic.cpp +772 -2
- package/deps/ncrypto/tools/run-clang-format.sh +5 -5
- package/lib/commonjs/diffie-hellman.js +4 -1
- package/lib/commonjs/diffie-hellman.js.map +1 -1
- package/lib/commonjs/ec.js +20 -25
- package/lib/commonjs/ec.js.map +1 -1
- package/lib/commonjs/ed.js +1 -2
- package/lib/commonjs/ed.js.map +1 -1
- package/lib/commonjs/hash.js +7 -0
- package/lib/commonjs/hash.js.map +1 -1
- package/lib/commonjs/index.js +11 -1
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/keys/classes.js +9 -5
- package/lib/commonjs/keys/classes.js.map +1 -1
- package/lib/commonjs/subtle.js +82 -31
- package/lib/commonjs/subtle.js.map +1 -1
- package/lib/commonjs/utils/types.js.map +1 -1
- package/lib/module/diffie-hellman.js +4 -0
- package/lib/module/diffie-hellman.js.map +1 -1
- package/lib/module/ec.js +19 -25
- package/lib/module/ec.js.map +1 -1
- package/lib/module/ed.js +1 -2
- package/lib/module/ed.js.map +1 -1
- package/lib/module/hash.js +6 -0
- package/lib/module/hash.js.map +1 -1
- package/lib/module/index.js +3 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/keys/classes.js +9 -5
- package/lib/module/keys/classes.js.map +1 -1
- package/lib/module/subtle.js +83 -32
- package/lib/module/subtle.js.map +1 -1
- package/lib/module/utils/types.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/lib/typescript/diffie-hellman.d.ts +2 -0
- package/lib/typescript/diffie-hellman.d.ts.map +1 -1
- package/lib/typescript/ec.d.ts +1 -0
- package/lib/typescript/ec.d.ts.map +1 -1
- package/lib/typescript/ed.d.ts.map +1 -1
- package/lib/typescript/hash.d.ts +2 -0
- package/lib/typescript/hash.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +5 -0
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/keys/classes.d.ts +2 -0
- package/lib/typescript/keys/classes.d.ts.map +1 -1
- package/lib/typescript/specs/diffie-hellman.nitro.d.ts +1 -0
- package/lib/typescript/specs/diffie-hellman.nitro.d.ts.map +1 -1
- package/lib/typescript/specs/ecKeyPair.nitro.d.ts +1 -0
- package/lib/typescript/specs/ecKeyPair.nitro.d.ts.map +1 -1
- package/lib/typescript/specs/keyObjectHandle.nitro.d.ts +2 -0
- package/lib/typescript/specs/keyObjectHandle.nitro.d.ts.map +1 -1
- package/lib/typescript/subtle.d.ts.map +1 -1
- package/lib/typescript/utils/types.d.ts +12 -5
- package/lib/typescript/utils/types.d.ts.map +1 -1
- package/nitrogen/generated/android/QuickCrypto+autolinking.cmake +8 -5
- package/nitrogen/generated/android/QuickCrypto+autolinking.gradle +1 -1
- package/nitrogen/generated/android/QuickCryptoOnLoad.cpp +54 -54
- package/nitrogen/generated/android/QuickCryptoOnLoad.hpp +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/crypto/QuickCryptoOnLoad.kt +1 -1
- package/nitrogen/generated/ios/QuickCrypto+autolinking.rb +2 -2
- package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.cpp +1 -1
- package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.hpp +1 -1
- package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Umbrella.hpp +1 -1
- package/nitrogen/generated/ios/QuickCryptoAutolinking.mm +54 -54
- package/nitrogen/generated/ios/QuickCryptoAutolinking.swift +5 -1
- package/nitrogen/generated/shared/c++/AsymmetricKeyType.hpp +1 -1
- package/nitrogen/generated/shared/c++/CipherArgs.hpp +34 -19
- package/nitrogen/generated/shared/c++/HybridBlake3Spec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridBlake3Spec.hpp +1 -3
- package/nitrogen/generated/shared/c++/HybridCipherFactorySpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridCipherFactorySpec.hpp +1 -1
- package/nitrogen/generated/shared/c++/HybridCipherSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridCipherSpec.hpp +1 -3
- package/nitrogen/generated/shared/c++/HybridDiffieHellmanSpec.cpp +2 -1
- package/nitrogen/generated/shared/c++/HybridDiffieHellmanSpec.hpp +3 -3
- package/nitrogen/generated/shared/c++/HybridECDHSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridECDHSpec.hpp +2 -3
- package/nitrogen/generated/shared/c++/HybridEcKeyPairSpec.cpp +2 -1
- package/nitrogen/generated/shared/c++/HybridEcKeyPairSpec.hpp +2 -3
- package/nitrogen/generated/shared/c++/HybridEdKeyPairSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridEdKeyPairSpec.hpp +2 -3
- package/nitrogen/generated/shared/c++/HybridHashSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridHashSpec.hpp +2 -4
- package/nitrogen/generated/shared/c++/HybridHkdfSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridHkdfSpec.hpp +2 -3
- package/nitrogen/generated/shared/c++/HybridHmacSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridHmacSpec.hpp +3 -4
- package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.cpp +3 -1
- package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.hpp +8 -4
- package/nitrogen/generated/shared/c++/HybridMlDsaKeyPairSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridMlDsaKeyPairSpec.hpp +2 -3
- package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.hpp +2 -3
- package/nitrogen/generated/shared/c++/HybridRandomSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridRandomSpec.hpp +2 -3
- package/nitrogen/generated/shared/c++/HybridRsaCipherSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridRsaCipherSpec.hpp +1 -3
- package/nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.hpp +1 -3
- package/nitrogen/generated/shared/c++/HybridScryptSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridScryptSpec.hpp +2 -3
- package/nitrogen/generated/shared/c++/HybridSignHandleSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridSignHandleSpec.hpp +1 -3
- package/nitrogen/generated/shared/c++/HybridUtilsSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridUtilsSpec.hpp +2 -3
- package/nitrogen/generated/shared/c++/HybridVerifyHandleSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridVerifyHandleSpec.hpp +1 -3
- package/nitrogen/generated/shared/c++/JWK.hpp +84 -68
- package/nitrogen/generated/shared/c++/JWKkty.hpp +5 -1
- package/nitrogen/generated/shared/c++/JWKuse.hpp +1 -1
- package/nitrogen/generated/shared/c++/KFormatType.hpp +1 -1
- package/nitrogen/generated/shared/c++/KeyDetail.hpp +39 -23
- package/nitrogen/generated/shared/c++/KeyEncoding.hpp +1 -1
- package/nitrogen/generated/shared/c++/KeyObject.hpp +21 -5
- package/nitrogen/generated/shared/c++/KeyType.hpp +1 -1
- package/nitrogen/generated/shared/c++/KeyUsage.hpp +1 -1
- package/nitrogen/generated/shared/c++/NamedCurve.hpp +1 -1
- package/package.json +1 -1
- package/src/diffie-hellman.ts +6 -0
- package/src/ec.ts +23 -19
- package/src/ed.ts +1 -2
- package/src/hash.ts +11 -0
- package/src/index.ts +3 -0
- package/src/keys/classes.ts +10 -3
- package/src/specs/diffie-hellman.nitro.ts +1 -0
- package/src/specs/ecKeyPair.nitro.ts +2 -0
- package/src/specs/keyObjectHandle.nitro.ts +2 -0
- package/src/subtle.ts +131 -32
- package/src/utils/types.ts +18 -3
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
326
|
+
config: AeadCipherConfig,
|
|
327
|
+
additionalData?: BufferLike,
|
|
328
|
+
tagLength: number = 128,
|
|
302
329
|
): Promise<ArrayBuffer> {
|
|
303
|
-
|
|
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
|
|
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}
|
|
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:
|
|
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
|
-
|
|
357
|
-
|
|
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
|
|
package/src/utils/types.ts
CHANGED
|
@@ -80,7 +80,12 @@ export type KeyPairAlgorithm =
|
|
|
80
80
|
| CFRGKeyPairAlgorithm
|
|
81
81
|
| PQCKeyPairAlgorithm;
|
|
82
82
|
|
|
83
|
-
export type AESAlgorithm =
|
|
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'
|
package/deps/ncrypto/WORKSPACE
DELETED
|
@@ -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
|
-
)
|