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,348 @@
|
|
|
1
|
+
#include "HybridRsaCipher.hpp"
|
|
2
|
+
#include "../keys/HybridKeyObjectHandle.hpp"
|
|
3
|
+
#include "Utils.hpp"
|
|
4
|
+
|
|
5
|
+
#include <cstring>
|
|
6
|
+
#include <openssl/err.h>
|
|
7
|
+
#include <openssl/evp.h>
|
|
8
|
+
#include <openssl/rsa.h>
|
|
9
|
+
|
|
10
|
+
namespace margelo::nitro::crypto {
|
|
11
|
+
|
|
12
|
+
using margelo::nitro::NativeArrayBuffer;
|
|
13
|
+
|
|
14
|
+
constexpr int kRsaPkcs1Padding = 1;
|
|
15
|
+
constexpr int kRsaOaepPadding = 4;
|
|
16
|
+
|
|
17
|
+
const EVP_MD* getDigestByName(const std::string& hashAlgorithm) {
|
|
18
|
+
if (hashAlgorithm == "SHA-1" || hashAlgorithm == "SHA1" || hashAlgorithm == "sha1" || hashAlgorithm == "sha-1") {
|
|
19
|
+
return EVP_sha1();
|
|
20
|
+
} else if (hashAlgorithm == "SHA-256" || hashAlgorithm == "SHA256" || hashAlgorithm == "sha256" || hashAlgorithm == "sha-256") {
|
|
21
|
+
return EVP_sha256();
|
|
22
|
+
} else if (hashAlgorithm == "SHA-384" || hashAlgorithm == "SHA384" || hashAlgorithm == "sha384" || hashAlgorithm == "sha-384") {
|
|
23
|
+
return EVP_sha384();
|
|
24
|
+
} else if (hashAlgorithm == "SHA-512" || hashAlgorithm == "SHA512" || hashAlgorithm == "sha512" || hashAlgorithm == "sha-512") {
|
|
25
|
+
return EVP_sha512();
|
|
26
|
+
}
|
|
27
|
+
throw std::runtime_error("Unsupported hash algorithm: " + hashAlgorithm);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
int toOpenSSLPadding(int padding) {
|
|
31
|
+
switch (padding) {
|
|
32
|
+
case kRsaPkcs1Padding:
|
|
33
|
+
return RSA_PKCS1_PADDING;
|
|
34
|
+
case kRsaOaepPadding:
|
|
35
|
+
return RSA_PKCS1_OAEP_PADDING;
|
|
36
|
+
default:
|
|
37
|
+
throw std::runtime_error("Unsupported padding mode: " + std::to_string(padding));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
std::shared_ptr<ArrayBuffer> HybridRsaCipher::encrypt(const std::shared_ptr<HybridKeyObjectHandleSpec>& keyHandle,
|
|
42
|
+
const std::shared_ptr<ArrayBuffer>& data, double padding,
|
|
43
|
+
const std::string& hashAlgorithm,
|
|
44
|
+
const std::optional<std::shared_ptr<ArrayBuffer>>& label) {
|
|
45
|
+
auto keyHandleImpl = std::static_pointer_cast<HybridKeyObjectHandle>(keyHandle);
|
|
46
|
+
EVP_PKEY* pkey = keyHandleImpl->getKeyObjectData().GetAsymmetricKey().get();
|
|
47
|
+
|
|
48
|
+
if (!pkey) {
|
|
49
|
+
throw std::runtime_error("Invalid key for RSA encryption");
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
EVP_PKEY_CTX* ctx = EVP_PKEY_CTX_new(pkey, nullptr);
|
|
53
|
+
if (!ctx) {
|
|
54
|
+
throw std::runtime_error("Failed to create EVP_PKEY_CTX");
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (EVP_PKEY_encrypt_init(ctx) <= 0) {
|
|
58
|
+
EVP_PKEY_CTX_free(ctx);
|
|
59
|
+
unsigned long err = ERR_get_error();
|
|
60
|
+
char err_buf[256];
|
|
61
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
62
|
+
throw std::runtime_error("Failed to initialize encryption: " + std::string(err_buf));
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
int paddingInt = static_cast<int>(padding);
|
|
66
|
+
int opensslPadding = toOpenSSLPadding(paddingInt);
|
|
67
|
+
|
|
68
|
+
if (EVP_PKEY_CTX_set_rsa_padding(ctx, opensslPadding) <= 0) {
|
|
69
|
+
EVP_PKEY_CTX_free(ctx);
|
|
70
|
+
throw std::runtime_error("Failed to set RSA padding");
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (paddingInt == kRsaOaepPadding) {
|
|
74
|
+
const EVP_MD* md = getDigestByName(hashAlgorithm);
|
|
75
|
+
if (EVP_PKEY_CTX_set_rsa_oaep_md(ctx, md) <= 0) {
|
|
76
|
+
EVP_PKEY_CTX_free(ctx);
|
|
77
|
+
throw std::runtime_error("Failed to set OAEP hash algorithm");
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (EVP_PKEY_CTX_set_rsa_mgf1_md(ctx, md) <= 0) {
|
|
81
|
+
EVP_PKEY_CTX_free(ctx);
|
|
82
|
+
throw std::runtime_error("Failed to set MGF1 hash algorithm");
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (label.has_value() && label.value()->size() > 0) {
|
|
86
|
+
auto native_label = ToNativeArrayBuffer(label.value());
|
|
87
|
+
unsigned char* label_copy = (unsigned char*)OPENSSL_malloc(native_label->size());
|
|
88
|
+
if (!label_copy) {
|
|
89
|
+
EVP_PKEY_CTX_free(ctx);
|
|
90
|
+
throw std::runtime_error("Failed to allocate memory for label");
|
|
91
|
+
}
|
|
92
|
+
std::memcpy(label_copy, native_label->data(), native_label->size());
|
|
93
|
+
|
|
94
|
+
if (EVP_PKEY_CTX_set0_rsa_oaep_label(ctx, label_copy, native_label->size()) <= 0) {
|
|
95
|
+
OPENSSL_free(label_copy);
|
|
96
|
+
EVP_PKEY_CTX_free(ctx);
|
|
97
|
+
throw std::runtime_error("Failed to set OAEP label");
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
auto native_data = ToNativeArrayBuffer(data);
|
|
103
|
+
const unsigned char* in = native_data->data();
|
|
104
|
+
size_t inlen = native_data->size();
|
|
105
|
+
|
|
106
|
+
size_t outlen;
|
|
107
|
+
if (EVP_PKEY_encrypt(ctx, nullptr, &outlen, in, inlen) <= 0) {
|
|
108
|
+
EVP_PKEY_CTX_free(ctx);
|
|
109
|
+
unsigned long err = ERR_get_error();
|
|
110
|
+
char err_buf[256];
|
|
111
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
112
|
+
throw std::runtime_error("Failed to determine output length: " + std::string(err_buf));
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
auto out_buf = std::make_unique<uint8_t[]>(outlen);
|
|
116
|
+
|
|
117
|
+
if (EVP_PKEY_encrypt(ctx, out_buf.get(), &outlen, in, inlen) <= 0) {
|
|
118
|
+
EVP_PKEY_CTX_free(ctx);
|
|
119
|
+
unsigned long err = ERR_get_error();
|
|
120
|
+
char err_buf[256];
|
|
121
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
122
|
+
throw std::runtime_error("Encryption failed: " + std::string(err_buf));
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
EVP_PKEY_CTX_free(ctx);
|
|
126
|
+
|
|
127
|
+
uint8_t* raw_ptr = out_buf.get();
|
|
128
|
+
return std::make_shared<NativeArrayBuffer>(out_buf.release(), outlen, [raw_ptr]() { delete[] raw_ptr; });
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
std::shared_ptr<ArrayBuffer> HybridRsaCipher::decrypt(const std::shared_ptr<HybridKeyObjectHandleSpec>& keyHandle,
|
|
132
|
+
const std::shared_ptr<ArrayBuffer>& data, double padding,
|
|
133
|
+
const std::string& hashAlgorithm,
|
|
134
|
+
const std::optional<std::shared_ptr<ArrayBuffer>>& label) {
|
|
135
|
+
auto keyHandleImpl = std::static_pointer_cast<HybridKeyObjectHandle>(keyHandle);
|
|
136
|
+
EVP_PKEY* pkey = keyHandleImpl->getKeyObjectData().GetAsymmetricKey().get();
|
|
137
|
+
|
|
138
|
+
if (!pkey) {
|
|
139
|
+
throw std::runtime_error("Invalid key for RSA decryption");
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
EVP_PKEY_CTX* ctx = EVP_PKEY_CTX_new(pkey, nullptr);
|
|
143
|
+
if (!ctx) {
|
|
144
|
+
throw std::runtime_error("Failed to create EVP_PKEY_CTX");
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
if (EVP_PKEY_decrypt_init(ctx) <= 0) {
|
|
148
|
+
EVP_PKEY_CTX_free(ctx);
|
|
149
|
+
unsigned long err = ERR_get_error();
|
|
150
|
+
char err_buf[256];
|
|
151
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
152
|
+
throw std::runtime_error("Failed to initialize decryption: " + std::string(err_buf));
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
int paddingInt = static_cast<int>(padding);
|
|
156
|
+
int opensslPadding = toOpenSSLPadding(paddingInt);
|
|
157
|
+
|
|
158
|
+
if (EVP_PKEY_CTX_set_rsa_padding(ctx, opensslPadding) <= 0) {
|
|
159
|
+
EVP_PKEY_CTX_free(ctx);
|
|
160
|
+
throw std::runtime_error("Failed to set RSA padding");
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
if (paddingInt == kRsaOaepPadding) {
|
|
164
|
+
const EVP_MD* md = getDigestByName(hashAlgorithm);
|
|
165
|
+
if (EVP_PKEY_CTX_set_rsa_oaep_md(ctx, md) <= 0) {
|
|
166
|
+
EVP_PKEY_CTX_free(ctx);
|
|
167
|
+
throw std::runtime_error("Failed to set OAEP hash algorithm");
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
if (EVP_PKEY_CTX_set_rsa_mgf1_md(ctx, md) <= 0) {
|
|
171
|
+
EVP_PKEY_CTX_free(ctx);
|
|
172
|
+
throw std::runtime_error("Failed to set MGF1 hash algorithm");
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
if (label.has_value() && label.value()->size() > 0) {
|
|
176
|
+
auto native_label = ToNativeArrayBuffer(label.value());
|
|
177
|
+
unsigned char* label_copy = (unsigned char*)OPENSSL_malloc(native_label->size());
|
|
178
|
+
if (!label_copy) {
|
|
179
|
+
EVP_PKEY_CTX_free(ctx);
|
|
180
|
+
throw std::runtime_error("Failed to allocate memory for label");
|
|
181
|
+
}
|
|
182
|
+
std::memcpy(label_copy, native_label->data(), native_label->size());
|
|
183
|
+
|
|
184
|
+
if (EVP_PKEY_CTX_set0_rsa_oaep_label(ctx, label_copy, native_label->size()) <= 0) {
|
|
185
|
+
OPENSSL_free(label_copy);
|
|
186
|
+
EVP_PKEY_CTX_free(ctx);
|
|
187
|
+
throw std::runtime_error("Failed to set OAEP label");
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
auto native_data = ToNativeArrayBuffer(data);
|
|
193
|
+
const unsigned char* in = native_data->data();
|
|
194
|
+
size_t inlen = native_data->size();
|
|
195
|
+
|
|
196
|
+
size_t outlen;
|
|
197
|
+
if (EVP_PKEY_decrypt(ctx, nullptr, &outlen, in, inlen) <= 0) {
|
|
198
|
+
EVP_PKEY_CTX_free(ctx);
|
|
199
|
+
unsigned long err = ERR_get_error();
|
|
200
|
+
char err_buf[256];
|
|
201
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
202
|
+
throw std::runtime_error("Failed to determine output length: " + std::string(err_buf));
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
auto out_buf = std::make_unique<uint8_t[]>(outlen);
|
|
206
|
+
|
|
207
|
+
if (EVP_PKEY_decrypt(ctx, out_buf.get(), &outlen, in, inlen) <= 0) {
|
|
208
|
+
EVP_PKEY_CTX_free(ctx);
|
|
209
|
+
unsigned long err = ERR_get_error();
|
|
210
|
+
char err_buf[256];
|
|
211
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
212
|
+
throw std::runtime_error("Decryption failed: " + std::string(err_buf));
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
EVP_PKEY_CTX_free(ctx);
|
|
216
|
+
|
|
217
|
+
uint8_t* raw_ptr = out_buf.get();
|
|
218
|
+
return std::make_shared<NativeArrayBuffer>(out_buf.release(), outlen, [raw_ptr]() { delete[] raw_ptr; });
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
std::shared_ptr<ArrayBuffer> HybridRsaCipher::privateEncrypt(const std::shared_ptr<HybridKeyObjectHandleSpec>& keyHandle,
|
|
222
|
+
const std::shared_ptr<ArrayBuffer>& data, double padding) {
|
|
223
|
+
auto keyHandleImpl = std::static_pointer_cast<HybridKeyObjectHandle>(keyHandle);
|
|
224
|
+
EVP_PKEY* pkey = keyHandleImpl->getKeyObjectData().GetAsymmetricKey().get();
|
|
225
|
+
|
|
226
|
+
if (!pkey) {
|
|
227
|
+
throw std::runtime_error("Invalid key for RSA private encryption");
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
EVP_PKEY_CTX* ctx = EVP_PKEY_CTX_new(pkey, nullptr);
|
|
231
|
+
if (!ctx) {
|
|
232
|
+
throw std::runtime_error("Failed to create EVP_PKEY_CTX");
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
if (EVP_PKEY_sign_init(ctx) <= 0) {
|
|
236
|
+
EVP_PKEY_CTX_free(ctx);
|
|
237
|
+
unsigned long err = ERR_get_error();
|
|
238
|
+
char err_buf[256];
|
|
239
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
240
|
+
throw std::runtime_error("Failed to initialize signing: " + std::string(err_buf));
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
int paddingInt = static_cast<int>(padding);
|
|
244
|
+
int opensslPadding = toOpenSSLPadding(paddingInt);
|
|
245
|
+
|
|
246
|
+
if (EVP_PKEY_CTX_set_rsa_padding(ctx, opensslPadding) <= 0) {
|
|
247
|
+
EVP_PKEY_CTX_free(ctx);
|
|
248
|
+
throw std::runtime_error("Failed to set RSA padding");
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
auto native_data = ToNativeArrayBuffer(data);
|
|
252
|
+
const unsigned char* in = native_data->data();
|
|
253
|
+
size_t inlen = native_data->size();
|
|
254
|
+
|
|
255
|
+
size_t outlen;
|
|
256
|
+
if (EVP_PKEY_sign(ctx, nullptr, &outlen, in, inlen) <= 0) {
|
|
257
|
+
EVP_PKEY_CTX_free(ctx);
|
|
258
|
+
unsigned long err = ERR_get_error();
|
|
259
|
+
char err_buf[256];
|
|
260
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
261
|
+
throw std::runtime_error("Failed to determine output length: " + std::string(err_buf));
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
auto out_buf = std::make_unique<uint8_t[]>(outlen);
|
|
265
|
+
|
|
266
|
+
if (EVP_PKEY_sign(ctx, out_buf.get(), &outlen, in, inlen) <= 0) {
|
|
267
|
+
EVP_PKEY_CTX_free(ctx);
|
|
268
|
+
unsigned long err = ERR_get_error();
|
|
269
|
+
char err_buf[256];
|
|
270
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
271
|
+
throw std::runtime_error("Private encryption failed: " + std::string(err_buf));
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
EVP_PKEY_CTX_free(ctx);
|
|
275
|
+
|
|
276
|
+
uint8_t* raw_ptr = out_buf.get();
|
|
277
|
+
return std::make_shared<NativeArrayBuffer>(out_buf.release(), outlen, [raw_ptr]() { delete[] raw_ptr; });
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
std::shared_ptr<ArrayBuffer> HybridRsaCipher::privateDecrypt(const std::shared_ptr<HybridKeyObjectHandleSpec>& keyHandle,
|
|
281
|
+
const std::shared_ptr<ArrayBuffer>& data, double padding) {
|
|
282
|
+
auto keyHandleImpl = std::static_pointer_cast<HybridKeyObjectHandle>(keyHandle);
|
|
283
|
+
EVP_PKEY* pkey = keyHandleImpl->getKeyObjectData().GetAsymmetricKey().get();
|
|
284
|
+
|
|
285
|
+
if (!pkey) {
|
|
286
|
+
throw std::runtime_error("Invalid key for RSA private decryption");
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
EVP_PKEY_CTX* ctx = EVP_PKEY_CTX_new(pkey, nullptr);
|
|
290
|
+
if (!ctx) {
|
|
291
|
+
throw std::runtime_error("Failed to create EVP_PKEY_CTX");
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
if (EVP_PKEY_verify_recover_init(ctx) <= 0) {
|
|
295
|
+
EVP_PKEY_CTX_free(ctx);
|
|
296
|
+
unsigned long err = ERR_get_error();
|
|
297
|
+
char err_buf[256];
|
|
298
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
299
|
+
throw std::runtime_error("Failed to initialize verify recover: " + std::string(err_buf));
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
int paddingInt = static_cast<int>(padding);
|
|
303
|
+
int opensslPadding = toOpenSSLPadding(paddingInt);
|
|
304
|
+
|
|
305
|
+
if (EVP_PKEY_CTX_set_rsa_padding(ctx, opensslPadding) <= 0) {
|
|
306
|
+
EVP_PKEY_CTX_free(ctx);
|
|
307
|
+
throw std::runtime_error("Failed to set RSA padding");
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
auto native_data = ToNativeArrayBuffer(data);
|
|
311
|
+
const unsigned char* in = native_data->data();
|
|
312
|
+
size_t inlen = native_data->size();
|
|
313
|
+
|
|
314
|
+
size_t outlen;
|
|
315
|
+
if (EVP_PKEY_verify_recover(ctx, nullptr, &outlen, in, inlen) <= 0) {
|
|
316
|
+
EVP_PKEY_CTX_free(ctx);
|
|
317
|
+
unsigned long err = ERR_get_error();
|
|
318
|
+
char err_buf[256];
|
|
319
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
320
|
+
throw std::runtime_error("Failed to determine output length: " + std::string(err_buf));
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
auto out_buf = std::make_unique<uint8_t[]>(outlen);
|
|
324
|
+
|
|
325
|
+
if (EVP_PKEY_verify_recover(ctx, out_buf.get(), &outlen, in, inlen) <= 0) {
|
|
326
|
+
EVP_PKEY_CTX_free(ctx);
|
|
327
|
+
unsigned long err = ERR_get_error();
|
|
328
|
+
char err_buf[256];
|
|
329
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
330
|
+
throw std::runtime_error("Private decryption failed: " + std::string(err_buf));
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
EVP_PKEY_CTX_free(ctx);
|
|
334
|
+
|
|
335
|
+
uint8_t* raw_ptr = out_buf.get();
|
|
336
|
+
return std::make_shared<NativeArrayBuffer>(out_buf.release(), outlen, [raw_ptr]() { delete[] raw_ptr; });
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
void HybridRsaCipher::loadHybridMethods() {
|
|
340
|
+
registerHybrids(this, [](Prototype& prototype) {
|
|
341
|
+
prototype.registerHybridMethod("encrypt", &HybridRsaCipher::encrypt);
|
|
342
|
+
prototype.registerHybridMethod("decrypt", &HybridRsaCipher::decrypt);
|
|
343
|
+
prototype.registerHybridMethod("privateEncrypt", &HybridRsaCipher::privateEncrypt);
|
|
344
|
+
prototype.registerHybridMethod("privateDecrypt", &HybridRsaCipher::privateDecrypt);
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
} // namespace margelo::nitro::crypto
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include "HybridRsaCipherSpec.hpp"
|
|
4
|
+
#include <memory>
|
|
5
|
+
|
|
6
|
+
namespace margelo::nitro::crypto {
|
|
7
|
+
|
|
8
|
+
class HybridRsaCipher : public HybridRsaCipherSpec {
|
|
9
|
+
public:
|
|
10
|
+
HybridRsaCipher() : HybridObject(TAG) {}
|
|
11
|
+
|
|
12
|
+
std::shared_ptr<ArrayBuffer> encrypt(const std::shared_ptr<HybridKeyObjectHandleSpec>& keyHandle,
|
|
13
|
+
const std::shared_ptr<ArrayBuffer>& data, double padding, const std::string& hashAlgorithm,
|
|
14
|
+
const std::optional<std::shared_ptr<ArrayBuffer>>& label) override;
|
|
15
|
+
|
|
16
|
+
std::shared_ptr<ArrayBuffer> decrypt(const std::shared_ptr<HybridKeyObjectHandleSpec>& keyHandle,
|
|
17
|
+
const std::shared_ptr<ArrayBuffer>& data, double padding, const std::string& hashAlgorithm,
|
|
18
|
+
const std::optional<std::shared_ptr<ArrayBuffer>>& label) override;
|
|
19
|
+
|
|
20
|
+
std::shared_ptr<ArrayBuffer> privateEncrypt(const std::shared_ptr<HybridKeyObjectHandleSpec>& keyHandle,
|
|
21
|
+
const std::shared_ptr<ArrayBuffer>& data, double padding) override;
|
|
22
|
+
|
|
23
|
+
std::shared_ptr<ArrayBuffer> privateDecrypt(const std::shared_ptr<HybridKeyObjectHandleSpec>& keyHandle,
|
|
24
|
+
const std::shared_ptr<ArrayBuffer>& data, double padding) override;
|
|
25
|
+
|
|
26
|
+
void loadHybridMethods() override;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
} // namespace margelo::nitro::crypto
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
#include "OCBCipher.hpp"
|
|
2
|
+
#include <cstring>
|
|
3
|
+
#include <openssl/err.h>
|
|
4
|
+
#include <openssl/evp.h>
|
|
5
|
+
|
|
6
|
+
#include "Utils.hpp"
|
|
7
|
+
#include <cstdio>
|
|
8
|
+
#include <iomanip>
|
|
9
|
+
|
|
10
|
+
namespace margelo::nitro::crypto {
|
|
11
|
+
|
|
12
|
+
void OCBCipher::init(const std::shared_ptr<ArrayBuffer>& key, const std::shared_ptr<ArrayBuffer>& iv, size_t tag_len) {
|
|
13
|
+
HybridCipher::init(key, iv);
|
|
14
|
+
auth_tag_len = tag_len;
|
|
15
|
+
|
|
16
|
+
// Set tag length for OCB (must be 12-16 bytes)
|
|
17
|
+
if (auth_tag_len < 12 || auth_tag_len > 16) {
|
|
18
|
+
throw std::runtime_error("OCB tag length must be between 12 and 16 bytes");
|
|
19
|
+
}
|
|
20
|
+
if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, auth_tag_len, nullptr) != 1) {
|
|
21
|
+
throw std::runtime_error("Failed to set OCB tag length");
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
std::shared_ptr<ArrayBuffer> OCBCipher::getAuthTag() {
|
|
26
|
+
checkCtx();
|
|
27
|
+
if (!is_cipher) {
|
|
28
|
+
throw std::runtime_error("getAuthTag can only be called during encryption.");
|
|
29
|
+
}
|
|
30
|
+
auto tag_buf = std::make_unique<uint8_t[]>(auth_tag_len);
|
|
31
|
+
if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, auth_tag_len, tag_buf.get()) != 1) {
|
|
32
|
+
throw std::runtime_error("Failed to get OCB auth tag");
|
|
33
|
+
}
|
|
34
|
+
uint8_t* raw_ptr = tag_buf.get();
|
|
35
|
+
return std::make_shared<NativeArrayBuffer>(tag_buf.release(), auth_tag_len, [raw_ptr]() { delete[] raw_ptr; });
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
bool OCBCipher::setAuthTag(const std::shared_ptr<ArrayBuffer>& tag) {
|
|
39
|
+
checkCtx();
|
|
40
|
+
if (is_cipher) {
|
|
41
|
+
throw std::runtime_error("setAuthTag can only be called during decryption.");
|
|
42
|
+
}
|
|
43
|
+
auto native_tag = ToNativeArrayBuffer(tag);
|
|
44
|
+
size_t tag_len = native_tag->size();
|
|
45
|
+
if (tag_len < 12 || tag_len > 16) {
|
|
46
|
+
throw std::runtime_error("Invalid OCB tag length");
|
|
47
|
+
}
|
|
48
|
+
if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, tag_len, native_tag->data()) != 1) {
|
|
49
|
+
throw std::runtime_error("Failed to set OCB auth tag");
|
|
50
|
+
}
|
|
51
|
+
auth_tag_len = tag_len;
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
} // namespace margelo::nitro::crypto
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include "HybridCipher.hpp"
|
|
4
|
+
|
|
5
|
+
namespace margelo::nitro::crypto {
|
|
6
|
+
|
|
7
|
+
class OCBCipher : public HybridCipher {
|
|
8
|
+
public:
|
|
9
|
+
OCBCipher() : HybridObject(TAG) {}
|
|
10
|
+
void init(const std::shared_ptr<ArrayBuffer>& key, const std::shared_ptr<ArrayBuffer>& iv, size_t tag_len = 16);
|
|
11
|
+
|
|
12
|
+
std::shared_ptr<ArrayBuffer> getAuthTag() override;
|
|
13
|
+
bool setAuthTag(const std::shared_ptr<ArrayBuffer>& tag) override;
|
|
14
|
+
|
|
15
|
+
protected:
|
|
16
|
+
size_t auth_tag_len = 16;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
} // namespace margelo::nitro::crypto
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#include <cstring> // For std::memcpy
|
|
2
|
+
#include <stdexcept> // For std::runtime_error
|
|
3
|
+
|
|
4
|
+
#include "NitroModules/ArrayBuffer.hpp"
|
|
5
|
+
#include "Utils.hpp"
|
|
6
|
+
#include "XSalsa20Cipher.hpp"
|
|
7
|
+
|
|
8
|
+
namespace margelo::nitro::crypto {
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Initialize the cipher with a key and a nonce (using iv argument as nonce)
|
|
12
|
+
*/
|
|
13
|
+
void XSalsa20Cipher::init(const std::shared_ptr<ArrayBuffer> cipher_key, const std::shared_ptr<ArrayBuffer> iv) {
|
|
14
|
+
auto native_key = ToNativeArrayBuffer(cipher_key);
|
|
15
|
+
auto native_iv = ToNativeArrayBuffer(iv);
|
|
16
|
+
|
|
17
|
+
// Validate key size
|
|
18
|
+
if (native_key->size() < crypto_stream_KEYBYTES) {
|
|
19
|
+
throw std::runtime_error("XSalsa20 key too short: expected " + std::to_string(crypto_stream_KEYBYTES) + " bytes, got " +
|
|
20
|
+
std::to_string(native_key->size()) + " bytes.");
|
|
21
|
+
}
|
|
22
|
+
// Validate nonce size
|
|
23
|
+
if (native_iv->size() < crypto_stream_NONCEBYTES) {
|
|
24
|
+
throw std::runtime_error("XSalsa20 nonce too short: expected " + std::to_string(crypto_stream_NONCEBYTES) + " bytes, got " +
|
|
25
|
+
std::to_string(native_iv->size()) + " bytes.");
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Copy key and nonce data
|
|
29
|
+
std::memcpy(key, native_key->data(), crypto_stream_KEYBYTES);
|
|
30
|
+
std::memcpy(nonce, native_iv->data(), crypto_stream_NONCEBYTES);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* xsalsa20 call to sodium implementation
|
|
35
|
+
*/
|
|
36
|
+
std::shared_ptr<ArrayBuffer> XSalsa20Cipher::update(const std::shared_ptr<ArrayBuffer>& data) {
|
|
37
|
+
#ifndef BLSALLOC_SODIUM
|
|
38
|
+
throw std::runtime_error("XSalsa20Cipher: libsodium must be enabled to use this cipher (BLSALLOC_SODIUM is not defined).");
|
|
39
|
+
#else
|
|
40
|
+
auto native_data = ToNativeArrayBuffer(data);
|
|
41
|
+
auto output = new uint8_t[native_data->size()];
|
|
42
|
+
int result = crypto_stream_xor(output, native_data->data(), native_data->size(), nonce, key);
|
|
43
|
+
if (result != 0) {
|
|
44
|
+
throw std::runtime_error("XSalsa20Cipher: Failed to update");
|
|
45
|
+
}
|
|
46
|
+
return std::make_shared<NativeArrayBuffer>(output, native_data->size(), [=]() { delete[] output; });
|
|
47
|
+
#endif
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* xsalsa20 does not have a final step, returns empty buffer
|
|
52
|
+
*/
|
|
53
|
+
std::shared_ptr<ArrayBuffer> XSalsa20Cipher::final() {
|
|
54
|
+
#ifndef BLSALLOC_SODIUM
|
|
55
|
+
throw std::runtime_error("XSalsa20Cipher: libsodium must be enabled to use this cipher (BLSALLOC_SODIUM is not defined).");
|
|
56
|
+
#else
|
|
57
|
+
return std::make_shared<NativeArrayBuffer>(nullptr, 0, nullptr);
|
|
58
|
+
#endif
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
} // namespace margelo::nitro::crypto
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#if BLSALLOC_SODIUM
|
|
4
|
+
#include "sodium.h"
|
|
5
|
+
#else
|
|
6
|
+
// Define XSalsa20 constants when sodium is disabled (for compilation purposes)
|
|
7
|
+
#define crypto_stream_KEYBYTES 32 // XSalsa20 key size (32 bytes)
|
|
8
|
+
#define crypto_stream_NONCEBYTES 24 // XSalsa20 nonce size (24 bytes)
|
|
9
|
+
#endif
|
|
10
|
+
|
|
11
|
+
#include "HybridCipher.hpp"
|
|
12
|
+
#include "NitroModules/ArrayBuffer.hpp"
|
|
13
|
+
|
|
14
|
+
namespace margelo::nitro::crypto {
|
|
15
|
+
|
|
16
|
+
class XSalsa20Cipher : public HybridCipher {
|
|
17
|
+
public:
|
|
18
|
+
XSalsa20Cipher() : HybridObject(TAG) {}
|
|
19
|
+
~XSalsa20Cipher() {
|
|
20
|
+
// Let parent destructor free the context
|
|
21
|
+
ctx = nullptr;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
void init(const std::shared_ptr<ArrayBuffer> cipher_key, const std::shared_ptr<ArrayBuffer> iv) override;
|
|
25
|
+
std::shared_ptr<ArrayBuffer> update(const std::shared_ptr<ArrayBuffer>& data) override;
|
|
26
|
+
std::shared_ptr<ArrayBuffer> final() override;
|
|
27
|
+
|
|
28
|
+
private:
|
|
29
|
+
uint8_t key[crypto_stream_KEYBYTES];
|
|
30
|
+
uint8_t nonce[crypto_stream_NONCEBYTES];
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
} // namespace margelo::nitro::crypto
|