diff --git a/Cargo.lock b/Cargo.lock index 2d63a08..166adee 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -66,9 +66,9 @@ dependencies = [ [[package]] name = "async-channel" -version = "2.3.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" dependencies = [ "concurrent-queue", "event-listener-strategy", @@ -159,9 +159,9 @@ dependencies = [ [[package]] name = "blocking" -version = "1.6.1" +version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" dependencies = [ "async-channel", "async-task", @@ -172,9 +172,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.18.1" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db76d6187cd04dff33004d8e6c9cc4e05cd330500379d2394209271b4aeee" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "byteorder" @@ -190,9 +190,9 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cc" -version = "1.2.27" +version = "1.2.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc" +checksum = "deec109607ca693028562ed836a5f1c4b8bd77755c4e132fc5ce11b0b6211ae7" dependencies = [ "shlex", ] @@ -323,9 +323,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] @@ -371,7 +371,7 @@ dependencies = [ [[package]] name = "crypto-layer" version = "0.1.0" -source = "git+https://github.com/nmshd/rust-crypto.git#9b4b256e48e6949e09a3775a1ce73ddcee7b2452" +source = "git+https://github.com/nmshd/rust-crypto.git#c96a86eff27576760fca9076b37e070ba2c4195f" dependencies = [ "anyhow", "argon2", @@ -391,12 +391,13 @@ dependencies = [ "rmp-serde", "robusta_jni", "security-framework", + "security-framework-sys", "serde", "serde_json", "sha2", "sha3", "sled", - "strum 0.27.1", + "strum 0.27.2", "thiserror 2.0.12", "tracing", "tracing-subscriber", @@ -779,6 +780,17 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "io-uring" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" +dependencies = [ + "bitflags 2.9.1", + "cfg-if", + "libc", +] + [[package]] name = "itertools" version = "0.14.0" @@ -915,6 +927,17 @@ dependencies = [ "adler2", ] +[[package]] +name = "mio" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +dependencies = [ + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.59.0", +] + [[package]] name = "nanoid" version = "0.4.0" @@ -1248,9 +1271,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", @@ -1404,7 +1427,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "rand 0.9.1", + "rand 0.9.2", "syn 1.0.109", ] @@ -1435,12 +1458,6 @@ dependencies = [ "semver", ] -[[package]] -name = "rustversion" -version = "1.0.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" - [[package]] name = "ryu" version = "1.0.20" @@ -1533,9 +1550,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.141" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3" dependencies = [ "itoa", "memchr", @@ -1589,6 +1606,12 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "slab" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" + [[package]] name = "sled" version = "0.34.7" @@ -1641,23 +1664,22 @@ checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" [[package]] name = "strum" -version = "0.27.1" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" dependencies = [ "strum_macros", ] [[package]] name = "strum_macros" -version = "0.27.1" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" dependencies = [ "heck", "proc-macro2", "quote", - "rustversion", "syn 2.0.104", ] @@ -1740,12 +1762,16 @@ dependencies = [ [[package]] name = "tokio" -version = "1.45.1" +version = "1.46.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" +checksum = "0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17" dependencies = [ "backtrace", + "io-uring", + "libc", + "mio", "pin-project-lite", + "slab", ] [[package]] diff --git a/crates/crypto-layer-node/src/lib.rs b/crates/crypto-layer-node/src/lib.rs index 2b632b9..76f2885 100644 --- a/crates/crypto-layer-node/src/lib.rs +++ b/crates/crypto-layer-node/src/lib.rs @@ -192,6 +192,7 @@ fn main(mut cx: ModuleContext) -> NeonResult<()> { )?; cx.export_function("getRandom", crate::provider::export_get_random)?; cx.export_function("hash", crate::provider::export_hash)?; + cx.export_function("getAllKeys", crate::provider::export_get_all_keys)?; // key pair handle cx.export_function("signData", crate::keypairhandle::export_sign_data)?; diff --git a/crates/crypto-layer-node/src/provider.rs b/crates/crypto-layer-node/src/provider.rs index 779b473..3b9def0 100644 --- a/crates/crypto-layer-node/src/provider.rs +++ b/crates/crypto-layer-node/src/provider.rs @@ -5,8 +5,8 @@ use crate::common::{arc_or_poisoned_error_deferred, box_if_ok, spawn_promise}; use crate::fromjs::error::unwrap_or_throw; use crate::fromjs::{from_wrapped_simple_enum, int_from_js_number, vec_from_uint_8_array}; use crate::kdf::kdf_from_object; -use crate::tojs::config::wrap_provider_config; -use crate::tojs::uint_8_array_from_vec_u8; +use crate::tojs::config::{wrap_provider_config, wrap_spec}; +use crate::tojs::{js_array_from_vec, uint_8_array_from_vec_u8}; use crate::JsProvider; use crate::{from_wrapped_key_pair_spec, from_wrapped_key_spec}; @@ -436,3 +436,35 @@ pub fn export_hash(mut cx: FunctionContext) -> JsResult { }); }) } + +/// Wraps `get_all_keys` function. +/// +/// # Arguments +/// +/// # Returns +/// * `[string, Spec][]` - list of key id and key spec +/// +/// # Throws +pub fn export_get_all_keys(mut cx: FunctionContext) -> JsResult { + let provider_arc = (**cx.this::()?).clone(); + + spawn_promise(&mut cx, move |channel, deferred| { + let provider = arc_or_poisoned_error_deferred!(&channel, deferred, provider_arc.read()); + + let keys_result = provider.get_all_keys(); + + deferred.settle_with(&channel, |mut cx| { + let keys = unwrap_or_throw!(cx, keys_result); + js_array_from_vec(&mut cx, keys, |cx, (id, spec)| { + let spec_js = wrap_spec(cx, spec)?; + let id_js = JsString::new(cx, id); + + let result = JsArray::new(cx, 2); + result.prop(cx, 0).set(id_js)?; + result.prop(cx, 1).set(spec_js)?; + + Ok(result.upcast()) + }) + }); + }) +} diff --git a/crates/crypto-layer-node/src/tojs/config.rs b/crates/crypto-layer-node/src/tojs/config.rs index 8e8354e..b25ed06 100644 --- a/crates/crypto-layer-node/src/tojs/config.rs +++ b/crates/crypto-layer-node/src/tojs/config.rs @@ -1,4 +1,4 @@ -use crypto_layer::prelude::*; +use crypto_layer::{common::config::Spec, prelude::*}; use neon::prelude::*; use super::wrap_string_array; @@ -104,3 +104,20 @@ pub fn wrap_key_pair_spec<'a>( Ok(obj) } + +pub fn wrap_spec<'a>(cx: &mut impl Context<'a>, spec: Spec) -> JsResult<'a, JsObject> { + let obj = cx.empty_object(); + + match spec { + Spec::KeyPairSpec(key_pair_spec) => { + let key_pair_spec_js = wrap_key_pair_spec(cx, key_pair_spec)?; + obj.set(cx, "KeyPairSpec", key_pair_spec_js)?; + } + Spec::KeySpec(key_spec) => { + let key_spec_js = wrap_key_spec(cx, key_spec)?; + obj.set(cx, "KeySpec", key_spec_js)?; + } + } + + return Ok(obj); +} diff --git a/package-lock.json b/package-lock.json index 691fe4d..d7429da 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "MIT", "dependencies": { "@neon-rs/load": "^0.1.73", - "@nmshd/rs-crypto-types": "^0.11.0" + "@nmshd/rs-crypto-types": "^0.12.0" }, "devDependencies": { "@eslint/js": "^9.21.0", @@ -30,10 +30,10 @@ "typescript-eslint": "^8.25.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" } }, "node_modules/@ampproject/remapping": { @@ -729,9 +729,9 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", - "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -744,9 +744,9 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.1.tgz", - "integrity": "sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz", + "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -754,9 +754,9 @@ } }, "node_modules/@eslint/core": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", - "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz", + "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -804,13 +804,16 @@ } }, "node_modules/@eslint/js": { - "version": "9.25.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.25.1.tgz", - "integrity": "sha512-dEIwmjntEx8u3Uvv+kr3PDeeArL8Hw07H9kyYxCjnM9pBjfEhk6uLXSchxxzgiwtRhhzVzqmUSDFBOi1TuZ7qg==", + "version": "9.31.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.31.0.tgz", + "integrity": "sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==", "dev": true, "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" } }, "node_modules/@eslint/object-schema": { @@ -824,13 +827,13 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", - "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.4.tgz", + "integrity": "sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.13.0", + "@eslint/core": "^0.15.1", "levn": "^0.4.1" }, "engines": { @@ -1394,9 +1397,9 @@ "license": "MIT" }, "node_modules/@nmshd/rs-crypto-node-darwin-arm64": { - "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==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@nmshd/rs-crypto-node-darwin-arm64/-/rs-crypto-node-darwin-arm64-0.14.0.tgz", + "integrity": "sha512-GM0wnInGFd+9dyO/RUpk7AQzmjca0VBzlTM/SSRNObDcx7Riwl9kccp7UwTVnM3YVGybnyot1nOI+LXYfrUbCw==", "cpu": [ "arm64" ], @@ -1407,9 +1410,9 @@ ] }, "node_modules/@nmshd/rs-crypto-node-darwin-x64": { - "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==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@nmshd/rs-crypto-node-darwin-x64/-/rs-crypto-node-darwin-x64-0.14.0.tgz", + "integrity": "sha512-3bF8eDkug4LPrFfIxqOqubpMm4M9vyBYE3HgXfbWDHHz0iRSxwGPvwBzyXes2V/HMRpYKjqG5XQdeSOjuMemGw==", "cpu": [ "x64" ], @@ -1420,9 +1423,9 @@ ] }, "node_modules/@nmshd/rs-crypto-node-linux-x64-gnu": { - "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==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@nmshd/rs-crypto-node-linux-x64-gnu/-/rs-crypto-node-linux-x64-gnu-0.14.0.tgz", + "integrity": "sha512-FMi4nMGiiWmzF39ZJOj1AhyZ5MAv4PsotZpRJiIZ1rkNOnTOeQSDj//85GXXv4i715TBJwLSp3eelkt+9xlqkw==", "cpu": [ "x64" ], @@ -1433,9 +1436,9 @@ ] }, "node_modules/@nmshd/rs-crypto-node-win32-x64-msvc": { - "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==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@nmshd/rs-crypto-node-win32-x64-msvc/-/rs-crypto-node-win32-x64-msvc-0.14.0.tgz", + "integrity": "sha512-09+Ov2Z30n3YUkHvcpf2bYJlV8GYesOaS3dWNCRAiseGmqduIWp/GQZZvAUHWslHhGKpT84fXy6HO5j8HrtOLg==", "cpu": [ "x64" ], @@ -1446,9 +1449,9 @@ ] }, "node_modules/@nmshd/rs-crypto-types": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@nmshd/rs-crypto-types/-/rs-crypto-types-0.11.0.tgz", - "integrity": "sha512-xP/NQhK3I2ui0j6IsIlAJ0FJKRW1Av7gZzdAiBoFpCE1OhENt2lTdh5ilgGCKR4ddPhaDLIvaBkTTbQU0tUOOA==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@nmshd/rs-crypto-types/-/rs-crypto-types-0.12.0.tgz", + "integrity": "sha512-YlbsPb9TaMl30BinVTvt1a7vEj8ALtpEnKQJWkphu00JBOoyV/2uWTJCMVkYbBji62YKOQCXaehdQn3rx7jzOQ==", "license": "MIT", "dependencies": { "typia": "^8.0.3" @@ -1812,9 +1815,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1893,9 +1896,9 @@ } }, "node_modules/acorn": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", - "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", "bin": { @@ -2160,9 +2163,9 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -2726,20 +2729,20 @@ } }, "node_modules/eslint": { - "version": "9.25.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.25.1.tgz", - "integrity": "sha512-E6Mtz9oGQWDCpV12319d59n4tx9zOTXSTmc8BLVxBx+G/0RdM5MvEEJLU9c0+aleoePYYgVTOsRblx433qmhWQ==", + "version": "9.31.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.31.0.tgz", + "integrity": "sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.20.0", - "@eslint/config-helpers": "^0.2.1", - "@eslint/core": "^0.13.0", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.0", + "@eslint/core": "^0.15.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.25.1", - "@eslint/plugin-kit": "^0.2.8", + "@eslint/js": "9.31.0", + "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", @@ -2750,9 +2753,9 @@ "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.3.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -2787,9 +2790,9 @@ } }, "node_modules/eslint-scope": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", - "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -2804,9 +2807,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -2817,15 +2820,15 @@ } }, "node_modules/espree": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", - "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.14.0", + "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.0" + "eslint-visitor-keys": "^4.2.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3088,9 +3091,9 @@ } }, "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 5bafba0..eb62216 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ }, "dependencies": { "@neon-rs/load": "^0.1.73", - "@nmshd/rs-crypto-types": "^0.11.0" + "@nmshd/rs-crypto-types": "^0.12.0" }, "optionalDependencies": { "@nmshd/rs-crypto-node-darwin-arm64": "0.14.0", @@ -71,4 +71,4 @@ "@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/src/index.cts b/src/index.cts index ef2a329..f9c34fa 100644 --- a/src/index.cts +++ b/src/index.cts @@ -14,6 +14,7 @@ import type { DHExchange, KDF, CryptoHash, + Spec, } from "@nmshd/rs-crypto-types"; import { @@ -60,6 +61,7 @@ import { deriveKeyForKeyHandle, encryptForKeyHandle, encryptWithIvForKeyHandle, + getAllKeys, } from "./load.cjs"; type BareProvider = object; @@ -150,6 +152,7 @@ declare module "./load.cjs" { input: Uint8Array, hash: CryptoHash, ): Promise; + function getAllKeys(): Promise<[string, Spec][]>; // KeyPairHandle function signData( @@ -362,7 +365,11 @@ class NodeProvider implements Provider { } async hash(input: Uint8Array, hashAlgo: CryptoHash): Promise { - return hash.call(this.provider, input, hashAlgo); + return await hash.call(this.provider, input, hashAlgo); + } + + async getAllKeys(): Promise<[string, Spec][]> { + return await getAllKeys.call(this.provider); } } diff --git a/tests/provider.test.ts b/tests/provider.test.ts index c185008..9b5e649 100644 --- a/tests/provider.test.ts +++ b/tests/provider.test.ts @@ -11,7 +11,12 @@ import { import { createProviderFromName } from "../lib/index.cjs"; import { SOFTWARE_PROVIDER_NAME, testDir } from "./common"; -import { assertKeyHandle } from "@nmshd/rs-crypto-types/checks"; +import { + assertKeyHandle, + assertSpec, + isKeyHandle, + isKeyPairHandle, +} from "@nmshd/rs-crypto-types/checks"; describe("test provider methods", () => { let provider: Provider; @@ -311,4 +316,33 @@ describe("test provider methods", () => { expect(hash.length).toBeGreaterThan(0); expect(hash).toEqual(hash2); }); + + test("get all keys", async () => { + const keys = await provider.getAllKeys(); + + expect(Array.isArray(keys)).toBe(true); + expect(keys.length).toBeGreaterThan(0); + + for (const [id, spec] of keys) { + expect(typeof id).toBe("string"); + expect(id.length).toBeGreaterThan(0); + assertSpec(spec); + } + + const loadedKeys = await Promise.all( + keys.map(([id, spec]) => { + if ("KeySpec" in spec) { + return provider.loadKey(id); + } else if ("KeyPairSpec" in spec) { + return provider.loadKeyPair(id); + } else { + throw new Error("Spec does not hold key or key pair spec."); + } + }), + ); + + for (const key of loadedKeys) { + expect(isKeyHandle(key) || isKeyPairHandle(key)).toBe(true); + } + }); }); // end describe