diff --git a/Cargo.lock b/Cargo.lock index 81efe1e..2d63a08 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -23,9 +23,9 @@ dependencies = [ [[package]] name = "adler2" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aead" @@ -64,18 +64,6 @@ dependencies = [ "password-hash", ] -[[package]] -name = "arrayref" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" - -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" - [[package]] name = "async-channel" version = "2.3.1" @@ -102,9 +90,9 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "backtrace" @@ -135,18 +123,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" -version = "1.7.3" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" - -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] +checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" [[package]] name = "bitflags" @@ -169,17 +148,6 @@ dependencies = [ "digest", ] -[[package]] -name = "blake2b_simd" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06e903a20b159e944f91ec8499fe1e55651480c541ea0a584f5d967c49ad9d99" -dependencies = [ - "arrayref", - "arrayvec", - "constant_time_eq", -] - [[package]] name = "block-buffer" version = "0.10.4" @@ -204,9 +172,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.17.0" +version = "3.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" +checksum = "793db76d6187cd04dff33004d8e6c9cc4e05cd330500379d2394209271b4aeee" [[package]] name = "byteorder" @@ -222,9 +190,9 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cc" -version = "1.2.25" +version = "1.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0fc897dc1e865cc67c0e05a836d9d3f1df3cbe442aa4a9473b18e12624a4951" +checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc" dependencies = [ "shlex", ] @@ -237,9 +205,9 @@ checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" [[package]] name = "chacha20" @@ -278,9 +246,9 @@ dependencies = [ [[package]] name = "color-eyre" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e1761c0e16f8883bbbb8ce5990867f4f06bf11a0253da6495a04ce4b6ef0ec" +checksum = "e5920befb47832a6d61ee3a3a846565cfa39b331331e68a3b1d1116630f2f26d" dependencies = [ "backtrace", "color-spantrace", @@ -293,9 +261,9 @@ dependencies = [ [[package]] name = "color-spantrace" -version = "0.2.2" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ddd8d5bfda1e11a501d0a7303f3bfed9aa632ebdb859be40d0fd70478ed70d5" +checksum = "b8b88ea9df13354b55bc7234ebcce36e6ef896aca2e42a15de9e10edce01b427" dependencies = [ "once_cell", "owo-colors", @@ -328,12 +296,6 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" -[[package]] -name = "constant_time_eq" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" - [[package]] name = "core-foundation" version = "0.10.1" @@ -409,27 +371,22 @@ dependencies = [ [[package]] name = "crypto-layer" version = "0.1.0" -source = "git+https://github.com/nmshd/rust-crypto.git#4e3f7506424ff14256238734e198708ac4e7e5fe" +source = "git+https://github.com/nmshd/rust-crypto.git#9b4b256e48e6949e09a3775a1ce73ddcee7b2452" dependencies = [ "anyhow", "argon2", "base64", - "bincode", "blake2", - "blake2b_simd", "chacha20poly1305", "core-foundation", - "der", "digest", "ed25519-compact", "enum_dispatch", "hmac", - "libloading", + "itertools", "nanoid", "p256", - "pkcs8", "pollster", - "redb", "ring", "rmp-serde", "robusta_jni", @@ -439,10 +396,9 @@ dependencies = [ "sha2", "sha3", "sled", - "strum", + "strum 0.27.1", "thiserror 2.0.12", "tracing", - "tracing-attributes", "tracing-subscriber", "x25519-dalek", "zeroize", @@ -457,7 +413,7 @@ dependencies = [ "crypto-layer", "neon", "num", - "strum", + "strum 0.26.3", "thiserror 2.0.12", "tracing", "tracing-subscriber", @@ -492,7 +448,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -613,7 +569,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -736,7 +692,7 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", "wasm-bindgen", ] @@ -823,6 +779,15 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.15" @@ -876,9 +841,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.172" +version = "0.2.174" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" +checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" [[package]] name = "libloading" @@ -887,7 +852,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" dependencies = [ "cfg-if", - "windows-targets 0.53.0", + "windows-targets 0.53.2", ] [[package]] @@ -907,7 +872,7 @@ checksum = "04d55ca5d5a14363da83bf3c33874b8feaa34653e760d5216d7ef9829c88001a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -937,15 +902,15 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.4" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "miniz_oxide" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", ] @@ -985,7 +950,7 @@ checksum = "c39e43767817fc963f90f400600967a2b2403602c6440685d09a6bc4e02b70b1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -1088,9 +1053,9 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "owo-colors" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26995317201fa17f3656c36716aed4a7c81743a9634ac4c99c0eeda495db0cec" +checksum = "48dd4f4a2c8405440fd0462561f0e5806bd0f77e86f51c761481bdd4018b545e" [[package]] name = "p256" @@ -1266,9 +1231,9 @@ dependencies = [ [[package]] name = "r-efi" -version = "5.2.0" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "rand" @@ -1329,15 +1294,6 @@ dependencies = [ "getrandom 0.3.3", ] -[[package]] -name = "redb" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cef6a6d3a65ea334d6cdfb31fa2525c20184b7aa7bd1ad1e2e37502610d4609f" -dependencies = [ - "libc", -] - [[package]] name = "redox_syscall" version = "0.2.16" @@ -1466,9 +1422,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.24" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" [[package]] name = "rustc_version" @@ -1572,7 +1528,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -1651,9 +1607,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.15.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "spki" @@ -1682,21 +1638,27 @@ name = "strum" version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" + +[[package]] +name = "strum" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" dependencies = [ "strum_macros", ] [[package]] name = "strum_macros" -version = "0.26.4" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" dependencies = [ "heck", "proc-macro2", "quote", "rustversion", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -1718,9 +1680,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.101" +version = "2.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" +checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" dependencies = [ "proc-macro2", "quote", @@ -1753,7 +1715,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -1764,17 +1726,16 @@ checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] name = "thread_local" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" dependencies = [ "cfg-if", - "once_cell", ] [[package]] @@ -1800,20 +1761,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.28" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" dependencies = [ "once_cell", "valuable", @@ -1910,9 +1871,9 @@ dependencies = [ [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasi" @@ -1944,7 +1905,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", "wasm-bindgen-shared", ] @@ -1966,7 +1927,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -2047,9 +2008,9 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.0" +version = "0.53.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef" dependencies = [ "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", @@ -2180,22 +2141,22 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.25" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" +checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.25" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" +checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -2215,5 +2176,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] diff --git a/README.md b/README.md index f724f9e..a25c566 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,10 @@ This command uses the [@neon-rs/cli](https://www.npmjs.com/package/@neon-rs/cli) It is possible to filter according to modules (see the [docs](https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html)). + ```pwsh + $env:RUST_LOG="crypto_layer_node=trace,crypto_layer=warn" + ``` + - Activate full backtrace: ```bash diff --git a/cSpell.json b/cSpell.json index 8e685d5..ee04b76 100644 --- a/cSpell.json +++ b/cSpell.json @@ -8,10 +8,12 @@ "fgrep", "fromjs", "Granual", + "HMAC", "keyhandle", "keypairhandle", "msvc", "nmshd", + "pswd", "robinraju", "rustup", "softprops", diff --git a/crates/crypto-layer-node/src/fromjs/config.rs b/crates/crypto-layer-node/src/fromjs/config.rs index 501fa28..500b4eb 100644 --- a/crates/crypto-layer-node/src/fromjs/config.rs +++ b/crates/crypto-layer-node/src/fromjs/config.rs @@ -4,7 +4,7 @@ use neon::prelude::*; use super::error::{bad_parameter, js_result, rw_lock_poisoned, ConversionError}; use super::{from_wrapped_enum, from_wrapped_simple_enum, wrapped_array_to_hash_set}; -use crate::{JsKeyHandle, JsKeyPairHandle}; +use crate::{BoxedKeyHandle, BoxedKeyPairHandle, JsKeyHandle, JsKeyPairHandle}; /// Converts `ProviderConfig` from `crypto-layer-ts-types` to `ProviderConfig` from `crypto-layer`. #[tracing::instrument(level = "trace", skip_all)] @@ -63,7 +63,21 @@ pub fn from_wrapped_provider_impl_config<'a>( }) } -/// Converts `AdditionalConfig` from `crypto-layer-ts-types` to `AdditionalConfig` from `crypto-layer`. +fn boxed_key_handle_from_node_key_handle( + cx: &mut FunctionContext, + obj: Handle, +) -> Result { + Ok((**bad_parameter(obj.get::(cx, "keyHandle"))?).clone()) +} + +fn boxed_key_pair_handle_from_node_key_pair_handle( + cx: &mut FunctionContext, + obj: Handle, +) -> Result { + Ok((**bad_parameter(obj.get::(cx, "keyPairHandle"))?).clone()) +} + +/// Converts `AdditionalConfig` from `rs-crypto-types` to `AdditionalConfig` from `crypto-layer`. /// /// # Errors /// * `KVStoreConfig` is currently not supported and will crash the program with `unimplemented!()`. @@ -81,10 +95,10 @@ pub fn from_wrapped_additional_config( } let obj = obj_option.unwrap(); + let obj = bad_parameter(obj.downcast::(cx))?; let result = match additional_config { AdditionalConfigDiscriminants::FileStoreConfig => { - let obj = bad_parameter(obj.downcast::(cx))?; let db_path_js = bad_parameter(obj.get::(cx, "db_dir"))?; AdditionalConfig::FileStoreConfig { @@ -92,7 +106,7 @@ pub fn from_wrapped_additional_config( } } AdditionalConfigDiscriminants::KVStoreConfig => { - // Implementing this is problamatic: + // Implementing this is problematic: // There is only one node thread running. // Meaning that to call methods given to rust, rust queues theses method calls for node to run, when the thread // is available. @@ -100,22 +114,32 @@ pub fn from_wrapped_additional_config( unimplemented!() } AdditionalConfigDiscriminants::StorageConfigHMAC => { - let key_handle_js = bad_parameter(obj.downcast::(cx))?; + let boxed_key_handle = boxed_key_handle_from_node_key_handle(cx, obj)?; - let key_handle = rw_lock_poisoned(key_handle_js.read())?; + let key_handle = rw_lock_poisoned(boxed_key_handle.read())?; AdditionalConfig::StorageConfigHMAC(key_handle.clone()) } AdditionalConfigDiscriminants::StorageConfigDSA => { - let key_pair_handle_js = bad_parameter(obj.downcast::(cx))?; + let key_pair_handle_js = boxed_key_pair_handle_from_node_key_pair_handle(cx, obj)?; let key_pair_handle = rw_lock_poisoned(key_pair_handle_js.read())?; AdditionalConfig::StorageConfigDSA(key_pair_handle.clone()) } - AdditionalConfigDiscriminants::StorageConfigPass => { - let pass_js = bad_parameter(obj.downcast::(cx))?; - AdditionalConfig::StorageConfigPass(pass_js.value(cx)) + AdditionalConfigDiscriminants::StorageConfigSymmetricEncryption => { + let key_handle_js = boxed_key_handle_from_node_key_handle(cx, obj)?; + + let key_handle = rw_lock_poisoned(key_handle_js.read())?; + + AdditionalConfig::StorageConfigSymmetricEncryption(key_handle.clone()) + } + AdditionalConfigDiscriminants::StorageConfigAsymmetricEncryption => { + let key_pair_handle_js = boxed_key_pair_handle_from_node_key_pair_handle(cx, obj)?; + + let key_pair_handle = rw_lock_poisoned(key_pair_handle_js.read())?; + + AdditionalConfig::StorageConfigAsymmetricEncryption(key_pair_handle.clone()) } }; @@ -147,7 +171,7 @@ pub(crate) fn from_wrapped_key_pair_spec( cx: &mut FunctionContext, wrapped: Handle, ) -> Result { - let asymc_spec_js = js_result(wrapped.get(cx, "asym_spec"))?; + let asym_spec_js = js_result(wrapped.get(cx, "asym_spec"))?; let cipher_js = js_result(wrapped.get::(cx, "cipher"))?; let signing_hash_js = js_result(wrapped.get(cx, "signing_hash"))?; let ephemeral_js = js_result(wrapped.get::(cx, "ephemeral"))?; @@ -160,7 +184,7 @@ pub(crate) fn from_wrapped_key_pair_spec( }; Ok(KeyPairSpec { - asym_spec: from_wrapped_simple_enum(cx, asymc_spec_js)?, + asym_spec: from_wrapped_simple_enum(cx, asym_spec_js)?, cipher, signing_hash: from_wrapped_simple_enum(cx, signing_hash_js)?, ephemeral: ephemeral_js.value(cx), diff --git a/crates/crypto-layer-node/src/lib.rs b/crates/crypto-layer-node/src/lib.rs index 1dc3f91..2b632b9 100644 --- a/crates/crypto-layer-node/src/lib.rs +++ b/crates/crypto-layer-node/src/lib.rs @@ -23,8 +23,10 @@ use fromjs::*; use tojs::config::wrap_provider_config; use tojs::*; -type JsKeyHandle = JsBox>>>; -type JsKeyPairHandle = JsBox>>>; +type BoxedKeyHandle = Arc>>; +type JsKeyHandle = JsBox; +type BoxedKeyPairHandle = Arc>>; +type JsKeyPairHandle = JsBox; type JsProvider = JsBox>>>; type JsDhExchange = JsBox>>>; diff --git a/package-lock.json b/package-lock.json index 7249cad..691fe4d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,16 @@ { "name": "@nmshd/rs-crypto-node", - "version": "0.13.0", + "version": "0.14.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@nmshd/rs-crypto-node", - "version": "0.13.0", + "version": "0.14.0", "license": "MIT", "dependencies": { "@neon-rs/load": "^0.1.73", - "@nmshd/rs-crypto-types": "^0.10.0" + "@nmshd/rs-crypto-types": "^0.11.0" }, "devDependencies": { "@eslint/js": "^9.21.0", @@ -24,15 +24,16 @@ "jest": "^29.7.0", "jiti": "^2.4.2", "prettier": "3.5.3", + "tmp-promise": "^3.0.3", "ts-jest": "^29.2.5", "typescript": "^5.3.3", "typescript-eslint": "^8.25.0" }, "optionalDependencies": { - "@nmshd/rs-crypto-node-darwin-arm64": "0.12.1", - "@nmshd/rs-crypto-node-darwin-x64": "0.12.1", - "@nmshd/rs-crypto-node-linux-x64-gnu": "0.12.1", - "@nmshd/rs-crypto-node-win32-x64-msvc": "0.12.1" + "@nmshd/rs-crypto-node-darwin-arm64": "0.13.0", + "@nmshd/rs-crypto-node-darwin-x64": "0.13.0", + "@nmshd/rs-crypto-node-linux-x64-gnu": "0.13.0", + "@nmshd/rs-crypto-node-win32-x64-msvc": "0.13.0" } }, "node_modules/@ampproject/remapping": { @@ -1393,9 +1394,9 @@ "license": "MIT" }, "node_modules/@nmshd/rs-crypto-node-darwin-arm64": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/@nmshd/rs-crypto-node-darwin-arm64/-/rs-crypto-node-darwin-arm64-0.12.1.tgz", - "integrity": "sha512-JqoB5FAHJXWuhR62p8xxjM84CFKJt/52nb+lujxE7aC7m8SkzEYmMcY56UUD8VaNj9QjeN012Ee8HT2JSf1mbQ==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@nmshd/rs-crypto-node-darwin-arm64/-/rs-crypto-node-darwin-arm64-0.13.0.tgz", + "integrity": "sha512-GhBKc5h5edxUg1Zg4iAGEbLn1exc4IwgLMX9I6aLtJsbmNcov3xCY8t0R5RlTY0PF/mVgoSOe+iHPUcXBi72mQ==", "cpu": [ "arm64" ], @@ -1406,9 +1407,9 @@ ] }, "node_modules/@nmshd/rs-crypto-node-darwin-x64": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/@nmshd/rs-crypto-node-darwin-x64/-/rs-crypto-node-darwin-x64-0.12.1.tgz", - "integrity": "sha512-ZgN1rWOFuWOGhll5O+ju/UXtiE9BqLEgXmXYlO/05JRFHhbGBIHXaEF/aplUpcI6mr6tulzqfLwT1RHjfR3c0g==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@nmshd/rs-crypto-node-darwin-x64/-/rs-crypto-node-darwin-x64-0.13.0.tgz", + "integrity": "sha512-UtQBYf5zmxVqHKpe3pcQmkcn5kY+4kTMJYRbGf+wcvA+c4aTXsytz2BKmxWRzRHJPL/p0YnEgZAzqUn9gnUPIA==", "cpu": [ "x64" ], @@ -1419,9 +1420,9 @@ ] }, "node_modules/@nmshd/rs-crypto-node-linux-x64-gnu": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/@nmshd/rs-crypto-node-linux-x64-gnu/-/rs-crypto-node-linux-x64-gnu-0.12.1.tgz", - "integrity": "sha512-VP506AOvc30S7tajxPg0wU1ikjX+unJA0fHy+sX6D5sFNWHbciJahFVpfOPApvuG04hdBHbT3E+Vw5pgWwO51Q==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@nmshd/rs-crypto-node-linux-x64-gnu/-/rs-crypto-node-linux-x64-gnu-0.13.0.tgz", + "integrity": "sha512-WaDVTErKUPYWD5/04CtNVATZCIJqk2PLBmrVxuEQ8wCS9xGozfd4Aa2OuQKk56Ygiohz9D54LRHF3cGG3NCitw==", "cpu": [ "x64" ], @@ -1432,9 +1433,9 @@ ] }, "node_modules/@nmshd/rs-crypto-node-win32-x64-msvc": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/@nmshd/rs-crypto-node-win32-x64-msvc/-/rs-crypto-node-win32-x64-msvc-0.12.1.tgz", - "integrity": "sha512-VxixKbixKLevaOY3tsqbXa2CkFvEA+GSz9DBDU8Kwdgu1MStvJcwEdkHTFDQx8P6blkac9AHSgCT9RZ5ZQzHHw==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@nmshd/rs-crypto-node-win32-x64-msvc/-/rs-crypto-node-win32-x64-msvc-0.13.0.tgz", + "integrity": "sha512-XLTyhpiyIKtZubx/55n4YZqcwT7ldG4s6MbXxKHX60WT2PRImH4zjquWtA1A79aEv0n5LUvHU8ZC0c+TNalSkg==", "cpu": [ "x64" ], @@ -1445,9 +1446,9 @@ ] }, "node_modules/@nmshd/rs-crypto-types": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@nmshd/rs-crypto-types/-/rs-crypto-types-0.10.0.tgz", - "integrity": "sha512-TVWL0oxbyl+6M8eM/cdLMywZTeGBDseIETYddkn+Q6Am+WUOD1QcB43FJKri1R5W0oh+61My5jynD+9l1X+Pug==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@nmshd/rs-crypto-types/-/rs-crypto-types-0.11.0.tgz", + "integrity": "sha512-xP/NQhK3I2ui0j6IsIlAJ0FJKRW1Av7gZzdAiBoFpCE1OhENt2lTdh5ilgGCKR4ddPhaDLIvaBkTTbQU0tUOOA==", "license": "MIT", "dependencies": { "typia": "^8.0.3" @@ -2956,6 +2957,18 @@ "node": ">=4" } }, + "node_modules/external-editor/node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -5514,15 +5527,23 @@ "license": "MIT" }, "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true, "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, "engines": { - "node": ">=0.6.0" + "node": ">=14.14" + } + }, + "node_modules/tmp-promise": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tmp": "^0.2.0" } }, "node_modules/tmpl": { diff --git a/package.json b/package.json index f9f692f..5bafba0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@nmshd/rs-crypto-node", - "version": "0.13.0", + "version": "0.14.0", "description": "crypto layer ts interface for nodejs", "homepage": "https://enmeshed.eu", "repository": "github:nmshd/crypto-layer-node", @@ -56,18 +56,19 @@ "jest": "^29.7.0", "jiti": "^2.4.2", "prettier": "3.5.3", + "tmp-promise": "^3.0.3", "ts-jest": "^29.2.5", "typescript": "^5.3.3", "typescript-eslint": "^8.25.0" }, "dependencies": { "@neon-rs/load": "^0.1.73", - "@nmshd/rs-crypto-types": "^0.10.0" + "@nmshd/rs-crypto-types": "^0.11.0" }, "optionalDependencies": { - "@nmshd/rs-crypto-node-darwin-arm64": "0.13.0", - "@nmshd/rs-crypto-node-darwin-x64": "0.13.0", - "@nmshd/rs-crypto-node-linux-x64-gnu": "0.13.0", - "@nmshd/rs-crypto-node-win32-x64-msvc": "0.13.0" + "@nmshd/rs-crypto-node-darwin-arm64": "0.14.0", + "@nmshd/rs-crypto-node-darwin-x64": "0.14.0", + "@nmshd/rs-crypto-node-linux-x64-gnu": "0.14.0", + "@nmshd/rs-crypto-node-win32-x64-msvc": "0.14.0" } } \ No newline at end of file diff --git a/platforms/darwin-arm64/package.json b/platforms/darwin-arm64/package.json index 419691e..ab23782 100644 --- a/platforms/darwin-arm64/package.json +++ b/platforms/darwin-arm64/package.json @@ -2,7 +2,7 @@ "name": "@nmshd/rs-crypto-node-darwin-arm64", "description": "Prebuilt binary package for `rs-crypto-node` on `darwin-arm64`.", "repository": "github:nmshd/crypto-layer-node", - "version": "0.13.0", + "version": "0.14.0", "os": [ "darwin" ], diff --git a/platforms/darwin-x64/package.json b/platforms/darwin-x64/package.json index 7688ece..e4deea7 100644 --- a/platforms/darwin-x64/package.json +++ b/platforms/darwin-x64/package.json @@ -2,7 +2,7 @@ "name": "@nmshd/rs-crypto-node-darwin-x64", "description": "Prebuilt binary package for `rs-layer-ts` on `darwin-x64`.", "repository": "github:nmshd/crypto-layer-node", - "version": "0.13.0", + "version": "0.14.0", "os": [ "darwin" ], diff --git a/platforms/linux-arm64-gnu/package.json b/platforms/linux-arm64-gnu/package.json index 9c12486..6b409c7 100644 --- a/platforms/linux-arm64-gnu/package.json +++ b/platforms/linux-arm64-gnu/package.json @@ -2,7 +2,7 @@ "name": "@nmshd/rs-crypto-node-linux-arm64-gnu", "description": "Prebuilt binary package for `rs-layer-ts` on `linux-arm64-gnu`.", "repository": "github:nmshd/crypto-layer-node", - "version": "0.13.0", + "version": "0.14.0", "os": [ "linux" ], diff --git a/platforms/linux-x64-gnu/package.json b/platforms/linux-x64-gnu/package.json index 81ccda8..24bd92d 100644 --- a/platforms/linux-x64-gnu/package.json +++ b/platforms/linux-x64-gnu/package.json @@ -2,7 +2,7 @@ "name": "@nmshd/rs-crypto-node-linux-x64-gnu", "description": "Prebuilt binary package for `rs-layer-ts` on `linux-x64-gnu`.", "repository": "github:nmshd/crypto-layer-node", - "version": "0.13.0", + "version": "0.14.0", "os": [ "linux" ], diff --git a/platforms/win32-x64-msvc/package.json b/platforms/win32-x64-msvc/package.json index 4101be4..06ab37a 100644 --- a/platforms/win32-x64-msvc/package.json +++ b/platforms/win32-x64-msvc/package.json @@ -2,7 +2,7 @@ "name": "@nmshd/rs-crypto-node-win32-x64-msvc", "description": "Prebuilt binary package for `rs-layer-ts` on `win32-x64-msvc`.", "repository": "github:nmshd/crypto-layer-node", - "version": "0.13.0", + "version": "0.14.0", "os": [ "win32" ], diff --git a/src/index.cts b/src/index.cts index 9c14e70..ef2a329 100644 --- a/src/index.cts +++ b/src/index.cts @@ -367,7 +367,8 @@ class NodeProvider implements Provider { } class NodeKeyHandle implements KeyHandle { - private keyHandle: BareKeyHandle; + // Do not change this variable. The rust code needs to unwrap this `NodeKeyHandle` to a `BareKeyHandle` on provider creation. + public keyHandle: BareKeyHandle; constructor(bareKeyHandle: BareKeyHandle) { this.keyHandle = bareKeyHandle; @@ -423,7 +424,8 @@ class NodeKeyHandle implements KeyHandle { } class NodeKeyPairHandle implements KeyPairHandle { - private keyPairHandle: BareKeyPairHandle; + // Do not change this variable. The rust code needs to unwrap this `NodeKeyPairHandle` to a `BareKeyPairHandle` on provider creation. + public keyPairHandle: BareKeyPairHandle; constructor(bareKeyPairHandle: BareKeyPairHandle) { this.keyPairHandle = bareKeyPairHandle; diff --git a/tests/common.ts b/tests/common.ts index db435b2..9046a76 100644 --- a/tests/common.ts +++ b/tests/common.ts @@ -1,2 +1,9 @@ +import { dir, DirectoryResult } from "tmp-promise"; + export const SOFTWARE_PROVIDER_NAME = "SoftwareProvider"; -export const DB_DIR_PATH = "./tests/test_db"; + +export async function testDir(): Promise { + return await dir({ + unsafeCleanup: true, + }); +} diff --git a/tests/dh-exchange.test.ts b/tests/dh-exchange.test.ts index 33d3b3b..58b9816 100644 --- a/tests/dh-exchange.test.ts +++ b/tests/dh-exchange.test.ts @@ -8,7 +8,7 @@ import { } from "@nmshd/rs-crypto-types"; import { createProviderFromName } from "../lib/index.cjs"; -import { DB_DIR_PATH, SOFTWARE_PROVIDER_NAME } from "./common"; +import { SOFTWARE_PROVIDER_NAME, testDir } from "./common"; function checkIfKeySpecIsDerivedFromKeyPairSpec( keySpec: KeySpec, @@ -20,17 +20,17 @@ function checkIfKeySpecIsDerivedFromKeyPairSpec( } describe("test dh exchange", () => { - const KEY_HANDLE_DB_DIR_PATH = DB_DIR_PATH + "/dh_exchange"; - - const providerImplConfigWithFileStore: ProviderImplConfig = { - additional_config: [ - { FileStoreConfig: { db_dir: KEY_HANDLE_DB_DIR_PATH } }, - { StorageConfigPass: "1234" }, - ], - }; - let provider: Provider; + let cleanup: () => Promise; + let path: string; + beforeAll(async () => { + const folder = await testDir(); + path = folder.path; + cleanup = folder.cleanup; + const providerImplConfigWithFileStore: ProviderImplConfig = { + additional_config: [{ FileStoreConfig: { db_dir: path } }], + }; const provider_or_null = await createProviderFromName( SOFTWARE_PROVIDER_NAME, providerImplConfigWithFileStore, @@ -41,6 +41,10 @@ describe("test dh exchange", () => { provider = provider_or_null; }); + afterAll(async () => { + if (cleanup) await cleanup(); + }); + const spec: KeyPairSpec = { asym_spec: "P256", cipher: "AesGcm256", diff --git a/tests/factory.test.ts b/tests/factory.test.ts index d23d34b..8f58898 100644 --- a/tests/factory.test.ts +++ b/tests/factory.test.ts @@ -1,6 +1,11 @@ import { test, expect, describe } from "@jest/globals"; -import { ProviderConfig, ProviderImplConfig } from "@nmshd/rs-crypto-types"; +import { + KeyPairSpec, + KeySpec, + ProviderConfig, + ProviderImplConfig, +} from "@nmshd/rs-crypto-types"; import { createProvider, getAllProviders, @@ -8,11 +13,14 @@ import { getProviderCapabilities, } from "../lib/index.cjs"; -import { DB_DIR_PATH, SOFTWARE_PROVIDER_NAME } from "./common"; +import { SOFTWARE_PROVIDER_NAME, testDir } from "./common"; +import { + assertKeyHandle, + assertProvider, + assertProviderConfig, +} from "@nmshd/rs-crypto-types/checks"; describe("test provider factory methods", () => { - const FACTORY_DB_DIR_PATH = DB_DIR_PATH + "/factory"; - const providerConfig: ProviderConfig = { max_security_level: "Software", min_security_level: "Software", @@ -32,55 +40,43 @@ describe("test provider factory methods", () => { }); test("create provider from config with file store", async () => { + const { path, cleanup } = await testDir(); const providerImplConfigWithFileStore: ProviderImplConfig = { - additional_config: [ - { FileStoreConfig: { db_dir: FACTORY_DB_DIR_PATH } }, - { StorageConfigPass: "1234" }, - ], + additional_config: [{ FileStoreConfig: { db_dir: path } }], }; const provider = await createProvider( providerConfig, providerImplConfigWithFileStore, ); - expect(provider).toBeDefined(); - expect(typeof provider?.createKey).toBe("function"); - expect(typeof provider?.createKeyPair).toBe("function"); - expect(typeof provider?.getCapabilities).toBe("function"); - expect(typeof provider?.importKey).toBe("function"); - expect(typeof provider?.importKeyPair).toBe("function"); - expect(typeof provider?.importPublicKey).toBe("function"); - expect(typeof provider?.loadKey).toBe("function"); - expect(typeof provider?.loadKeyPair).toBe("function"); - expect(typeof provider?.providerName).toBe("function"); - expect(typeof provider?.startEphemeralDhExchange).toBe("function"); + + assertProvider(provider); + expect(provider?.providerName()).resolves.toEqual( + SOFTWARE_PROVIDER_NAME, + ); + await cleanup(); }); test("create software provider from name with file store", async () => { + const { path, cleanup } = await testDir(); const providerImplConfigWithFileStore: ProviderImplConfig = { additional_config: [ { FileStoreConfig: { - db_dir: FACTORY_DB_DIR_PATH + "FromName", + db_dir: path, }, }, - { StorageConfigPass: "1234" }, ], }; const provider = await createProviderFromName( SOFTWARE_PROVIDER_NAME, providerImplConfigWithFileStore, ); - expect(provider).toBeDefined(); - expect(typeof provider?.createKey).toBe("function"); - expect(typeof provider?.createKeyPair).toBe("function"); - expect(typeof provider?.getCapabilities).toBe("function"); - expect(typeof provider?.importKey).toBe("function"); - expect(typeof provider?.importKeyPair).toBe("function"); - expect(typeof provider?.importPublicKey).toBe("function"); - expect(typeof provider?.loadKey).toBe("function"); - expect(typeof provider?.loadKeyPair).toBe("function"); - expect(typeof provider?.providerName).toBe("function"); - expect(typeof provider?.startEphemeralDhExchange).toBe("function"); + + assertProvider(provider); + expect(provider?.providerName()).resolves.toEqual( + SOFTWARE_PROVIDER_NAME, + ); + await cleanup(); }); test("test get provider capabilities", async () => { @@ -95,24 +91,139 @@ describe("test provider factory methods", () => { for (const [name, caps] of providerCapsList) { expect(typeof name).toEqual("string"); expect(name).toBeTruthy(); - expect(caps).toBeDefined(); - expect(typeof caps.max_security_level).toEqual("string"); - expect(typeof caps.min_security_level).toEqual("string"); - expect(Array.isArray(caps.supported_asym_spec)).toEqual(true); - for (const item of caps.supported_asym_spec) { - expect(typeof item).toEqual("string"); - expect(item).toBeTruthy(); - } - expect(Array.isArray(caps.supported_ciphers)).toEqual(true); - for (const item of caps.supported_ciphers) { - expect(typeof item).toEqual("string"); - expect(item).toBeTruthy(); - } - expect(Array.isArray(caps.supported_hashes)).toEqual(true); - for (const item of caps.supported_hashes) { - expect(typeof item).toEqual("string"); - expect(item).toBeTruthy(); - } + assertProviderConfig(caps); + } + }); + + test("create software provider secured via a key handle", async () => { + const { path, cleanup } = await testDir(); + + const temporaryProviderConfig: ProviderImplConfig = { + additional_config: [], + }; + const temporaryProvider = await createProviderFromName( + SOFTWARE_PROVIDER_NAME, + temporaryProviderConfig, + ); + + if (!temporaryProvider) + throw new Error("Failed creating an ephemeral software provider."); + + const keySpecMasterKey: KeySpec = { + cipher: "AesGcm256", + signing_hash: "Sha2_512", + ephemeral: true, + non_exportable: true, + }; + const masterKey = await temporaryProvider.createKey(keySpecMasterKey); + + const securedAdditionalConfig: ProviderImplConfig = { + additional_config: [ + { StorageConfigHMAC: masterKey }, + { StorageConfigSymmetricEncryption: masterKey }, + { + FileStoreConfig: { + db_dir: path, + }, + }, + ], + }; + const securedProvider = await createProviderFromName( + SOFTWARE_PROVIDER_NAME, + securedAdditionalConfig, + ); + + if (!securedProvider) + throw new Error("Failed creating a secured software provider."); + + assertProvider(securedProvider); + + const keySpecSecureProvider: KeySpec = { + cipher: "AesGcm256", + signing_hash: "Sha2_512", + ephemeral: false, + non_exportable: true, + }; + let id: string; + { + const keyHandle = await securedProvider.createKey( + keySpecSecureProvider, + ); + assertKeyHandle(keyHandle); + id = await keyHandle.id(); } + { + const keyHandle = await securedProvider.loadKey(id); + assertKeyHandle(keyHandle); + } + + await cleanup(); + }); + + test("create software provider validated through a key pair handle", async () => { + const { path, cleanup } = await testDir(); + + const temporaryProviderConfig: ProviderImplConfig = { + additional_config: [], + }; + const temporaryProvider = await createProviderFromName( + SOFTWARE_PROVIDER_NAME, + temporaryProviderConfig, + ); + + if (!temporaryProvider) + throw new Error("Failed creating an ephemeral software provider."); + + const keyPairSpecMasterKey: KeyPairSpec = { + asym_spec: "P256", + cipher: null, + signing_hash: "Sha2_512", + ephemeral: true, + non_exportable: true, + }; + + const signingKey = + await temporaryProvider.createKeyPair(keyPairSpecMasterKey); + + const securedAdditionalConfig: ProviderImplConfig = { + additional_config: [ + { StorageConfigDSA: signingKey }, + { + FileStoreConfig: { + db_dir: path, + }, + }, + ], + }; + const securedProvider = await createProviderFromName( + SOFTWARE_PROVIDER_NAME, + securedAdditionalConfig, + ); + + if (!securedProvider) + throw new Error("Failed creating a secured software provider."); + + assertProvider(securedProvider); + + const keySpecSecureProvider: KeySpec = { + cipher: "AesGcm256", + signing_hash: "Sha2_512", + ephemeral: false, + non_exportable: true, + }; + let id: string; + { + const keyHandle = await securedProvider.createKey( + keySpecSecureProvider, + ); + assertKeyHandle(keyHandle); + id = await keyHandle.id(); + } + { + const keyHandle = await securedProvider.loadKey(id); + assertKeyHandle(keyHandle); + } + + await cleanup(); }); }); diff --git a/tests/key-handle.test.ts b/tests/key-handle.test.ts index db5b876..ad1f019 100644 --- a/tests/key-handle.test.ts +++ b/tests/key-handle.test.ts @@ -3,21 +3,21 @@ import { test, expect, describe } from "@jest/globals"; import { ProviderImplConfig, Provider, KeySpec } from "@nmshd/rs-crypto-types"; import { createProviderFromName } from "../lib/index.cjs"; -import { DB_DIR_PATH, SOFTWARE_PROVIDER_NAME } from "./common"; +import { SOFTWARE_PROVIDER_NAME, testDir } from "./common"; import { assertKeyHandle } from "@nmshd/rs-crypto-types/checks"; describe("test key handle methods", () => { - const KEY_HANDLE_DB_DIR_PATH = DB_DIR_PATH + "/key_handle"; - - const providerImplConfigWithFileStore: ProviderImplConfig = { - additional_config: [ - { FileStoreConfig: { db_dir: KEY_HANDLE_DB_DIR_PATH } }, - { StorageConfigPass: "1234" }, - ], - }; - let provider: Provider; + let cleanup: () => Promise; + let path: string; + beforeAll(async () => { + const folder = await testDir(); + path = folder.path; + cleanup = folder.cleanup; + const providerImplConfigWithFileStore: ProviderImplConfig = { + additional_config: [{ FileStoreConfig: { db_dir: path } }], + }; const provider_or_null = await createProviderFromName( SOFTWARE_PROVIDER_NAME, providerImplConfigWithFileStore, @@ -28,6 +28,10 @@ describe("test key handle methods", () => { provider = provider_or_null; }); + afterAll(async () => { + if (cleanup) await cleanup(); + }); + const spec: KeySpec = { cipher: "AesGcm256", signing_hash: "Sha2_256", diff --git a/tests/key-pair-handle.test.ts b/tests/key-pair-handle.test.ts index f8805a5..3bbef1a 100644 --- a/tests/key-pair-handle.test.ts +++ b/tests/key-pair-handle.test.ts @@ -7,20 +7,20 @@ import { } from "@nmshd/rs-crypto-types"; import { createProviderFromName } from "../lib/index.cjs"; -import { DB_DIR_PATH, SOFTWARE_PROVIDER_NAME } from "./common"; +import { SOFTWARE_PROVIDER_NAME, testDir } from "./common"; describe("test key pair handle methods", () => { - const KEY_HANDLE_DB_DIR_PATH = DB_DIR_PATH + "/key_pair_handle"; - - const providerImplConfigWithFileStore: ProviderImplConfig = { - additional_config: [ - { FileStoreConfig: { db_dir: KEY_HANDLE_DB_DIR_PATH } }, - { StorageConfigPass: "1234" }, - ], - }; - let provider: Provider; + let cleanup: () => Promise; + let path: string; + beforeAll(async () => { + const folder = await testDir(); + path = folder.path; + cleanup = folder.cleanup; + const providerImplConfigWithFileStore: ProviderImplConfig = { + additional_config: [{ FileStoreConfig: { db_dir: path } }], + }; const provider_or_null = await createProviderFromName( SOFTWARE_PROVIDER_NAME, providerImplConfigWithFileStore, @@ -31,6 +31,13 @@ describe("test key pair handle methods", () => { provider = provider_or_null; }); + afterAll(async () => { + if (cleanup) { + await cleanup(); + console.log("cleanup comp"); + } + }); + const spec: KeyPairSpec = { asym_spec: "P256", cipher: null, diff --git a/tests/provider.test.ts b/tests/provider.test.ts index eb8f4a0..c185008 100644 --- a/tests/provider.test.ts +++ b/tests/provider.test.ts @@ -10,20 +10,21 @@ import { import { createProviderFromName } from "../lib/index.cjs"; -import { DB_DIR_PATH, SOFTWARE_PROVIDER_NAME } from "./common"; +import { SOFTWARE_PROVIDER_NAME, testDir } from "./common"; +import { assertKeyHandle } from "@nmshd/rs-crypto-types/checks"; describe("test provider methods", () => { - const PROVIDER_DB_DIR_PATH = DB_DIR_PATH + "/provider"; - - const providerImplConfigWithFileStore: ProviderImplConfig = { - additional_config: [ - { FileStoreConfig: { db_dir: PROVIDER_DB_DIR_PATH } }, - { StorageConfigPass: "1234" }, - ], - }; - let provider: Provider; + let cleanup: () => Promise; + let path: string; + beforeAll(async () => { + const folder = await testDir(); + path = folder.path; + cleanup = folder.cleanup; + const providerImplConfigWithFileStore: ProviderImplConfig = { + additional_config: [{ FileStoreConfig: { db_dir: path } }], + }; const provider_or_null = await createProviderFromName( SOFTWARE_PROVIDER_NAME, providerImplConfigWithFileStore, @@ -34,6 +35,10 @@ describe("test provider methods", () => { provider = provider_or_null; }); + afterAll(async () => { + if (cleanup) await cleanup(); + }); + test("create aes gcm ephemeral key", async () => { const spec: KeySpec = { cipher: "AesGcm256", @@ -273,8 +278,8 @@ describe("test provider methods", () => { const kdf: KDF = { Argon2d: { - memory: 19456, - iterations: 2, + memory: 8192, + iterations: 1, parallelism: 1, }, }; @@ -287,8 +292,7 @@ describe("test provider methods", () => { spec, kdf, ); - expect(keyHandle).toBeDefined(); - expect(keyHandle.spec).toBeDefined(); + assertKeyHandle(keyHandle); expect(keyHandle.spec()).resolves.toEqual(spec); }); @@ -307,4 +311,4 @@ describe("test provider methods", () => { expect(hash.length).toBeGreaterThan(0); expect(hash).toEqual(hash2); }); -}); +}); // end describe