react-native-quick-crypto 1.0.9 → 1.0.11
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 +13 -0
- package/cpp/argon2/HybridArgon2.cpp +103 -0
- package/cpp/argon2/HybridArgon2.hpp +32 -0
- package/cpp/certificate/HybridCertificate.cpp +42 -0
- package/cpp/certificate/HybridCertificate.hpp +16 -0
- package/cpp/cipher/HybridCipher.cpp +58 -0
- package/cpp/cipher/HybridCipher.hpp +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/HybridDhKeyPair.cpp +179 -0
- package/cpp/dh/HybridDhKeyPair.hpp +37 -0
- package/cpp/dh/HybridDiffieHellman.cpp +10 -0
- package/cpp/dh/HybridDiffieHellman.hpp +1 -0
- package/cpp/dsa/HybridDsaKeyPair.cpp +128 -0
- package/cpp/dsa/HybridDsaKeyPair.hpp +32 -0
- package/cpp/ec/HybridEcKeyPair.cpp +21 -0
- package/cpp/ec/HybridEcKeyPair.hpp +1 -0
- package/cpp/ecdh/HybridECDH.cpp +35 -0
- package/cpp/ecdh/HybridECDH.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 +131 -1
- package/cpp/keys/HybridKeyObjectHandle.hpp +5 -1
- package/cpp/prime/HybridPrime.cpp +81 -0
- package/cpp/prime/HybridPrime.hpp +20 -0
- 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/argon2.js +39 -0
- package/lib/commonjs/argon2.js.map +1 -0
- package/lib/commonjs/certificate.js +35 -0
- package/lib/commonjs/certificate.js.map +1 -0
- package/lib/commonjs/cipher.js +8 -0
- package/lib/commonjs/cipher.js.map +1 -1
- package/lib/commonjs/dhKeyPair.js +109 -0
- package/lib/commonjs/dhKeyPair.js.map +1 -0
- package/lib/commonjs/diffie-hellman.js +4 -1
- package/lib/commonjs/diffie-hellman.js.map +1 -1
- package/lib/commonjs/dsa.js +92 -0
- package/lib/commonjs/dsa.js.map +1 -0
- package/lib/commonjs/ec.js +20 -25
- package/lib/commonjs/ec.js.map +1 -1
- package/lib/commonjs/ecdh.js +37 -0
- package/lib/commonjs/ecdh.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 +46 -1
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/keys/classes.js +18 -12
- package/lib/commonjs/keys/classes.js.map +1 -1
- package/lib/commonjs/keys/generateKeyPair.js +11 -0
- package/lib/commonjs/keys/generateKeyPair.js.map +1 -1
- package/lib/commonjs/prime.js +84 -0
- package/lib/commonjs/prime.js.map +1 -0
- package/lib/commonjs/specs/argon2.nitro.js +6 -0
- package/lib/commonjs/specs/argon2.nitro.js.map +1 -0
- package/lib/commonjs/specs/certificate.nitro.js +6 -0
- package/lib/commonjs/specs/certificate.nitro.js.map +1 -0
- package/lib/commonjs/specs/dhKeyPair.nitro.js +6 -0
- package/lib/commonjs/specs/dhKeyPair.nitro.js.map +1 -0
- package/lib/commonjs/specs/dsaKeyPair.nitro.js +6 -0
- package/lib/commonjs/specs/dsaKeyPair.nitro.js.map +1 -0
- package/lib/commonjs/specs/prime.nitro.js +6 -0
- package/lib/commonjs/specs/prime.nitro.js.map +1 -0
- package/lib/commonjs/subtle.js +181 -39
- package/lib/commonjs/subtle.js.map +1 -1
- package/lib/commonjs/utils/types.js.map +1 -1
- package/lib/module/argon2.js +34 -0
- package/lib/module/argon2.js.map +1 -0
- package/lib/module/certificate.js +30 -0
- package/lib/module/certificate.js.map +1 -0
- package/lib/module/cipher.js +7 -0
- package/lib/module/cipher.js.map +1 -1
- package/lib/module/dhKeyPair.js +102 -0
- package/lib/module/dhKeyPair.js.map +1 -0
- package/lib/module/diffie-hellman.js +4 -0
- package/lib/module/diffie-hellman.js.map +1 -1
- package/lib/module/dsa.js +85 -0
- package/lib/module/dsa.js.map +1 -0
- package/lib/module/ec.js +19 -25
- package/lib/module/ec.js.map +1 -1
- package/lib/module/ecdh.js +37 -0
- package/lib/module/ecdh.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 +12 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/keys/classes.js +18 -12
- package/lib/module/keys/classes.js.map +1 -1
- package/lib/module/keys/generateKeyPair.js +11 -0
- package/lib/module/keys/generateKeyPair.js.map +1 -1
- package/lib/module/prime.js +77 -0
- package/lib/module/prime.js.map +1 -0
- package/lib/module/specs/argon2.nitro.js +4 -0
- package/lib/module/specs/argon2.nitro.js.map +1 -0
- package/lib/module/specs/certificate.nitro.js +4 -0
- package/lib/module/specs/certificate.nitro.js.map +1 -0
- package/lib/module/specs/dhKeyPair.nitro.js +4 -0
- package/lib/module/specs/dhKeyPair.nitro.js.map +1 -0
- package/lib/module/specs/dsaKeyPair.nitro.js +4 -0
- package/lib/module/specs/dsaKeyPair.nitro.js.map +1 -0
- package/lib/module/specs/prime.nitro.js +4 -0
- package/lib/module/specs/prime.nitro.js.map +1 -0
- package/lib/module/subtle.js +183 -42
- 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/argon2.d.ts +16 -0
- package/lib/typescript/argon2.d.ts.map +1 -0
- package/lib/typescript/certificate.d.ts +8 -0
- package/lib/typescript/certificate.d.ts.map +1 -0
- package/lib/typescript/cipher.d.ts +12 -0
- package/lib/typescript/cipher.d.ts.map +1 -1
- package/lib/typescript/dhKeyPair.d.ts +19 -0
- package/lib/typescript/dhKeyPair.d.ts.map +1 -0
- package/lib/typescript/diffie-hellman.d.ts +2 -0
- package/lib/typescript/diffie-hellman.d.ts.map +1 -1
- package/lib/typescript/dsa.d.ts +19 -0
- package/lib/typescript/dsa.d.ts.map +1 -0
- package/lib/typescript/ec.d.ts +1 -0
- package/lib/typescript/ec.d.ts.map +1 -1
- package/lib/typescript/ecdh.d.ts +3 -0
- package/lib/typescript/ecdh.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 +22 -0
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/keys/classes.d.ts +4 -0
- package/lib/typescript/keys/classes.d.ts.map +1 -1
- package/lib/typescript/keys/generateKeyPair.d.ts.map +1 -1
- package/lib/typescript/prime.d.ts +19 -0
- package/lib/typescript/prime.d.ts.map +1 -0
- package/lib/typescript/specs/argon2.nitro.d.ts +9 -0
- package/lib/typescript/specs/argon2.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/certificate.nitro.d.ts +10 -0
- package/lib/typescript/specs/certificate.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/cipher.nitro.d.ts +9 -0
- package/lib/typescript/specs/cipher.nitro.d.ts.map +1 -1
- package/lib/typescript/specs/dhKeyPair.nitro.d.ts +14 -0
- package/lib/typescript/specs/dhKeyPair.nitro.d.ts.map +1 -0
- 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/dsaKeyPair.nitro.d.ts +13 -0
- package/lib/typescript/specs/dsaKeyPair.nitro.d.ts.map +1 -0
- 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/ecdh.nitro.d.ts +1 -0
- package/lib/typescript/specs/ecdh.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/specs/prime.nitro.d.ts +11 -0
- package/lib/typescript/specs/prime.nitro.d.ts.map +1 -0
- package/lib/typescript/subtle.d.ts +2 -0
- package/lib/typescript/subtle.d.ts.map +1 -1
- package/lib/typescript/utils/types.d.ts +24 -7
- package/lib/typescript/utils/types.d.ts.map +1 -1
- package/nitrogen/generated/android/QuickCrypto+autolinking.cmake +13 -5
- package/nitrogen/generated/android/QuickCrypto+autolinking.gradle +1 -1
- package/nitrogen/generated/android/QuickCryptoOnLoad.cpp +104 -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 +104 -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++/CipherInfo.hpp +104 -0
- package/nitrogen/generated/shared/c++/HybridArgon2Spec.cpp +22 -0
- package/nitrogen/generated/shared/c++/HybridArgon2Spec.hpp +66 -0
- package/nitrogen/generated/shared/c++/HybridBlake3Spec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridBlake3Spec.hpp +1 -3
- package/nitrogen/generated/shared/c++/HybridCertificateSpec.cpp +23 -0
- package/nitrogen/generated/shared/c++/HybridCertificateSpec.hpp +64 -0
- 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 +2 -1
- package/nitrogen/generated/shared/c++/HybridCipherSpec.hpp +5 -3
- package/nitrogen/generated/shared/c++/HybridDhKeyPairSpec.cpp +27 -0
- package/nitrogen/generated/shared/c++/HybridDhKeyPairSpec.hpp +69 -0
- package/nitrogen/generated/shared/c++/HybridDiffieHellmanSpec.cpp +2 -1
- package/nitrogen/generated/shared/c++/HybridDiffieHellmanSpec.hpp +3 -3
- package/nitrogen/generated/shared/c++/HybridDsaKeyPairSpec.cpp +26 -0
- package/nitrogen/generated/shared/c++/HybridDsaKeyPairSpec.hpp +68 -0
- package/nitrogen/generated/shared/c++/HybridECDHSpec.cpp +2 -1
- package/nitrogen/generated/shared/c++/HybridECDHSpec.hpp +3 -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++/HybridPrimeSpec.cpp +24 -0
- package/nitrogen/generated/shared/c++/HybridPrimeSpec.hpp +67 -0
- 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/argon2.ts +83 -0
- package/src/certificate.ts +41 -0
- package/src/cipher.ts +24 -0
- package/src/dhKeyPair.ts +156 -0
- package/src/diffie-hellman.ts +6 -0
- package/src/dsa.ts +129 -0
- package/src/ec.ts +23 -19
- package/src/ecdh.ts +59 -0
- package/src/ed.ts +1 -2
- package/src/hash.ts +11 -0
- package/src/index.ts +12 -0
- package/src/keys/classes.ts +26 -8
- package/src/keys/generateKeyPair.ts +14 -0
- package/src/prime.ts +134 -0
- package/src/specs/argon2.nitro.ts +29 -0
- package/src/specs/certificate.nitro.ts +8 -0
- package/src/specs/cipher.nitro.ts +14 -0
- package/src/specs/dhKeyPair.nitro.ts +14 -0
- package/src/specs/diffie-hellman.nitro.ts +1 -0
- package/src/specs/dsaKeyPair.nitro.ts +13 -0
- package/src/specs/ecKeyPair.nitro.ts +2 -0
- package/src/specs/ecdh.nitro.ts +1 -0
- package/src/specs/keyObjectHandle.nitro.ts +2 -0
- package/src/specs/prime.nitro.ts +18 -0
- package/src/subtle.ts +400 -42
- package/src/utils/types.ts +39 -5
- 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,
|
|
@@ -27,11 +28,12 @@ import {
|
|
|
27
28
|
} from './keys';
|
|
28
29
|
import type { CryptoKeyPair } from './utils/types';
|
|
29
30
|
import { bufferLikeToArrayBuffer } from './utils/conversion';
|
|
31
|
+
import { argon2Sync } from './argon2';
|
|
30
32
|
import { lazyDOMException } from './utils/errors';
|
|
31
33
|
import { normalizeHashName, HashContext } from './utils/hashnames';
|
|
32
34
|
import { validateMaxBufferLength } from './utils/validation';
|
|
33
35
|
import { asyncDigest } from './hash';
|
|
34
|
-
import { createSecretKey } from './keys';
|
|
36
|
+
import { createSecretKey, createPublicKey } from './keys';
|
|
35
37
|
import { NitroModules } from 'react-native-nitro-modules';
|
|
36
38
|
import type { KeyObjectHandle } from './specs/keyObjectHandle.nitro';
|
|
37
39
|
import type { RsaCipher } from './specs/rsaCipher.nitro';
|
|
@@ -55,12 +57,6 @@ import {
|
|
|
55
57
|
} from './ed';
|
|
56
58
|
import { mldsa_generateKeyPairWebCrypto, type MlDsaVariant } from './mldsa';
|
|
57
59
|
import { hkdfDeriveBits, type HkdfAlgorithm } from './hkdf';
|
|
58
|
-
// import { pbkdf2DeriveBits } from './pbkdf2';
|
|
59
|
-
// import { aesCipher, aesGenerateKey, aesImportKey, getAlgorithmName } from './aes';
|
|
60
|
-
// import { rsaCipher, rsaExportKey, rsaImportKey, rsaKeyGenerate } from './rsa';
|
|
61
|
-
// import { normalizeAlgorithm, type Operation } from './algorithms';
|
|
62
|
-
// import { hmacImportKey } from './mac';
|
|
63
|
-
|
|
64
60
|
// Temporary enums that need to be defined
|
|
65
61
|
|
|
66
62
|
enum KWebCryptoKeyFormat {
|
|
@@ -90,19 +86,34 @@ function normalizeAlgorithm(
|
|
|
90
86
|
}
|
|
91
87
|
|
|
92
88
|
function getAlgorithmName(name: string, length: number): string {
|
|
93
|
-
|
|
89
|
+
switch (name) {
|
|
90
|
+
case 'AES-CBC':
|
|
91
|
+
return `A${length}CBC`;
|
|
92
|
+
case 'AES-CTR':
|
|
93
|
+
return `A${length}CTR`;
|
|
94
|
+
case 'AES-GCM':
|
|
95
|
+
return `A${length}GCM`;
|
|
96
|
+
case 'AES-KW':
|
|
97
|
+
return `A${length}KW`;
|
|
98
|
+
case 'AES-OCB':
|
|
99
|
+
return `A${length}OCB`;
|
|
100
|
+
case 'ChaCha20-Poly1305':
|
|
101
|
+
return 'C20P';
|
|
102
|
+
default:
|
|
103
|
+
return `${name}${length}`;
|
|
104
|
+
}
|
|
94
105
|
}
|
|
95
106
|
|
|
96
107
|
// Placeholder implementations for missing functions
|
|
97
108
|
function ecExportKey(key: CryptoKey, format: KWebCryptoKeyFormat): ArrayBuffer {
|
|
98
109
|
const keyObject = key.keyObject;
|
|
99
110
|
|
|
100
|
-
if (format === KWebCryptoKeyFormat.
|
|
101
|
-
|
|
111
|
+
if (format === KWebCryptoKeyFormat.kWebCryptoKeyFormatRaw) {
|
|
112
|
+
return bufferLikeToArrayBuffer(keyObject.handle.exportKey());
|
|
113
|
+
} else if (format === KWebCryptoKeyFormat.kWebCryptoKeyFormatSPKI) {
|
|
102
114
|
const exported = keyObject.export({ format: 'der', type: 'spki' });
|
|
103
115
|
return bufferLikeToArrayBuffer(exported);
|
|
104
116
|
} else if (format === KWebCryptoKeyFormat.kWebCryptoKeyFormatPKCS8) {
|
|
105
|
-
// Export private key in PKCS8 format
|
|
106
117
|
const exported = keyObject.export({ format: 'der', type: 'pkcs8' });
|
|
107
118
|
return bufferLikeToArrayBuffer(exported);
|
|
108
119
|
} else {
|
|
@@ -198,6 +209,8 @@ async function aesCipher(
|
|
|
198
209
|
return aesCbcCipher(mode, key, data, algorithm as AesCbcParams);
|
|
199
210
|
case 'AES-GCM':
|
|
200
211
|
return aesGcmCipher(mode, key, data, algorithm as AesGcmParams);
|
|
212
|
+
case 'AES-OCB':
|
|
213
|
+
return aesOcbCipher(mode, key, data, algorithm as AesOcbParams);
|
|
201
214
|
default:
|
|
202
215
|
throw lazyDOMException(
|
|
203
216
|
`Unsupported AES algorithm: ${name}`,
|
|
@@ -294,45 +307,45 @@ async function aesCbcCipher(
|
|
|
294
307
|
return result.buffer;
|
|
295
308
|
}
|
|
296
309
|
|
|
297
|
-
|
|
310
|
+
interface AeadCipherConfig {
|
|
311
|
+
algorithmName: string;
|
|
312
|
+
validTagLengths: number[];
|
|
313
|
+
cipherSuffix: string;
|
|
314
|
+
iv: ArrayBuffer;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
async function aesAeadCipher(
|
|
298
318
|
mode: CipherOrWrapMode,
|
|
299
319
|
key: CryptoKey,
|
|
300
320
|
data: ArrayBuffer,
|
|
301
|
-
|
|
321
|
+
config: AeadCipherConfig,
|
|
322
|
+
additionalData?: BufferLike,
|
|
323
|
+
tagLength: number = 128,
|
|
302
324
|
): Promise<ArrayBuffer> {
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
// Validate tag length
|
|
306
|
-
const validTagLengths = [32, 64, 96, 104, 112, 120, 128];
|
|
307
|
-
if (!validTagLengths.includes(tagLength)) {
|
|
325
|
+
if (!config.validTagLengths.includes(tagLength)) {
|
|
308
326
|
throw lazyDOMException(
|
|
309
|
-
`${tagLength} is not a valid
|
|
327
|
+
`${tagLength} is not a valid ${config.algorithmName} tag length`,
|
|
310
328
|
'OperationError',
|
|
311
329
|
);
|
|
312
330
|
}
|
|
313
331
|
|
|
314
332
|
const tagByteLength = tagLength / 8;
|
|
315
|
-
|
|
316
|
-
// Get cipher type based on key length
|
|
317
333
|
const keyLength = (key.algorithm as { length: number }).length;
|
|
318
|
-
const cipherType = `aes-${keyLength}
|
|
334
|
+
const cipherType = `aes-${keyLength}-${config.cipherSuffix}`;
|
|
319
335
|
|
|
320
|
-
// Create cipher
|
|
321
336
|
const factory =
|
|
322
337
|
NitroModules.createHybridObject<CipherFactory>('CipherFactory');
|
|
323
338
|
const cipher = factory.createCipher({
|
|
324
339
|
isCipher: mode === CipherOrWrapMode.kWebCryptoCipherEncrypt,
|
|
325
340
|
cipherType,
|
|
326
341
|
cipherKey: bufferLikeToArrayBuffer(key.keyObject.export()),
|
|
327
|
-
iv:
|
|
342
|
+
iv: config.iv,
|
|
328
343
|
authTagLen: tagByteLength,
|
|
329
344
|
});
|
|
330
345
|
|
|
331
346
|
let processData: ArrayBuffer;
|
|
332
|
-
let authTag: ArrayBuffer | undefined;
|
|
333
347
|
|
|
334
348
|
if (mode === CipherOrWrapMode.kWebCryptoCipherDecrypt) {
|
|
335
|
-
// For decryption, extract auth tag from end of data
|
|
336
349
|
const dataView = new Uint8Array(data);
|
|
337
350
|
|
|
338
351
|
if (dataView.byteLength < tagByteLength) {
|
|
@@ -342,28 +355,22 @@ async function aesGcmCipher(
|
|
|
342
355
|
);
|
|
343
356
|
}
|
|
344
357
|
|
|
345
|
-
// Split data and tag
|
|
346
358
|
const ciphertextLength = dataView.byteLength - tagByteLength;
|
|
347
359
|
processData = dataView.slice(0, ciphertextLength).buffer;
|
|
348
|
-
authTag = dataView.slice(ciphertextLength).buffer;
|
|
349
|
-
|
|
350
|
-
// Set auth tag for verification
|
|
360
|
+
const authTag = dataView.slice(ciphertextLength).buffer;
|
|
351
361
|
cipher.setAuthTag(authTag);
|
|
352
362
|
} else {
|
|
353
363
|
processData = data;
|
|
354
364
|
}
|
|
355
365
|
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
cipher.setAAD(bufferLikeToArrayBuffer(algorithm.additionalData));
|
|
366
|
+
if (additionalData) {
|
|
367
|
+
cipher.setAAD(bufferLikeToArrayBuffer(additionalData));
|
|
359
368
|
}
|
|
360
369
|
|
|
361
|
-
// Process data
|
|
362
370
|
const updated = cipher.update(processData);
|
|
363
371
|
const final = cipher.final();
|
|
364
372
|
|
|
365
373
|
if (mode === CipherOrWrapMode.kWebCryptoCipherEncrypt) {
|
|
366
|
-
// For encryption, append auth tag to result
|
|
367
374
|
const tag = cipher.getAuthTag();
|
|
368
375
|
const result = new Uint8Array(
|
|
369
376
|
updated.byteLength + final.byteLength + tag.byteLength,
|
|
@@ -373,7 +380,6 @@ async function aesGcmCipher(
|
|
|
373
380
|
result.set(new Uint8Array(tag), updated.byteLength + final.byteLength);
|
|
374
381
|
return result.buffer;
|
|
375
382
|
} else {
|
|
376
|
-
// For decryption, just concatenate plaintext
|
|
377
383
|
const result = new Uint8Array(updated.byteLength + final.byteLength);
|
|
378
384
|
result.set(new Uint8Array(updated), 0);
|
|
379
385
|
result.set(new Uint8Array(final), updated.byteLength);
|
|
@@ -381,6 +387,56 @@ async function aesGcmCipher(
|
|
|
381
387
|
}
|
|
382
388
|
}
|
|
383
389
|
|
|
390
|
+
async function aesGcmCipher(
|
|
391
|
+
mode: CipherOrWrapMode,
|
|
392
|
+
key: CryptoKey,
|
|
393
|
+
data: ArrayBuffer,
|
|
394
|
+
algorithm: AesGcmParams,
|
|
395
|
+
): Promise<ArrayBuffer> {
|
|
396
|
+
return aesAeadCipher(
|
|
397
|
+
mode,
|
|
398
|
+
key,
|
|
399
|
+
data,
|
|
400
|
+
{
|
|
401
|
+
algorithmName: 'AES-GCM',
|
|
402
|
+
validTagLengths: [32, 64, 96, 104, 112, 120, 128],
|
|
403
|
+
cipherSuffix: 'gcm',
|
|
404
|
+
iv: bufferLikeToArrayBuffer(algorithm.iv),
|
|
405
|
+
},
|
|
406
|
+
algorithm.additionalData,
|
|
407
|
+
algorithm.tagLength,
|
|
408
|
+
);
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
async function aesOcbCipher(
|
|
412
|
+
mode: CipherOrWrapMode,
|
|
413
|
+
key: CryptoKey,
|
|
414
|
+
data: ArrayBuffer,
|
|
415
|
+
algorithm: AesOcbParams,
|
|
416
|
+
): Promise<ArrayBuffer> {
|
|
417
|
+
const ivBuffer = bufferLikeToArrayBuffer(algorithm.iv);
|
|
418
|
+
if (ivBuffer.byteLength < 1 || ivBuffer.byteLength > 15) {
|
|
419
|
+
throw lazyDOMException(
|
|
420
|
+
'AES-OCB algorithm.iv must be between 1 and 15 bytes',
|
|
421
|
+
'OperationError',
|
|
422
|
+
);
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
return aesAeadCipher(
|
|
426
|
+
mode,
|
|
427
|
+
key,
|
|
428
|
+
data,
|
|
429
|
+
{
|
|
430
|
+
algorithmName: 'AES-OCB',
|
|
431
|
+
validTagLengths: [64, 96, 128],
|
|
432
|
+
cipherSuffix: 'ocb',
|
|
433
|
+
iv: ivBuffer,
|
|
434
|
+
},
|
|
435
|
+
algorithm.additionalData,
|
|
436
|
+
algorithm.tagLength,
|
|
437
|
+
);
|
|
438
|
+
}
|
|
439
|
+
|
|
384
440
|
async function aesKwCipher(
|
|
385
441
|
mode: CipherOrWrapMode,
|
|
386
442
|
key: CryptoKey,
|
|
@@ -891,7 +947,7 @@ async function aesImportKey(
|
|
|
891
947
|
|
|
892
948
|
function edImportKey(
|
|
893
949
|
format: ImportFormat,
|
|
894
|
-
data: BufferLike,
|
|
950
|
+
data: BufferLike | JWK,
|
|
895
951
|
algorithm: SubtleAlgorithm,
|
|
896
952
|
extractable: boolean,
|
|
897
953
|
keyUsages: KeyUsage[],
|
|
@@ -915,7 +971,7 @@ function edImportKey(
|
|
|
915
971
|
|
|
916
972
|
if (format === 'spki') {
|
|
917
973
|
// Import public key
|
|
918
|
-
const keyData = bufferLikeToArrayBuffer(data);
|
|
974
|
+
const keyData = bufferLikeToArrayBuffer(data as BufferLike);
|
|
919
975
|
keyObject = KeyObject.createKeyObject(
|
|
920
976
|
'public',
|
|
921
977
|
keyData,
|
|
@@ -924,7 +980,7 @@ function edImportKey(
|
|
|
924
980
|
);
|
|
925
981
|
} else if (format === 'pkcs8') {
|
|
926
982
|
// Import private key
|
|
927
|
-
const keyData = bufferLikeToArrayBuffer(data);
|
|
983
|
+
const keyData = bufferLikeToArrayBuffer(data as BufferLike);
|
|
928
984
|
keyObject = KeyObject.createKeyObject(
|
|
929
985
|
'private',
|
|
930
986
|
keyData,
|
|
@@ -933,13 +989,26 @@ function edImportKey(
|
|
|
933
989
|
);
|
|
934
990
|
} else if (format === 'raw') {
|
|
935
991
|
// Raw format - public key only for Ed keys
|
|
936
|
-
const keyData = bufferLikeToArrayBuffer(data);
|
|
992
|
+
const keyData = bufferLikeToArrayBuffer(data as BufferLike);
|
|
937
993
|
const handle =
|
|
938
994
|
NitroModules.createHybridObject<KeyObjectHandle>('KeyObjectHandle');
|
|
939
995
|
// For raw Ed keys, we need to create them differently
|
|
940
996
|
// Raw public keys are just the key bytes
|
|
941
997
|
handle.init(1, keyData); // 1 = public key type
|
|
942
998
|
keyObject = new PublicKeyObject(handle);
|
|
999
|
+
} else if (format === 'jwk') {
|
|
1000
|
+
const jwkData = data as JWK;
|
|
1001
|
+
const handle =
|
|
1002
|
+
NitroModules.createHybridObject<KeyObjectHandle>('KeyObjectHandle');
|
|
1003
|
+
const keyType = handle.initJwk(jwkData);
|
|
1004
|
+
if (keyType === undefined) {
|
|
1005
|
+
throw lazyDOMException('Invalid JWK data', 'DataError');
|
|
1006
|
+
}
|
|
1007
|
+
if (keyType === KeyType.PRIVATE) {
|
|
1008
|
+
keyObject = new PrivateKeyObject(handle);
|
|
1009
|
+
} else {
|
|
1010
|
+
keyObject = new PublicKeyObject(handle);
|
|
1011
|
+
}
|
|
943
1012
|
} else {
|
|
944
1013
|
throw lazyDOMException(
|
|
945
1014
|
`Unsupported format for ${name} import: ${format}`,
|
|
@@ -1133,6 +1202,8 @@ const exportKeyRaw = (key: CryptoKey): ArrayBuffer | unknown => {
|
|
|
1133
1202
|
// Fall through
|
|
1134
1203
|
case 'AES-KW':
|
|
1135
1204
|
// Fall through
|
|
1205
|
+
case 'AES-OCB':
|
|
1206
|
+
// Fall through
|
|
1136
1207
|
case 'ChaCha20-Poly1305':
|
|
1137
1208
|
// Fall through
|
|
1138
1209
|
case 'HMAC': {
|
|
@@ -1177,6 +1248,14 @@ const exportKeyJWK = (key: CryptoKey): ArrayBuffer | unknown => {
|
|
|
1177
1248
|
case 'ECDH':
|
|
1178
1249
|
jwk.crv ||= key.algorithm.namedCurve;
|
|
1179
1250
|
return jwk;
|
|
1251
|
+
case 'Ed25519':
|
|
1252
|
+
// Fall through
|
|
1253
|
+
case 'Ed448':
|
|
1254
|
+
// Fall through
|
|
1255
|
+
case 'X25519':
|
|
1256
|
+
// Fall through
|
|
1257
|
+
case 'X448':
|
|
1258
|
+
return jwk;
|
|
1180
1259
|
case 'AES-CTR':
|
|
1181
1260
|
// Fall through
|
|
1182
1261
|
case 'AES-CBC':
|
|
@@ -1185,6 +1264,8 @@ const exportKeyJWK = (key: CryptoKey): ArrayBuffer | unknown => {
|
|
|
1185
1264
|
// Fall through
|
|
1186
1265
|
case 'AES-KW':
|
|
1187
1266
|
// Fall through
|
|
1267
|
+
case 'AES-OCB':
|
|
1268
|
+
// Fall through
|
|
1188
1269
|
case 'ChaCha20-Poly1305':
|
|
1189
1270
|
if (key.algorithm.length === undefined) {
|
|
1190
1271
|
throw lazyDOMException(
|
|
@@ -1278,6 +1359,45 @@ const checkCryptoKeyPairUsages = (pair: CryptoKeyPair) => {
|
|
|
1278
1359
|
);
|
|
1279
1360
|
};
|
|
1280
1361
|
|
|
1362
|
+
function argon2DeriveBits(
|
|
1363
|
+
algorithm: SubtleAlgorithm,
|
|
1364
|
+
baseKey: CryptoKey,
|
|
1365
|
+
length: number,
|
|
1366
|
+
): ArrayBuffer {
|
|
1367
|
+
if (length === 0 || length % 8 !== 0) {
|
|
1368
|
+
throw lazyDOMException(
|
|
1369
|
+
'Invalid Argon2 derived key length',
|
|
1370
|
+
'OperationError',
|
|
1371
|
+
);
|
|
1372
|
+
}
|
|
1373
|
+
if (length < 32) {
|
|
1374
|
+
throw lazyDOMException(
|
|
1375
|
+
'Argon2 derived key length must be at least 32 bits',
|
|
1376
|
+
'OperationError',
|
|
1377
|
+
);
|
|
1378
|
+
}
|
|
1379
|
+
|
|
1380
|
+
const { nonce, parallelism, memory, passes, secretValue, associatedData } =
|
|
1381
|
+
algorithm;
|
|
1382
|
+
const tagLength = length / 8;
|
|
1383
|
+
const message = baseKey.keyObject.export();
|
|
1384
|
+
const algName = algorithm.name.toLowerCase();
|
|
1385
|
+
|
|
1386
|
+
const result = argon2Sync(algName, {
|
|
1387
|
+
message,
|
|
1388
|
+
nonce: nonce ?? new Uint8Array(0),
|
|
1389
|
+
parallelism: parallelism ?? 1,
|
|
1390
|
+
tagLength,
|
|
1391
|
+
memory: memory ?? 65536,
|
|
1392
|
+
passes: passes ?? 3,
|
|
1393
|
+
secret: secretValue,
|
|
1394
|
+
associatedData,
|
|
1395
|
+
version: algorithm.version,
|
|
1396
|
+
});
|
|
1397
|
+
|
|
1398
|
+
return bufferLikeToArrayBuffer(result);
|
|
1399
|
+
}
|
|
1400
|
+
|
|
1281
1401
|
// Type guard to check if result is CryptoKeyPair
|
|
1282
1402
|
export function isCryptoKeyPair(
|
|
1283
1403
|
result: CryptoKey | CryptoKeyPair,
|
|
@@ -1503,6 +1623,8 @@ const cipherOrWrap = async (
|
|
|
1503
1623
|
case 'AES-CBC':
|
|
1504
1624
|
// Fall through
|
|
1505
1625
|
case 'AES-GCM':
|
|
1626
|
+
// Fall through
|
|
1627
|
+
case 'AES-OCB':
|
|
1506
1628
|
return aesCipher(mode, key, data, algorithm);
|
|
1507
1629
|
case 'AES-KW':
|
|
1508
1630
|
return aesKwCipher(mode, key, data);
|
|
@@ -1516,7 +1638,205 @@ const cipherOrWrap = async (
|
|
|
1516
1638
|
}
|
|
1517
1639
|
};
|
|
1518
1640
|
|
|
1641
|
+
const SUPPORTED_ALGORITHMS: Record<string, Set<string>> = {
|
|
1642
|
+
encrypt: new Set([
|
|
1643
|
+
'RSA-OAEP',
|
|
1644
|
+
'AES-CTR',
|
|
1645
|
+
'AES-CBC',
|
|
1646
|
+
'AES-GCM',
|
|
1647
|
+
'AES-OCB',
|
|
1648
|
+
'ChaCha20-Poly1305',
|
|
1649
|
+
]),
|
|
1650
|
+
decrypt: new Set([
|
|
1651
|
+
'RSA-OAEP',
|
|
1652
|
+
'AES-CTR',
|
|
1653
|
+
'AES-CBC',
|
|
1654
|
+
'AES-GCM',
|
|
1655
|
+
'AES-OCB',
|
|
1656
|
+
'ChaCha20-Poly1305',
|
|
1657
|
+
]),
|
|
1658
|
+
sign: new Set([
|
|
1659
|
+
'RSASSA-PKCS1-v1_5',
|
|
1660
|
+
'RSA-PSS',
|
|
1661
|
+
'ECDSA',
|
|
1662
|
+
'HMAC',
|
|
1663
|
+
'Ed25519',
|
|
1664
|
+
'Ed448',
|
|
1665
|
+
'ML-DSA-44',
|
|
1666
|
+
'ML-DSA-65',
|
|
1667
|
+
'ML-DSA-87',
|
|
1668
|
+
]),
|
|
1669
|
+
verify: new Set([
|
|
1670
|
+
'RSASSA-PKCS1-v1_5',
|
|
1671
|
+
'RSA-PSS',
|
|
1672
|
+
'ECDSA',
|
|
1673
|
+
'HMAC',
|
|
1674
|
+
'Ed25519',
|
|
1675
|
+
'Ed448',
|
|
1676
|
+
'ML-DSA-44',
|
|
1677
|
+
'ML-DSA-65',
|
|
1678
|
+
'ML-DSA-87',
|
|
1679
|
+
]),
|
|
1680
|
+
digest: new Set(['SHA-1', 'SHA-256', 'SHA-384', 'SHA-512']),
|
|
1681
|
+
generateKey: new Set([
|
|
1682
|
+
'RSASSA-PKCS1-v1_5',
|
|
1683
|
+
'RSA-PSS',
|
|
1684
|
+
'RSA-OAEP',
|
|
1685
|
+
'ECDSA',
|
|
1686
|
+
'ECDH',
|
|
1687
|
+
'Ed25519',
|
|
1688
|
+
'Ed448',
|
|
1689
|
+
'X25519',
|
|
1690
|
+
'X448',
|
|
1691
|
+
'AES-CTR',
|
|
1692
|
+
'AES-CBC',
|
|
1693
|
+
'AES-GCM',
|
|
1694
|
+
'AES-KW',
|
|
1695
|
+
'AES-OCB',
|
|
1696
|
+
'ChaCha20-Poly1305',
|
|
1697
|
+
'HMAC',
|
|
1698
|
+
'ML-DSA-44',
|
|
1699
|
+
'ML-DSA-65',
|
|
1700
|
+
'ML-DSA-87',
|
|
1701
|
+
]),
|
|
1702
|
+
importKey: new Set([
|
|
1703
|
+
'RSASSA-PKCS1-v1_5',
|
|
1704
|
+
'RSA-PSS',
|
|
1705
|
+
'RSA-OAEP',
|
|
1706
|
+
'ECDSA',
|
|
1707
|
+
'ECDH',
|
|
1708
|
+
'Ed25519',
|
|
1709
|
+
'Ed448',
|
|
1710
|
+
'X25519',
|
|
1711
|
+
'X448',
|
|
1712
|
+
'AES-CTR',
|
|
1713
|
+
'AES-CBC',
|
|
1714
|
+
'AES-GCM',
|
|
1715
|
+
'AES-KW',
|
|
1716
|
+
'AES-OCB',
|
|
1717
|
+
'ChaCha20-Poly1305',
|
|
1718
|
+
'HMAC',
|
|
1719
|
+
'HKDF',
|
|
1720
|
+
'PBKDF2',
|
|
1721
|
+
'Argon2d',
|
|
1722
|
+
'Argon2i',
|
|
1723
|
+
'Argon2id',
|
|
1724
|
+
'ML-DSA-44',
|
|
1725
|
+
'ML-DSA-65',
|
|
1726
|
+
'ML-DSA-87',
|
|
1727
|
+
]),
|
|
1728
|
+
exportKey: new Set([
|
|
1729
|
+
'RSASSA-PKCS1-v1_5',
|
|
1730
|
+
'RSA-PSS',
|
|
1731
|
+
'RSA-OAEP',
|
|
1732
|
+
'ECDSA',
|
|
1733
|
+
'ECDH',
|
|
1734
|
+
'Ed25519',
|
|
1735
|
+
'Ed448',
|
|
1736
|
+
'X25519',
|
|
1737
|
+
'X448',
|
|
1738
|
+
'AES-CTR',
|
|
1739
|
+
'AES-CBC',
|
|
1740
|
+
'AES-GCM',
|
|
1741
|
+
'AES-KW',
|
|
1742
|
+
'AES-OCB',
|
|
1743
|
+
'ChaCha20-Poly1305',
|
|
1744
|
+
'HMAC',
|
|
1745
|
+
'ML-DSA-44',
|
|
1746
|
+
'ML-DSA-65',
|
|
1747
|
+
'ML-DSA-87',
|
|
1748
|
+
]),
|
|
1749
|
+
deriveBits: new Set([
|
|
1750
|
+
'PBKDF2',
|
|
1751
|
+
'HKDF',
|
|
1752
|
+
'ECDH',
|
|
1753
|
+
'X25519',
|
|
1754
|
+
'X448',
|
|
1755
|
+
'Argon2d',
|
|
1756
|
+
'Argon2i',
|
|
1757
|
+
'Argon2id',
|
|
1758
|
+
]),
|
|
1759
|
+
wrapKey: new Set([
|
|
1760
|
+
'AES-CTR',
|
|
1761
|
+
'AES-CBC',
|
|
1762
|
+
'AES-GCM',
|
|
1763
|
+
'AES-KW',
|
|
1764
|
+
'AES-OCB',
|
|
1765
|
+
'ChaCha20-Poly1305',
|
|
1766
|
+
'RSA-OAEP',
|
|
1767
|
+
]),
|
|
1768
|
+
unwrapKey: new Set([
|
|
1769
|
+
'AES-CTR',
|
|
1770
|
+
'AES-CBC',
|
|
1771
|
+
'AES-GCM',
|
|
1772
|
+
'AES-KW',
|
|
1773
|
+
'AES-OCB',
|
|
1774
|
+
'ChaCha20-Poly1305',
|
|
1775
|
+
'RSA-OAEP',
|
|
1776
|
+
]),
|
|
1777
|
+
};
|
|
1778
|
+
|
|
1779
|
+
const ASYMMETRIC_ALGORITHMS = new Set([
|
|
1780
|
+
'RSASSA-PKCS1-v1_5',
|
|
1781
|
+
'RSA-PSS',
|
|
1782
|
+
'RSA-OAEP',
|
|
1783
|
+
'ECDSA',
|
|
1784
|
+
'ECDH',
|
|
1785
|
+
'Ed25519',
|
|
1786
|
+
'Ed448',
|
|
1787
|
+
'X25519',
|
|
1788
|
+
'X448',
|
|
1789
|
+
'ML-DSA-44',
|
|
1790
|
+
'ML-DSA-65',
|
|
1791
|
+
'ML-DSA-87',
|
|
1792
|
+
]);
|
|
1793
|
+
|
|
1519
1794
|
export class Subtle {
|
|
1795
|
+
static supports(
|
|
1796
|
+
operation: string,
|
|
1797
|
+
algorithm: SubtleAlgorithm | AnyAlgorithm,
|
|
1798
|
+
_lengthOrAdditionalAlgorithm?: unknown,
|
|
1799
|
+
): boolean {
|
|
1800
|
+
let normalizedAlgorithm: SubtleAlgorithm;
|
|
1801
|
+
try {
|
|
1802
|
+
normalizedAlgorithm = normalizeAlgorithm(
|
|
1803
|
+
algorithm,
|
|
1804
|
+
(operation === 'getPublicKey' ? 'exportKey' : operation) as Operation,
|
|
1805
|
+
);
|
|
1806
|
+
} catch {
|
|
1807
|
+
return false;
|
|
1808
|
+
}
|
|
1809
|
+
|
|
1810
|
+
const name = normalizedAlgorithm.name;
|
|
1811
|
+
|
|
1812
|
+
if (operation === 'getPublicKey') {
|
|
1813
|
+
return ASYMMETRIC_ALGORITHMS.has(name);
|
|
1814
|
+
}
|
|
1815
|
+
|
|
1816
|
+
if (operation === 'deriveKey') {
|
|
1817
|
+
// deriveKey decomposes to deriveBits + importKey of additional algorithm
|
|
1818
|
+
if (!SUPPORTED_ALGORITHMS.deriveBits?.has(name)) return false;
|
|
1819
|
+
if (_lengthOrAdditionalAlgorithm != null) {
|
|
1820
|
+
try {
|
|
1821
|
+
const additionalAlg = normalizeAlgorithm(
|
|
1822
|
+
_lengthOrAdditionalAlgorithm as SubtleAlgorithm | AnyAlgorithm,
|
|
1823
|
+
'importKey',
|
|
1824
|
+
);
|
|
1825
|
+
return (
|
|
1826
|
+
SUPPORTED_ALGORITHMS.importKey?.has(additionalAlg.name) ?? false
|
|
1827
|
+
);
|
|
1828
|
+
} catch {
|
|
1829
|
+
return false;
|
|
1830
|
+
}
|
|
1831
|
+
}
|
|
1832
|
+
return true;
|
|
1833
|
+
}
|
|
1834
|
+
|
|
1835
|
+
const supported = SUPPORTED_ALGORITHMS[operation];
|
|
1836
|
+
if (!supported) return false;
|
|
1837
|
+
return supported.has(name);
|
|
1838
|
+
}
|
|
1839
|
+
|
|
1520
1840
|
async decrypt(
|
|
1521
1841
|
algorithm: EncryptDecryptParams,
|
|
1522
1842
|
key: CryptoKey,
|
|
@@ -1572,6 +1892,10 @@ export class Subtle {
|
|
|
1572
1892
|
baseKey,
|
|
1573
1893
|
length,
|
|
1574
1894
|
);
|
|
1895
|
+
case 'Argon2d':
|
|
1896
|
+
case 'Argon2i':
|
|
1897
|
+
case 'Argon2id':
|
|
1898
|
+
return argon2DeriveBits(algorithm, baseKey, length);
|
|
1575
1899
|
}
|
|
1576
1900
|
throw new Error(
|
|
1577
1901
|
`'subtle.deriveBits()' for ${algorithm.name} is not implemented.`,
|
|
@@ -1613,6 +1937,9 @@ export class Subtle {
|
|
|
1613
1937
|
case 'X448':
|
|
1614
1938
|
derivedBits = await xDeriveBits(algorithm, baseKey, length);
|
|
1615
1939
|
break;
|
|
1940
|
+
case 'ECDH':
|
|
1941
|
+
derivedBits = await ecDeriveBits(algorithm, baseKey, length);
|
|
1942
|
+
break;
|
|
1616
1943
|
case 'HKDF':
|
|
1617
1944
|
derivedBits = hkdfDeriveBits(
|
|
1618
1945
|
algorithm as unknown as HkdfAlgorithm,
|
|
@@ -1620,6 +1947,11 @@ export class Subtle {
|
|
|
1620
1947
|
length,
|
|
1621
1948
|
);
|
|
1622
1949
|
break;
|
|
1950
|
+
case 'Argon2d':
|
|
1951
|
+
case 'Argon2i':
|
|
1952
|
+
case 'Argon2id':
|
|
1953
|
+
derivedBits = argon2DeriveBits(algorithm, baseKey, length);
|
|
1954
|
+
break;
|
|
1623
1955
|
default:
|
|
1624
1956
|
throw new Error(
|
|
1625
1957
|
`'subtle.deriveKey()' for ${algorithm.name} is not implemented.`,
|
|
@@ -1657,6 +1989,8 @@ export class Subtle {
|
|
|
1657
1989
|
): Promise<ArrayBuffer | JWK> {
|
|
1658
1990
|
if (!key.extractable) throw new Error('key is not extractable');
|
|
1659
1991
|
|
|
1992
|
+
if (format === 'raw-secret' || format === 'raw-public') format = 'raw';
|
|
1993
|
+
|
|
1660
1994
|
switch (format) {
|
|
1661
1995
|
case 'spki':
|
|
1662
1996
|
return (await exportKeySpki(key)) as ArrayBuffer;
|
|
@@ -1811,6 +2145,8 @@ export class Subtle {
|
|
|
1811
2145
|
case 'AES-GCM':
|
|
1812
2146
|
// Fall through
|
|
1813
2147
|
case 'AES-KW':
|
|
2148
|
+
// Fall through
|
|
2149
|
+
case 'AES-OCB':
|
|
1814
2150
|
result = await aesGenerateKey(
|
|
1815
2151
|
algorithm as AesKeyGenParams,
|
|
1816
2152
|
extractable,
|
|
@@ -1882,6 +2218,21 @@ export class Subtle {
|
|
|
1882
2218
|
return result;
|
|
1883
2219
|
}
|
|
1884
2220
|
|
|
2221
|
+
async getPublicKey(
|
|
2222
|
+
key: CryptoKey,
|
|
2223
|
+
keyUsages: KeyUsage[],
|
|
2224
|
+
): Promise<CryptoKey> {
|
|
2225
|
+
if (key.type === 'secret') {
|
|
2226
|
+
throw lazyDOMException('key must be a private key', 'NotSupportedError');
|
|
2227
|
+
}
|
|
2228
|
+
if (key.type !== 'private') {
|
|
2229
|
+
throw lazyDOMException('key must be a private key', 'InvalidAccessError');
|
|
2230
|
+
}
|
|
2231
|
+
|
|
2232
|
+
const publicKeyObject = createPublicKey(key.keyObject);
|
|
2233
|
+
return publicKeyObject.toCryptoKey(key.algorithm, true, keyUsages);
|
|
2234
|
+
}
|
|
2235
|
+
|
|
1885
2236
|
async importKey(
|
|
1886
2237
|
format: ImportFormat,
|
|
1887
2238
|
data: BufferLike | BinaryLike | JWK,
|
|
@@ -1889,6 +2240,7 @@ export class Subtle {
|
|
|
1889
2240
|
extractable: boolean,
|
|
1890
2241
|
keyUsages: KeyUsage[],
|
|
1891
2242
|
): Promise<CryptoKey> {
|
|
2243
|
+
if (format === 'raw-secret' || format === 'raw-public') format = 'raw';
|
|
1892
2244
|
const normalizedAlgorithm = normalizeAlgorithm(algorithm, 'importKey');
|
|
1893
2245
|
let result: CryptoKey;
|
|
1894
2246
|
switch (normalizedAlgorithm.name) {
|
|
@@ -1933,6 +2285,8 @@ export class Subtle {
|
|
|
1933
2285
|
// Fall through
|
|
1934
2286
|
case 'AES-KW':
|
|
1935
2287
|
// Fall through
|
|
2288
|
+
case 'AES-OCB':
|
|
2289
|
+
// Fall through
|
|
1936
2290
|
case 'ChaCha20-Poly1305':
|
|
1937
2291
|
result = await aesImportKey(
|
|
1938
2292
|
normalizedAlgorithm,
|
|
@@ -1943,6 +2297,9 @@ export class Subtle {
|
|
|
1943
2297
|
);
|
|
1944
2298
|
break;
|
|
1945
2299
|
case 'PBKDF2':
|
|
2300
|
+
case 'Argon2d':
|
|
2301
|
+
case 'Argon2i':
|
|
2302
|
+
case 'Argon2id':
|
|
1946
2303
|
result = await importGenericSecretKey(
|
|
1947
2304
|
normalizedAlgorithm,
|
|
1948
2305
|
format,
|
|
@@ -1969,7 +2326,7 @@ export class Subtle {
|
|
|
1969
2326
|
case 'Ed448':
|
|
1970
2327
|
result = edImportKey(
|
|
1971
2328
|
format,
|
|
1972
|
-
data as BufferLike,
|
|
2329
|
+
data as BufferLike | JWK,
|
|
1973
2330
|
normalizedAlgorithm,
|
|
1974
2331
|
extractable,
|
|
1975
2332
|
keyUsages,
|
|
@@ -2121,6 +2478,7 @@ function getKeyLength(algorithm: SubtleAlgorithm): number {
|
|
|
2121
2478
|
case 'AES-CBC':
|
|
2122
2479
|
case 'AES-GCM':
|
|
2123
2480
|
case 'AES-KW':
|
|
2481
|
+
case 'AES-OCB':
|
|
2124
2482
|
case 'ChaCha20-Poly1305':
|
|
2125
2483
|
return (algorithm as AesKeyGenParams).length || 256;
|
|
2126
2484
|
|