react-native-quick-crypto 1.0.0-beta.8 → 1.0.0
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 +145 -6
- package/README.md +14 -27
- package/android/CMakeLists.txt +62 -7
- package/android/build.gradle +12 -2
- package/android/src/main/java/com/margelo/nitro/quickcrypto/QuickCryptoPackage.java +0 -2
- package/app.plugin.js +3 -0
- package/cpp/blake3/HybridBlake3.cpp +118 -0
- package/cpp/blake3/HybridBlake3.hpp +35 -0
- package/cpp/cipher/CCMCipher.cpp +199 -0
- package/cpp/cipher/CCMCipher.hpp +26 -0
- package/cpp/cipher/ChaCha20Cipher.cpp +97 -0
- package/cpp/cipher/ChaCha20Cipher.hpp +25 -0
- package/cpp/cipher/ChaCha20Poly1305Cipher.cpp +170 -0
- package/cpp/cipher/ChaCha20Poly1305Cipher.hpp +30 -0
- package/cpp/cipher/GCMCipher.cpp +68 -0
- package/cpp/cipher/GCMCipher.hpp +14 -0
- package/cpp/cipher/HybridCipher.cpp +322 -0
- package/cpp/cipher/HybridCipher.hpp +68 -0
- package/cpp/cipher/HybridCipherFactory.hpp +105 -0
- package/cpp/cipher/HybridRsaCipher.cpp +348 -0
- package/cpp/cipher/HybridRsaCipher.hpp +29 -0
- package/cpp/cipher/OCBCipher.cpp +55 -0
- package/cpp/cipher/OCBCipher.hpp +19 -0
- package/cpp/cipher/XSalsa20Cipher.cpp +61 -0
- package/cpp/cipher/XSalsa20Cipher.hpp +33 -0
- package/cpp/ec/HybridEcKeyPair.cpp +428 -0
- package/cpp/ec/HybridEcKeyPair.hpp +48 -0
- package/cpp/ed25519/HybridEdKeyPair.cpp +228 -98
- package/cpp/ed25519/HybridEdKeyPair.hpp +42 -56
- package/cpp/hash/HybridHash.cpp +185 -0
- package/cpp/hash/HybridHash.hpp +43 -0
- package/cpp/hmac/HybridHmac.cpp +95 -0
- package/cpp/hmac/HybridHmac.hpp +31 -0
- package/cpp/keys/HybridKeyObjectHandle.cpp +749 -0
- package/cpp/keys/HybridKeyObjectHandle.hpp +51 -0
- package/cpp/keys/KeyObjectData.cpp +268 -0
- package/cpp/keys/KeyObjectData.hpp +71 -0
- package/cpp/keys/node.h +5 -0
- package/cpp/pbkdf2/HybridPbkdf2.cpp +34 -55
- package/cpp/pbkdf2/HybridPbkdf2.hpp +5 -16
- package/cpp/random/HybridRandom.cpp +6 -17
- package/cpp/random/HybridRandom.hpp +5 -6
- package/cpp/rsa/HybridRsaKeyPair.cpp +154 -0
- package/cpp/rsa/HybridRsaKeyPair.hpp +43 -0
- package/cpp/sign/HybridSignHandle.cpp +191 -0
- package/cpp/sign/HybridSignHandle.hpp +36 -0
- package/cpp/sign/HybridVerifyHandle.cpp +158 -0
- package/cpp/sign/HybridVerifyHandle.hpp +36 -0
- package/cpp/sign/SignUtils.hpp +108 -0
- package/cpp/utils/Macros.hpp +68 -0
- package/cpp/utils/Utils.hpp +43 -2
- package/cpp/utils/base64.h +309 -0
- package/deps/blake3/.cargo/config.toml +2 -0
- package/deps/blake3/.git-blame-ignore-revs +2 -0
- package/deps/blake3/.github/workflows/build_b3sum.py +38 -0
- package/deps/blake3/.github/workflows/ci.yml +491 -0
- package/deps/blake3/.github/workflows/tag.yml +43 -0
- package/deps/blake3/.github/workflows/upload_github_release_asset.py +73 -0
- package/deps/blake3/CONTRIBUTING.md +31 -0
- package/deps/blake3/Cargo.toml +135 -0
- package/deps/blake3/LICENSE_A2 +202 -0
- package/deps/blake3/LICENSE_A2LLVM +219 -0
- package/deps/blake3/LICENSE_CC0 +121 -0
- package/deps/blake3/README.md +229 -0
- package/deps/blake3/b3sum/Cargo.lock +513 -0
- package/deps/blake3/b3sum/Cargo.toml +26 -0
- package/deps/blake3/b3sum/README.md +72 -0
- package/deps/blake3/b3sum/src/main.rs +564 -0
- package/deps/blake3/b3sum/src/unit_tests.rs +235 -0
- package/deps/blake3/b3sum/tests/cli_tests.rs +680 -0
- package/deps/blake3/b3sum/what_does_check_do.md +176 -0
- package/deps/blake3/benches/bench.rs +623 -0
- package/deps/blake3/build.rs +389 -0
- package/deps/blake3/c/CMakeLists.txt +383 -0
- package/deps/blake3/c/CMakePresets.json +73 -0
- package/deps/blake3/c/Makefile.testing +82 -0
- package/deps/blake3/c/README.md +403 -0
- package/deps/blake3/c/blake3-config.cmake.in +14 -0
- package/deps/blake3/c/blake3.c +650 -0
- package/deps/blake3/c/blake3.h +86 -0
- package/deps/blake3/c/blake3_avx2.c +326 -0
- package/deps/blake3/c/blake3_avx2_x86-64_unix.S +1815 -0
- package/deps/blake3/c/blake3_avx2_x86-64_windows_gnu.S +1817 -0
- package/deps/blake3/c/blake3_avx2_x86-64_windows_msvc.asm +1828 -0
- package/deps/blake3/c/blake3_avx512.c +1388 -0
- package/deps/blake3/c/blake3_avx512_x86-64_unix.S +4824 -0
- package/deps/blake3/c/blake3_avx512_x86-64_windows_gnu.S +2615 -0
- package/deps/blake3/c/blake3_avx512_x86-64_windows_msvc.asm +2634 -0
- package/deps/blake3/c/blake3_c_rust_bindings/Cargo.toml +32 -0
- package/deps/blake3/c/blake3_c_rust_bindings/README.md +4 -0
- package/deps/blake3/c/blake3_c_rust_bindings/benches/bench.rs +477 -0
- package/deps/blake3/c/blake3_c_rust_bindings/build.rs +253 -0
- package/deps/blake3/c/blake3_c_rust_bindings/cross_test.sh +31 -0
- package/deps/blake3/c/blake3_c_rust_bindings/src/lib.rs +333 -0
- package/deps/blake3/c/blake3_c_rust_bindings/src/test.rs +696 -0
- package/deps/blake3/c/blake3_dispatch.c +332 -0
- package/deps/blake3/c/blake3_impl.h +333 -0
- package/deps/blake3/c/blake3_neon.c +366 -0
- package/deps/blake3/c/blake3_portable.c +160 -0
- package/deps/blake3/c/blake3_sse2.c +566 -0
- package/deps/blake3/c/blake3_sse2_x86-64_unix.S +2291 -0
- package/deps/blake3/c/blake3_sse2_x86-64_windows_gnu.S +2332 -0
- package/deps/blake3/c/blake3_sse2_x86-64_windows_msvc.asm +2350 -0
- package/deps/blake3/c/blake3_sse41.c +560 -0
- package/deps/blake3/c/blake3_sse41_x86-64_unix.S +2028 -0
- package/deps/blake3/c/blake3_sse41_x86-64_windows_gnu.S +2069 -0
- package/deps/blake3/c/blake3_sse41_x86-64_windows_msvc.asm +2089 -0
- package/deps/blake3/c/blake3_tbb.cpp +37 -0
- package/deps/blake3/c/dependencies/CMakeLists.txt +3 -0
- package/deps/blake3/c/dependencies/tbb/CMakeLists.txt +28 -0
- package/deps/blake3/c/example.c +36 -0
- package/deps/blake3/c/example_tbb.c +57 -0
- package/deps/blake3/c/libblake3.pc.in +12 -0
- package/deps/blake3/c/main.c +166 -0
- package/deps/blake3/c/test.py +97 -0
- package/deps/blake3/media/B3.svg +70 -0
- package/deps/blake3/media/BLAKE3.svg +85 -0
- package/deps/blake3/media/speed.svg +1474 -0
- package/deps/blake3/reference_impl/Cargo.toml +8 -0
- package/deps/blake3/reference_impl/README.md +14 -0
- package/deps/blake3/reference_impl/reference_impl.rs +374 -0
- package/deps/blake3/src/ffi_avx2.rs +65 -0
- package/deps/blake3/src/ffi_avx512.rs +169 -0
- package/deps/blake3/src/ffi_neon.rs +82 -0
- package/deps/blake3/src/ffi_sse2.rs +126 -0
- package/deps/blake3/src/ffi_sse41.rs +126 -0
- package/deps/blake3/src/guts.rs +60 -0
- package/deps/blake3/src/hazmat.rs +704 -0
- package/deps/blake3/src/io.rs +64 -0
- package/deps/blake3/src/join.rs +92 -0
- package/deps/blake3/src/lib.rs +1835 -0
- package/deps/blake3/src/platform.rs +587 -0
- package/deps/blake3/src/portable.rs +198 -0
- package/deps/blake3/src/rust_avx2.rs +474 -0
- package/deps/blake3/src/rust_sse2.rs +775 -0
- package/deps/blake3/src/rust_sse41.rs +766 -0
- package/deps/blake3/src/test.rs +1049 -0
- package/deps/blake3/src/traits.rs +227 -0
- package/deps/blake3/src/wasm32_simd.rs +794 -0
- package/deps/blake3/test_vectors/Cargo.toml +19 -0
- package/deps/blake3/test_vectors/cross_test.sh +25 -0
- package/deps/blake3/test_vectors/src/bin/generate.rs +4 -0
- package/deps/blake3/test_vectors/src/lib.rs +350 -0
- package/deps/blake3/test_vectors/test_vectors.json +217 -0
- package/deps/blake3/tools/compiler_version/Cargo.toml +7 -0
- package/deps/blake3/tools/compiler_version/build.rs +6 -0
- package/deps/blake3/tools/compiler_version/src/main.rs +27 -0
- package/deps/blake3/tools/instruction_set_support/Cargo.toml +6 -0
- package/deps/blake3/tools/instruction_set_support/src/main.rs +10 -0
- package/deps/blake3/tools/release.md +16 -0
- package/deps/fastpbkdf2/fastpbkdf2.c +5 -1
- package/deps/ncrypto/ncrypto.cc +4679 -0
- package/deps/ncrypto/ncrypto.h +1625 -0
- package/lib/commonjs/blake3.js +98 -0
- package/lib/commonjs/blake3.js.map +1 -0
- package/lib/commonjs/cipher.js +180 -0
- package/lib/commonjs/cipher.js.map +1 -0
- package/lib/commonjs/constants.js +32 -0
- package/lib/commonjs/constants.js.map +1 -0
- package/lib/commonjs/ec.js +480 -0
- package/lib/commonjs/ec.js.map +1 -0
- package/lib/commonjs/ed.js +214 -2
- package/lib/commonjs/ed.js.map +1 -1
- package/lib/commonjs/expo-plugin/@types.js +2 -0
- package/lib/commonjs/expo-plugin/@types.js.map +1 -0
- package/lib/commonjs/expo-plugin/withRNQC.js +25 -0
- package/lib/commonjs/expo-plugin/withRNQC.js.map +1 -0
- package/lib/commonjs/expo-plugin/withSodiumAndroid.js +25 -0
- package/lib/commonjs/expo-plugin/withSodiumAndroid.js.map +1 -0
- package/lib/commonjs/expo-plugin/withSodiumIos.js +26 -0
- package/lib/commonjs/expo-plugin/withSodiumIos.js.map +1 -0
- package/lib/commonjs/expo-plugin/withXCode.js +51 -0
- package/lib/commonjs/expo-plugin/withXCode.js.map +1 -0
- package/lib/commonjs/hash.js +215 -0
- package/lib/commonjs/hash.js.map +1 -0
- package/lib/commonjs/hmac.js +109 -0
- package/lib/commonjs/hmac.js.map +1 -0
- package/lib/commonjs/index.js +102 -24
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/keys/classes.js +109 -52
- package/lib/commonjs/keys/classes.js.map +1 -1
- package/lib/commonjs/keys/generateKeyPair.js +141 -144
- package/lib/commonjs/keys/generateKeyPair.js.map +1 -1
- package/lib/commonjs/keys/index.js +229 -0
- package/lib/commonjs/keys/index.js.map +1 -1
- package/lib/commonjs/keys/publicCipher.js +152 -0
- package/lib/commonjs/keys/publicCipher.js.map +1 -0
- package/lib/commonjs/keys/signVerify.js +178 -39
- package/lib/commonjs/keys/signVerify.js.map +1 -1
- package/lib/commonjs/keys/utils.js +18 -13
- package/lib/commonjs/keys/utils.js.map +1 -1
- package/lib/commonjs/pbkdf2.js.map +1 -1
- package/lib/commonjs/random.js +6 -0
- package/lib/commonjs/random.js.map +1 -1
- package/lib/commonjs/rsa.js +202 -0
- package/lib/commonjs/rsa.js.map +1 -0
- package/lib/commonjs/specs/blake3.nitro.js +6 -0
- package/lib/commonjs/specs/blake3.nitro.js.map +1 -0
- package/lib/commonjs/specs/cipher.nitro.js +6 -0
- package/lib/commonjs/specs/cipher.nitro.js.map +1 -0
- package/lib/commonjs/specs/ecKeyPair.nitro.js +6 -0
- package/lib/commonjs/specs/ecKeyPair.nitro.js.map +1 -0
- package/lib/commonjs/specs/hash.nitro.js +6 -0
- package/lib/commonjs/specs/hash.nitro.js.map +1 -0
- package/lib/commonjs/specs/hmac.nitro.js +6 -0
- package/lib/commonjs/specs/hmac.nitro.js.map +1 -0
- package/lib/commonjs/specs/rsaCipher.nitro.js +6 -0
- package/lib/commonjs/specs/rsaCipher.nitro.js.map +1 -0
- package/lib/commonjs/specs/rsaKeyPair.nitro.js +6 -0
- package/lib/commonjs/specs/rsaKeyPair.nitro.js.map +1 -0
- package/lib/commonjs/specs/sign.nitro.js +6 -0
- package/lib/commonjs/specs/sign.nitro.js.map +1 -0
- package/lib/commonjs/subtle.js +987 -0
- package/lib/commonjs/subtle.js.map +1 -0
- package/lib/commonjs/utils/cipher.js +64 -0
- package/lib/commonjs/utils/cipher.js.map +1 -0
- package/lib/commonjs/utils/conversion.js +44 -5
- package/lib/commonjs/utils/conversion.js.map +1 -1
- package/lib/commonjs/utils/hashnames.js +2 -1
- package/lib/commonjs/utils/hashnames.js.map +1 -1
- package/lib/commonjs/utils/index.js +11 -0
- package/lib/commonjs/utils/index.js.map +1 -1
- package/lib/commonjs/utils/noble.js +82 -0
- package/lib/commonjs/utils/noble.js.map +1 -0
- package/lib/commonjs/utils/types.js +32 -17
- package/lib/commonjs/utils/types.js.map +1 -1
- package/lib/commonjs/utils/validation.js +74 -1
- package/lib/commonjs/utils/validation.js.map +1 -1
- package/lib/module/blake3.js +90 -0
- package/lib/module/blake3.js.map +1 -0
- package/lib/module/cipher.js +173 -0
- package/lib/module/cipher.js.map +1 -0
- package/lib/module/constants.js +28 -0
- package/lib/module/constants.js.map +1 -0
- package/lib/module/ec.js +470 -0
- package/lib/module/ec.js.map +1 -0
- package/lib/module/ed.js +212 -3
- package/lib/module/ed.js.map +1 -1
- package/lib/module/expo-plugin/@types.js +2 -0
- package/lib/module/expo-plugin/@types.js.map +1 -0
- package/lib/module/expo-plugin/withRNQC.js +21 -0
- package/lib/module/expo-plugin/withRNQC.js.map +1 -0
- package/lib/module/expo-plugin/withSodiumAndroid.js +20 -0
- package/lib/module/expo-plugin/withSodiumAndroid.js.map +1 -0
- package/lib/module/expo-plugin/withSodiumIos.js +20 -0
- package/lib/module/expo-plugin/withSodiumIos.js.map +1 -0
- package/lib/module/expo-plugin/withXCode.js +46 -0
- package/lib/module/expo-plugin/withXCode.js.map +1 -0
- package/lib/module/hash.js +207 -0
- package/lib/module/hash.js.map +1 -0
- package/lib/module/hmac.js +104 -0
- package/lib/module/hmac.js.map +1 -0
- package/lib/module/index.js +21 -21
- package/lib/module/index.js.map +1 -1
- package/lib/module/keys/classes.js +106 -49
- package/lib/module/keys/classes.js.map +1 -1
- package/lib/module/keys/generateKeyPair.js +134 -143
- package/lib/module/keys/generateKeyPair.js.map +1 -1
- package/lib/module/keys/index.js +161 -22
- package/lib/module/keys/index.js.map +1 -1
- package/lib/module/keys/publicCipher.js +145 -0
- package/lib/module/keys/publicCipher.js.map +1 -0
- package/lib/module/keys/signVerify.js +170 -39
- package/lib/module/keys/signVerify.js.map +1 -1
- package/lib/module/keys/utils.js +16 -12
- package/lib/module/keys/utils.js.map +1 -1
- package/lib/module/pbkdf2.js.map +1 -1
- package/lib/module/random.js +6 -0
- package/lib/module/random.js.map +1 -1
- package/lib/module/rsa.js +194 -0
- package/lib/module/rsa.js.map +1 -0
- package/lib/module/specs/blake3.nitro.js +4 -0
- package/lib/module/specs/blake3.nitro.js.map +1 -0
- package/lib/module/specs/cipher.nitro.js +4 -0
- package/lib/module/specs/cipher.nitro.js.map +1 -0
- package/lib/module/specs/ecKeyPair.nitro.js +4 -0
- package/lib/module/specs/ecKeyPair.nitro.js.map +1 -0
- package/lib/module/specs/hash.nitro.js +4 -0
- package/lib/module/specs/hash.nitro.js.map +1 -0
- package/lib/module/specs/hmac.nitro.js +4 -0
- package/lib/module/specs/hmac.nitro.js.map +1 -0
- package/lib/module/specs/rsaCipher.nitro.js +4 -0
- package/lib/module/specs/rsaCipher.nitro.js.map +1 -0
- package/lib/module/specs/rsaKeyPair.nitro.js +4 -0
- package/lib/module/specs/rsaKeyPair.nitro.js.map +1 -0
- package/lib/module/specs/sign.nitro.js +4 -0
- package/lib/module/specs/sign.nitro.js.map +1 -0
- package/lib/module/subtle.js +982 -0
- package/lib/module/subtle.js.map +1 -0
- package/lib/module/utils/cipher.js +56 -0
- package/lib/module/utils/cipher.js.map +1 -0
- package/lib/module/utils/conversion.js +26 -5
- package/lib/module/utils/conversion.js.map +1 -1
- package/lib/module/utils/hashnames.js +2 -1
- package/lib/module/utils/hashnames.js.map +1 -1
- package/lib/module/utils/index.js +1 -0
- package/lib/module/utils/index.js.map +1 -1
- package/lib/module/utils/noble.js +76 -0
- package/lib/module/utils/noble.js.map +1 -0
- package/lib/module/utils/types.js +32 -17
- package/lib/module/utils/types.js.map +1 -1
- package/lib/module/utils/validation.js +69 -1
- package/lib/module/utils/validation.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/lib/typescript/blake3.d.ts +33 -0
- package/lib/typescript/blake3.d.ts.map +1 -0
- package/lib/typescript/cipher.d.ts +60 -0
- package/lib/typescript/cipher.d.ts.map +1 -0
- package/lib/typescript/constants.d.ts +21 -0
- package/lib/typescript/constants.d.ts.map +1 -0
- package/lib/typescript/ec.d.ts +22 -0
- package/lib/typescript/ec.d.ts.map +1 -0
- package/lib/typescript/ed.d.ts +28 -1
- package/lib/typescript/ed.d.ts.map +1 -1
- package/lib/typescript/expo-plugin/@types.d.ts +8 -0
- package/lib/typescript/expo-plugin/@types.d.ts.map +1 -0
- package/lib/typescript/expo-plugin/withRNQC.d.ts +4 -0
- package/lib/typescript/expo-plugin/withRNQC.d.ts.map +1 -0
- package/lib/typescript/expo-plugin/withSodiumAndroid.d.ts +4 -0
- package/lib/typescript/expo-plugin/withSodiumAndroid.d.ts.map +1 -0
- package/lib/typescript/expo-plugin/withSodiumIos.d.ts +4 -0
- package/lib/typescript/expo-plugin/withSodiumIos.d.ts.map +1 -0
- package/lib/typescript/expo-plugin/withXCode.d.ts +9 -0
- package/lib/typescript/expo-plugin/withXCode.d.ts.map +1 -0
- package/lib/typescript/hash.d.ts +122 -0
- package/lib/typescript/hash.d.ts.map +1 -0
- package/lib/typescript/hmac.d.ts +66 -0
- package/lib/typescript/hmac.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +102 -10
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/keys/classes.d.ts +50 -8
- package/lib/typescript/keys/classes.d.ts.map +1 -1
- package/lib/typescript/keys/generateKeyPair.d.ts +5 -0
- package/lib/typescript/keys/generateKeyPair.d.ts.map +1 -1
- package/lib/typescript/keys/index.d.ts +22 -2
- package/lib/typescript/keys/index.d.ts.map +1 -1
- package/lib/typescript/keys/publicCipher.d.ts +20 -0
- package/lib/typescript/keys/publicCipher.d.ts.map +1 -0
- package/lib/typescript/keys/signVerify.d.ts +28 -0
- package/lib/typescript/keys/signVerify.d.ts.map +1 -1
- package/lib/typescript/keys/utils.d.ts +3 -1
- package/lib/typescript/keys/utils.d.ts.map +1 -1
- package/lib/typescript/pbkdf2.d.ts +1 -1
- package/lib/typescript/pbkdf2.d.ts.map +1 -1
- package/lib/typescript/random.d.ts +6 -0
- package/lib/typescript/random.d.ts.map +1 -1
- package/lib/typescript/rsa.d.ts +19 -0
- package/lib/typescript/rsa.d.ts.map +1 -0
- package/lib/typescript/specs/blake3.nitro.d.ts +15 -0
- package/lib/typescript/specs/blake3.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/cipher.nitro.d.ts +29 -0
- package/lib/typescript/specs/cipher.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/ecKeyPair.nitro.d.ts +20 -0
- package/lib/typescript/specs/ecKeyPair.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/edKeyPair.nitro.d.ts +1 -0
- package/lib/typescript/specs/edKeyPair.nitro.d.ts.map +1 -1
- package/lib/typescript/specs/hash.nitro.d.ts +13 -0
- package/lib/typescript/specs/hash.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/hmac.nitro.d.ts +10 -0
- package/lib/typescript/specs/hmac.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/keyObjectHandle.nitro.d.ts +1 -1
- package/lib/typescript/specs/keyObjectHandle.nitro.d.ts.map +1 -1
- package/lib/typescript/specs/rsaCipher.nitro.d.ts +44 -0
- package/lib/typescript/specs/rsaCipher.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/rsaKeyPair.nitro.d.ts +20 -0
- package/lib/typescript/specs/rsaKeyPair.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/sign.nitro.d.ts +19 -0
- package/lib/typescript/specs/sign.nitro.d.ts.map +1 -0
- package/lib/typescript/subtle.d.ts +17 -0
- package/lib/typescript/subtle.d.ts.map +1 -0
- package/lib/typescript/utils/cipher.d.ts +7 -0
- package/lib/typescript/utils/cipher.d.ts.map +1 -0
- package/lib/typescript/utils/conversion.d.ts +1 -0
- package/lib/typescript/utils/conversion.d.ts.map +1 -1
- package/lib/typescript/utils/hashnames.d.ts +3 -1
- package/lib/typescript/utils/hashnames.d.ts.map +1 -1
- package/lib/typescript/utils/index.d.ts +1 -0
- package/lib/typescript/utils/index.d.ts.map +1 -1
- package/lib/typescript/utils/noble.d.ts +19 -0
- package/lib/typescript/utils/noble.d.ts.map +1 -0
- package/lib/typescript/utils/types.d.ts +125 -23
- package/lib/typescript/utils/types.d.ts.map +1 -1
- package/lib/typescript/utils/validation.d.ts +5 -0
- package/lib/typescript/utils/validation.d.ts.map +1 -1
- package/nitrogen/generated/.gitattributes +1 -0
- package/nitrogen/generated/android/QuickCrypto+autolinking.cmake +30 -1
- package/nitrogen/generated/android/QuickCrypto+autolinking.gradle +1 -1
- package/nitrogen/generated/android/QuickCryptoOnLoad.cpp +115 -1
- package/nitrogen/generated/android/QuickCryptoOnLoad.hpp +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/crypto/QuickCryptoOnLoad.kt +35 -0
- package/nitrogen/generated/ios/QuickCrypto+autolinking.rb +3 -1
- 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 +3 -3
- package/nitrogen/generated/ios/QuickCryptoAutolinking.mm +111 -1
- package/nitrogen/generated/ios/QuickCryptoAutolinking.swift +1 -1
- package/nitrogen/generated/shared/c++/AsymmetricKeyType.hpp +104 -0
- package/nitrogen/generated/shared/c++/CipherArgs.hpp +86 -0
- package/nitrogen/generated/shared/c++/HybridBlake3Spec.cpp +28 -0
- package/nitrogen/generated/shared/c++/HybridBlake3Spec.hpp +76 -0
- package/nitrogen/generated/shared/c++/HybridCipherFactorySpec.cpp +21 -0
- package/nitrogen/generated/shared/c++/HybridCipherFactorySpec.hpp +67 -0
- package/nitrogen/generated/shared/c++/HybridCipherSpec.cpp +28 -0
- package/nitrogen/generated/shared/c++/HybridCipherSpec.hpp +76 -0
- package/nitrogen/generated/shared/c++/HybridEcKeyPairSpec.cpp +29 -0
- package/nitrogen/generated/shared/c++/HybridEcKeyPairSpec.hpp +77 -0
- package/nitrogen/generated/shared/c++/HybridEdKeyPairSpec.cpp +2 -1
- package/nitrogen/generated/shared/c++/HybridEdKeyPairSpec.hpp +5 -4
- package/nitrogen/generated/shared/c++/HybridHashSpec.cpp +26 -0
- package/nitrogen/generated/shared/c++/HybridHashSpec.hpp +75 -0
- package/nitrogen/generated/shared/c++/HybridHmacSpec.cpp +23 -0
- package/nitrogen/generated/shared/c++/HybridHmacSpec.hpp +66 -0
- package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.hpp +8 -8
- package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.hpp +3 -3
- package/nitrogen/generated/shared/c++/HybridRandomSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridRandomSpec.hpp +3 -3
- package/nitrogen/generated/shared/c++/HybridRsaCipherSpec.cpp +24 -0
- package/nitrogen/generated/shared/c++/HybridRsaCipherSpec.hpp +72 -0
- package/nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.cpp +29 -0
- package/nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.hpp +77 -0
- package/nitrogen/generated/shared/c++/HybridSignHandleSpec.cpp +23 -0
- package/nitrogen/generated/shared/c++/HybridSignHandleSpec.hpp +71 -0
- package/nitrogen/generated/shared/c++/HybridVerifyHandleSpec.cpp +23 -0
- package/nitrogen/generated/shared/c++/HybridVerifyHandleSpec.hpp +71 -0
- package/nitrogen/generated/shared/c++/JWK.hpp +17 -18
- package/nitrogen/generated/shared/c++/JWKkty.hpp +12 -14
- package/nitrogen/generated/shared/c++/JWKuse.hpp +8 -10
- package/nitrogen/generated/shared/c++/KFormatType.hpp +14 -16
- package/nitrogen/generated/shared/c++/KeyDetail.hpp +6 -7
- package/nitrogen/generated/shared/c++/KeyEncoding.hpp +15 -17
- package/nitrogen/generated/shared/c++/KeyObject.hpp +67 -0
- package/nitrogen/generated/shared/c++/KeyType.hpp +11 -13
- package/nitrogen/generated/shared/c++/KeyUsage.hpp +38 -24
- package/nitrogen/generated/shared/c++/NamedCurve.hpp +10 -12
- package/package.json +28 -23
- package/src/blake3.ts +123 -0
- package/src/cipher.ts +335 -0
- package/src/constants.ts +32 -0
- package/src/ec.ts +657 -0
- package/src/ed.ts +297 -13
- package/src/expo-plugin/@types.ts +7 -0
- package/src/expo-plugin/withRNQC.ts +23 -0
- package/src/expo-plugin/withSodiumAndroid.ts +24 -0
- package/src/expo-plugin/withSodiumIos.ts +30 -0
- package/src/expo-plugin/withXCode.ts +55 -0
- package/src/hash.ts +274 -0
- package/src/hmac.ts +135 -0
- package/src/index.ts +20 -20
- package/src/keys/classes.ts +148 -55
- package/src/keys/generateKeyPair.ts +177 -134
- package/src/keys/index.ts +226 -14
- package/src/keys/publicCipher.ts +229 -0
- package/src/keys/signVerify.ts +239 -39
- package/src/keys/utils.ts +24 -18
- package/src/pbkdf2.ts +1 -1
- package/src/random.ts +7 -0
- package/src/rsa.ts +310 -0
- package/src/specs/blake3.nitro.ts +12 -0
- package/src/specs/cipher.nitro.ts +25 -0
- package/src/specs/ecKeyPair.nitro.ts +38 -0
- package/src/specs/edKeyPair.nitro.ts +2 -0
- package/src/specs/hash.nitro.ts +10 -0
- package/src/specs/hmac.nitro.ts +7 -0
- package/src/specs/keyObjectHandle.nitro.ts +1 -1
- package/src/specs/rsaCipher.nitro.ts +65 -0
- package/src/specs/rsaKeyPair.nitro.ts +33 -0
- package/src/specs/sign.nitro.ts +31 -0
- package/src/subtle.ts +1436 -0
- package/src/utils/cipher.ts +60 -0
- package/src/utils/conversion.ts +33 -4
- package/src/utils/hashnames.ts +4 -2
- package/src/utils/index.ts +1 -0
- package/src/utils/noble.ts +85 -0
- package/src/utils/types.ts +209 -29
- package/src/utils/validation.ts +96 -1
- package/lib/module/package.json +0 -1
- package/nitrogen/generated/android/QuickCryptoOnLoad.kt +0 -1
- package/nitrogen/generated/shared/c++/CFRGKeyPairType.hpp +0 -86
package/src/ec.ts
ADDED
|
@@ -0,0 +1,657 @@
|
|
|
1
|
+
import { NitroModules } from 'react-native-nitro-modules';
|
|
2
|
+
import type { EcKeyPair } from './specs/ecKeyPair.nitro';
|
|
3
|
+
import type { KeyObjectHandle } from './specs/keyObjectHandle.nitro';
|
|
4
|
+
import {
|
|
5
|
+
CryptoKey,
|
|
6
|
+
KeyObject,
|
|
7
|
+
PublicKeyObject,
|
|
8
|
+
PrivateKeyObject,
|
|
9
|
+
} from './keys';
|
|
10
|
+
import type {
|
|
11
|
+
CryptoKeyPair,
|
|
12
|
+
KeyPairOptions,
|
|
13
|
+
KeyUsage,
|
|
14
|
+
SubtleAlgorithm,
|
|
15
|
+
BufferLike,
|
|
16
|
+
BinaryLike,
|
|
17
|
+
JWK,
|
|
18
|
+
ImportFormat,
|
|
19
|
+
NamedCurve,
|
|
20
|
+
GenerateKeyPairOptions,
|
|
21
|
+
KeyPairGenConfig,
|
|
22
|
+
} from './utils/types';
|
|
23
|
+
import {
|
|
24
|
+
bufferLikeToArrayBuffer,
|
|
25
|
+
getUsagesUnion,
|
|
26
|
+
hasAnyNotIn,
|
|
27
|
+
kNamedCurveAliases,
|
|
28
|
+
lazyDOMException,
|
|
29
|
+
normalizeHashName,
|
|
30
|
+
HashContext,
|
|
31
|
+
KeyEncoding,
|
|
32
|
+
KFormatType,
|
|
33
|
+
} from './utils';
|
|
34
|
+
import { Buffer } from 'buffer';
|
|
35
|
+
|
|
36
|
+
export class Ec {
|
|
37
|
+
native: EcKeyPair;
|
|
38
|
+
|
|
39
|
+
constructor(curve: string) {
|
|
40
|
+
this.native = NitroModules.createHybridObject<EcKeyPair>('EcKeyPair');
|
|
41
|
+
this.native.setCurve(curve);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
async generateKeyPair(): Promise<CryptoKeyPair> {
|
|
45
|
+
await this.native.generateKeyPair();
|
|
46
|
+
return {
|
|
47
|
+
publicKey: this.native.getPublicKey(),
|
|
48
|
+
privateKey: this.native.getPrivateKey(),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
generateKeyPairSync(): CryptoKeyPair {
|
|
53
|
+
this.native.generateKeyPairSync();
|
|
54
|
+
return {
|
|
55
|
+
publicKey: this.native.getPublicKey(),
|
|
56
|
+
privateKey: this.native.getPrivateKey(),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// function verifyAcceptableEcKeyUse(
|
|
62
|
+
// name: AnyAlgorithm,
|
|
63
|
+
// isPublic: boolean,
|
|
64
|
+
// usages: KeyUsage[],
|
|
65
|
+
// ): void {
|
|
66
|
+
// let checkSet;
|
|
67
|
+
// switch (name) {
|
|
68
|
+
// case 'ECDH':
|
|
69
|
+
// checkSet = isPublic ? [] : ['deriveKey', 'deriveBits'];
|
|
70
|
+
// break;
|
|
71
|
+
// case 'ECDSA':
|
|
72
|
+
// checkSet = isPublic ? ['verify'] : ['sign'];
|
|
73
|
+
// break;
|
|
74
|
+
// default:
|
|
75
|
+
// throw lazyDOMException(
|
|
76
|
+
// 'The algorithm is not supported',
|
|
77
|
+
// 'NotSupportedError',
|
|
78
|
+
// );
|
|
79
|
+
// }
|
|
80
|
+
// if (hasAnyNotIn(usages, checkSet)) {
|
|
81
|
+
// throw lazyDOMException(
|
|
82
|
+
// `Unsupported key usage for a ${name} key`,
|
|
83
|
+
// 'SyntaxError',
|
|
84
|
+
// );
|
|
85
|
+
// }
|
|
86
|
+
// }
|
|
87
|
+
|
|
88
|
+
// function createECPublicKeyRaw(
|
|
89
|
+
// namedCurve: NamedCurve | undefined,
|
|
90
|
+
// keyDataBuffer: ArrayBuffer,
|
|
91
|
+
// ): PublicKeyObject {
|
|
92
|
+
// if (!namedCurve) {
|
|
93
|
+
// throw new Error('Invalid namedCurve');
|
|
94
|
+
// }
|
|
95
|
+
// const handle = NitroModules.createHybridObject(
|
|
96
|
+
// 'KeyObjectHandle',
|
|
97
|
+
// ) as KeyObjectHandle;
|
|
98
|
+
|
|
99
|
+
// if (!handle.initECRaw(kNamedCurveAliases[namedCurve], keyDataBuffer)) {
|
|
100
|
+
// console.log('keyData', ab2str(keyDataBuffer));
|
|
101
|
+
// throw new Error('Invalid keyData 1');
|
|
102
|
+
// }
|
|
103
|
+
|
|
104
|
+
// return new PublicKeyObject(handle);
|
|
105
|
+
// }
|
|
106
|
+
|
|
107
|
+
// // Node API
|
|
108
|
+
// export function ec_exportKey(key: CryptoKey, format: KeyFormat): ArrayBuffer {
|
|
109
|
+
// return ec.native.exportKey(format, key.keyObject.handle);
|
|
110
|
+
// }
|
|
111
|
+
|
|
112
|
+
// Node API
|
|
113
|
+
export function ecImportKey(
|
|
114
|
+
format: ImportFormat,
|
|
115
|
+
keyData: BufferLike | BinaryLike | JWK,
|
|
116
|
+
algorithm: SubtleAlgorithm,
|
|
117
|
+
extractable: boolean,
|
|
118
|
+
keyUsages: KeyUsage[],
|
|
119
|
+
): CryptoKey {
|
|
120
|
+
const { name, namedCurve } = algorithm;
|
|
121
|
+
|
|
122
|
+
if (
|
|
123
|
+
!namedCurve ||
|
|
124
|
+
!kNamedCurveAliases[namedCurve as keyof typeof kNamedCurveAliases]
|
|
125
|
+
) {
|
|
126
|
+
throw lazyDOMException('Unrecognized namedCurve', 'NotSupportedError');
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Handle JWK format
|
|
130
|
+
if (format === 'jwk') {
|
|
131
|
+
const jwk = keyData as JWK;
|
|
132
|
+
|
|
133
|
+
// Validate JWK
|
|
134
|
+
if (jwk.kty !== 'EC') {
|
|
135
|
+
throw lazyDOMException('Invalid JWK "kty" Parameter', 'DataError');
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
if (jwk.crv !== namedCurve) {
|
|
139
|
+
throw lazyDOMException(
|
|
140
|
+
'JWK "crv" does not match the requested algorithm',
|
|
141
|
+
'DataError',
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Check use parameter if present
|
|
146
|
+
if (jwk.use !== undefined) {
|
|
147
|
+
const expectedUse = name === 'ECDH' ? 'enc' : 'sig';
|
|
148
|
+
if (jwk.use !== expectedUse) {
|
|
149
|
+
throw lazyDOMException('Invalid JWK "use" Parameter', 'DataError');
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Check alg parameter if present
|
|
154
|
+
if (jwk.alg !== undefined) {
|
|
155
|
+
let expectedAlg: string | undefined;
|
|
156
|
+
|
|
157
|
+
if (name === 'ECDSA') {
|
|
158
|
+
// Map namedCurve to expected ECDSA algorithm
|
|
159
|
+
expectedAlg =
|
|
160
|
+
namedCurve === 'P-256'
|
|
161
|
+
? 'ES256'
|
|
162
|
+
: namedCurve === 'P-384'
|
|
163
|
+
? 'ES384'
|
|
164
|
+
: namedCurve === 'P-521'
|
|
165
|
+
? 'ES512'
|
|
166
|
+
: undefined;
|
|
167
|
+
} else if (name === 'ECDH') {
|
|
168
|
+
// ECDH uses ECDH-ES algorithm
|
|
169
|
+
expectedAlg = 'ECDH-ES';
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
if (expectedAlg && jwk.alg !== expectedAlg) {
|
|
173
|
+
throw lazyDOMException(
|
|
174
|
+
'JWK "alg" does not match the requested algorithm',
|
|
175
|
+
'DataError',
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// Import using C++ layer
|
|
181
|
+
const handle =
|
|
182
|
+
NitroModules.createHybridObject<KeyObjectHandle>('KeyObjectHandle');
|
|
183
|
+
const keyType = handle.initJwk(jwk, namedCurve as NamedCurve);
|
|
184
|
+
|
|
185
|
+
if (keyType === undefined) {
|
|
186
|
+
throw lazyDOMException('Invalid JWK', 'DataError');
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// Create the appropriate KeyObject based on type
|
|
190
|
+
let keyObject: KeyObject;
|
|
191
|
+
if (keyType === 1) {
|
|
192
|
+
keyObject = new PublicKeyObject(handle);
|
|
193
|
+
} else if (keyType === 2) {
|
|
194
|
+
keyObject = new PrivateKeyObject(handle);
|
|
195
|
+
} else {
|
|
196
|
+
throw lazyDOMException(
|
|
197
|
+
'Unexpected key type from JWK import',
|
|
198
|
+
'DataError',
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
return new CryptoKey(keyObject, algorithm, keyUsages, extractable);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// Handle binary formats (spki, pkcs8, raw)
|
|
206
|
+
if (format !== 'spki' && format !== 'pkcs8' && format !== 'raw') {
|
|
207
|
+
throw lazyDOMException(
|
|
208
|
+
`Unsupported format: ${format}`,
|
|
209
|
+
'NotSupportedError',
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// Determine expected key type based on format
|
|
214
|
+
const expectedKeyType =
|
|
215
|
+
format === 'spki' || format === 'raw' ? 'public' : 'private';
|
|
216
|
+
|
|
217
|
+
// Validate usages for the key type
|
|
218
|
+
const isPublicKey = expectedKeyType === 'public';
|
|
219
|
+
let validUsages: KeyUsage[];
|
|
220
|
+
|
|
221
|
+
if (name === 'ECDSA') {
|
|
222
|
+
validUsages = isPublicKey ? ['verify'] : ['sign'];
|
|
223
|
+
} else if (name === 'ECDH') {
|
|
224
|
+
validUsages = isPublicKey ? [] : ['deriveKey', 'deriveBits'];
|
|
225
|
+
} else {
|
|
226
|
+
throw lazyDOMException('Unsupported algorithm', 'NotSupportedError');
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
if (hasAnyNotIn(keyUsages, validUsages)) {
|
|
230
|
+
throw lazyDOMException(
|
|
231
|
+
`Unsupported key usage for a ${name} key`,
|
|
232
|
+
'SyntaxError',
|
|
233
|
+
);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// Convert keyData to ArrayBuffer
|
|
237
|
+
const keyBuffer = bufferLikeToArrayBuffer(keyData as BufferLike);
|
|
238
|
+
|
|
239
|
+
// Create KeyObject directly using the appropriate format
|
|
240
|
+
let keyObject: KeyObject;
|
|
241
|
+
|
|
242
|
+
if (format === 'raw') {
|
|
243
|
+
// Raw format is only for public keys - use specialized EC raw import
|
|
244
|
+
const handle =
|
|
245
|
+
NitroModules.createHybridObject<KeyObjectHandle>('KeyObjectHandle');
|
|
246
|
+
const curveAlias =
|
|
247
|
+
kNamedCurveAliases[namedCurve as keyof typeof kNamedCurveAliases];
|
|
248
|
+
if (!handle.initECRaw(curveAlias, keyBuffer)) {
|
|
249
|
+
throw lazyDOMException('Failed to import EC raw key', 'DataError');
|
|
250
|
+
}
|
|
251
|
+
keyObject = new PublicKeyObject(handle);
|
|
252
|
+
} else {
|
|
253
|
+
// Use standard DER import for spki/pkcs8
|
|
254
|
+
keyObject = KeyObject.createKeyObject(
|
|
255
|
+
expectedKeyType,
|
|
256
|
+
keyBuffer,
|
|
257
|
+
KFormatType.DER,
|
|
258
|
+
format === 'spki' ? KeyEncoding.SPKI : KeyEncoding.PKCS8,
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
return new CryptoKey(keyObject, algorithm, keyUsages, extractable);
|
|
263
|
+
// // // verifyAcceptableEcKeyUse(name, true, usagesSet);
|
|
264
|
+
// // try {
|
|
265
|
+
// // keyObject = createPublicKey({
|
|
266
|
+
// // key: keyData,
|
|
267
|
+
// // format: 'der',
|
|
268
|
+
// // type: 'spki',
|
|
269
|
+
// // });
|
|
270
|
+
// // } catch (err) {
|
|
271
|
+
// // throw new Error(`Invalid keyData 2: ${err}`);
|
|
272
|
+
// // }
|
|
273
|
+
// // break;
|
|
274
|
+
// // }
|
|
275
|
+
// // case 'pkcs8': {
|
|
276
|
+
// // // verifyAcceptableEcKeyUse(name, false, usagesSet);
|
|
277
|
+
// // try {
|
|
278
|
+
// // keyObject = createPrivateKey({
|
|
279
|
+
// // key: keyData,
|
|
280
|
+
// // format: 'der',
|
|
281
|
+
// // type: 'pkcs8',
|
|
282
|
+
// // });
|
|
283
|
+
// // } catch (err) {
|
|
284
|
+
// // throw new Error(`Invalid keyData 3 ${err}`);
|
|
285
|
+
// // }
|
|
286
|
+
// // break;
|
|
287
|
+
// // }
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// case 'jwk': {
|
|
291
|
+
// const data = keyData as JWK;
|
|
292
|
+
|
|
293
|
+
// if (!data.kty) throw lazyDOMException('Invalid keyData 4', 'DataError');
|
|
294
|
+
// if (data.kty !== 'EC')
|
|
295
|
+
// throw lazyDOMException('Invalid JWK "kty" Parameter', 'DataError');
|
|
296
|
+
// if (data.crv !== namedCurve)
|
|
297
|
+
// throw lazyDOMException(
|
|
298
|
+
// 'JWK "crv" does not match the requested algorithm',
|
|
299
|
+
// 'DataError',
|
|
300
|
+
// );
|
|
301
|
+
|
|
302
|
+
// verifyAcceptableEcKeyUse(name, data.d === undefined, keyUsages);
|
|
303
|
+
|
|
304
|
+
// if (keyUsages.length > 0 && data.use !== undefined) {
|
|
305
|
+
// const checkUse = name === 'ECDH' ? 'enc' : 'sig';
|
|
306
|
+
// if (data.use !== checkUse)
|
|
307
|
+
// throw lazyDOMException('Invalid JWK "use" Parameter', 'DataError');
|
|
308
|
+
// }
|
|
309
|
+
|
|
310
|
+
// validateKeyOps(data.key_ops, keyUsages);
|
|
311
|
+
|
|
312
|
+
// if (
|
|
313
|
+
// data.ext !== undefined &&
|
|
314
|
+
// data.ext === false &&
|
|
315
|
+
// extractable === true
|
|
316
|
+
// ) {
|
|
317
|
+
// throw lazyDOMException(
|
|
318
|
+
// 'JWK "ext" Parameter and extractable mismatch',
|
|
319
|
+
// 'DataError',
|
|
320
|
+
// );
|
|
321
|
+
// }
|
|
322
|
+
|
|
323
|
+
// if (algorithm.name === 'ECDSA' && data.alg !== undefined) {
|
|
324
|
+
// let algNamedCurve;
|
|
325
|
+
// switch (data.alg) {
|
|
326
|
+
// case 'ES256':
|
|
327
|
+
// algNamedCurve = 'P-256';
|
|
328
|
+
// break;
|
|
329
|
+
// case 'ES384':
|
|
330
|
+
// algNamedCurve = 'P-384';
|
|
331
|
+
// break;
|
|
332
|
+
// case 'ES512':
|
|
333
|
+
// algNamedCurve = 'P-521';
|
|
334
|
+
// break;
|
|
335
|
+
// }
|
|
336
|
+
// if (algNamedCurve !== namedCurve)
|
|
337
|
+
// throw lazyDOMException(
|
|
338
|
+
// 'JWK "alg" does not match the requested algorithm',
|
|
339
|
+
// 'DataError',
|
|
340
|
+
// );
|
|
341
|
+
// }
|
|
342
|
+
|
|
343
|
+
// const handle = NativeQuickCrypto.webcrypto.createKeyObjectHandle();
|
|
344
|
+
// const type = handle.initJwk(data, namedCurve);
|
|
345
|
+
// if (type === undefined)
|
|
346
|
+
// throw lazyDOMException('Invalid JWK', 'DataError');
|
|
347
|
+
// keyObject =
|
|
348
|
+
// type === KeyType.PRIVATE
|
|
349
|
+
// ? new PrivateKeyObject(handle)
|
|
350
|
+
// : new PublicKeyObject(handle);
|
|
351
|
+
// break;
|
|
352
|
+
// }
|
|
353
|
+
// case 'raw': {
|
|
354
|
+
// const data = keyData as BufferLike | BinaryLike;
|
|
355
|
+
// verifyAcceptableEcKeyUse(name, true, keyUsages);
|
|
356
|
+
// const buffer =
|
|
357
|
+
// typeof data === 'string'
|
|
358
|
+
// ? binaryLikeToArrayBuffer(data)
|
|
359
|
+
// : bufferLikeToArrayBuffer(data);
|
|
360
|
+
// keyObject = createECPublicKeyRaw(namedCurve, buffer);
|
|
361
|
+
// break;
|
|
362
|
+
// }
|
|
363
|
+
// default: {
|
|
364
|
+
// throw new Error(`Unknown EC import format: ${format}`);
|
|
365
|
+
// }
|
|
366
|
+
// }
|
|
367
|
+
|
|
368
|
+
// switch (algorithm.name) {
|
|
369
|
+
// case 'ECDSA':
|
|
370
|
+
// // Fall through
|
|
371
|
+
// case 'ECDH':
|
|
372
|
+
// if (keyObject.asymmetricKeyType !== ('ec' as AsymmetricKeyType))
|
|
373
|
+
// throw new Error('Invalid key type');
|
|
374
|
+
// break;
|
|
375
|
+
// }
|
|
376
|
+
|
|
377
|
+
// // if (!keyObject[kHandle].checkEcKeyData()) {
|
|
378
|
+
// // throw new Error('Invalid keyData 5');
|
|
379
|
+
// // }
|
|
380
|
+
|
|
381
|
+
// // const { namedCurve: checkNamedCurve } = keyObject[kHandle].keyDetail({});
|
|
382
|
+
// // if (kNamedCurveAliases[namedCurve] !== checkNamedCurve)
|
|
383
|
+
// // throw new Error('Named curve mismatch');
|
|
384
|
+
|
|
385
|
+
// return new CryptoKey(keyObject, { name, namedCurve }, keyUsages, extractable);
|
|
386
|
+
// }
|
|
387
|
+
|
|
388
|
+
// Node API
|
|
389
|
+
export const ecdsaSignVerify = (
|
|
390
|
+
key: CryptoKey,
|
|
391
|
+
data: BufferLike,
|
|
392
|
+
{ hash }: SubtleAlgorithm,
|
|
393
|
+
signature?: BufferLike,
|
|
394
|
+
): ArrayBuffer | boolean => {
|
|
395
|
+
const isSign = signature === undefined;
|
|
396
|
+
const expectedKeyType = isSign ? 'private' : 'public';
|
|
397
|
+
|
|
398
|
+
if (key.type !== expectedKeyType) {
|
|
399
|
+
throw lazyDOMException(
|
|
400
|
+
`Key must be a ${expectedKeyType} key`,
|
|
401
|
+
'InvalidAccessError',
|
|
402
|
+
);
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
const hashName = typeof hash === 'string' ? hash : hash?.name;
|
|
406
|
+
|
|
407
|
+
if (!hashName) {
|
|
408
|
+
throw lazyDOMException(
|
|
409
|
+
'Hash algorithm is required for ECDSA',
|
|
410
|
+
'InvalidAccessError',
|
|
411
|
+
);
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// Normalize hash algorithm name to WebCrypto format for C++ layer
|
|
415
|
+
const normalizedHashName = normalizeHashName(hashName, HashContext.WebCrypto);
|
|
416
|
+
|
|
417
|
+
// Create EC instance with the curve from the key
|
|
418
|
+
const namedCurve = key.algorithm.namedCurve!;
|
|
419
|
+
const ec = new Ec(namedCurve);
|
|
420
|
+
|
|
421
|
+
// Extract and import the actual key data from the CryptoKey
|
|
422
|
+
// Export in DER format with appropriate encoding
|
|
423
|
+
const encoding =
|
|
424
|
+
key.type === 'private' ? KeyEncoding.PKCS8 : KeyEncoding.SPKI;
|
|
425
|
+
const keyData = key.keyObject.handle.exportKey(KFormatType.DER, encoding);
|
|
426
|
+
const keyBuffer = bufferLikeToArrayBuffer(keyData);
|
|
427
|
+
ec.native.importKey(
|
|
428
|
+
'der',
|
|
429
|
+
keyBuffer,
|
|
430
|
+
key.algorithm.name!,
|
|
431
|
+
key.extractable,
|
|
432
|
+
key.usages,
|
|
433
|
+
);
|
|
434
|
+
|
|
435
|
+
const dataBuffer = bufferLikeToArrayBuffer(data);
|
|
436
|
+
|
|
437
|
+
if (isSign) {
|
|
438
|
+
// Sign operation
|
|
439
|
+
return ec.native.sign(dataBuffer, normalizedHashName);
|
|
440
|
+
} else {
|
|
441
|
+
// Verify operation
|
|
442
|
+
const signatureBuffer = bufferLikeToArrayBuffer(signature!);
|
|
443
|
+
return ec.native.verify(dataBuffer, signatureBuffer, normalizedHashName);
|
|
444
|
+
}
|
|
445
|
+
};
|
|
446
|
+
|
|
447
|
+
// Node API
|
|
448
|
+
|
|
449
|
+
export async function ec_generateKeyPair(
|
|
450
|
+
name: string,
|
|
451
|
+
namedCurve: string,
|
|
452
|
+
extractable: boolean,
|
|
453
|
+
keyUsages: KeyUsage[],
|
|
454
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
455
|
+
_options?: KeyPairOptions, // TODO: Implement format options support
|
|
456
|
+
): Promise<CryptoKeyPair> {
|
|
457
|
+
// validation checks
|
|
458
|
+
if (!Object.keys(kNamedCurveAliases).includes(namedCurve || '')) {
|
|
459
|
+
throw lazyDOMException(
|
|
460
|
+
`Unrecognized namedCurve '${namedCurve}'`,
|
|
461
|
+
'NotSupportedError',
|
|
462
|
+
);
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
// const usageSet = new SafeSet(keyUsages);
|
|
466
|
+
switch (name) {
|
|
467
|
+
case 'ECDSA':
|
|
468
|
+
if (hasAnyNotIn(keyUsages, ['sign', 'verify'])) {
|
|
469
|
+
throw lazyDOMException(
|
|
470
|
+
'Unsupported key usage for an ECDSA key',
|
|
471
|
+
'SyntaxError',
|
|
472
|
+
);
|
|
473
|
+
}
|
|
474
|
+
break;
|
|
475
|
+
case 'ECDH':
|
|
476
|
+
if (hasAnyNotIn(keyUsages, ['deriveKey', 'deriveBits'])) {
|
|
477
|
+
throw lazyDOMException(
|
|
478
|
+
'Unsupported key usage for an ECDH key',
|
|
479
|
+
'SyntaxError',
|
|
480
|
+
);
|
|
481
|
+
}
|
|
482
|
+
// Fall through
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
const ec = new Ec(namedCurve!);
|
|
486
|
+
await ec.generateKeyPair();
|
|
487
|
+
|
|
488
|
+
let publicUsages: KeyUsage[] = [];
|
|
489
|
+
let privateUsages: KeyUsage[] = [];
|
|
490
|
+
switch (name) {
|
|
491
|
+
case 'ECDSA':
|
|
492
|
+
publicUsages = getUsagesUnion(keyUsages, 'verify');
|
|
493
|
+
privateUsages = getUsagesUnion(keyUsages, 'sign');
|
|
494
|
+
break;
|
|
495
|
+
case 'ECDH':
|
|
496
|
+
publicUsages = [];
|
|
497
|
+
privateUsages = getUsagesUnion(keyUsages, 'deriveKey', 'deriveBits');
|
|
498
|
+
break;
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
const keyAlgorithm = { name, namedCurve: namedCurve! };
|
|
502
|
+
|
|
503
|
+
// Export keys directly from the EC key pair using the internal EVP_PKEY
|
|
504
|
+
// These methods export in DER format (SPKI for public, PKCS8 for private)
|
|
505
|
+
const publicKeyData = ec.native.getPublicKey();
|
|
506
|
+
const privateKeyData = ec.native.getPrivateKey();
|
|
507
|
+
|
|
508
|
+
const pub = KeyObject.createKeyObject(
|
|
509
|
+
'public',
|
|
510
|
+
publicKeyData,
|
|
511
|
+
KFormatType.DER,
|
|
512
|
+
KeyEncoding.SPKI,
|
|
513
|
+
) as PublicKeyObject;
|
|
514
|
+
const publicKey = new CryptoKey(
|
|
515
|
+
pub,
|
|
516
|
+
keyAlgorithm as SubtleAlgorithm,
|
|
517
|
+
publicUsages,
|
|
518
|
+
true,
|
|
519
|
+
);
|
|
520
|
+
|
|
521
|
+
// All keys are now exported in PKCS8 format for consistency
|
|
522
|
+
const priv = KeyObject.createKeyObject(
|
|
523
|
+
'private',
|
|
524
|
+
privateKeyData,
|
|
525
|
+
KFormatType.DER,
|
|
526
|
+
KeyEncoding.PKCS8,
|
|
527
|
+
) as PrivateKeyObject;
|
|
528
|
+
const privateKey = new CryptoKey(
|
|
529
|
+
priv,
|
|
530
|
+
keyAlgorithm as SubtleAlgorithm,
|
|
531
|
+
privateUsages,
|
|
532
|
+
extractable,
|
|
533
|
+
);
|
|
534
|
+
|
|
535
|
+
return { publicKey, privateKey };
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
function ec_prepareKeyGenParams(
|
|
539
|
+
options: GenerateKeyPairOptions | undefined,
|
|
540
|
+
): Ec {
|
|
541
|
+
if (!options) {
|
|
542
|
+
throw new Error('Options are required for EC key generation');
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
const { namedCurve } = options as { namedCurve?: string };
|
|
546
|
+
|
|
547
|
+
if (
|
|
548
|
+
!namedCurve ||
|
|
549
|
+
!kNamedCurveAliases[namedCurve as keyof typeof kNamedCurveAliases]
|
|
550
|
+
) {
|
|
551
|
+
throw new Error(`Invalid or unsupported named curve: ${namedCurve}`);
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
return new Ec(namedCurve);
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
function ec_formatKeyPairOutput(
|
|
558
|
+
ec: Ec,
|
|
559
|
+
encoding: KeyPairGenConfig,
|
|
560
|
+
): {
|
|
561
|
+
publicKey: PublicKeyObject | Buffer | string | ArrayBuffer;
|
|
562
|
+
privateKey: PrivateKeyObject | Buffer | string | ArrayBuffer;
|
|
563
|
+
} {
|
|
564
|
+
const {
|
|
565
|
+
publicFormat,
|
|
566
|
+
publicType,
|
|
567
|
+
privateFormat,
|
|
568
|
+
privateType,
|
|
569
|
+
cipher,
|
|
570
|
+
passphrase,
|
|
571
|
+
} = encoding;
|
|
572
|
+
|
|
573
|
+
const publicKeyData = ec.native.getPublicKey();
|
|
574
|
+
const privateKeyData = ec.native.getPrivateKey();
|
|
575
|
+
|
|
576
|
+
const pub = KeyObject.createKeyObject(
|
|
577
|
+
'public',
|
|
578
|
+
publicKeyData,
|
|
579
|
+
KFormatType.DER,
|
|
580
|
+
KeyEncoding.SPKI,
|
|
581
|
+
) as PublicKeyObject;
|
|
582
|
+
|
|
583
|
+
const priv = KeyObject.createKeyObject(
|
|
584
|
+
'private',
|
|
585
|
+
privateKeyData,
|
|
586
|
+
KFormatType.DER,
|
|
587
|
+
KeyEncoding.PKCS8,
|
|
588
|
+
) as PrivateKeyObject;
|
|
589
|
+
|
|
590
|
+
let publicKey: PublicKeyObject | Buffer | string | ArrayBuffer;
|
|
591
|
+
let privateKey: PrivateKeyObject | Buffer | string | ArrayBuffer;
|
|
592
|
+
|
|
593
|
+
if (publicFormat === -1) {
|
|
594
|
+
publicKey = pub;
|
|
595
|
+
} else {
|
|
596
|
+
const format =
|
|
597
|
+
publicFormat === KFormatType.PEM ? KFormatType.PEM : KFormatType.DER;
|
|
598
|
+
const keyEncoding =
|
|
599
|
+
publicType === KeyEncoding.SPKI ? KeyEncoding.SPKI : KeyEncoding.SPKI;
|
|
600
|
+
const exported = pub.handle.exportKey(format, keyEncoding);
|
|
601
|
+
if (format === KFormatType.PEM) {
|
|
602
|
+
publicKey = Buffer.from(new Uint8Array(exported)).toString('utf-8');
|
|
603
|
+
} else {
|
|
604
|
+
publicKey = exported;
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
if (privateFormat === -1) {
|
|
609
|
+
privateKey = priv;
|
|
610
|
+
} else {
|
|
611
|
+
const format =
|
|
612
|
+
privateFormat === KFormatType.PEM ? KFormatType.PEM : KFormatType.DER;
|
|
613
|
+
const keyEncoding =
|
|
614
|
+
privateType === KeyEncoding.PKCS8
|
|
615
|
+
? KeyEncoding.PKCS8
|
|
616
|
+
: privateType === KeyEncoding.SEC1
|
|
617
|
+
? KeyEncoding.SEC1
|
|
618
|
+
: KeyEncoding.PKCS8;
|
|
619
|
+
const exported = priv.handle.exportKey(
|
|
620
|
+
format,
|
|
621
|
+
keyEncoding,
|
|
622
|
+
cipher,
|
|
623
|
+
passphrase,
|
|
624
|
+
);
|
|
625
|
+
if (format === KFormatType.PEM) {
|
|
626
|
+
privateKey = Buffer.from(new Uint8Array(exported)).toString('utf-8');
|
|
627
|
+
} else {
|
|
628
|
+
privateKey = exported;
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
return { publicKey, privateKey };
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
export async function ec_generateKeyPairNode(
|
|
636
|
+
options: GenerateKeyPairOptions | undefined,
|
|
637
|
+
encoding: KeyPairGenConfig,
|
|
638
|
+
): Promise<{
|
|
639
|
+
publicKey: PublicKeyObject | Buffer | string | ArrayBuffer;
|
|
640
|
+
privateKey: PrivateKeyObject | Buffer | string | ArrayBuffer;
|
|
641
|
+
}> {
|
|
642
|
+
const ec = ec_prepareKeyGenParams(options);
|
|
643
|
+
await ec.generateKeyPair();
|
|
644
|
+
return ec_formatKeyPairOutput(ec, encoding);
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
export function ec_generateKeyPairNodeSync(
|
|
648
|
+
options: GenerateKeyPairOptions | undefined,
|
|
649
|
+
encoding: KeyPairGenConfig,
|
|
650
|
+
): {
|
|
651
|
+
publicKey: PublicKeyObject | Buffer | string | ArrayBuffer;
|
|
652
|
+
privateKey: PrivateKeyObject | Buffer | string | ArrayBuffer;
|
|
653
|
+
} {
|
|
654
|
+
const ec = ec_prepareKeyGenParams(options);
|
|
655
|
+
ec.generateKeyPairSync();
|
|
656
|
+
return ec_formatKeyPairOutput(ec, encoding);
|
|
657
|
+
}
|