Skip to main content

polymorph_webcrypto_guest/
aes_kw.rs

1//! `aes-kw` key creation (RFC 3394 / NIST SP 800-38F KW): dedicated
2//! key-wrapping keys for the `key-wrap` kind.
3
4use crate::{bindings, Error, KwKey, KwKeyOptions, UnwrapInput};
5
6pub use crate::bindings::aes_kw::AesVariant;
7
8/// Import raw key material as the declared AES variant.
9pub async fn import_key_raw(
10    variant: AesVariant,
11    raw: impl Into<Vec<u8>>,
12    options: KwKeyOptions,
13) -> Result<KwKey, Error> {
14    Ok(KwKey::from_raw(
15        bindings::aes_kw::import_key_raw(variant, raw.into(), options.lower()).await?,
16    ))
17}
18
19/// Import an RFC 7517 `oct` JSON Web Key (as JSON text; `alg`, when
20/// present, must name the declared variant) as an AES-KW key.
21pub async fn import_key_jwk(
22    variant: AesVariant,
23    jwk: impl Into<String>,
24    options: KwKeyOptions,
25) -> Result<KwKey, Error> {
26    Ok(KwKey::from_raw(
27        bindings::aes_kw::import_key_jwk(variant, jwk.into(), options.lower()).await?,
28    ))
29}
30
31/// Generate a fresh random key of the declared AES variant.
32pub async fn generate_key(variant: AesVariant, options: KwKeyOptions) -> Result<KwKey, Error> {
33    Ok(KwKey::from_raw(
34        bindings::aes_kw::generate_key(variant, options.lower()).await?,
35    ))
36}
37
38/// Mint an AES-KW key of the declared variant from a parameterized
39/// derivation (the `aes-gcm.derive-key` contract, minting a `kw-key`).
40pub async fn derive_key(
41    variant: AesVariant,
42    input: &crate::DeriveInput,
43    options: KwKeyOptions,
44) -> Result<KwKey, Error> {
45    Ok(KwKey::from_raw(
46        bindings::aes_kw::derive_key(variant, input.as_raw(), options.lower()).await?,
47    ))
48}
49
50/// Mint an AES-KW key from unwrapped key material read as raw bytes.
51/// Consumes the [`UnwrapInput`].
52pub async fn unwrap_key_raw(
53    variant: AesVariant,
54    input: UnwrapInput,
55    options: KwKeyOptions,
56) -> Result<KwKey, Error> {
57    Ok(KwKey::from_raw(
58        bindings::aes_kw::unwrap_key_raw(variant, input.into_raw(), options.lower()).await?,
59    ))
60}
61
62/// Mint an AES-KW key from unwrapped key material read as an `oct` JWK.
63/// Consumes the [`UnwrapInput`].
64pub async fn unwrap_key_jwk(
65    variant: AesVariant,
66    input: UnwrapInput,
67    options: KwKeyOptions,
68) -> Result<KwKey, Error> {
69    Ok(KwKey::from_raw(
70        bindings::aes_kw::unwrap_key_jwk(variant, input.into_raw(), options.lower()).await?,
71    ))
72}