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
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
#include <NitroModules/ArrayBuffer.hpp>
|
|
2
|
+
#include <NitroModules/Promise.hpp>
|
|
3
|
+
#include <memory>
|
|
4
|
+
#include <openssl/bio.h>
|
|
5
|
+
#include <openssl/buffer.h>
|
|
6
|
+
#include <openssl/err.h>
|
|
7
|
+
#include <openssl/evp.h>
|
|
8
|
+
#include <openssl/pem.h>
|
|
9
|
+
#include <openssl/rsa.h>
|
|
10
|
+
#include <stdexcept>
|
|
11
|
+
#include <string>
|
|
12
|
+
|
|
13
|
+
#include "HybridRsaKeyPair.hpp"
|
|
14
|
+
#include "Utils.hpp"
|
|
15
|
+
|
|
16
|
+
namespace margelo::nitro::crypto {
|
|
17
|
+
|
|
18
|
+
std::shared_ptr<Promise<void>> HybridRsaKeyPair::generateKeyPair() {
|
|
19
|
+
return Promise<void>::async([this]() { this->generateKeyPairSync(); });
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
void HybridRsaKeyPair::generateKeyPairSync() {
|
|
23
|
+
// Clean up existing key if any
|
|
24
|
+
if (this->pkey != nullptr) {
|
|
25
|
+
EVP_PKEY_free(this->pkey);
|
|
26
|
+
this->pkey = nullptr;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Create key generation context
|
|
30
|
+
std::unique_ptr<EVP_PKEY_CTX, decltype(&EVP_PKEY_CTX_free)> ctx(EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, nullptr), EVP_PKEY_CTX_free);
|
|
31
|
+
|
|
32
|
+
if (!ctx) {
|
|
33
|
+
throw std::runtime_error("Failed to create RSA key generation context");
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (EVP_PKEY_keygen_init(ctx.get()) <= 0) {
|
|
37
|
+
throw std::runtime_error("Failed to initialize RSA key generation");
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Set modulus length
|
|
41
|
+
if (EVP_PKEY_CTX_set_rsa_keygen_bits(ctx.get(), this->modulusLength) <= 0) {
|
|
42
|
+
throw std::runtime_error("Failed to set RSA modulus length");
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Set public exponent
|
|
46
|
+
std::unique_ptr<BIGNUM, decltype(&BN_free)> exponent(BN_new(), BN_free);
|
|
47
|
+
if (!exponent) {
|
|
48
|
+
throw std::runtime_error("Failed to create BIGNUM for public exponent");
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Default to 65537 (0x10001) if no public exponent is set
|
|
52
|
+
if (this->publicExponent.empty()) {
|
|
53
|
+
if (BN_set_word(exponent.get(), RSA_F4) != 1) {
|
|
54
|
+
throw std::runtime_error("Failed to set default public exponent");
|
|
55
|
+
}
|
|
56
|
+
} else {
|
|
57
|
+
if (BN_bin2bn(this->publicExponent.data(), this->publicExponent.size(), exponent.get()) == nullptr) {
|
|
58
|
+
throw std::runtime_error("Failed to convert public exponent to BIGNUM");
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (EVP_PKEY_CTX_set1_rsa_keygen_pubexp(ctx.get(), exponent.get()) <= 0) {
|
|
63
|
+
throw std::runtime_error("Failed to set RSA public exponent");
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Generate the key pair
|
|
67
|
+
EVP_PKEY* raw_pkey = nullptr;
|
|
68
|
+
if (EVP_PKEY_keygen(ctx.get(), &raw_pkey) <= 0) {
|
|
69
|
+
throw std::runtime_error("Failed to generate RSA key pair");
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
this->pkey = raw_pkey;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
void HybridRsaKeyPair::setModulusLength(double modulusLength) {
|
|
76
|
+
this->modulusLength = static_cast<int>(modulusLength);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
void HybridRsaKeyPair::setPublicExponent(const std::shared_ptr<ArrayBuffer>& publicExponent) {
|
|
80
|
+
if (publicExponent && publicExponent->size() > 0) {
|
|
81
|
+
const uint8_t* data = publicExponent->data();
|
|
82
|
+
this->publicExponent.assign(data, data + publicExponent->size());
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
void HybridRsaKeyPair::setHashAlgorithm(const std::string& hashAlgorithm) {
|
|
87
|
+
this->hashAlgorithm = hashAlgorithm;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
std::shared_ptr<ArrayBuffer> HybridRsaKeyPair::getPublicKey() {
|
|
91
|
+
this->checkKeyPair();
|
|
92
|
+
|
|
93
|
+
// Export as DER format using direct OpenSSL calls
|
|
94
|
+
BIO* bio = BIO_new(BIO_s_mem());
|
|
95
|
+
if (!bio) {
|
|
96
|
+
throw std::runtime_error("Failed to create BIO for public key export");
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (i2d_PUBKEY_bio(bio, this->pkey) != 1) {
|
|
100
|
+
BIO_free(bio);
|
|
101
|
+
throw std::runtime_error("Failed to export public key to DER format");
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
BUF_MEM* mem;
|
|
105
|
+
BIO_get_mem_ptr(bio, &mem);
|
|
106
|
+
|
|
107
|
+
// Create a string from the DER data and use ToNativeArrayBuffer utility
|
|
108
|
+
std::string derData(mem->data, mem->length);
|
|
109
|
+
BIO_free(bio);
|
|
110
|
+
|
|
111
|
+
return ToNativeArrayBuffer(derData);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
std::shared_ptr<ArrayBuffer> HybridRsaKeyPair::getPrivateKey() {
|
|
115
|
+
this->checkKeyPair();
|
|
116
|
+
|
|
117
|
+
// Export as DER format in PKCS8 format using direct OpenSSL calls
|
|
118
|
+
BIO* bio = BIO_new(BIO_s_mem());
|
|
119
|
+
if (!bio) {
|
|
120
|
+
throw std::runtime_error("Failed to create BIO for private key export");
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (i2d_PKCS8PrivateKey_bio(bio, this->pkey, nullptr, nullptr, 0, nullptr, nullptr) != 1) {
|
|
124
|
+
BIO_free(bio);
|
|
125
|
+
throw std::runtime_error("Failed to export private key to DER PKCS8 format");
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
BUF_MEM* mem;
|
|
129
|
+
BIO_get_mem_ptr(bio, &mem);
|
|
130
|
+
|
|
131
|
+
// Create a string from the DER data and use ToNativeArrayBuffer utility
|
|
132
|
+
std::string derData(mem->data, mem->length);
|
|
133
|
+
BIO_free(bio);
|
|
134
|
+
|
|
135
|
+
return ToNativeArrayBuffer(derData);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
KeyObject HybridRsaKeyPair::importKey(const std::string& /* format */, const std::shared_ptr<ArrayBuffer>& /* keyData */,
|
|
139
|
+
const std::string& /* algorithm */, bool /* extractable */,
|
|
140
|
+
const std::vector<std::string>& /* keyUsages */) {
|
|
141
|
+
throw std::runtime_error("HybridRsaKeyPair::importKey() is not yet implemented");
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
std::shared_ptr<ArrayBuffer> HybridRsaKeyPair::exportKey(const KeyObject& /* key */, const std::string& /* format */) {
|
|
145
|
+
throw std::runtime_error("HybridRsaKeyPair::exportKey() is not yet implemented");
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
void HybridRsaKeyPair::checkKeyPair() {
|
|
149
|
+
if (this->pkey == nullptr) {
|
|
150
|
+
throw std::runtime_error("RSA KeyPair not initialized");
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
} // namespace margelo::nitro::crypto
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include "HybridRsaKeyPairSpec.hpp"
|
|
4
|
+
#include <NitroModules/ArrayBuffer.hpp>
|
|
5
|
+
#include <NitroModules/Promise.hpp>
|
|
6
|
+
#include <memory>
|
|
7
|
+
#include <openssl/evp.h>
|
|
8
|
+
#include <openssl/rsa.h>
|
|
9
|
+
#include <string>
|
|
10
|
+
#include <vector>
|
|
11
|
+
|
|
12
|
+
namespace margelo::nitro::crypto {
|
|
13
|
+
|
|
14
|
+
class HybridRsaKeyPair : public HybridRsaKeyPairSpec {
|
|
15
|
+
public:
|
|
16
|
+
HybridRsaKeyPair() : HybridObject(TAG), pkey(nullptr), modulusLength(2048), hashAlgorithm("SHA-256") {}
|
|
17
|
+
~HybridRsaKeyPair() {
|
|
18
|
+
if (pkey) {
|
|
19
|
+
EVP_PKEY_free(pkey);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
std::shared_ptr<Promise<void>> generateKeyPair() override;
|
|
24
|
+
void generateKeyPairSync() override;
|
|
25
|
+
void setModulusLength(double modulusLength) override;
|
|
26
|
+
void setPublicExponent(const std::shared_ptr<ArrayBuffer>& publicExponent) override;
|
|
27
|
+
void setHashAlgorithm(const std::string& hashAlgorithm) override;
|
|
28
|
+
std::shared_ptr<ArrayBuffer> getPublicKey() override;
|
|
29
|
+
std::shared_ptr<ArrayBuffer> getPrivateKey() override;
|
|
30
|
+
KeyObject importKey(const std::string& format, const std::shared_ptr<ArrayBuffer>& keyData, const std::string& algorithm,
|
|
31
|
+
bool extractable, const std::vector<std::string>& keyUsages) override;
|
|
32
|
+
std::shared_ptr<ArrayBuffer> exportKey(const KeyObject& key, const std::string& format) override;
|
|
33
|
+
|
|
34
|
+
private:
|
|
35
|
+
EVP_PKEY* pkey;
|
|
36
|
+
int modulusLength;
|
|
37
|
+
std::vector<unsigned char> publicExponent;
|
|
38
|
+
std::string hashAlgorithm;
|
|
39
|
+
|
|
40
|
+
void checkKeyPair();
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
} // namespace margelo::nitro::crypto
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
#include "HybridSignHandle.hpp"
|
|
2
|
+
|
|
3
|
+
#include "../keys/HybridKeyObjectHandle.hpp"
|
|
4
|
+
#include "SignUtils.hpp"
|
|
5
|
+
#include "Utils.hpp"
|
|
6
|
+
|
|
7
|
+
#include <cstring>
|
|
8
|
+
#include <openssl/err.h>
|
|
9
|
+
#include <openssl/evp.h>
|
|
10
|
+
#include <openssl/rsa.h>
|
|
11
|
+
|
|
12
|
+
namespace margelo::nitro::crypto {
|
|
13
|
+
|
|
14
|
+
using margelo::nitro::NativeArrayBuffer;
|
|
15
|
+
|
|
16
|
+
HybridSignHandle::~HybridSignHandle() {
|
|
17
|
+
if (md_ctx) {
|
|
18
|
+
EVP_MD_CTX_free(md_ctx);
|
|
19
|
+
md_ctx = nullptr;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
void HybridSignHandle::init(const std::string& algorithm) {
|
|
24
|
+
algorithm_name = algorithm;
|
|
25
|
+
md = getDigestByName(algorithm);
|
|
26
|
+
|
|
27
|
+
md_ctx = EVP_MD_CTX_new();
|
|
28
|
+
if (!md_ctx) {
|
|
29
|
+
throw std::runtime_error("Failed to create message digest context");
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
if (EVP_DigestInit_ex(md_ctx, md, nullptr) <= 0) {
|
|
33
|
+
EVP_MD_CTX_free(md_ctx);
|
|
34
|
+
md_ctx = nullptr;
|
|
35
|
+
throw std::runtime_error("Failed to initialize message digest");
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
void HybridSignHandle::update(const std::shared_ptr<ArrayBuffer>& data) {
|
|
40
|
+
if (!md_ctx) {
|
|
41
|
+
throw std::runtime_error("Sign not initialized");
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
auto native_data = ToNativeArrayBuffer(data);
|
|
45
|
+
|
|
46
|
+
// Accumulate raw data for potential one-shot signing (Ed25519/Ed448)
|
|
47
|
+
const uint8_t* ptr = reinterpret_cast<const uint8_t*>(native_data->data());
|
|
48
|
+
data_buffer.insert(data_buffer.end(), ptr, ptr + native_data->size());
|
|
49
|
+
|
|
50
|
+
if (EVP_DigestUpdate(md_ctx, native_data->data(), native_data->size()) <= 0) {
|
|
51
|
+
unsigned long err = ERR_get_error();
|
|
52
|
+
char err_buf[256];
|
|
53
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
54
|
+
throw std::runtime_error("Failed to update digest: " + std::string(err_buf));
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Check if key type requires one-shot signing (Ed25519, Ed448)
|
|
59
|
+
static bool isOneShotVariant(EVP_PKEY* pkey) {
|
|
60
|
+
int type = EVP_PKEY_id(pkey);
|
|
61
|
+
return type == EVP_PKEY_ED25519 || type == EVP_PKEY_ED448;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
std::shared_ptr<ArrayBuffer> HybridSignHandle::sign(const std::shared_ptr<HybridKeyObjectHandleSpec>& keyHandle,
|
|
65
|
+
std::optional<double> padding, std::optional<double> saltLength,
|
|
66
|
+
std::optional<double> dsaEncoding) {
|
|
67
|
+
if (!md_ctx) {
|
|
68
|
+
throw std::runtime_error("Sign not initialized");
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
auto keyHandleImpl = std::static_pointer_cast<HybridKeyObjectHandle>(keyHandle);
|
|
72
|
+
EVP_PKEY* pkey = keyHandleImpl->getKeyObjectData().GetAsymmetricKey().get();
|
|
73
|
+
|
|
74
|
+
if (!pkey) {
|
|
75
|
+
throw std::runtime_error("Invalid private key for signing");
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
size_t sig_len = 0;
|
|
79
|
+
std::unique_ptr<uint8_t[]> sig_buf;
|
|
80
|
+
|
|
81
|
+
// Ed25519/Ed448 require one-shot signing with EVP_DigestSign
|
|
82
|
+
if (isOneShotVariant(pkey)) {
|
|
83
|
+
// Create a new context for one-shot signing
|
|
84
|
+
EVP_MD_CTX* sign_ctx = EVP_MD_CTX_new();
|
|
85
|
+
if (!sign_ctx) {
|
|
86
|
+
throw std::runtime_error("Failed to create signing context");
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Initialize for one-shot signing (pass nullptr for md - Ed25519/Ed448 have built-in hash)
|
|
90
|
+
if (EVP_DigestSignInit(sign_ctx, nullptr, nullptr, nullptr, pkey) <= 0) {
|
|
91
|
+
EVP_MD_CTX_free(sign_ctx);
|
|
92
|
+
throw std::runtime_error("Failed to initialize Ed signing");
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Get the accumulated data from the digest context
|
|
96
|
+
// For Ed25519/Ed448, we need to pass the original data, not a digest
|
|
97
|
+
// Since we've been accumulating with DigestUpdate, we need to use the data buffer
|
|
98
|
+
// Unfortunately, EVP_MD_CTX doesn't expose the accumulated data directly
|
|
99
|
+
// We need to use EVP_DigestSign with the accumulated data
|
|
100
|
+
|
|
101
|
+
// For one-shot variants, determine signature length first
|
|
102
|
+
if (EVP_DigestSign(sign_ctx, nullptr, &sig_len, data_buffer.data(), data_buffer.size()) <= 0) {
|
|
103
|
+
EVP_MD_CTX_free(sign_ctx);
|
|
104
|
+
throw std::runtime_error("Failed to determine Ed signature length");
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
sig_buf = std::make_unique<uint8_t[]>(sig_len);
|
|
108
|
+
if (EVP_DigestSign(sign_ctx, sig_buf.get(), &sig_len, data_buffer.data(), data_buffer.size()) <= 0) {
|
|
109
|
+
EVP_MD_CTX_free(sign_ctx);
|
|
110
|
+
unsigned long err = ERR_get_error();
|
|
111
|
+
char err_buf[256];
|
|
112
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
113
|
+
throw std::runtime_error("Failed to sign with Ed key: " + std::string(err_buf));
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
EVP_MD_CTX_free(sign_ctx);
|
|
117
|
+
} else {
|
|
118
|
+
// Standard signing flow for RSA/ECDSA
|
|
119
|
+
unsigned char digest[EVP_MAX_MD_SIZE];
|
|
120
|
+
unsigned int digest_len = 0;
|
|
121
|
+
|
|
122
|
+
if (EVP_DigestFinal_ex(md_ctx, digest, &digest_len) <= 0) {
|
|
123
|
+
throw std::runtime_error("Failed to finalize digest");
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
EVP_PKEY_CTX* pkey_ctx = EVP_PKEY_CTX_new(pkey, nullptr);
|
|
127
|
+
if (!pkey_ctx) {
|
|
128
|
+
throw std::runtime_error("Failed to create signing context");
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if (EVP_PKEY_sign_init(pkey_ctx) <= 0) {
|
|
132
|
+
EVP_PKEY_CTX_free(pkey_ctx);
|
|
133
|
+
throw std::runtime_error("Failed to initialize signing");
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
if (padding.has_value()) {
|
|
137
|
+
int pad = static_cast<int>(padding.value());
|
|
138
|
+
if (EVP_PKEY_CTX_set_rsa_padding(pkey_ctx, pad) <= 0) {
|
|
139
|
+
EVP_PKEY_CTX_free(pkey_ctx);
|
|
140
|
+
throw std::runtime_error("Failed to set RSA padding");
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
if (saltLength.has_value() && padding.has_value() && static_cast<int>(padding.value()) == RSA_PKCS1_PSS_PADDING) {
|
|
145
|
+
int salt_len = static_cast<int>(saltLength.value());
|
|
146
|
+
if (EVP_PKEY_CTX_set_rsa_pss_saltlen(pkey_ctx, salt_len) <= 0) {
|
|
147
|
+
EVP_PKEY_CTX_free(pkey_ctx);
|
|
148
|
+
throw std::runtime_error("Failed to set PSS salt length");
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (EVP_PKEY_CTX_set_signature_md(pkey_ctx, md) <= 0) {
|
|
153
|
+
EVP_PKEY_CTX_free(pkey_ctx);
|
|
154
|
+
throw std::runtime_error("Failed to set signature digest");
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
if (EVP_PKEY_sign(pkey_ctx, nullptr, &sig_len, digest, digest_len) <= 0) {
|
|
158
|
+
EVP_PKEY_CTX_free(pkey_ctx);
|
|
159
|
+
throw std::runtime_error("Failed to determine signature length");
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
sig_buf = std::make_unique<uint8_t[]>(sig_len);
|
|
163
|
+
if (EVP_PKEY_sign(pkey_ctx, sig_buf.get(), &sig_len, digest, digest_len) <= 0) {
|
|
164
|
+
EVP_PKEY_CTX_free(pkey_ctx);
|
|
165
|
+
unsigned long err = ERR_get_error();
|
|
166
|
+
char err_buf[256];
|
|
167
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
168
|
+
throw std::runtime_error("Failed to sign: " + std::string(err_buf));
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
EVP_PKEY_CTX_free(pkey_ctx);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
int dsa_enc = dsaEncoding.has_value() ? static_cast<int>(dsaEncoding.value()) : kSigEncDER;
|
|
175
|
+
if (dsa_enc == kSigEncP1363) {
|
|
176
|
+
unsigned int n = getBytesOfRS(pkey);
|
|
177
|
+
if (n > 0) {
|
|
178
|
+
auto p1363_buf = std::make_unique<uint8_t[]>(2 * n);
|
|
179
|
+
std::memset(p1363_buf.get(), 0, 2 * n);
|
|
180
|
+
if (convertSignatureToP1363(sig_buf.get(), sig_len, p1363_buf.get(), n)) {
|
|
181
|
+
uint8_t* raw_ptr = p1363_buf.get();
|
|
182
|
+
return std::make_shared<NativeArrayBuffer>(p1363_buf.release(), 2 * n, [raw_ptr]() { delete[] raw_ptr; });
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
uint8_t* raw_ptr = sig_buf.get();
|
|
188
|
+
return std::make_shared<NativeArrayBuffer>(sig_buf.release(), sig_len, [raw_ptr]() { delete[] raw_ptr; });
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
} // namespace margelo::nitro::crypto
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <NitroModules/ArrayBuffer.hpp>
|
|
4
|
+
#include <memory>
|
|
5
|
+
#include <openssl/evp.h>
|
|
6
|
+
#include <optional>
|
|
7
|
+
#include <string>
|
|
8
|
+
#include <vector>
|
|
9
|
+
|
|
10
|
+
#include "HybridKeyObjectHandleSpec.hpp"
|
|
11
|
+
#include "HybridSignHandleSpec.hpp"
|
|
12
|
+
|
|
13
|
+
namespace margelo::nitro::crypto {
|
|
14
|
+
|
|
15
|
+
using namespace facebook;
|
|
16
|
+
|
|
17
|
+
class HybridSignHandle : public HybridSignHandleSpec {
|
|
18
|
+
public:
|
|
19
|
+
HybridSignHandle() : HybridObject(TAG) {}
|
|
20
|
+
~HybridSignHandle();
|
|
21
|
+
|
|
22
|
+
public:
|
|
23
|
+
void init(const std::string& algorithm) override;
|
|
24
|
+
void update(const std::shared_ptr<ArrayBuffer>& data) override;
|
|
25
|
+
std::shared_ptr<ArrayBuffer> sign(const std::shared_ptr<HybridKeyObjectHandleSpec>& keyHandle, std::optional<double> padding,
|
|
26
|
+
std::optional<double> saltLength, std::optional<double> dsaEncoding) override;
|
|
27
|
+
|
|
28
|
+
private:
|
|
29
|
+
EVP_MD_CTX* md_ctx = nullptr;
|
|
30
|
+
const EVP_MD* md = nullptr;
|
|
31
|
+
std::string algorithm_name;
|
|
32
|
+
// Buffer for accumulating data for one-shot signing (Ed25519/Ed448)
|
|
33
|
+
std::vector<uint8_t> data_buffer;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
} // namespace margelo::nitro::crypto
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
#include "HybridVerifyHandle.hpp"
|
|
2
|
+
|
|
3
|
+
#include "../keys/HybridKeyObjectHandle.hpp"
|
|
4
|
+
#include "SignUtils.hpp"
|
|
5
|
+
#include "Utils.hpp"
|
|
6
|
+
|
|
7
|
+
#include <cstring>
|
|
8
|
+
#include <openssl/err.h>
|
|
9
|
+
#include <openssl/evp.h>
|
|
10
|
+
#include <openssl/rsa.h>
|
|
11
|
+
|
|
12
|
+
namespace margelo::nitro::crypto {
|
|
13
|
+
|
|
14
|
+
using margelo::nitro::NativeArrayBuffer;
|
|
15
|
+
|
|
16
|
+
HybridVerifyHandle::~HybridVerifyHandle() {
|
|
17
|
+
if (md_ctx) {
|
|
18
|
+
EVP_MD_CTX_free(md_ctx);
|
|
19
|
+
md_ctx = nullptr;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
void HybridVerifyHandle::init(const std::string& algorithm) {
|
|
24
|
+
algorithm_name = algorithm;
|
|
25
|
+
md = getDigestByName(algorithm);
|
|
26
|
+
|
|
27
|
+
md_ctx = EVP_MD_CTX_new();
|
|
28
|
+
if (!md_ctx) {
|
|
29
|
+
throw std::runtime_error("Failed to create message digest context");
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
if (EVP_DigestInit_ex(md_ctx, md, nullptr) <= 0) {
|
|
33
|
+
EVP_MD_CTX_free(md_ctx);
|
|
34
|
+
md_ctx = nullptr;
|
|
35
|
+
throw std::runtime_error("Failed to initialize message digest");
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
void HybridVerifyHandle::update(const std::shared_ptr<ArrayBuffer>& data) {
|
|
40
|
+
if (!md_ctx) {
|
|
41
|
+
throw std::runtime_error("Verify not initialized");
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
auto native_data = ToNativeArrayBuffer(data);
|
|
45
|
+
|
|
46
|
+
// Accumulate raw data for potential one-shot verification (Ed25519/Ed448)
|
|
47
|
+
const uint8_t* ptr = reinterpret_cast<const uint8_t*>(native_data->data());
|
|
48
|
+
data_buffer.insert(data_buffer.end(), ptr, ptr + native_data->size());
|
|
49
|
+
|
|
50
|
+
if (EVP_DigestUpdate(md_ctx, native_data->data(), native_data->size()) <= 0) {
|
|
51
|
+
unsigned long err = ERR_get_error();
|
|
52
|
+
char err_buf[256];
|
|
53
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
54
|
+
throw std::runtime_error("Failed to update digest: " + std::string(err_buf));
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Check if key type requires one-shot verification (Ed25519, Ed448)
|
|
59
|
+
static bool isOneShotVariant(EVP_PKEY* pkey) {
|
|
60
|
+
int type = EVP_PKEY_id(pkey);
|
|
61
|
+
return type == EVP_PKEY_ED25519 || type == EVP_PKEY_ED448;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
bool HybridVerifyHandle::verify(const std::shared_ptr<HybridKeyObjectHandleSpec>& keyHandle, const std::shared_ptr<ArrayBuffer>& signature,
|
|
65
|
+
std::optional<double> padding, std::optional<double> saltLength, std::optional<double> dsaEncoding) {
|
|
66
|
+
if (!md_ctx) {
|
|
67
|
+
throw std::runtime_error("Verify not initialized");
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
auto keyHandleImpl = std::static_pointer_cast<HybridKeyObjectHandle>(keyHandle);
|
|
71
|
+
EVP_PKEY* pkey = keyHandleImpl->getKeyObjectData().GetAsymmetricKey().get();
|
|
72
|
+
|
|
73
|
+
if (!pkey) {
|
|
74
|
+
throw std::runtime_error("Invalid public key for verification");
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
auto native_sig = ToNativeArrayBuffer(signature);
|
|
78
|
+
const unsigned char* sig_data = native_sig->data();
|
|
79
|
+
size_t sig_len = native_sig->size();
|
|
80
|
+
|
|
81
|
+
// Ed25519/Ed448 require one-shot verification with EVP_DigestVerify
|
|
82
|
+
if (isOneShotVariant(pkey)) {
|
|
83
|
+
EVP_MD_CTX* verify_ctx = EVP_MD_CTX_new();
|
|
84
|
+
if (!verify_ctx) {
|
|
85
|
+
throw std::runtime_error("Failed to create verification context");
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Initialize for one-shot verification (pass nullptr for md - Ed25519/Ed448 have built-in hash)
|
|
89
|
+
if (EVP_DigestVerifyInit(verify_ctx, nullptr, nullptr, nullptr, pkey) <= 0) {
|
|
90
|
+
EVP_MD_CTX_free(verify_ctx);
|
|
91
|
+
throw std::runtime_error("Failed to initialize Ed verification");
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
int result = EVP_DigestVerify(verify_ctx, sig_data, sig_len, data_buffer.data(), data_buffer.size());
|
|
95
|
+
EVP_MD_CTX_free(verify_ctx);
|
|
96
|
+
return result == 1;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Standard verification flow for RSA/ECDSA
|
|
100
|
+
unsigned char digest[EVP_MAX_MD_SIZE];
|
|
101
|
+
unsigned int digest_len = 0;
|
|
102
|
+
|
|
103
|
+
if (EVP_DigestFinal_ex(md_ctx, digest, &digest_len) <= 0) {
|
|
104
|
+
throw std::runtime_error("Failed to finalize digest");
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
std::unique_ptr<uint8_t[]> der_sig_buf;
|
|
108
|
+
int dsa_enc = dsaEncoding.has_value() ? static_cast<int>(dsaEncoding.value()) : kSigEncDER;
|
|
109
|
+
if (dsa_enc == kSigEncP1363) {
|
|
110
|
+
unsigned int n = getBytesOfRS(pkey);
|
|
111
|
+
if (n > 0) {
|
|
112
|
+
size_t der_len = 0;
|
|
113
|
+
der_sig_buf = convertSignatureToDER(sig_data, sig_len, n, &der_len);
|
|
114
|
+
if (der_sig_buf) {
|
|
115
|
+
sig_data = der_sig_buf.get();
|
|
116
|
+
sig_len = der_len;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
EVP_PKEY_CTX* pkey_ctx = EVP_PKEY_CTX_new(pkey, nullptr);
|
|
122
|
+
if (!pkey_ctx) {
|
|
123
|
+
throw std::runtime_error("Failed to create verification context");
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if (EVP_PKEY_verify_init(pkey_ctx) <= 0) {
|
|
127
|
+
EVP_PKEY_CTX_free(pkey_ctx);
|
|
128
|
+
throw std::runtime_error("Failed to initialize verification");
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if (padding.has_value()) {
|
|
132
|
+
int pad = static_cast<int>(padding.value());
|
|
133
|
+
if (EVP_PKEY_CTX_set_rsa_padding(pkey_ctx, pad) <= 0) {
|
|
134
|
+
EVP_PKEY_CTX_free(pkey_ctx);
|
|
135
|
+
throw std::runtime_error("Failed to set RSA padding");
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
if (saltLength.has_value() && padding.has_value() && static_cast<int>(padding.value()) == RSA_PKCS1_PSS_PADDING) {
|
|
140
|
+
int salt_len = static_cast<int>(saltLength.value());
|
|
141
|
+
if (EVP_PKEY_CTX_set_rsa_pss_saltlen(pkey_ctx, salt_len) <= 0) {
|
|
142
|
+
EVP_PKEY_CTX_free(pkey_ctx);
|
|
143
|
+
throw std::runtime_error("Failed to set PSS salt length");
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
if (EVP_PKEY_CTX_set_signature_md(pkey_ctx, md) <= 0) {
|
|
148
|
+
EVP_PKEY_CTX_free(pkey_ctx);
|
|
149
|
+
throw std::runtime_error("Failed to set signature digest");
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
int result = EVP_PKEY_verify(pkey_ctx, sig_data, sig_len, digest, digest_len);
|
|
153
|
+
EVP_PKEY_CTX_free(pkey_ctx);
|
|
154
|
+
|
|
155
|
+
return result == 1;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
} // namespace margelo::nitro::crypto
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <NitroModules/ArrayBuffer.hpp>
|
|
4
|
+
#include <memory>
|
|
5
|
+
#include <openssl/evp.h>
|
|
6
|
+
#include <optional>
|
|
7
|
+
#include <string>
|
|
8
|
+
#include <vector>
|
|
9
|
+
|
|
10
|
+
#include "HybridKeyObjectHandleSpec.hpp"
|
|
11
|
+
#include "HybridVerifyHandleSpec.hpp"
|
|
12
|
+
|
|
13
|
+
namespace margelo::nitro::crypto {
|
|
14
|
+
|
|
15
|
+
using namespace facebook;
|
|
16
|
+
|
|
17
|
+
class HybridVerifyHandle : public HybridVerifyHandleSpec {
|
|
18
|
+
public:
|
|
19
|
+
HybridVerifyHandle() : HybridObject(TAG) {}
|
|
20
|
+
~HybridVerifyHandle();
|
|
21
|
+
|
|
22
|
+
public:
|
|
23
|
+
void init(const std::string& algorithm) override;
|
|
24
|
+
void update(const std::shared_ptr<ArrayBuffer>& data) override;
|
|
25
|
+
bool verify(const std::shared_ptr<HybridKeyObjectHandleSpec>& keyHandle, const std::shared_ptr<ArrayBuffer>& signature,
|
|
26
|
+
std::optional<double> padding, std::optional<double> saltLength, std::optional<double> dsaEncoding) override;
|
|
27
|
+
|
|
28
|
+
private:
|
|
29
|
+
EVP_MD_CTX* md_ctx = nullptr;
|
|
30
|
+
const EVP_MD* md = nullptr;
|
|
31
|
+
std::string algorithm_name;
|
|
32
|
+
// Buffer for accumulating data for one-shot verification (Ed25519/Ed448)
|
|
33
|
+
std::vector<uint8_t> data_buffer;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
} // namespace margelo::nitro::crypto
|