Skip to main content

polymorph_webcrypto_guest/
rsassa_pkcs1_v15.rs

1//! `rsassa-pkcs1-v15-verify` key creation (RFC 8017 §8.2), plus —
2//! behind the `rsa-sign` cargo feature — `rsassa-pkcs1-v15-sign`.
3
4use crate::{bindings, Error, VerifyingKey};
5#[cfg(feature = "rsa-sign")]
6use crate::{SigningKey, SigningKeyOptions};
7
8pub use crate::bindings::rsassa_pkcs1_v15_verify::RsaVariant;
9
10#[cfg(feature = "rsa-sign")]
11pub use crate::bindings::rsassa_pkcs1_v15_sign::RsaModulus;
12
13/// Import a public key as an X.509 SubjectPublicKeyInfo (DER). The
14/// declared variant binds the digest at mint; admission follows the RSA
15/// family contract (see the WIT `rsa` interface).
16pub async fn import_verifying_key_spki(
17    variant: RsaVariant,
18    spki: impl Into<Vec<u8>>,
19) -> Result<VerifyingKey, Error> {
20    Ok(VerifyingKey::from_raw(
21        bindings::rsassa_pkcs1_v15_verify::import_verifying_key_spki(variant, spki.into()).await?,
22    ))
23}
24
25/// Import a public key as an RSA public JWK (`kty: "RSA"`, with `n` and
26/// `e`, as JSON text). An `alg` member, when present, must be the
27/// variant's JOSE alg (`"RS256"`, `"RS384"`, or `"RS512"`). See the WIT
28/// `mac-key.export-key-jwk` doc for the package-wide JWK contract.
29pub async fn import_verifying_key_jwk(
30    variant: RsaVariant,
31    jwk: impl Into<String>,
32) -> Result<VerifyingKey, Error> {
33    Ok(VerifyingKey::from_raw(
34        bindings::rsassa_pkcs1_v15_verify::import_verifying_key_jwk(variant, jwk.into()).await?,
35    ))
36}
37
38/// Generate a fresh signing key pair of the declared variant and modulus
39/// length, returning both halves. The public exponent is 65537; it is
40/// not a parameter.
41#[cfg(feature = "rsa-sign")]
42pub async fn generate_key(
43    variant: RsaVariant,
44    modulus: RsaModulus,
45    options: SigningKeyOptions,
46) -> Result<(SigningKey, VerifyingKey), Error> {
47    let (signing, verifying) =
48        bindings::rsassa_pkcs1_v15_sign::generate_key(variant, modulus, options.lower()).await?;
49    Ok((
50        SigningKey::from_raw(signing),
51        VerifyingKey::from_raw(verifying),
52    ))
53}
54
55/// Import a signing key as a PKCS#8 PrivateKeyInfo (DER, with the CRT
56/// parameters). Admission follows the RSA family contract plus the
57/// signing window — a 2048–8192-bit modulus (see the WIT
58/// `rsassa-pkcs1-v15-sign` interface). Returns only the signing key;
59/// supply the public half to [`import_verifying_key_spki`] if you need
60/// it.
61#[cfg(feature = "rsa-sign")]
62pub async fn import_signing_key_pkcs8(
63    variant: RsaVariant,
64    pkcs8: impl Into<Vec<u8>>,
65    options: SigningKeyOptions,
66) -> Result<SigningKey, Error> {
67    Ok(SigningKey::from_raw(
68        bindings::rsassa_pkcs1_v15_sign::import_signing_key_pkcs8(
69            variant,
70            pkcs8.into(),
71            options.lower(),
72        )
73        .await?,
74    ))
75}
76
77/// Import a signing key as an RSA private JWK (`kty: "RSA"`, with `n`,
78/// `e`, `d`, and the CRT members, as JSON text), subject to
79/// [`import_signing_key_pkcs8`]'s admission. An `alg` member, when
80/// present, must be the variant's JOSE alg (`"RS256"`, `"RS384"`, or
81/// `"RS512"`).
82#[cfg(feature = "rsa-sign")]
83pub async fn import_signing_key_jwk(
84    variant: RsaVariant,
85    jwk: impl Into<String>,
86    options: SigningKeyOptions,
87) -> Result<SigningKey, Error> {
88    Ok(SigningKey::from_raw(
89        bindings::rsassa_pkcs1_v15_sign::import_signing_key_jwk(
90            variant,
91            jwk.into(),
92            options.lower(),
93        )
94        .await?,
95    ))
96}