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,199 @@
|
|
|
1
|
+
#include "CCMCipher.hpp"
|
|
2
|
+
#include "Utils.hpp"
|
|
3
|
+
#include <openssl/err.h>
|
|
4
|
+
#include <openssl/evp.h>
|
|
5
|
+
#include <stdexcept>
|
|
6
|
+
|
|
7
|
+
namespace margelo::nitro::crypto {
|
|
8
|
+
|
|
9
|
+
void CCMCipher::init(const std::shared_ptr<ArrayBuffer> cipher_key, const std::shared_ptr<ArrayBuffer> iv) {
|
|
10
|
+
// 1. Call the base class initializer first
|
|
11
|
+
try {
|
|
12
|
+
HybridCipher::init(cipher_key, iv);
|
|
13
|
+
} catch (const std::exception& e) {
|
|
14
|
+
throw; // Re-throw after logging
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// Ensure context is valid after base init
|
|
18
|
+
checkCtx();
|
|
19
|
+
|
|
20
|
+
// 2. Perform CCM-specific initialization
|
|
21
|
+
auto native_iv = ToNativeArrayBuffer(iv);
|
|
22
|
+
size_t iv_len = native_iv->size();
|
|
23
|
+
|
|
24
|
+
// Set the IV length using CCM-specific control
|
|
25
|
+
if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_SET_IVLEN, iv_len, nullptr) != 1) {
|
|
26
|
+
unsigned long err = ERR_get_error();
|
|
27
|
+
char err_buf[256];
|
|
28
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
29
|
+
throw std::runtime_error("CCMCipher: Failed to set IV length: " + std::string(err_buf));
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Set the expected/output tag length using CCM-specific control.
|
|
33
|
+
// auth_tag_len should have been defaulted or set via setArgs in the base init.
|
|
34
|
+
if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_SET_TAG, auth_tag_len, nullptr) != 1) {
|
|
35
|
+
unsigned long err = ERR_get_error();
|
|
36
|
+
char err_buf[256];
|
|
37
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
38
|
+
throw std::runtime_error("CCMCipher: Failed to set tag length: " + std::string(err_buf));
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Finally, initialize the key and IV using the parameters passed to this function.
|
|
42
|
+
auto native_key = ToNativeArrayBuffer(cipher_key); // Use 'cipher_key' parameter
|
|
43
|
+
const unsigned char* key_ptr = reinterpret_cast<const unsigned char*>(native_key->data());
|
|
44
|
+
const unsigned char* iv_ptr = reinterpret_cast<const unsigned char*>(native_iv->data());
|
|
45
|
+
|
|
46
|
+
// The last argument (is_cipher) should be consistent with the initial setup call.
|
|
47
|
+
if (EVP_CipherInit_ex(ctx, nullptr, nullptr, key_ptr, iv_ptr, is_cipher) != 1) {
|
|
48
|
+
unsigned long err = ERR_get_error();
|
|
49
|
+
char err_buf[256];
|
|
50
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
51
|
+
throw std::runtime_error("CCMCipher: Failed to set key/IV: " + std::string(err_buf));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
std::shared_ptr<ArrayBuffer> CCMCipher::update(const std::shared_ptr<ArrayBuffer>& data) {
|
|
56
|
+
checkCtx();
|
|
57
|
+
auto native_data = ToNativeArrayBuffer(data);
|
|
58
|
+
size_t in_len = native_data->size();
|
|
59
|
+
if (in_len < 0 || in_len > INT_MAX) {
|
|
60
|
+
throw std::runtime_error("Invalid message length");
|
|
61
|
+
}
|
|
62
|
+
int out_len = 0;
|
|
63
|
+
|
|
64
|
+
if (!is_cipher) {
|
|
65
|
+
maybePassAuthTagToOpenSSL();
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
int block_size = EVP_CIPHER_CTX_block_size(ctx);
|
|
69
|
+
if (block_size <= 0) {
|
|
70
|
+
throw std::runtime_error("Invalid block size in update");
|
|
71
|
+
}
|
|
72
|
+
out_len = in_len + block_size - 1;
|
|
73
|
+
if (out_len < 0 || out_len < in_len) {
|
|
74
|
+
throw std::runtime_error("Calculated output buffer size invalid in update");
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
auto out_buf = std::make_unique<unsigned char[]>(out_len);
|
|
78
|
+
const uint8_t* in = reinterpret_cast<const uint8_t*>(native_data->data());
|
|
79
|
+
|
|
80
|
+
int actual_out_len = 0;
|
|
81
|
+
int ret = EVP_CipherUpdate(ctx, out_buf.get(), &actual_out_len, in, in_len);
|
|
82
|
+
|
|
83
|
+
if (!is_cipher) {
|
|
84
|
+
// Decryption: Check for tag verification failure
|
|
85
|
+
if (ret <= 0) {
|
|
86
|
+
// Tag verification failed (or other decryption error)
|
|
87
|
+
throw std::runtime_error("CCM Decryption: Tag verification failed");
|
|
88
|
+
}
|
|
89
|
+
} else {
|
|
90
|
+
// Encryption: Check for standard errors
|
|
91
|
+
if (ret != 1) {
|
|
92
|
+
pending_auth_failed = true; // Should this be set for encryption failure?
|
|
93
|
+
unsigned long err = ERR_get_error();
|
|
94
|
+
char err_buf[256];
|
|
95
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
96
|
+
throw std::runtime_error("Error in update() performing encryption operation: " + std::string(err_buf));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// If we reached here, the operation (encryption or decryption) succeeded
|
|
100
|
+
|
|
101
|
+
unsigned char* final_output = out_buf.release();
|
|
102
|
+
return std::make_shared<NativeArrayBuffer>(final_output, actual_out_len, [=]() { delete[] final_output; });
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
std::shared_ptr<ArrayBuffer> CCMCipher::final() {
|
|
106
|
+
checkCtx();
|
|
107
|
+
|
|
108
|
+
// CCM decryption does not use final. Verification happens in the last update call.
|
|
109
|
+
if (!is_cipher) {
|
|
110
|
+
// Return an empty buffer, matching Node.js behavior
|
|
111
|
+
unsigned char* empty_output = new unsigned char[0];
|
|
112
|
+
return std::make_shared<NativeArrayBuffer>(empty_output, 0, [=]() { delete[] empty_output; });
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Proceed only for encryption
|
|
116
|
+
int block_size = EVP_CIPHER_CTX_block_size(ctx);
|
|
117
|
+
if (block_size <= 0) {
|
|
118
|
+
throw std::runtime_error("Invalid block size");
|
|
119
|
+
}
|
|
120
|
+
auto out_buf = std::make_unique<unsigned char[]>(block_size);
|
|
121
|
+
int out_len = 0;
|
|
122
|
+
|
|
123
|
+
if (!EVP_CipherFinal_ex(ctx, out_buf.get(), &out_len)) {
|
|
124
|
+
unsigned long err = ERR_get_error();
|
|
125
|
+
char err_buf[256];
|
|
126
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
127
|
+
throw std::runtime_error("Encryption finalization failed: " + std::string(err_buf));
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (auth_tag_len == 0) {
|
|
131
|
+
auth_tag_len = sizeof(auth_tag);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_GET_TAG, auth_tag_len, auth_tag) != 1) {
|
|
135
|
+
unsigned long err = ERR_get_error();
|
|
136
|
+
char err_buf[256];
|
|
137
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
138
|
+
throw std::runtime_error("Failed to get auth tag after finalization: " + std::string(err_buf));
|
|
139
|
+
}
|
|
140
|
+
auth_tag_state = kAuthTagKnown;
|
|
141
|
+
|
|
142
|
+
unsigned char* final_output = out_buf.release();
|
|
143
|
+
return std::make_shared<NativeArrayBuffer>(final_output, out_len, [=]() { delete[] final_output; });
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
bool CCMCipher::setAAD(const std::shared_ptr<ArrayBuffer>& data, std::optional<double> plaintextLength) {
|
|
147
|
+
checkCtx();
|
|
148
|
+
if (!plaintextLength.has_value()) {
|
|
149
|
+
throw std::runtime_error("CCM mode requires plaintextLength to be set");
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// IMPORTANT: For CCM decryption (!is_cipher), OpenSSL requires this initial update
|
|
153
|
+
// call to specify the TOTAL LENGTH OF THE CIPHERTEXT, not the plaintext.
|
|
154
|
+
// The caller (JS) must ensure `plaintextLength` holds the ciphertext length when decrypting.
|
|
155
|
+
int data_len = static_cast<int>(plaintextLength.value());
|
|
156
|
+
if (data_len > kMaxMessageSize) {
|
|
157
|
+
throw std::runtime_error("Provided data length exceeds maximum allowed size");
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if (!is_cipher) {
|
|
161
|
+
if (!maybePassAuthTagToOpenSSL()) {
|
|
162
|
+
unsigned long err = ERR_get_error();
|
|
163
|
+
char err_buf[256];
|
|
164
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
165
|
+
throw std::runtime_error("setAAD: Failed to set auth tag parameters: " + std::string(err_buf));
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
int out_len = 0;
|
|
170
|
+
|
|
171
|
+
// Get AAD data and length *before* deciding whether to set total length
|
|
172
|
+
auto native_aad = ToNativeArrayBuffer(data);
|
|
173
|
+
size_t aad_len = native_aad->size();
|
|
174
|
+
|
|
175
|
+
// 1. Set the total *ciphertext* length. This seems necessary based on examples,
|
|
176
|
+
// BUT the wiki says "(only needed if AAD is passed)". Let's skip if decrypting and AAD length is 0.
|
|
177
|
+
bool should_set_total_length = is_cipher || aad_len > 0;
|
|
178
|
+
if (should_set_total_length) {
|
|
179
|
+
if (EVP_CipherUpdate(ctx, nullptr, &out_len, nullptr, data_len) != 1) {
|
|
180
|
+
unsigned long err = ERR_get_error();
|
|
181
|
+
char err_buf[256];
|
|
182
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
183
|
+
throw std::runtime_error("CCMCipher: Failed to set expected length: " + std::string(err_buf));
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// 2. Process AAD Data
|
|
188
|
+
// Per OpenSSL CCM decryption examples, this MUST be called even if aad_len is 0.
|
|
189
|
+
// Pass nullptr as the output buffer, the AAD data pointer, and its length.
|
|
190
|
+
if (EVP_CipherUpdate(ctx, nullptr, &out_len, native_aad->data(), aad_len) != 1) {
|
|
191
|
+
unsigned long err = ERR_get_error();
|
|
192
|
+
char err_buf[256];
|
|
193
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
194
|
+
throw std::runtime_error("CCMCipher: Failed to update AAD: " + std::string(err_buf));
|
|
195
|
+
}
|
|
196
|
+
return true;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
} // namespace margelo::nitro::crypto
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include "HybridCipher.hpp"
|
|
4
|
+
|
|
5
|
+
namespace margelo::nitro::crypto {
|
|
6
|
+
|
|
7
|
+
class CCMCipher : public HybridCipher {
|
|
8
|
+
public:
|
|
9
|
+
CCMCipher() : HybridObject(TAG) {}
|
|
10
|
+
~CCMCipher() {
|
|
11
|
+
// Let parent destructor free the context
|
|
12
|
+
ctx = nullptr;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
void init(const std::shared_ptr<ArrayBuffer> cipher_key, const std::shared_ptr<ArrayBuffer> iv) override;
|
|
16
|
+
std::shared_ptr<ArrayBuffer> update(const std::shared_ptr<ArrayBuffer>& data) override;
|
|
17
|
+
std::shared_ptr<ArrayBuffer> final() override;
|
|
18
|
+
bool setAAD(const std::shared_ptr<ArrayBuffer>& data, std::optional<double> plaintextLength) override;
|
|
19
|
+
|
|
20
|
+
private:
|
|
21
|
+
// CCM mode supports messages up to 2^(8L) - 1 bytes where L is the length of nonce
|
|
22
|
+
// With a 12-byte nonce (L=3), max size is 2^24 - 1 bytes
|
|
23
|
+
static constexpr int kMaxMessageSize = (1 << 24) - 1;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
} // namespace margelo::nitro::crypto
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
#include "ChaCha20Cipher.hpp"
|
|
2
|
+
#include "Utils.hpp"
|
|
3
|
+
#include <openssl/err.h>
|
|
4
|
+
#include <openssl/evp.h>
|
|
5
|
+
#include <stdexcept>
|
|
6
|
+
|
|
7
|
+
namespace margelo::nitro::crypto {
|
|
8
|
+
|
|
9
|
+
void ChaCha20Cipher::init(const std::shared_ptr<ArrayBuffer> cipher_key, const std::shared_ptr<ArrayBuffer> iv) {
|
|
10
|
+
// Clean up any existing context
|
|
11
|
+
if (ctx) {
|
|
12
|
+
EVP_CIPHER_CTX_free(ctx);
|
|
13
|
+
ctx = nullptr;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// Get ChaCha20 cipher implementation
|
|
17
|
+
const EVP_CIPHER* cipher = EVP_chacha20();
|
|
18
|
+
if (!cipher) {
|
|
19
|
+
throw std::runtime_error("Failed to get ChaCha20 cipher implementation");
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Create a new context
|
|
23
|
+
ctx = EVP_CIPHER_CTX_new();
|
|
24
|
+
if (!ctx) {
|
|
25
|
+
throw std::runtime_error("Failed to create cipher context");
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Initialize the encryption/decryption operation
|
|
29
|
+
if (EVP_CipherInit_ex(ctx, cipher, nullptr, nullptr, nullptr, is_cipher) != 1) {
|
|
30
|
+
unsigned long err = ERR_get_error();
|
|
31
|
+
char err_buf[256];
|
|
32
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
33
|
+
EVP_CIPHER_CTX_free(ctx);
|
|
34
|
+
ctx = nullptr;
|
|
35
|
+
throw std::runtime_error("ChaCha20Cipher: Failed initial CipherInit setup: " + std::string(err_buf));
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Set key and IV
|
|
39
|
+
auto native_key = ToNativeArrayBuffer(cipher_key);
|
|
40
|
+
auto native_iv = ToNativeArrayBuffer(iv);
|
|
41
|
+
|
|
42
|
+
// Validate key size
|
|
43
|
+
if (native_key->size() != kKeySize) {
|
|
44
|
+
throw std::runtime_error("ChaCha20 key must be 32 bytes");
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Validate IV size
|
|
48
|
+
if (native_iv->size() != kIVSize) {
|
|
49
|
+
throw std::runtime_error("ChaCha20 IV must be 16 bytes");
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const unsigned char* key_ptr = reinterpret_cast<const unsigned char*>(native_key->data());
|
|
53
|
+
const unsigned char* iv_ptr = reinterpret_cast<const unsigned char*>(native_iv->data());
|
|
54
|
+
|
|
55
|
+
if (EVP_CipherInit_ex(ctx, nullptr, nullptr, key_ptr, iv_ptr, is_cipher) != 1) {
|
|
56
|
+
unsigned long err = ERR_get_error();
|
|
57
|
+
char err_buf[256];
|
|
58
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
59
|
+
EVP_CIPHER_CTX_free(ctx);
|
|
60
|
+
ctx = nullptr;
|
|
61
|
+
throw std::runtime_error("ChaCha20Cipher: Failed to set key/IV: " + std::string(err_buf));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
std::shared_ptr<ArrayBuffer> ChaCha20Cipher::update(const std::shared_ptr<ArrayBuffer>& data) {
|
|
66
|
+
checkCtx();
|
|
67
|
+
auto native_data = ToNativeArrayBuffer(data);
|
|
68
|
+
size_t in_len = native_data->size();
|
|
69
|
+
if (in_len > INT_MAX) {
|
|
70
|
+
throw std::runtime_error("Message too long");
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// For ChaCha20, output size equals input size since it's a stream cipher
|
|
74
|
+
int out_len = in_len;
|
|
75
|
+
uint8_t* out = new uint8_t[out_len];
|
|
76
|
+
|
|
77
|
+
// Perform the cipher update operation
|
|
78
|
+
if (EVP_CipherUpdate(ctx, out, &out_len, native_data->data(), in_len) != 1) {
|
|
79
|
+
delete[] out;
|
|
80
|
+
unsigned long err = ERR_get_error();
|
|
81
|
+
char err_buf[256];
|
|
82
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
83
|
+
throw std::runtime_error("ChaCha20Cipher: Failed to update: " + std::string(err_buf));
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Create and return a new buffer of exact size needed
|
|
87
|
+
return std::make_shared<NativeArrayBuffer>(out, out_len, [=]() { delete[] out; });
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
std::shared_ptr<ArrayBuffer> ChaCha20Cipher::final() {
|
|
91
|
+
checkCtx();
|
|
92
|
+
// For ChaCha20, final() should return an empty buffer since it's a stream cipher
|
|
93
|
+
unsigned char* empty_output = new unsigned char[0];
|
|
94
|
+
return std::make_shared<NativeArrayBuffer>(empty_output, 0, [=]() { delete[] empty_output; });
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
} // namespace margelo::nitro::crypto
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include "HybridCipher.hpp"
|
|
4
|
+
|
|
5
|
+
namespace margelo::nitro::crypto {
|
|
6
|
+
|
|
7
|
+
class ChaCha20Cipher : public HybridCipher {
|
|
8
|
+
public:
|
|
9
|
+
ChaCha20Cipher() : HybridObject(TAG) {}
|
|
10
|
+
~ChaCha20Cipher() {
|
|
11
|
+
// Let parent destructor free the context
|
|
12
|
+
ctx = nullptr;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
void init(const std::shared_ptr<ArrayBuffer> cipher_key, const std::shared_ptr<ArrayBuffer> iv) override;
|
|
16
|
+
std::shared_ptr<ArrayBuffer> update(const std::shared_ptr<ArrayBuffer>& data) override;
|
|
17
|
+
std::shared_ptr<ArrayBuffer> final() override;
|
|
18
|
+
|
|
19
|
+
private:
|
|
20
|
+
// ChaCha20 uses a 256-bit key (32 bytes) and a 128-bit IV (16 bytes)
|
|
21
|
+
static constexpr int kKeySize = 32;
|
|
22
|
+
static constexpr int kIVSize = 16;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
} // namespace margelo::nitro::crypto
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
#include "ChaCha20Poly1305Cipher.hpp"
|
|
2
|
+
#include "Utils.hpp"
|
|
3
|
+
#include <openssl/err.h>
|
|
4
|
+
#include <openssl/evp.h>
|
|
5
|
+
#include <stdexcept>
|
|
6
|
+
|
|
7
|
+
namespace margelo::nitro::crypto {
|
|
8
|
+
|
|
9
|
+
void ChaCha20Poly1305Cipher::init(const std::shared_ptr<ArrayBuffer> cipher_key, const std::shared_ptr<ArrayBuffer> iv) {
|
|
10
|
+
// Clean up any existing context
|
|
11
|
+
if (ctx) {
|
|
12
|
+
EVP_CIPHER_CTX_free(ctx);
|
|
13
|
+
ctx = nullptr;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// Get ChaCha20-Poly1305 cipher implementation
|
|
17
|
+
const EVP_CIPHER* cipher = EVP_chacha20_poly1305();
|
|
18
|
+
if (!cipher) {
|
|
19
|
+
throw std::runtime_error("Failed to get ChaCha20-Poly1305 cipher implementation");
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Create a new context
|
|
23
|
+
ctx = EVP_CIPHER_CTX_new();
|
|
24
|
+
if (!ctx) {
|
|
25
|
+
throw std::runtime_error("Failed to create cipher context");
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Initialize the encryption/decryption operation
|
|
29
|
+
if (EVP_CipherInit_ex(ctx, cipher, nullptr, nullptr, nullptr, is_cipher) != 1) {
|
|
30
|
+
unsigned long err = ERR_get_error();
|
|
31
|
+
char err_buf[256];
|
|
32
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
33
|
+
EVP_CIPHER_CTX_free(ctx);
|
|
34
|
+
ctx = nullptr;
|
|
35
|
+
throw std::runtime_error("ChaCha20Poly1305Cipher: Failed initial CipherInit setup: " + std::string(err_buf));
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Set key and IV
|
|
39
|
+
auto native_key = ToNativeArrayBuffer(cipher_key);
|
|
40
|
+
auto native_iv = ToNativeArrayBuffer(iv);
|
|
41
|
+
|
|
42
|
+
// Validate key size
|
|
43
|
+
if (native_key->size() != kKeySize) {
|
|
44
|
+
throw std::runtime_error("ChaCha20-Poly1305 key must be 32 bytes");
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Validate nonce size
|
|
48
|
+
if (native_iv->size() != kNonceSize) {
|
|
49
|
+
throw std::runtime_error("ChaCha20-Poly1305 nonce must be 12 bytes");
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const unsigned char* key_ptr = reinterpret_cast<const unsigned char*>(native_key->data());
|
|
53
|
+
const unsigned char* iv_ptr = reinterpret_cast<const unsigned char*>(native_iv->data());
|
|
54
|
+
|
|
55
|
+
if (EVP_CipherInit_ex(ctx, nullptr, nullptr, key_ptr, iv_ptr, is_cipher) != 1) {
|
|
56
|
+
unsigned long err = ERR_get_error();
|
|
57
|
+
char err_buf[256];
|
|
58
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
59
|
+
EVP_CIPHER_CTX_free(ctx);
|
|
60
|
+
ctx = nullptr;
|
|
61
|
+
throw std::runtime_error("ChaCha20Poly1305Cipher: Failed to set key/IV: " + std::string(err_buf));
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Reset final_called flag
|
|
65
|
+
final_called = false;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
std::shared_ptr<ArrayBuffer> ChaCha20Poly1305Cipher::update(const std::shared_ptr<ArrayBuffer>& data) {
|
|
69
|
+
checkCtx();
|
|
70
|
+
auto native_data = ToNativeArrayBuffer(data);
|
|
71
|
+
size_t in_len = native_data->size();
|
|
72
|
+
if (in_len > INT_MAX) {
|
|
73
|
+
throw std::runtime_error("Message too long");
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// For ChaCha20-Poly1305, output size equals input size since it's a stream cipher
|
|
77
|
+
int out_len = in_len;
|
|
78
|
+
uint8_t* out = new uint8_t[out_len];
|
|
79
|
+
|
|
80
|
+
// Perform the cipher update operation
|
|
81
|
+
if (EVP_CipherUpdate(ctx, out, &out_len, native_data->data(), in_len) != 1) {
|
|
82
|
+
delete[] out;
|
|
83
|
+
unsigned long err = ERR_get_error();
|
|
84
|
+
char err_buf[256];
|
|
85
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
86
|
+
throw std::runtime_error("ChaCha20Poly1305Cipher: Failed to update: " + std::string(err_buf));
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Create and return a new buffer of exact size needed
|
|
90
|
+
return std::make_shared<NativeArrayBuffer>(out, out_len, [=]() { delete[] out; });
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
std::shared_ptr<ArrayBuffer> ChaCha20Poly1305Cipher::final() {
|
|
94
|
+
checkCtx();
|
|
95
|
+
|
|
96
|
+
// For ChaCha20-Poly1305, we need to call final to generate the tag
|
|
97
|
+
int out_len = 0;
|
|
98
|
+
unsigned char* out = new unsigned char[0];
|
|
99
|
+
|
|
100
|
+
if (EVP_CipherFinal_ex(ctx, out, &out_len) != 1) {
|
|
101
|
+
delete[] out;
|
|
102
|
+
unsigned long err = ERR_get_error();
|
|
103
|
+
char err_buf[256];
|
|
104
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
105
|
+
throw std::runtime_error("ChaCha20Poly1305Cipher: Failed to finalize: " + std::string(err_buf));
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
final_called = true;
|
|
109
|
+
return std::make_shared<NativeArrayBuffer>(out, out_len, [=]() { delete[] out; });
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
bool ChaCha20Poly1305Cipher::setAAD(const std::shared_ptr<ArrayBuffer>& data, std::optional<double> plaintextLength) {
|
|
113
|
+
checkCtx();
|
|
114
|
+
auto native_aad = ToNativeArrayBuffer(data);
|
|
115
|
+
size_t aad_len = native_aad->size();
|
|
116
|
+
|
|
117
|
+
// Set AAD data
|
|
118
|
+
int out_len = 0;
|
|
119
|
+
if (EVP_CipherUpdate(ctx, nullptr, &out_len, native_aad->data(), aad_len) != 1) {
|
|
120
|
+
unsigned long err = ERR_get_error();
|
|
121
|
+
char err_buf[256];
|
|
122
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
123
|
+
throw std::runtime_error("ChaCha20Poly1305Cipher: Failed to set AAD: " + std::string(err_buf));
|
|
124
|
+
}
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
std::shared_ptr<ArrayBuffer> ChaCha20Poly1305Cipher::getAuthTag() {
|
|
129
|
+
checkCtx();
|
|
130
|
+
if (!is_cipher) {
|
|
131
|
+
throw std::runtime_error("getAuthTag can only be called during encryption");
|
|
132
|
+
}
|
|
133
|
+
if (!final_called) {
|
|
134
|
+
throw std::runtime_error("getAuthTag must be called after final()");
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Get the authentication tag
|
|
138
|
+
auto tag_buf = std::make_unique<uint8_t[]>(kTagSize);
|
|
139
|
+
if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, kTagSize, tag_buf.get()) != 1) {
|
|
140
|
+
unsigned long err = ERR_get_error();
|
|
141
|
+
char err_buf[256];
|
|
142
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
143
|
+
throw std::runtime_error("ChaCha20Poly1305Cipher: Failed to get auth tag: " + std::string(err_buf));
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
uint8_t* raw_ptr = tag_buf.get();
|
|
147
|
+
return std::make_shared<NativeArrayBuffer>(tag_buf.release(), kTagSize, [raw_ptr]() { delete[] raw_ptr; });
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
bool ChaCha20Poly1305Cipher::setAuthTag(const std::shared_ptr<ArrayBuffer>& tag) {
|
|
151
|
+
checkCtx();
|
|
152
|
+
if (is_cipher) {
|
|
153
|
+
throw std::runtime_error("setAuthTag can only be called during decryption");
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
auto native_tag = ToNativeArrayBuffer(tag);
|
|
157
|
+
if (native_tag->size() != kTagSize) {
|
|
158
|
+
throw std::runtime_error("ChaCha20-Poly1305 tag must be 16 bytes");
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, kTagSize, native_tag->data()) != 1) {
|
|
162
|
+
unsigned long err = ERR_get_error();
|
|
163
|
+
char err_buf[256];
|
|
164
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
165
|
+
throw std::runtime_error("ChaCha20Poly1305Cipher: Failed to set auth tag: " + std::string(err_buf));
|
|
166
|
+
}
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
} // namespace margelo::nitro::crypto
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include "HybridCipher.hpp"
|
|
4
|
+
|
|
5
|
+
namespace margelo::nitro::crypto {
|
|
6
|
+
|
|
7
|
+
class ChaCha20Poly1305Cipher : public HybridCipher {
|
|
8
|
+
public:
|
|
9
|
+
ChaCha20Poly1305Cipher() : HybridObject(TAG), final_called(false) {}
|
|
10
|
+
~ChaCha20Poly1305Cipher() {
|
|
11
|
+
// Let parent destructor free the context
|
|
12
|
+
ctx = nullptr;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
void init(const std::shared_ptr<ArrayBuffer> cipher_key, const std::shared_ptr<ArrayBuffer> iv) override;
|
|
16
|
+
std::shared_ptr<ArrayBuffer> update(const std::shared_ptr<ArrayBuffer>& data) override;
|
|
17
|
+
std::shared_ptr<ArrayBuffer> final() override;
|
|
18
|
+
bool setAAD(const std::shared_ptr<ArrayBuffer>& data, std::optional<double> plaintextLength) override;
|
|
19
|
+
std::shared_ptr<ArrayBuffer> getAuthTag() override;
|
|
20
|
+
bool setAuthTag(const std::shared_ptr<ArrayBuffer>& tag) override;
|
|
21
|
+
|
|
22
|
+
private:
|
|
23
|
+
// ChaCha20-Poly1305 uses a 256-bit key (32 bytes) and a 96-bit nonce (12 bytes)
|
|
24
|
+
static constexpr int kKeySize = 32;
|
|
25
|
+
static constexpr int kNonceSize = 12;
|
|
26
|
+
static constexpr int kTagSize = 16; // Poly1305 tag is always 16 bytes
|
|
27
|
+
bool final_called;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
} // namespace margelo::nitro::crypto
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
#include "GCMCipher.hpp"
|
|
2
|
+
#include "Utils.hpp"
|
|
3
|
+
#include <openssl/err.h>
|
|
4
|
+
#include <openssl/evp.h>
|
|
5
|
+
#include <stdexcept>
|
|
6
|
+
|
|
7
|
+
namespace margelo::nitro::crypto {
|
|
8
|
+
|
|
9
|
+
void GCMCipher::init(const std::shared_ptr<ArrayBuffer> cipher_key, const std::shared_ptr<ArrayBuffer> iv) {
|
|
10
|
+
// Clean up any existing context
|
|
11
|
+
if (ctx) {
|
|
12
|
+
EVP_CIPHER_CTX_free(ctx);
|
|
13
|
+
ctx = nullptr;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// 1. Get cipher implementation by name
|
|
17
|
+
const EVP_CIPHER* cipher = EVP_get_cipherbyname(cipher_type.c_str());
|
|
18
|
+
if (!cipher) {
|
|
19
|
+
throw std::runtime_error("Unknown cipher " + cipher_type);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// 2. Create a new context
|
|
23
|
+
ctx = EVP_CIPHER_CTX_new();
|
|
24
|
+
if (!ctx) {
|
|
25
|
+
throw std::runtime_error("Failed to create cipher context");
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// 3. Initialize with cipher type only (no key/IV yet)
|
|
29
|
+
if (EVP_CipherInit_ex(ctx, cipher, nullptr, nullptr, nullptr, is_cipher) != 1) {
|
|
30
|
+
unsigned long err = ERR_get_error();
|
|
31
|
+
char err_buf[256];
|
|
32
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
33
|
+
EVP_CIPHER_CTX_free(ctx);
|
|
34
|
+
ctx = nullptr;
|
|
35
|
+
throw std::runtime_error("GCMCipher: Failed initial CipherInit setup: " + std::string(err_buf));
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// 4. Set IV length for non-standard IV sizes (GCM default is 96 bits/12 bytes)
|
|
39
|
+
auto native_iv = ToNativeArrayBuffer(iv);
|
|
40
|
+
size_t iv_len = native_iv->size();
|
|
41
|
+
|
|
42
|
+
if (iv_len != 12) { // Only set if not the default length
|
|
43
|
+
if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, static_cast<int>(iv_len), nullptr) != 1) {
|
|
44
|
+
unsigned long err = ERR_get_error();
|
|
45
|
+
char err_buf[256];
|
|
46
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
47
|
+
EVP_CIPHER_CTX_free(ctx);
|
|
48
|
+
ctx = nullptr;
|
|
49
|
+
throw std::runtime_error("GCMCipher: Failed to set IV length: " + std::string(err_buf));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// 5. Now set the key and IV
|
|
54
|
+
auto native_key = ToNativeArrayBuffer(cipher_key);
|
|
55
|
+
const unsigned char* key_ptr = reinterpret_cast<const unsigned char*>(native_key->data());
|
|
56
|
+
const unsigned char* iv_ptr = reinterpret_cast<const unsigned char*>(native_iv->data());
|
|
57
|
+
|
|
58
|
+
if (EVP_CipherInit_ex(ctx, nullptr, nullptr, key_ptr, iv_ptr, is_cipher) != 1) {
|
|
59
|
+
unsigned long err = ERR_get_error();
|
|
60
|
+
char err_buf[256];
|
|
61
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
62
|
+
EVP_CIPHER_CTX_free(ctx);
|
|
63
|
+
ctx = nullptr;
|
|
64
|
+
throw std::runtime_error("GCMCipher: Failed to set key/IV: " + std::string(err_buf));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
} // namespace margelo::nitro::crypto
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include "HybridCipher.hpp"
|
|
4
|
+
|
|
5
|
+
namespace margelo::nitro::crypto {
|
|
6
|
+
|
|
7
|
+
class GCMCipher : public HybridCipher {
|
|
8
|
+
public:
|
|
9
|
+
GCMCipher() : HybridObject(TAG) {}
|
|
10
|
+
|
|
11
|
+
void init(const std::shared_ptr<ArrayBuffer> cipher_key, const std::shared_ptr<ArrayBuffer> iv) override;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
} // namespace margelo::nitro::crypto
|