react-native-quick-crypto 1.0.0-beta.2 → 1.0.0-beta.21
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 +143 -7
- package/README.md +12 -6
- package/android/CMakeLists.txt +82 -21
- package/android/build.gradle +47 -4
- package/android/src/main/cpp/cpp-adapter.cpp +3 -10
- package/android/src/main/java/com/margelo/nitro/quickcrypto/QuickCryptoPackage.java +13 -10
- 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/HybridCipher.cpp +322 -0
- package/cpp/cipher/HybridCipher.hpp +68 -0
- package/cpp/cipher/HybridCipherFactory.hpp +97 -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 +300 -0
- package/cpp/ed25519/HybridEdKeyPair.hpp +63 -0
- 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 +243 -0
- package/cpp/keys/HybridKeyObjectHandle.hpp +42 -0
- package/cpp/keys/KeyObjectData.cpp +226 -0
- package/cpp/keys/KeyObjectData.hpp +71 -0
- package/cpp/keys/node.h +5 -0
- package/cpp/pbkdf2/HybridPbkdf2.cpp +51 -0
- package/cpp/pbkdf2/HybridPbkdf2.hpp +24 -0
- package/cpp/random/HybridRandom.cpp +32 -18
- package/cpp/random/HybridRandom.hpp +18 -30
- package/cpp/rsa/HybridRsaKeyPair.cpp +154 -0
- package/cpp/rsa/HybridRsaKeyPair.hpp +43 -0
- package/cpp/utils/Macros.hpp +68 -0
- package/cpp/utils/Utils.hpp +53 -1
- 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 +356 -0
- package/deps/fastpbkdf2/fastpbkdf2.h +68 -0
- 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/ec.js +344 -0
- package/lib/commonjs/ec.js.map +1 -0
- package/lib/commonjs/ed.js +185 -0
- package/lib/commonjs/ed.js.map +1 -0
- 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 +152 -32
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/keys/classes.js +250 -0
- package/lib/commonjs/keys/classes.js.map +1 -0
- package/lib/commonjs/keys/generateKeyPair.js +102 -0
- package/lib/commonjs/keys/generateKeyPair.js.map +1 -0
- package/lib/commonjs/keys/index.js +89 -0
- package/lib/commonjs/keys/index.js.map +1 -0
- package/lib/commonjs/keys/signVerify.js +41 -0
- package/lib/commonjs/keys/signVerify.js.map +1 -0
- package/lib/commonjs/keys/utils.js +123 -0
- package/lib/commonjs/keys/utils.js.map +1 -0
- package/lib/commonjs/pbkdf2.js +89 -0
- package/lib/commonjs/pbkdf2.js.map +1 -0
- package/lib/commonjs/random.js +9 -3
- package/lib/commonjs/random.js.map +1 -1
- package/lib/commonjs/rsa.js +129 -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/edKeyPair.nitro.js +6 -0
- package/lib/commonjs/specs/edKeyPair.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/keyObjectHandle.nitro.js +6 -0
- package/lib/commonjs/specs/keyObjectHandle.nitro.js.map +1 -0
- package/lib/commonjs/specs/pbkdf2.nitro.js +6 -0
- package/lib/commonjs/specs/pbkdf2.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/subtle.js +365 -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 +140 -6
- package/lib/commonjs/utils/conversion.js.map +1 -1
- package/lib/commonjs/utils/errors.js +14 -0
- package/lib/commonjs/utils/errors.js.map +1 -0
- package/lib/commonjs/utils/hashnames.js +91 -0
- package/lib/commonjs/utils/hashnames.js.map +1 -0
- package/lib/commonjs/utils/index.js +65 -5
- 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 +52 -0
- package/lib/commonjs/utils/types.js.map +1 -1
- package/lib/commonjs/utils/validation.js +98 -0
- package/lib/commonjs/utils/validation.js.map +1 -0
- 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/ec.js +336 -0
- package/lib/module/ec.js.map +1 -0
- package/lib/module/ed.js +178 -0
- package/lib/module/ed.js.map +1 -0
- 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 +33 -29
- package/lib/module/index.js.map +1 -1
- package/lib/module/keys/classes.js +241 -0
- package/lib/module/keys/classes.js.map +1 -0
- package/lib/module/keys/generateKeyPair.js +96 -0
- package/lib/module/keys/generateKeyPair.js.map +1 -0
- package/lib/module/keys/index.js +32 -0
- package/lib/module/keys/index.js.map +1 -0
- package/lib/module/keys/signVerify.js +41 -0
- package/lib/module/keys/signVerify.js.map +1 -0
- package/lib/module/keys/utils.js +114 -0
- package/lib/module/keys/utils.js.map +1 -0
- package/lib/module/pbkdf2.js +83 -0
- package/lib/module/pbkdf2.js.map +1 -0
- package/lib/module/random.js +7 -1
- package/lib/module/random.js.map +1 -1
- package/lib/module/rsa.js +123 -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/edKeyPair.nitro.js +4 -0
- package/lib/module/specs/edKeyPair.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/keyObjectHandle.nitro.js +4 -0
- package/lib/module/specs/keyObjectHandle.nitro.js.map +1 -0
- package/lib/module/specs/pbkdf2.nitro.js +4 -0
- package/lib/module/specs/pbkdf2.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/subtle.js +360 -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 +120 -8
- package/lib/module/utils/conversion.js.map +1 -1
- package/lib/module/utils/errors.js +10 -0
- package/lib/module/utils/errors.js.map +1 -0
- package/lib/module/utils/hashnames.js +89 -0
- package/lib/module/utils/hashnames.js.map +1 -0
- package/lib/module/utils/index.js +6 -5
- 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 +53 -0
- package/lib/module/utils/types.js.map +1 -1
- package/lib/module/utils/validation.js +87 -0
- package/lib/module/utils/validation.js.map +1 -0
- 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/ec.d.ts +13 -0
- package/lib/typescript/ec.d.ts.map +1 -0
- package/lib/typescript/ed.d.ts +43 -0
- package/lib/typescript/ed.d.ts.map +1 -0
- 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 +110 -9
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/keys/classes.d.ts +79 -0
- package/lib/typescript/keys/classes.d.ts.map +1 -0
- package/lib/typescript/keys/generateKeyPair.d.ts +6 -0
- package/lib/typescript/keys/generateKeyPair.d.ts.map +1 -0
- package/lib/typescript/keys/index.d.ts +7 -0
- package/lib/typescript/keys/index.d.ts.map +1 -0
- package/lib/typescript/keys/signVerify.d.ts +1 -0
- package/lib/typescript/keys/signVerify.d.ts.map +1 -0
- package/lib/typescript/keys/utils.d.ts +34 -0
- package/lib/typescript/keys/utils.d.ts.map +1 -0
- package/lib/typescript/pbkdf2.d.ts +12 -0
- package/lib/typescript/pbkdf2.d.ts.map +1 -0
- package/lib/typescript/random.d.ts +11 -5
- package/lib/typescript/random.d.ts.map +1 -1
- package/lib/typescript/rsa.d.ts +10 -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 +17 -0
- package/lib/typescript/specs/edKeyPair.nitro.d.ts.map +1 -0
- 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 +14 -0
- package/lib/typescript/specs/keyObjectHandle.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/pbkdf2.nitro.d.ts +9 -0
- package/lib/typescript/specs/pbkdf2.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/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 +24 -2
- package/lib/typescript/utils/conversion.d.ts.map +1 -1
- package/lib/typescript/utils/errors.d.ts +7 -0
- package/lib/typescript/utils/errors.d.ts.map +1 -0
- package/lib/typescript/utils/hashnames.d.ts +13 -0
- package/lib/typescript/utils/hashnames.d.ts.map +1 -0
- package/lib/typescript/utils/index.d.ts +6 -5
- 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 +252 -2
- package/lib/typescript/utils/types.d.ts.map +1 -1
- package/lib/typescript/utils/validation.d.ts +13 -0
- package/lib/typescript/utils/validation.d.ts.map +1 -0
- package/nitrogen/generated/.gitattributes +1 -0
- package/nitrogen/generated/android/QuickCrypto+autolinking.cmake +47 -4
- package/nitrogen/generated/android/QuickCrypto+autolinking.gradle +4 -3
- package/nitrogen/generated/android/QuickCryptoOnLoad.cpp +144 -0
- package/nitrogen/generated/android/QuickCryptoOnLoad.hpp +25 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/crypto/QuickCryptoOnLoad.kt +35 -0
- package/nitrogen/generated/ios/QuickCrypto+autolinking.rb +11 -8
- package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.cpp +11 -3
- package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.hpp +5 -3
- package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Umbrella.hpp +16 -7
- package/nitrogen/generated/ios/QuickCryptoAutolinking.mm +135 -0
- package/nitrogen/generated/ios/QuickCryptoAutolinking.swift +12 -0
- package/nitrogen/generated/shared/c++/CFRGKeyPairType.hpp +84 -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 +30 -0
- package/nitrogen/generated/shared/c++/HybridEdKeyPairSpec.hpp +75 -0
- 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 +26 -0
- package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.hpp +92 -0
- package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.cpp +22 -0
- package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.hpp +66 -0
- package/nitrogen/generated/shared/c++/HybridRandomSpec.cpp +2 -3
- package/nitrogen/generated/shared/c++/HybridRandomSpec.hpp +9 -6
- package/nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.cpp +29 -0
- package/nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.hpp +77 -0
- package/nitrogen/generated/shared/c++/JWK.hpp +161 -0
- package/nitrogen/generated/shared/c++/JWKkty.hpp +84 -0
- package/nitrogen/generated/shared/c++/JWKuse.hpp +76 -0
- package/nitrogen/generated/shared/c++/KFormatType.hpp +63 -0
- package/nitrogen/generated/shared/c++/KeyDetail.hpp +92 -0
- package/nitrogen/generated/shared/c++/KeyEncoding.hpp +64 -0
- package/nitrogen/generated/shared/c++/KeyObject.hpp +67 -0
- package/nitrogen/generated/shared/c++/KeyType.hpp +63 -0
- package/nitrogen/generated/shared/c++/KeyUsage.hpp +116 -0
- package/nitrogen/generated/shared/c++/NamedCurve.hpp +80 -0
- package/package.json +66 -39
- package/src/blake3.ts +123 -0
- package/src/cipher.ts +335 -0
- package/src/ec.ts +432 -0
- package/src/ed.ts +256 -0
- 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 +32 -29
- package/src/keys/classes.ts +317 -0
- package/src/keys/generateKeyPair.ts +145 -0
- package/src/keys/index.ts +52 -0
- package/src/keys/signVerify.ts +39 -0
- package/src/keys/utils.ts +190 -0
- package/src/pbkdf2.ts +154 -0
- package/src/random.ts +26 -23
- package/src/rsa.ts +176 -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 +43 -0
- package/src/specs/hash.nitro.ts +10 -0
- package/src/specs/hmac.nitro.ts +7 -0
- package/src/specs/keyObjectHandle.nitro.ts +31 -0
- package/src/specs/pbkdf2.nitro.ts +18 -0
- package/src/specs/random.nitro.ts +2 -2
- package/src/specs/rsaKeyPair.nitro.ts +33 -0
- package/src/subtle.ts +614 -0
- package/src/utils/cipher.ts +60 -0
- package/src/utils/conversion.ts +143 -9
- package/src/utils/errors.ts +15 -0
- package/src/utils/hashnames.ts +98 -0
- package/src/utils/index.ts +6 -6
- package/src/utils/noble.ts +85 -0
- package/src/utils/types.ts +423 -3
- package/src/utils/validation.ts +130 -0
- package/ios/QuickCryptoOnLoad.mm +0 -19
- package/lib/module/package.json +0 -1
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import {
|
|
2
|
+
binaryLikeToArrayBuffer,
|
|
3
|
+
isStringOrBuffer,
|
|
4
|
+
KeyEncoding,
|
|
5
|
+
KFormatType,
|
|
6
|
+
} from '../utils';
|
|
7
|
+
import type { CryptoKeyPair, EncodingOptions } from '../utils';
|
|
8
|
+
import type { CryptoKey } from './classes';
|
|
9
|
+
|
|
10
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
11
|
+
export const isCryptoKey = (obj: any): boolean => {
|
|
12
|
+
return obj !== null && obj?.keyObject !== undefined;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export function getCryptoKeyPair(
|
|
16
|
+
key: CryptoKey | CryptoKeyPair,
|
|
17
|
+
): CryptoKeyPair {
|
|
18
|
+
if ('publicKey' in key && 'privateKey' in key) return key;
|
|
19
|
+
throw new Error('Invalid CryptoKeyPair');
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Parses the public key encoding based on an object. keyType must be undefined
|
|
24
|
+
* when this is used to parse an input encoding and must be a valid key type if
|
|
25
|
+
* used to parse an output encoding.
|
|
26
|
+
*/
|
|
27
|
+
export function parsePublicKeyEncoding(
|
|
28
|
+
enc: EncodingOptions,
|
|
29
|
+
keyType: string | undefined,
|
|
30
|
+
objName?: string,
|
|
31
|
+
) {
|
|
32
|
+
return parseKeyEncoding(enc, keyType, keyType ? true : undefined, objName);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Parses the private key encoding based on an object. keyType must be undefined
|
|
37
|
+
* when this is used to parse an input encoding and must be a valid key type if
|
|
38
|
+
* used to parse an output encoding.
|
|
39
|
+
*/
|
|
40
|
+
export function parsePrivateKeyEncoding(
|
|
41
|
+
enc: EncodingOptions,
|
|
42
|
+
keyType: string | undefined,
|
|
43
|
+
objName?: string,
|
|
44
|
+
) {
|
|
45
|
+
return parseKeyEncoding(enc, keyType, false, objName);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function parseKeyEncoding(
|
|
49
|
+
enc: EncodingOptions,
|
|
50
|
+
keyType?: string,
|
|
51
|
+
isPublic?: boolean,
|
|
52
|
+
objName?: string,
|
|
53
|
+
) {
|
|
54
|
+
// validateObject(enc, 'options');
|
|
55
|
+
|
|
56
|
+
const isInput = keyType === undefined;
|
|
57
|
+
|
|
58
|
+
const { format, type } = parseKeyFormatAndType(
|
|
59
|
+
enc,
|
|
60
|
+
keyType,
|
|
61
|
+
isPublic,
|
|
62
|
+
objName,
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
let cipher, passphrase, encoding;
|
|
66
|
+
if (isPublic !== true) {
|
|
67
|
+
({ cipher, passphrase, encoding } = enc);
|
|
68
|
+
|
|
69
|
+
if (!isInput) {
|
|
70
|
+
if (cipher != null) {
|
|
71
|
+
if (typeof cipher !== 'string')
|
|
72
|
+
throw new Error(
|
|
73
|
+
`Invalid argument ${option('cipher', objName)}: ${cipher}`,
|
|
74
|
+
);
|
|
75
|
+
if (
|
|
76
|
+
format === KFormatType.DER &&
|
|
77
|
+
(type === KeyEncoding.PKCS1 || type === KeyEncoding.SEC1)
|
|
78
|
+
) {
|
|
79
|
+
throw new Error(
|
|
80
|
+
`Incompatible key options ${encodingNames[type]} does not support encryption`,
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
} else if (passphrase !== undefined) {
|
|
84
|
+
throw new Error(
|
|
85
|
+
`invalid argument ${option('cipher', objName)}: ${cipher}`,
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (
|
|
91
|
+
(isInput && passphrase !== undefined && !isStringOrBuffer(passphrase)) ||
|
|
92
|
+
(!isInput && cipher != null && !isStringOrBuffer(passphrase))
|
|
93
|
+
) {
|
|
94
|
+
throw new Error(
|
|
95
|
+
`Invalid argument value ${option('passphrase', objName)}: ${passphrase}`,
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (passphrase !== undefined)
|
|
101
|
+
passphrase = binaryLikeToArrayBuffer(passphrase, encoding);
|
|
102
|
+
|
|
103
|
+
return { format, type, cipher, passphrase };
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const encodingNames = {
|
|
107
|
+
[KeyEncoding.PKCS1]: 'pkcs1',
|
|
108
|
+
[KeyEncoding.PKCS8]: 'pkcs8',
|
|
109
|
+
[KeyEncoding.SPKI]: 'spki',
|
|
110
|
+
[KeyEncoding.SEC1]: 'sec1',
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
function option(name: string, objName?: string) {
|
|
114
|
+
return objName === undefined
|
|
115
|
+
? `options.${name}`
|
|
116
|
+
: `options.${objName}.${name}`;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function parseKeyFormat(
|
|
120
|
+
formatStr?: string,
|
|
121
|
+
defaultFormat?: KFormatType,
|
|
122
|
+
optionName?: string,
|
|
123
|
+
) {
|
|
124
|
+
if (formatStr === undefined && defaultFormat !== undefined)
|
|
125
|
+
return defaultFormat;
|
|
126
|
+
else if (formatStr === 'pem') return KFormatType.PEM;
|
|
127
|
+
else if (formatStr === 'der') return KFormatType.DER;
|
|
128
|
+
else if (formatStr === 'jwk') return KFormatType.JWK;
|
|
129
|
+
throw new Error(`Invalid key format str: ${optionName}`);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function parseKeyType(
|
|
133
|
+
typeStr: string | undefined,
|
|
134
|
+
required: boolean,
|
|
135
|
+
keyType: string | undefined,
|
|
136
|
+
isPublic: boolean | undefined,
|
|
137
|
+
optionName: string,
|
|
138
|
+
): KeyEncoding | undefined {
|
|
139
|
+
if (typeStr === undefined && !required) {
|
|
140
|
+
return undefined;
|
|
141
|
+
} else if (typeStr === 'pkcs1') {
|
|
142
|
+
if (keyType !== undefined && keyType !== 'rsa') {
|
|
143
|
+
throw new Error(
|
|
144
|
+
`Crypto incompatible key options: ${typeStr} can only be used for RSA keys`,
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
return KeyEncoding.PKCS1;
|
|
148
|
+
} else if (typeStr === 'spki' && isPublic !== false) {
|
|
149
|
+
return KeyEncoding.SPKI;
|
|
150
|
+
} else if (typeStr === 'pkcs8' && isPublic !== true) {
|
|
151
|
+
return KeyEncoding.PKCS8;
|
|
152
|
+
} else if (typeStr === 'sec1' && isPublic !== true) {
|
|
153
|
+
if (keyType !== undefined && keyType !== 'ec') {
|
|
154
|
+
throw new Error(
|
|
155
|
+
`Incompatible key options ${typeStr} can only be used for EC keys`,
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
return KeyEncoding.SEC1;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
throw new Error(`Invalid option ${optionName} - ${typeStr}`);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function parseKeyFormatAndType(
|
|
165
|
+
enc: EncodingOptions,
|
|
166
|
+
keyType?: string,
|
|
167
|
+
isPublic?: boolean,
|
|
168
|
+
objName?: string,
|
|
169
|
+
) {
|
|
170
|
+
const { format: formatStr, type: typeStr } = enc;
|
|
171
|
+
|
|
172
|
+
const isInput = keyType === undefined;
|
|
173
|
+
const format = parseKeyFormat(
|
|
174
|
+
formatStr,
|
|
175
|
+
isInput ? KFormatType.PEM : undefined,
|
|
176
|
+
option('format', objName),
|
|
177
|
+
);
|
|
178
|
+
|
|
179
|
+
const isRequired =
|
|
180
|
+
(!isInput || format === KFormatType.DER) && format !== KFormatType.JWK;
|
|
181
|
+
|
|
182
|
+
const type = parseKeyType(
|
|
183
|
+
typeStr,
|
|
184
|
+
isRequired,
|
|
185
|
+
keyType,
|
|
186
|
+
isPublic,
|
|
187
|
+
option('type', objName),
|
|
188
|
+
);
|
|
189
|
+
return { format, type };
|
|
190
|
+
}
|
package/src/pbkdf2.ts
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { Buffer } from '@craftzdog/react-native-buffer';
|
|
2
|
+
import { NitroModules } from 'react-native-nitro-modules';
|
|
3
|
+
import type { BinaryLike } from './utils';
|
|
4
|
+
import {
|
|
5
|
+
HashContext,
|
|
6
|
+
binaryLikeToArrayBuffer,
|
|
7
|
+
bufferLikeToArrayBuffer,
|
|
8
|
+
lazyDOMException,
|
|
9
|
+
normalizeHashName,
|
|
10
|
+
} from './utils';
|
|
11
|
+
import type { HashAlgorithm, SubtleAlgorithm } from './utils';
|
|
12
|
+
import type { Pbkdf2 } from './specs/pbkdf2.nitro';
|
|
13
|
+
import { promisify } from 'util';
|
|
14
|
+
import type { CryptoKey } from './keys';
|
|
15
|
+
|
|
16
|
+
const WRONG_PASS =
|
|
17
|
+
'Password must be a string, a Buffer, a typed array or a DataView';
|
|
18
|
+
const WRONG_SALT = `Salt must be a string, a Buffer, a typed array or a DataView`;
|
|
19
|
+
|
|
20
|
+
type Password = BinaryLike;
|
|
21
|
+
type Salt = BinaryLike;
|
|
22
|
+
type Pbkdf2Callback = (err: Error | null, derivedKey?: Buffer) => void;
|
|
23
|
+
|
|
24
|
+
// to use native bits in sub-functions, use getNative(). don't call it at top-level!
|
|
25
|
+
let native: Pbkdf2;
|
|
26
|
+
function getNative(): Pbkdf2 {
|
|
27
|
+
if (native == null) {
|
|
28
|
+
// lazy-load the Nitro HybridObject
|
|
29
|
+
native = NitroModules.createHybridObject<Pbkdf2>('Pbkdf2');
|
|
30
|
+
}
|
|
31
|
+
return native;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function sanitizeInput(input: BinaryLike, errorMsg: string): ArrayBuffer {
|
|
35
|
+
try {
|
|
36
|
+
return binaryLikeToArrayBuffer(input);
|
|
37
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
38
|
+
} catch (_e: unknown) {
|
|
39
|
+
throw new Error(errorMsg);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function pbkdf2(
|
|
44
|
+
password: Password,
|
|
45
|
+
salt: Salt,
|
|
46
|
+
iterations: number,
|
|
47
|
+
keylen: number,
|
|
48
|
+
digest: string,
|
|
49
|
+
callback: Pbkdf2Callback,
|
|
50
|
+
): void {
|
|
51
|
+
if (callback === undefined || typeof callback !== 'function') {
|
|
52
|
+
throw new Error('No callback provided to pbkdf2');
|
|
53
|
+
}
|
|
54
|
+
const sanitizedPassword = sanitizeInput(password, WRONG_PASS);
|
|
55
|
+
const sanitizedSalt = sanitizeInput(salt, WRONG_SALT);
|
|
56
|
+
const normalizedDigest = normalizeHashName(digest, HashContext.Node);
|
|
57
|
+
|
|
58
|
+
getNative();
|
|
59
|
+
native
|
|
60
|
+
.pbkdf2(
|
|
61
|
+
sanitizedPassword,
|
|
62
|
+
sanitizedSalt,
|
|
63
|
+
iterations,
|
|
64
|
+
keylen,
|
|
65
|
+
normalizedDigest,
|
|
66
|
+
)
|
|
67
|
+
.then(
|
|
68
|
+
(res: ArrayBuffer) => {
|
|
69
|
+
callback!(null, Buffer.from(res));
|
|
70
|
+
},
|
|
71
|
+
(e: Error) => {
|
|
72
|
+
callback!(e);
|
|
73
|
+
},
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export function pbkdf2Sync(
|
|
78
|
+
password: Password,
|
|
79
|
+
salt: Salt,
|
|
80
|
+
iterations: number,
|
|
81
|
+
keylen: number,
|
|
82
|
+
digest?: HashAlgorithm,
|
|
83
|
+
): Buffer {
|
|
84
|
+
const sanitizedPassword = sanitizeInput(password, WRONG_PASS);
|
|
85
|
+
const sanitizedSalt = sanitizeInput(salt, WRONG_SALT);
|
|
86
|
+
|
|
87
|
+
const algo = digest ? normalizeHashName(digest, HashContext.Node) : 'sha1';
|
|
88
|
+
getNative();
|
|
89
|
+
const result: ArrayBuffer = native.pbkdf2Sync(
|
|
90
|
+
sanitizedPassword,
|
|
91
|
+
sanitizedSalt,
|
|
92
|
+
iterations,
|
|
93
|
+
keylen,
|
|
94
|
+
algo,
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
return Buffer.from(result);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// We need this because the typescript overload signatures in pbkdf2() above do
|
|
101
|
+
// not play nice with promisify() below.
|
|
102
|
+
const pbkdf2WithDigest = (
|
|
103
|
+
password: Password,
|
|
104
|
+
salt: Salt,
|
|
105
|
+
iterations: number,
|
|
106
|
+
keylen: number,
|
|
107
|
+
digest: HashAlgorithm,
|
|
108
|
+
callback: Pbkdf2Callback,
|
|
109
|
+
) => pbkdf2(password, salt, iterations, keylen, digest, callback);
|
|
110
|
+
|
|
111
|
+
const pbkdf2Promise = promisify(pbkdf2WithDigest);
|
|
112
|
+
export async function pbkdf2DeriveBits(
|
|
113
|
+
algorithm: SubtleAlgorithm,
|
|
114
|
+
baseKey: CryptoKey,
|
|
115
|
+
length: number,
|
|
116
|
+
): Promise<ArrayBuffer> {
|
|
117
|
+
const { iterations, hash, salt } = algorithm;
|
|
118
|
+
const normalizedHash = normalizeHashName(hash);
|
|
119
|
+
if (!normalizedHash) {
|
|
120
|
+
throw lazyDOMException('hash cannot be blank', 'OperationError');
|
|
121
|
+
}
|
|
122
|
+
if (!iterations || iterations === 0) {
|
|
123
|
+
throw lazyDOMException('iterations cannot be zero', 'OperationError');
|
|
124
|
+
}
|
|
125
|
+
if (!salt) {
|
|
126
|
+
throw lazyDOMException(WRONG_SALT, 'OperationError');
|
|
127
|
+
}
|
|
128
|
+
const raw = baseKey.keyObject.export();
|
|
129
|
+
|
|
130
|
+
if (length === 0)
|
|
131
|
+
throw lazyDOMException('length cannot be zero', 'OperationError');
|
|
132
|
+
if (length === null)
|
|
133
|
+
throw lazyDOMException('length cannot be null', 'OperationError');
|
|
134
|
+
if (length % 8) {
|
|
135
|
+
throw lazyDOMException('length must be a multiple of 8', 'OperationError');
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const sanitizedPassword = sanitizeInput(raw, WRONG_PASS);
|
|
139
|
+
const sanitizedSalt = sanitizeInput(salt, WRONG_SALT);
|
|
140
|
+
const result: Buffer | undefined = await pbkdf2Promise(
|
|
141
|
+
sanitizedPassword,
|
|
142
|
+
sanitizedSalt,
|
|
143
|
+
iterations,
|
|
144
|
+
length / 8,
|
|
145
|
+
normalizedHash as HashAlgorithm,
|
|
146
|
+
);
|
|
147
|
+
if (!result) {
|
|
148
|
+
throw lazyDOMException(
|
|
149
|
+
'received bad result from pbkdf2()',
|
|
150
|
+
'OperationError',
|
|
151
|
+
);
|
|
152
|
+
}
|
|
153
|
+
return bufferLikeToArrayBuffer(result);
|
|
154
|
+
}
|
package/src/random.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Buffer } from '@craftzdog/react-native-buffer';
|
|
2
|
-
import type {
|
|
3
|
-
import { abvToArrayBuffer } from './utils
|
|
2
|
+
import type { ABV, RandomCallback } from './utils';
|
|
3
|
+
import { abvToArrayBuffer } from './utils';
|
|
4
4
|
import { NitroModules } from 'react-native-nitro-modules';
|
|
5
5
|
import type { Random } from './specs/random.nitro';
|
|
6
6
|
|
|
@@ -14,32 +14,32 @@ function getNative(): Random {
|
|
|
14
14
|
return random;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
export function randomFill<T extends
|
|
17
|
+
export function randomFill<T extends ABV>(
|
|
18
18
|
buffer: T,
|
|
19
|
-
callback: RandomCallback<T
|
|
19
|
+
callback: RandomCallback<T>,
|
|
20
20
|
): void;
|
|
21
21
|
|
|
22
|
-
export function randomFill<T extends
|
|
22
|
+
export function randomFill<T extends ABV>(
|
|
23
23
|
buffer: T,
|
|
24
24
|
offset: number,
|
|
25
|
-
callback: RandomCallback<T
|
|
25
|
+
callback: RandomCallback<T>,
|
|
26
26
|
): void;
|
|
27
27
|
|
|
28
|
-
export function randomFill<T extends
|
|
28
|
+
export function randomFill<T extends ABV>(
|
|
29
29
|
buffer: T,
|
|
30
30
|
offset: number,
|
|
31
31
|
size: number,
|
|
32
|
-
callback: RandomCallback<T
|
|
32
|
+
callback: RandomCallback<T>,
|
|
33
33
|
): void;
|
|
34
34
|
|
|
35
|
-
export function randomFill(buffer:
|
|
35
|
+
export function randomFill(buffer: ABV, ...rest: unknown[]): void {
|
|
36
36
|
if (typeof rest[rest.length - 1] !== 'function') {
|
|
37
37
|
throw new Error('No callback provided to randomFill');
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
const callback = rest[rest.length - 1] as unknown as (
|
|
41
41
|
err: Error | null,
|
|
42
|
-
buf?: ArrayBuffer
|
|
42
|
+
buf?: ArrayBuffer,
|
|
43
43
|
) => void;
|
|
44
44
|
|
|
45
45
|
let offset: number = 0;
|
|
@@ -61,21 +61,17 @@ export function randomFill(buffer: ArrayBufferView, ...rest: unknown[]): void {
|
|
|
61
61
|
},
|
|
62
62
|
(e: Error) => {
|
|
63
63
|
callback(e);
|
|
64
|
-
}
|
|
64
|
+
},
|
|
65
65
|
);
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
-
export function randomFillSync<T extends
|
|
68
|
+
export function randomFillSync<T extends ABV>(
|
|
69
69
|
buffer: T,
|
|
70
70
|
offset?: number,
|
|
71
|
-
size?: number
|
|
71
|
+
size?: number,
|
|
72
72
|
): T;
|
|
73
73
|
|
|
74
|
-
export function randomFillSync(
|
|
75
|
-
buffer: ArrayBufferView,
|
|
76
|
-
offset: number = 0,
|
|
77
|
-
size?: number
|
|
78
|
-
) {
|
|
74
|
+
export function randomFillSync(buffer: ABV, offset: number = 0, size?: number) {
|
|
79
75
|
getNative();
|
|
80
76
|
buffer = abvToArrayBuffer(buffer);
|
|
81
77
|
const res = random.randomFillSync(buffer, offset, size ?? buffer.byteLength);
|
|
@@ -87,12 +83,12 @@ export function randomBytes(size: number): Buffer;
|
|
|
87
83
|
|
|
88
84
|
export function randomBytes(
|
|
89
85
|
size: number,
|
|
90
|
-
callback: (err: Error | null, buf?: Buffer) => void
|
|
86
|
+
callback: (err: Error | null, buf?: Buffer) => void,
|
|
91
87
|
): void;
|
|
92
88
|
|
|
93
89
|
export function randomBytes(
|
|
94
90
|
size: number,
|
|
95
|
-
callback?: (err: Error | null, buf?: Buffer) => void
|
|
91
|
+
callback?: (err: Error | null, buf?: Buffer) => void,
|
|
96
92
|
): void | Buffer {
|
|
97
93
|
const buf = new Buffer(size);
|
|
98
94
|
|
|
@@ -141,13 +137,13 @@ export function randomInt(max: number): number;
|
|
|
141
137
|
export function randomInt(
|
|
142
138
|
min: number,
|
|
143
139
|
max: number,
|
|
144
|
-
callback: RandomIntCallback
|
|
140
|
+
callback: RandomIntCallback,
|
|
145
141
|
): void;
|
|
146
142
|
export function randomInt(min: number, max: number): number;
|
|
147
143
|
export function randomInt(
|
|
148
144
|
arg1: number,
|
|
149
145
|
arg2?: number | RandomIntCallback,
|
|
150
|
-
callback?: RandomIntCallback
|
|
146
|
+
callback?: RandomIntCallback,
|
|
151
147
|
): void | number {
|
|
152
148
|
// Detect optional min syntax
|
|
153
149
|
// randomInt(max)
|
|
@@ -253,7 +249,7 @@ function asyncRefillRandomIntCache() {
|
|
|
253
249
|
// callback (errorReceiver) about it. This way, every async call to
|
|
254
250
|
// randomInt has a chance of being successful, and it avoids complex
|
|
255
251
|
// exception handling here.
|
|
256
|
-
tasks.splice(0).forEach(
|
|
252
|
+
tasks.splice(0).forEach(task => {
|
|
257
253
|
randomInt(task.min, task.max, task.callback);
|
|
258
254
|
});
|
|
259
255
|
|
|
@@ -273,6 +269,13 @@ export type RandomTypedArrays =
|
|
|
273
269
|
| Uint8Array
|
|
274
270
|
| Uint16Array
|
|
275
271
|
| Uint32Array;
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Fills the provided typed array with cryptographically strong random values.
|
|
275
|
+
*
|
|
276
|
+
* @param data The data to fill with random values
|
|
277
|
+
* @returns The filled data
|
|
278
|
+
*/
|
|
276
279
|
export function getRandomValues(data: RandomTypedArrays) {
|
|
277
280
|
if (data.byteLength > 65536) {
|
|
278
281
|
throw new Error('The requested length exceeds 65,536 bytes');
|
package/src/rsa.ts
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { NitroModules } from 'react-native-nitro-modules';
|
|
2
|
+
import {
|
|
3
|
+
CryptoKey,
|
|
4
|
+
KeyObject,
|
|
5
|
+
PrivateKeyObject,
|
|
6
|
+
PublicKeyObject,
|
|
7
|
+
} from './keys';
|
|
8
|
+
import {
|
|
9
|
+
getUsagesUnion,
|
|
10
|
+
hasAnyNotIn,
|
|
11
|
+
lazyDOMException,
|
|
12
|
+
normalizeHashName,
|
|
13
|
+
} from './utils';
|
|
14
|
+
import type {
|
|
15
|
+
CryptoKeyPair,
|
|
16
|
+
KeyUsage,
|
|
17
|
+
RsaHashedKeyGenParams,
|
|
18
|
+
SubtleAlgorithm,
|
|
19
|
+
} from './utils';
|
|
20
|
+
import type { RsaKeyPair } from './specs/rsaKeyPair.nitro';
|
|
21
|
+
|
|
22
|
+
export class Rsa {
|
|
23
|
+
native: RsaKeyPair;
|
|
24
|
+
|
|
25
|
+
constructor(
|
|
26
|
+
modulusLength: number,
|
|
27
|
+
publicExponent: Uint8Array,
|
|
28
|
+
hashAlgorithm: string,
|
|
29
|
+
) {
|
|
30
|
+
this.native = NitroModules.createHybridObject<RsaKeyPair>('RsaKeyPair');
|
|
31
|
+
this.native.setModulusLength(modulusLength);
|
|
32
|
+
this.native.setPublicExponent(
|
|
33
|
+
publicExponent.buffer.slice(
|
|
34
|
+
publicExponent.byteOffset,
|
|
35
|
+
publicExponent.byteOffset + publicExponent.byteLength,
|
|
36
|
+
) as ArrayBuffer,
|
|
37
|
+
);
|
|
38
|
+
this.native.setHashAlgorithm(hashAlgorithm);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
async generateKeyPair(): Promise<CryptoKeyPair> {
|
|
42
|
+
await this.native.generateKeyPair();
|
|
43
|
+
return {
|
|
44
|
+
publicKey: this.native.getPublicKey(),
|
|
45
|
+
privateKey: this.native.getPrivateKey(),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
generateKeyPairSync(): CryptoKeyPair {
|
|
50
|
+
this.native.generateKeyPairSync();
|
|
51
|
+
return {
|
|
52
|
+
publicKey: this.native.getPublicKey(),
|
|
53
|
+
privateKey: this.native.getPrivateKey(),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Node API
|
|
59
|
+
export async function rsa_generateKeyPair(
|
|
60
|
+
algorithm: SubtleAlgorithm,
|
|
61
|
+
extractable: boolean,
|
|
62
|
+
keyUsages: KeyUsage[],
|
|
63
|
+
): Promise<CryptoKeyPair> {
|
|
64
|
+
const { name, modulusLength, publicExponent, hash } =
|
|
65
|
+
algorithm as RsaHashedKeyGenParams;
|
|
66
|
+
|
|
67
|
+
// Validate parameters first
|
|
68
|
+
if (!modulusLength || modulusLength < 256) {
|
|
69
|
+
throw lazyDOMException('Invalid key length', 'OperationError');
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (!publicExponent || publicExponent.length === 0) {
|
|
73
|
+
throw lazyDOMException('Invalid public exponent', 'OperationError');
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Validate hash algorithm using existing validation function
|
|
77
|
+
let hashName: string;
|
|
78
|
+
try {
|
|
79
|
+
const normalizedHash = normalizeHashName(hash);
|
|
80
|
+
hashName = typeof hash === 'string' ? hash : hash?.name || normalizedHash;
|
|
81
|
+
} catch {
|
|
82
|
+
throw lazyDOMException('Invalid Hash Algorithm', 'NotSupportedError');
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Validate usages are not empty
|
|
86
|
+
if (keyUsages.length === 0) {
|
|
87
|
+
throw lazyDOMException('Usages cannot be empty', 'SyntaxError');
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Usage validation based on algorithm type
|
|
91
|
+
switch (name) {
|
|
92
|
+
case 'RSASSA-PKCS1-v1_5':
|
|
93
|
+
if (hasAnyNotIn(keyUsages, ['sign', 'verify'])) {
|
|
94
|
+
throw lazyDOMException(
|
|
95
|
+
`Unsupported key usage for a ${name} key`,
|
|
96
|
+
'SyntaxError',
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
break;
|
|
100
|
+
case 'RSA-PSS':
|
|
101
|
+
if (hasAnyNotIn(keyUsages, ['sign', 'verify'])) {
|
|
102
|
+
throw lazyDOMException(
|
|
103
|
+
`Unsupported key usage for a ${name} key`,
|
|
104
|
+
'SyntaxError',
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
break;
|
|
108
|
+
case 'RSA-OAEP':
|
|
109
|
+
if (
|
|
110
|
+
hasAnyNotIn(keyUsages, ['encrypt', 'decrypt', 'wrapKey', 'unwrapKey'])
|
|
111
|
+
) {
|
|
112
|
+
throw lazyDOMException(
|
|
113
|
+
`Unsupported key usage for a ${name} key`,
|
|
114
|
+
'SyntaxError',
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
break;
|
|
118
|
+
default:
|
|
119
|
+
throw lazyDOMException(
|
|
120
|
+
'The algorithm is not supported',
|
|
121
|
+
'NotSupportedError',
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Split usages between public and private keys
|
|
126
|
+
let publicUsages: KeyUsage[] = [];
|
|
127
|
+
let privateUsages: KeyUsage[] = [];
|
|
128
|
+
switch (name) {
|
|
129
|
+
case 'RSASSA-PKCS1-v1_5':
|
|
130
|
+
case 'RSA-PSS':
|
|
131
|
+
publicUsages = getUsagesUnion(keyUsages, 'verify');
|
|
132
|
+
privateUsages = getUsagesUnion(keyUsages, 'sign');
|
|
133
|
+
break;
|
|
134
|
+
case 'RSA-OAEP':
|
|
135
|
+
publicUsages = getUsagesUnion(keyUsages, 'encrypt', 'wrapKey');
|
|
136
|
+
privateUsages = getUsagesUnion(keyUsages, 'decrypt', 'unwrapKey');
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Validate that private key has usages for CryptoKeyPair
|
|
141
|
+
if (privateUsages.length === 0) {
|
|
142
|
+
throw lazyDOMException('Usages cannot be empty', 'SyntaxError');
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const rsa = new Rsa(modulusLength, publicExponent, hashName);
|
|
146
|
+
await rsa.generateKeyPair();
|
|
147
|
+
|
|
148
|
+
const keyAlgorithm = {
|
|
149
|
+
name,
|
|
150
|
+
modulusLength,
|
|
151
|
+
publicExponent,
|
|
152
|
+
hash: { name: hashName },
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
// Create KeyObject instances using the standard createKeyObject method
|
|
156
|
+
const publicKeyData = rsa.native.getPublicKey();
|
|
157
|
+
const pub = KeyObject.createKeyObject(
|
|
158
|
+
'public',
|
|
159
|
+
publicKeyData,
|
|
160
|
+
) as PublicKeyObject;
|
|
161
|
+
const publicKey = new CryptoKey(pub, keyAlgorithm, publicUsages, true);
|
|
162
|
+
|
|
163
|
+
const privateKeyData = rsa.native.getPrivateKey();
|
|
164
|
+
const priv = KeyObject.createKeyObject(
|
|
165
|
+
'private',
|
|
166
|
+
privateKeyData,
|
|
167
|
+
) as PrivateKeyObject;
|
|
168
|
+
const privateKey = new CryptoKey(
|
|
169
|
+
priv,
|
|
170
|
+
keyAlgorithm,
|
|
171
|
+
privateUsages,
|
|
172
|
+
extractable,
|
|
173
|
+
);
|
|
174
|
+
|
|
175
|
+
return { publicKey, privateKey };
|
|
176
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { HybridObject } from 'react-native-nitro-modules';
|
|
2
|
+
|
|
3
|
+
export interface Blake3 extends HybridObject<{ ios: 'c++'; android: 'c++' }> {
|
|
4
|
+
initHash(): void;
|
|
5
|
+
initKeyed(key: ArrayBuffer): void;
|
|
6
|
+
initDeriveKey(context: string): void;
|
|
7
|
+
update(data: ArrayBuffer): void;
|
|
8
|
+
digest(length?: number): ArrayBuffer;
|
|
9
|
+
reset(): void;
|
|
10
|
+
copy(): Blake3;
|
|
11
|
+
getVersion(): string;
|
|
12
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { HybridObject } from 'react-native-nitro-modules';
|
|
2
|
+
|
|
3
|
+
type CipherArgs = {
|
|
4
|
+
isCipher: boolean;
|
|
5
|
+
cipherType: string;
|
|
6
|
+
cipherKey: ArrayBuffer;
|
|
7
|
+
iv: ArrayBuffer;
|
|
8
|
+
authTagLen?: number;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export interface Cipher extends HybridObject<{ ios: 'c++'; android: 'c++' }> {
|
|
12
|
+
update(data: ArrayBuffer): ArrayBuffer;
|
|
13
|
+
final(): ArrayBuffer;
|
|
14
|
+
setArgs(args: CipherArgs): void;
|
|
15
|
+
setAAD(data: ArrayBuffer, plaintextLength?: number): boolean;
|
|
16
|
+
setAutoPadding(autoPad: boolean): boolean;
|
|
17
|
+
setAuthTag(tag: ArrayBuffer): boolean;
|
|
18
|
+
getAuthTag(): ArrayBuffer;
|
|
19
|
+
getSupportedCiphers(): string[];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface CipherFactory
|
|
23
|
+
extends HybridObject<{ ios: 'c++'; android: 'c++' }> {
|
|
24
|
+
createCipher(args: CipherArgs): Cipher;
|
|
25
|
+
}
|