Skip to main content

jwt_simple/algorithms/
rsa.rs

1#[cfg(any(feature = "pure-rust", target_arch = "wasm32", target_arch = "wasm64"))]
2use superboring as boring;
3
4use boring::bn::BigNum;
5use boring::hash::MessageDigest;
6use boring::pkey::{PKey, Private, Public};
7use boring::rsa::{Padding, Rsa};
8use boring::sign::{Signer, Verifier};
9use ct_codecs::{Base64UrlSafeNoPadding, Encoder};
10use hmac_sha1_compact::Hash as SHA1;
11use hmac_sha256::Hash as SHA256;
12use serde::{de::DeserializeOwned, Serialize};
13use zeroize::Zeroizing;
14
15use crate::algorithms::jwk::{
16    encode, encode_secret, rsa_modulus, rsa_private_integer, rsa_thumbprint, Jwk, JwkDescriptor,
17    JwkMembers, KeyRole, KeyType,
18};
19use crate::claims::*;
20use crate::common::*;
21#[cfg(feature = "cwt")]
22use crate::cwt_token::*;
23use crate::error::*;
24use crate::jwt_header::*;
25use crate::token::*;
26
27pub(crate) const MIN_RSA_MODULUS_BITS: usize = 2048;
28pub(crate) const MAX_RSA_MODULUS_BITS: usize = 4096;
29
30fn trim_leading_zeros(x: &[u8]) -> &[u8] {
31    let first = x.iter().position(|&b| b != 0).unwrap_or(x.len());
32    &x[first..]
33}
34
35fn bit_length(x: &[u8]) -> usize {
36    let x = trim_leading_zeros(x);
37    match x.first() {
38        None => 0,
39        Some(&top) => (x.len() - 1) * 8 + (8 - top.leading_zeros() as usize),
40    }
41}
42
43/// Apply the same RSA key limits across formats and backends.
44///
45/// `n` and `e` are big-endian and may have leading zeros.
46pub(crate) fn check_rsa_key_policy(n: &[u8], e: &[u8], invalid: JWTError) -> Result<(), Error> {
47    let bits = bit_length(n);
48    ensure!(bits >= MIN_RSA_MODULUS_BITS, JWTError::WeakKey);
49    ensure!(
50        bits <= MAX_RSA_MODULUS_BITS,
51        JWTError::UnsupportedRSAModulus
52    );
53    ensure!(n[n.len() - 1] & 1 == 1, invalid);
54    ensure!(trim_leading_zeros(e) == [1, 0, 1], invalid);
55    Ok(())
56}
57
58pub(crate) fn check_rsa_public_key(rsa_pk: &Rsa<Public>) -> Result<(), Error> {
59    check_rsa_key_policy(
60        &rsa_pk.n().to_vec(),
61        &rsa_pk.e().to_vec(),
62        JWTError::InvalidPublicKey,
63    )
64}
65
66/// Reject unsupported keys before the more expensive key check.
67pub(crate) fn check_rsa_private_key(rsa_sk: &Rsa<Private>) -> Result<(), Error> {
68    check_rsa_key_policy(
69        &rsa_sk.n().to_vec(),
70        &rsa_sk.e().to_vec(),
71        JWTError::InvalidKeyPair,
72    )?;
73    check_rsa_private_key_consistency(rsa_sk)
74}
75
76/// Require all private values so the key can be exported as a JWK.
77fn check_rsa_private_key_consistency(rsa_sk: &Rsa<Private>) -> Result<(), Error> {
78    ensure!(
79        rsa_sk.check_key().unwrap_or(false),
80        JWTError::InvalidKeyPair
81    );
82    ensure!(
83        private_parameters(rsa_sk).is_some(),
84        JWTError::InvalidKeyPair
85    );
86    Ok(())
87}
88
89/// Handle private key values from either RSA backend.
90trait ParameterBytes {
91    fn parameter_bytes(self) -> Option<Vec<u8>>;
92}
93
94#[cfg(not(any(feature = "pure-rust", target_arch = "wasm32", target_arch = "wasm64")))]
95impl ParameterBytes for &boring::bn::BigNumRef {
96    fn parameter_bytes(self) -> Option<Vec<u8>> {
97        Some(self.to_vec())
98    }
99}
100
101#[cfg(not(any(feature = "pure-rust", target_arch = "wasm32", target_arch = "wasm64")))]
102impl ParameterBytes for Option<&boring::bn::BigNumRef> {
103    fn parameter_bytes(self) -> Option<Vec<u8>> {
104        self.map(|x| x.to_vec())
105    }
106}
107
108#[cfg(any(feature = "pure-rust", target_arch = "wasm32", target_arch = "wasm64"))]
109impl ParameterBytes for BigNum {
110    fn parameter_bytes(self) -> Option<Vec<u8>> {
111        Some(self.to_vec())
112    }
113}
114
115#[cfg(any(feature = "pure-rust", target_arch = "wasm32", target_arch = "wasm64"))]
116impl ParameterBytes for Option<BigNum> {
117    fn parameter_bytes(self) -> Option<Vec<u8>> {
118        self.map(|x| x.to_vec())
119    }
120}
121
122fn private_parameters(rsa_sk: &Rsa<Private>) -> Option<[Zeroizing<Vec<u8>>; 6]> {
123    Some([
124        Zeroizing::new(rsa_sk.d().parameter_bytes()?),
125        Zeroizing::new(rsa_sk.p().parameter_bytes()?),
126        Zeroizing::new(rsa_sk.q().parameter_bytes()?),
127        Zeroizing::new(rsa_sk.dmp1().parameter_bytes()?),
128        Zeroizing::new(rsa_sk.dmq1().parameter_bytes()?),
129        Zeroizing::new(rsa_sk.iqmp().parameter_bytes()?),
130    ])
131}
132
133pub(crate) const fn rsa_jwk_descriptor(alg: &'static str, role: KeyRole) -> JwkDescriptor {
134    JwkDescriptor::new(KeyType::Rsa, None, alg, role)
135}
136
137const RSA_EXPONENT: [u8; 3] = [1, 0, 1];
138
139pub(crate) fn rsa_public_key_from_jwk(
140    jwk: &str,
141    descriptor: &JwkDescriptor,
142) -> Result<(Rsa<Public>, Option<String>), Error> {
143    let jwk = Jwk::parse(jwk, descriptor)?;
144    let n = rsa_modulus(jwk.n(), descriptor)?;
145    ensure!(jwk.e() == "AQAB", descriptor.error());
146    check_rsa_key_policy(&n, &RSA_EXPONENT, descriptor.error())?;
147    let bn = |x: &[u8]| BigNum::from_slice(x).map_err(|_| descriptor.error());
148    let rsa_pk = Rsa::<Public>::from_public_components(bn(&n)?, bn(&RSA_EXPONENT)?)
149        .map_err(|_| descriptor.error())?;
150    Ok((rsa_pk, jwk.kid().map(Into::into)))
151}
152
153/// Reject oversized values before passing them to the RSA backend.
154pub(crate) fn rsa_private_key_from_jwk(
155    jwk: &str,
156    descriptor: &JwkDescriptor,
157) -> Result<(Rsa<Private>, Option<String>), Error> {
158    let jwk = Jwk::parse(jwk, descriptor)?;
159    let n = rsa_modulus(jwk.n(), descriptor)?;
160    ensure!(jwk.e() == "AQAB", descriptor.error());
161    check_rsa_key_policy(&n, &RSA_EXPONENT, descriptor.error())?;
162    let d = rsa_private_integer(jwk.d(), descriptor)?;
163    let p = rsa_private_integer(jwk.p(), descriptor)?;
164    let q = rsa_private_integer(jwk.q(), descriptor)?;
165    let dp = rsa_private_integer(jwk.dp(), descriptor)?;
166    let dq = rsa_private_integer(jwk.dq(), descriptor)?;
167    let qi = rsa_private_integer(jwk.qi(), descriptor)?;
168    let bn = |x: &[u8]| BigNum::from_slice(x).map_err(|_| descriptor.error());
169    let rsa_sk = Rsa::<Private>::from_private_components(
170        bn(&n)?,
171        bn(&RSA_EXPONENT)?,
172        bn(&d)?,
173        bn(&p)?,
174        bn(&q)?,
175        bn(&dp)?,
176        bn(&dq)?,
177        bn(&qi)?,
178    )
179    .map_err(|_| descriptor.error())?;
180    check_rsa_private_key_consistency(&rsa_sk)?;
181    Ok((rsa_sk, jwk.kid().map(Into::into)))
182}
183
184pub(crate) fn rsa_public_key_to_jwk(
185    rsa_pk: &Rsa<Public>,
186    descriptor: &JwkDescriptor,
187    key_id: Option<&str>,
188) -> String {
189    let n = encode(&rsa_pk.n().to_vec());
190    let e = encode(&rsa_pk.e().to_vec());
191    let members = JwkMembers {
192        n: Some(&n),
193        e: Some(&e),
194        ..Default::default()
195    };
196    descriptor.export(members, key_id)
197}
198
199pub(crate) fn rsa_private_key_to_jwk(
200    rsa_sk: &Rsa<Private>,
201    descriptor: &JwkDescriptor,
202    key_id: Option<&str>,
203) -> String {
204    let parameters = private_parameters(rsa_sk)
205        .expect("RSA private keys are checked for CRT parameters when they are constructed");
206    let [d, p, q, dp, dq, qi] = parameters.each_ref().map(|x| encode_secret(x));
207    let n = encode(&rsa_sk.n().to_vec());
208    let e = encode(&rsa_sk.e().to_vec());
209    let members = JwkMembers {
210        n: Some(&n),
211        e: Some(&e),
212        d: Some(&d),
213        p: Some(&p),
214        q: Some(&q),
215        dp: Some(&dp),
216        dq: Some(&dq),
217        qi: Some(&qi),
218        ..Default::default()
219    };
220    descriptor.export(members, key_id)
221}
222
223pub(crate) fn rsa_public_key_thumbprint(rsa_pk: &Rsa<Public>) -> String {
224    rsa_thumbprint(&rsa_pk.n().to_vec(), &rsa_pk.e().to_vec())
225}
226
227pub(crate) fn rsa_private_key_thumbprint(rsa_sk: &Rsa<Private>) -> String {
228    rsa_thumbprint(&rsa_sk.n().to_vec(), &rsa_sk.e().to_vec())
229}
230
231#[doc(hidden)]
232#[derive(Debug, Clone)]
233pub struct RSAPublicKey(Rsa<Public>);
234
235impl AsRef<Rsa<Public>> for RSAPublicKey {
236    fn as_ref(&self) -> &Rsa<Public> {
237        &self.0
238    }
239}
240
241pub struct RSAPublicKeyComponents {
242    pub n: Vec<u8>,
243    pub e: Vec<u8>,
244}
245
246impl RSAPublicKey {
247    pub fn from_der(der: &[u8]) -> Result<Self, Error> {
248        let rsa_pk = Rsa::<Public>::public_key_from_der(der)
249            .or_else(|_| Rsa::<Public>::public_key_from_der_pkcs1(der))?;
250        check_rsa_public_key(&rsa_pk)?;
251        Ok(RSAPublicKey(rsa_pk))
252    }
253
254    pub fn from_pem(pem: &str) -> Result<Self, Error> {
255        let pem = pem.trim();
256        let rsa_pk = Rsa::<Public>::public_key_from_pem(pem.as_bytes())
257            .or_else(|_| Rsa::<Public>::public_key_from_pem_pkcs1(pem.as_bytes()))?;
258        check_rsa_public_key(&rsa_pk)?;
259        Ok(RSAPublicKey(rsa_pk))
260    }
261
262    pub fn from_components(n: &[u8], e: &[u8]) -> Result<Self, Error> {
263        check_rsa_key_policy(n, e, JWTError::InvalidPublicKey)?;
264        let n = BigNum::from_slice(n)?;
265        let e = BigNum::from_slice(e)?;
266        let rsa_pk = Rsa::<Public>::from_public_components(n, e)?;
267        Ok(RSAPublicKey(rsa_pk))
268    }
269
270    pub fn to_der(&self) -> Result<Vec<u8>, Error> {
271        self.0.public_key_to_der().map_err(Into::into)
272    }
273
274    pub fn to_pem(&self) -> Result<String, Error> {
275        Ok(String::from_utf8(self.0.public_key_to_pem()?)?)
276    }
277
278    pub fn to_components(&self) -> RSAPublicKeyComponents {
279        RSAPublicKeyComponents {
280            n: self.0.n().to_vec(),
281            e: self.0.e().to_vec(),
282        }
283    }
284
285    fn thumbprint(&self, hash: impl Fn(&[u8]) -> Vec<u8>) -> String {
286        Base64UrlSafeNoPadding::encode_to_string(hash(&self.to_der().unwrap())).unwrap()
287    }
288}
289
290#[doc(hidden)]
291#[derive(Clone)]
292pub struct RSAKeyPair {
293    rsa_sk: Rsa<Private>,
294    metadata: Option<KeyMetadata>,
295}
296
297impl std::fmt::Debug for RSAKeyPair {
298    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
299        write!(f, "Rsa")
300    }
301}
302
303impl AsRef<Rsa<Private>> for RSAKeyPair {
304    fn as_ref(&self) -> &Rsa<Private> {
305        &self.rsa_sk
306    }
307}
308
309impl RSAKeyPair {
310    pub fn from_der(der: &[u8]) -> Result<Self, Error> {
311        let rsa_sk = Rsa::<Private>::private_key_from_der(der)?;
312        check_rsa_private_key(&rsa_sk)?;
313        Ok(RSAKeyPair {
314            rsa_sk,
315            metadata: None,
316        })
317    }
318
319    pub fn from_pem(pem: &str) -> Result<Self, Error> {
320        let pem = pem.trim();
321        let rsa_sk = Rsa::<Private>::private_key_from_pem(pem.as_bytes())?;
322        check_rsa_private_key(&rsa_sk)?;
323        Ok(RSAKeyPair {
324            rsa_sk,
325            metadata: None,
326        })
327    }
328
329    pub fn to_der(&self) -> Result<Vec<u8>, Error> {
330        self.rsa_sk.private_key_to_der().map_err(Into::into)
331    }
332
333    pub fn to_pem(&self) -> Result<String, Error> {
334        let bytes = self.rsa_sk.private_key_to_pem()?;
335        let pem = String::from_utf8(bytes)?;
336        Ok(pem)
337    }
338
339    pub fn public_key(&self) -> RSAPublicKey {
340        let rsa_pk = Rsa::<Public>::from_public_components(
341            self.rsa_sk
342                .n()
343                .to_owned()
344                .expect("failed to create public key"),
345            self.rsa_sk
346                .e()
347                .to_owned()
348                .expect("failed to create public key"),
349        )
350        .expect("failed to create public key");
351        RSAPublicKey(rsa_pk)
352    }
353
354    pub fn generate(modulus_bits: usize) -> Result<Self, Error> {
355        match modulus_bits {
356            2048 | 3072 | 4096 => {}
357            _ => bail!(JWTError::UnsupportedRSAModulus),
358        };
359        let rsa_sk = Rsa::<Private>::generate(modulus_bits as _)?;
360        check_rsa_private_key(&rsa_sk)?;
361        Ok(RSAKeyPair {
362            rsa_sk,
363            metadata: None,
364        })
365    }
366}
367
368pub trait RSAKeyPairLike {
369    fn jwt_alg_name() -> &'static str;
370    fn key_pair(&self) -> &RSAKeyPair;
371    fn key_id(&self) -> &Option<String>;
372    fn metadata(&self) -> &Option<KeyMetadata>;
373    fn attach_metadata(&mut self, metadata: KeyMetadata) -> Result<(), Error>;
374    fn hash() -> MessageDigest;
375    fn padding_scheme(&self) -> Padding;
376
377    fn sign<CustomClaims: Serialize>(
378        &self,
379        claims: JWTClaims<CustomClaims>,
380    ) -> Result<String, Error> {
381        self.sign_with_options(claims, &Default::default())
382    }
383
384    fn sign_with_options<CustomClaims: Serialize>(
385        &self,
386        claims: JWTClaims<CustomClaims>,
387        opts: &HeaderOptions,
388    ) -> Result<String, Error> {
389        let jwt_header = JWTHeader::new(Self::jwt_alg_name().to_string(), self.key_id().clone())
390            .with_key_metadata(self.metadata())
391            .with_options(opts);
392        Token::build(&jwt_header, claims, |authenticated| {
393            let digest = Self::hash();
394            let pkey = PKey::from_rsa(self.key_pair().as_ref().clone())?;
395            let mut signer = Signer::new(digest, &pkey).unwrap();
396            signer.set_rsa_padding(self.padding_scheme())?;
397            signer.update(authenticated.as_bytes())?;
398            let signature = signer.sign_to_vec()?;
399            Ok(signature)
400        })
401    }
402}
403
404pub trait RSAPublicKeyLike {
405    fn jwt_alg_name() -> &'static str;
406    fn public_key(&self) -> &RSAPublicKey;
407    fn key_id(&self) -> &Option<String>;
408    fn set_key_id(&mut self, key_id: String);
409    fn hash() -> MessageDigest;
410    fn padding_scheme(&self) -> Padding;
411
412    fn verify_token<CustomClaims: DeserializeOwned>(
413        &self,
414        token: &str,
415        options: Option<VerificationOptions>,
416    ) -> Result<JWTClaims<CustomClaims>, Error> {
417        Token::verify(
418            Self::jwt_alg_name(),
419            token,
420            options,
421            |authenticated, signature| {
422                let digest = Self::hash();
423                let pkey = PKey::from_rsa(self.public_key().as_ref().clone())?;
424                let mut verifier = Verifier::new(digest, &pkey)?;
425                verifier.set_rsa_padding(self.padding_scheme())?;
426                verifier.update(authenticated.as_bytes())?;
427                if !(verifier
428                    .verify(signature)
429                    .map_err(|_| JWTError::InvalidSignature)?)
430                {
431                    bail!(JWTError::InvalidSignature);
432                }
433                Ok(())
434            },
435            |_salt: Option<&[u8]>| Ok(()),
436        )
437    }
438
439    #[cfg(feature = "cwt")]
440    fn verify_cwt_token<CustomClaims: DeserializeOwned>(
441        &self,
442        token: &[u8],
443        options: Option<VerificationOptions>,
444    ) -> Result<JWTClaims<NoCustomClaims>, Error> {
445        CWTToken::verify(
446            Self::jwt_alg_name(),
447            token,
448            options,
449            |authenticated, signature| {
450                let digest = Self::hash();
451                let pkey = PKey::from_rsa(self.public_key().as_ref().clone())?;
452                let mut verifier = Verifier::new(digest, &pkey)?;
453                verifier.set_rsa_padding(self.padding_scheme())?;
454                verifier.update(authenticated.as_bytes())?;
455                if !(verifier
456                    .verify(signature)
457                    .map_err(|_| JWTError::InvalidSignature)?)
458                {
459                    bail!(JWTError::InvalidSignature);
460                }
461                Ok(())
462            },
463        )
464    }
465
466    /// Decode CWT token metadata that can be useful prior to signature/tag verification
467    #[cfg(feature = "cwt")]
468    fn decode_cwt_metadata(&self, token: impl AsRef<[u8]>) -> Result<TokenMetadata, Error> {
469        CWTToken::decode_metadata(token)
470    }
471}
472
473#[derive(Clone)]
474pub struct RS256KeyPair {
475    key_pair: RSAKeyPair,
476    key_id: Option<String>,
477}
478
479impl std::fmt::Debug for RS256KeyPair {
480    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
481        write!(f, "Rsa")
482    }
483}
484
485#[derive(Debug, Clone)]
486pub struct RS256PublicKey {
487    pk: RSAPublicKey,
488    key_id: Option<String>,
489}
490
491impl RSAKeyPairLike for RS256KeyPair {
492    fn jwt_alg_name() -> &'static str {
493        "RS256"
494    }
495
496    fn key_pair(&self) -> &RSAKeyPair {
497        &self.key_pair
498    }
499
500    fn key_id(&self) -> &Option<String> {
501        &self.key_id
502    }
503
504    fn metadata(&self) -> &Option<KeyMetadata> {
505        &self.key_pair.metadata
506    }
507
508    fn attach_metadata(&mut self, metadata: KeyMetadata) -> Result<(), Error> {
509        self.key_pair.metadata = Some(metadata);
510        Ok(())
511    }
512
513    fn hash() -> MessageDigest {
514        MessageDigest::sha256()
515    }
516
517    fn padding_scheme(&self) -> Padding {
518        Padding::PKCS1
519    }
520}
521
522impl RS256KeyPair {
523    pub fn from_der(der: &[u8]) -> Result<Self, Error> {
524        Ok(RS256KeyPair {
525            key_pair: RSAKeyPair::from_der(der)?,
526            key_id: None,
527        })
528    }
529
530    pub fn from_pem(pem: &str) -> Result<Self, Error> {
531        Ok(RS256KeyPair {
532            key_pair: RSAKeyPair::from_pem(pem)?,
533            key_id: None,
534        })
535    }
536
537    pub fn to_der(&self) -> Result<Vec<u8>, Error> {
538        self.key_pair.to_der()
539    }
540
541    pub fn to_pem(&self) -> Result<String, Error> {
542        self.key_pair.to_pem()
543    }
544
545    pub fn public_key(&self) -> RS256PublicKey {
546        RS256PublicKey {
547            pk: self.key_pair.public_key(),
548            key_id: self.key_id.clone(),
549        }
550    }
551
552    pub fn generate(modulus_bits: usize) -> Result<Self, Error> {
553        Ok(RS256KeyPair {
554            key_pair: RSAKeyPair::generate(modulus_bits)?,
555            key_id: None,
556        })
557    }
558
559    pub fn with_key_id(mut self, key_id: &str) -> Self {
560        self.key_id = Some(key_id.to_string());
561        self
562    }
563
564    /// Import a key pair from a private RSA JWK.
565    ///
566    /// The modulus must be 2048 to 4096 bits long, and the exponent 65537.
567    /// See [strict JWK validation](crate#strict-jwk-validation) for the other rules.
568    pub fn from_jwk(jwk: &str) -> Result<Self, Error> {
569        let descriptor = rsa_jwk_descriptor(Self::jwt_alg_name(), KeyRole::SignaturePrivate);
570        let (rsa_sk, key_id) = rsa_private_key_from_jwk(jwk, &descriptor)?;
571        let key_pair = RSAKeyPair {
572            rsa_sk,
573            metadata: None,
574        };
575        Ok(RS256KeyPair { key_pair, key_id })
576    }
577
578    /// Export the key pair as a JWK, private key included.
579    /// Use `public_key().to_jwk()` to share the public key.
580    pub fn to_jwk(&self) -> String {
581        let descriptor = rsa_jwk_descriptor(Self::jwt_alg_name(), KeyRole::SignaturePrivate);
582        rsa_private_key_to_jwk(&self.key_pair.rsa_sk, &descriptor, self.key_id.as_deref())
583    }
584
585    /// The JWK thumbprint of the public key.
586    pub fn jwk_thumbprint(&self) -> String {
587        rsa_private_key_thumbprint(&self.key_pair.rsa_sk)
588    }
589}
590
591impl RSAPublicKeyLike for RS256PublicKey {
592    fn jwt_alg_name() -> &'static str {
593        "RS256"
594    }
595
596    fn hash() -> MessageDigest {
597        MessageDigest::sha256()
598    }
599
600    fn padding_scheme(&self) -> Padding {
601        Padding::PKCS1
602    }
603
604    fn public_key(&self) -> &RSAPublicKey {
605        &self.pk
606    }
607
608    fn key_id(&self) -> &Option<String> {
609        &self.key_id
610    }
611
612    fn set_key_id(&mut self, key_id: String) {
613        self.key_id = Some(key_id);
614    }
615}
616
617impl RS256PublicKey {
618    pub fn from_der(der: &[u8]) -> Result<Self, Error> {
619        Ok(RS256PublicKey {
620            pk: RSAPublicKey::from_der(der)?,
621            key_id: None,
622        })
623    }
624
625    pub fn from_pem(pem: &str) -> Result<Self, Error> {
626        Ok(RS256PublicKey {
627            pk: RSAPublicKey::from_pem(pem)?,
628            key_id: None,
629        })
630    }
631
632    pub fn from_components(n: &[u8], e: &[u8]) -> Result<Self, Error> {
633        Ok(RS256PublicKey {
634            pk: RSAPublicKey::from_components(n, e)?,
635            key_id: None,
636        })
637    }
638
639    pub fn to_der(&self) -> Result<Vec<u8>, Error> {
640        self.pk.to_der()
641    }
642
643    pub fn to_pem(&self) -> Result<String, Error> {
644        self.pk.to_pem()
645    }
646
647    pub fn to_components(&self) -> RSAPublicKeyComponents {
648        self.pk.to_components()
649    }
650
651    pub fn with_key_id(mut self, key_id: &str) -> Self {
652        self.key_id = Some(key_id.to_string());
653        self
654    }
655
656    /// Import a public key from an RSA JWK.
657    ///
658    /// The modulus must be 2048 to 4096 bits long, and the exponent 65537.
659    /// See [strict JWK validation](crate#strict-jwk-validation) for the other rules.
660    pub fn from_jwk(jwk: &str) -> Result<Self, Error> {
661        let descriptor = rsa_jwk_descriptor(Self::jwt_alg_name(), KeyRole::SignaturePublic);
662        let (rsa_pk, key_id) = rsa_public_key_from_jwk(jwk, &descriptor)?;
663        Ok(RS256PublicKey {
664            pk: RSAPublicKey(rsa_pk),
665            key_id,
666        })
667    }
668
669    /// Export the public key as a JWK, with `alg: RS256` and `use: sig`.
670    pub fn to_jwk(&self) -> String {
671        let descriptor = rsa_jwk_descriptor(Self::jwt_alg_name(), KeyRole::SignaturePublic);
672        rsa_public_key_to_jwk(&self.pk.0, &descriptor, self.key_id.as_deref())
673    }
674
675    /// The JWK thumbprint of the key.
676    pub fn jwk_thumbprint(&self) -> String {
677        rsa_public_key_thumbprint(&self.pk.0)
678    }
679
680    pub fn sha1_thumbprint(&self) -> String {
681        self.pk.thumbprint(|data| SHA1::hash(data).to_vec())
682    }
683
684    pub fn sha256_thumbprint(&self) -> String {
685        self.pk.thumbprint(|data| SHA256::hash(data).to_vec())
686    }
687}
688
689//
690
691#[derive(Clone)]
692pub struct RS512KeyPair {
693    key_pair: RSAKeyPair,
694    key_id: Option<String>,
695}
696
697impl std::fmt::Debug for RS512KeyPair {
698    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
699        write!(f, "Rsa")
700    }
701}
702
703#[derive(Debug, Clone)]
704pub struct RS512PublicKey {
705    pk: RSAPublicKey,
706    key_id: Option<String>,
707}
708
709impl RSAKeyPairLike for RS512KeyPair {
710    fn jwt_alg_name() -> &'static str {
711        "RS512"
712    }
713
714    fn key_pair(&self) -> &RSAKeyPair {
715        &self.key_pair
716    }
717
718    fn key_id(&self) -> &Option<String> {
719        &self.key_id
720    }
721
722    fn metadata(&self) -> &Option<KeyMetadata> {
723        &self.key_pair.metadata
724    }
725
726    fn attach_metadata(&mut self, metadata: KeyMetadata) -> Result<(), Error> {
727        self.key_pair.metadata = Some(metadata);
728        Ok(())
729    }
730
731    fn hash() -> MessageDigest {
732        MessageDigest::sha512()
733    }
734
735    fn padding_scheme(&self) -> Padding {
736        Padding::PKCS1
737    }
738}
739
740impl RS512KeyPair {
741    pub fn from_der(der: &[u8]) -> Result<Self, Error> {
742        Ok(RS512KeyPair {
743            key_pair: RSAKeyPair::from_der(der)?,
744            key_id: None,
745        })
746    }
747
748    pub fn from_pem(pem: &str) -> Result<Self, Error> {
749        Ok(RS512KeyPair {
750            key_pair: RSAKeyPair::from_pem(pem)?,
751            key_id: None,
752        })
753    }
754
755    pub fn to_der(&self) -> Result<Vec<u8>, Error> {
756        self.key_pair.to_der()
757    }
758
759    pub fn to_pem(&self) -> Result<String, Error> {
760        self.key_pair.to_pem()
761    }
762
763    pub fn public_key(&self) -> RS512PublicKey {
764        RS512PublicKey {
765            pk: self.key_pair.public_key(),
766            key_id: self.key_id.clone(),
767        }
768    }
769
770    pub fn generate(modulus_bits: usize) -> Result<Self, Error> {
771        Ok(RS512KeyPair {
772            key_pair: RSAKeyPair::generate(modulus_bits)?,
773            key_id: None,
774        })
775    }
776
777    pub fn with_key_id(mut self, key_id: &str) -> Self {
778        self.key_id = Some(key_id.to_string());
779        self
780    }
781
782    /// Import a key pair from a private RSA JWK.
783    ///
784    /// The modulus must be 2048 to 4096 bits long, and the exponent 65537.
785    /// See [strict JWK validation](crate#strict-jwk-validation) for the other rules.
786    pub fn from_jwk(jwk: &str) -> Result<Self, Error> {
787        let descriptor = rsa_jwk_descriptor(Self::jwt_alg_name(), KeyRole::SignaturePrivate);
788        let (rsa_sk, key_id) = rsa_private_key_from_jwk(jwk, &descriptor)?;
789        let key_pair = RSAKeyPair {
790            rsa_sk,
791            metadata: None,
792        };
793        Ok(RS512KeyPair { key_pair, key_id })
794    }
795
796    /// Export the key pair as a JWK, private key included.
797    /// Use `public_key().to_jwk()` to share the public key.
798    pub fn to_jwk(&self) -> String {
799        let descriptor = rsa_jwk_descriptor(Self::jwt_alg_name(), KeyRole::SignaturePrivate);
800        rsa_private_key_to_jwk(&self.key_pair.rsa_sk, &descriptor, self.key_id.as_deref())
801    }
802
803    /// The JWK thumbprint of the public key.
804    pub fn jwk_thumbprint(&self) -> String {
805        rsa_private_key_thumbprint(&self.key_pair.rsa_sk)
806    }
807}
808
809impl RSAPublicKeyLike for RS512PublicKey {
810    fn jwt_alg_name() -> &'static str {
811        "RS512"
812    }
813
814    fn hash() -> MessageDigest {
815        MessageDigest::sha512()
816    }
817
818    fn padding_scheme(&self) -> Padding {
819        Padding::PKCS1
820    }
821
822    fn public_key(&self) -> &RSAPublicKey {
823        &self.pk
824    }
825
826    fn key_id(&self) -> &Option<String> {
827        &self.key_id
828    }
829
830    fn set_key_id(&mut self, key_id: String) {
831        self.key_id = Some(key_id);
832    }
833}
834
835impl RS512PublicKey {
836    pub fn from_der(der: &[u8]) -> Result<Self, Error> {
837        Ok(RS512PublicKey {
838            pk: RSAPublicKey::from_der(der)?,
839            key_id: None,
840        })
841    }
842
843    pub fn from_pem(pem: &str) -> Result<Self, Error> {
844        Ok(RS512PublicKey {
845            pk: RSAPublicKey::from_pem(pem)?,
846            key_id: None,
847        })
848    }
849
850    pub fn from_components(n: &[u8], e: &[u8]) -> Result<Self, Error> {
851        Ok(RS512PublicKey {
852            pk: RSAPublicKey::from_components(n, e)?,
853            key_id: None,
854        })
855    }
856
857    pub fn to_der(&self) -> Result<Vec<u8>, Error> {
858        self.pk.to_der()
859    }
860
861    pub fn to_pem(&self) -> Result<String, Error> {
862        self.pk.to_pem()
863    }
864
865    pub fn to_components(&self) -> RSAPublicKeyComponents {
866        self.pk.to_components()
867    }
868
869    pub fn with_key_id(mut self, key_id: &str) -> Self {
870        self.key_id = Some(key_id.to_string());
871        self
872    }
873
874    /// Import a public key from an RSA JWK.
875    ///
876    /// The modulus must be 2048 to 4096 bits long, and the exponent 65537.
877    /// See [strict JWK validation](crate#strict-jwk-validation) for the other rules.
878    pub fn from_jwk(jwk: &str) -> Result<Self, Error> {
879        let descriptor = rsa_jwk_descriptor(Self::jwt_alg_name(), KeyRole::SignaturePublic);
880        let (rsa_pk, key_id) = rsa_public_key_from_jwk(jwk, &descriptor)?;
881        Ok(RS512PublicKey {
882            pk: RSAPublicKey(rsa_pk),
883            key_id,
884        })
885    }
886
887    /// Export the public key as a JWK, with `alg: RS512` and `use: sig`.
888    pub fn to_jwk(&self) -> String {
889        let descriptor = rsa_jwk_descriptor(Self::jwt_alg_name(), KeyRole::SignaturePublic);
890        rsa_public_key_to_jwk(&self.pk.0, &descriptor, self.key_id.as_deref())
891    }
892
893    /// The JWK thumbprint of the key.
894    pub fn jwk_thumbprint(&self) -> String {
895        rsa_public_key_thumbprint(&self.pk.0)
896    }
897
898    pub fn sha1_thumbprint(&self) -> String {
899        self.pk.thumbprint(|data| SHA1::hash(data).to_vec())
900    }
901
902    pub fn sha256_thumbprint(&self) -> String {
903        self.pk.thumbprint(|data| SHA256::hash(data).to_vec())
904    }
905}
906
907//
908
909#[derive(Clone)]
910pub struct RS384KeyPair {
911    key_pair: RSAKeyPair,
912    key_id: Option<String>,
913}
914
915impl std::fmt::Debug for RS384KeyPair {
916    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
917        write!(f, "Rsa")
918    }
919}
920
921#[derive(Debug, Clone)]
922pub struct RS384PublicKey {
923    pk: RSAPublicKey,
924    key_id: Option<String>,
925}
926
927impl RSAKeyPairLike for RS384KeyPair {
928    fn jwt_alg_name() -> &'static str {
929        "RS384"
930    }
931
932    fn key_pair(&self) -> &RSAKeyPair {
933        &self.key_pair
934    }
935
936    fn key_id(&self) -> &Option<String> {
937        &self.key_id
938    }
939
940    fn metadata(&self) -> &Option<KeyMetadata> {
941        &self.key_pair.metadata
942    }
943
944    fn attach_metadata(&mut self, metadata: KeyMetadata) -> Result<(), Error> {
945        self.key_pair.metadata = Some(metadata);
946        Ok(())
947    }
948
949    fn hash() -> MessageDigest {
950        MessageDigest::sha384()
951    }
952
953    fn padding_scheme(&self) -> Padding {
954        Padding::PKCS1
955    }
956}
957
958impl RS384KeyPair {
959    pub fn from_der(der: &[u8]) -> Result<Self, Error> {
960        Ok(RS384KeyPair {
961            key_pair: RSAKeyPair::from_der(der)?,
962            key_id: None,
963        })
964    }
965
966    pub fn from_pem(pem: &str) -> Result<Self, Error> {
967        Ok(RS384KeyPair {
968            key_pair: RSAKeyPair::from_pem(pem)?,
969            key_id: None,
970        })
971    }
972
973    pub fn to_der(&self) -> Result<Vec<u8>, Error> {
974        self.key_pair.to_der()
975    }
976
977    pub fn to_pem(&self) -> Result<String, Error> {
978        self.key_pair.to_pem()
979    }
980
981    pub fn public_key(&self) -> RS384PublicKey {
982        RS384PublicKey {
983            pk: self.key_pair.public_key(),
984            key_id: self.key_id.clone(),
985        }
986    }
987
988    pub fn generate(modulus_bits: usize) -> Result<Self, Error> {
989        Ok(RS384KeyPair {
990            key_pair: RSAKeyPair::generate(modulus_bits)?,
991            key_id: None,
992        })
993    }
994
995    pub fn with_key_id(mut self, key_id: &str) -> Self {
996        self.key_id = Some(key_id.to_string());
997        self
998    }
999
1000    /// Import a key pair from a private RSA JWK.
1001    ///
1002    /// The modulus must be 2048 to 4096 bits long, and the exponent 65537.
1003    /// See [strict JWK validation](crate#strict-jwk-validation) for the other rules.
1004    pub fn from_jwk(jwk: &str) -> Result<Self, Error> {
1005        let descriptor = rsa_jwk_descriptor(Self::jwt_alg_name(), KeyRole::SignaturePrivate);
1006        let (rsa_sk, key_id) = rsa_private_key_from_jwk(jwk, &descriptor)?;
1007        let key_pair = RSAKeyPair {
1008            rsa_sk,
1009            metadata: None,
1010        };
1011        Ok(RS384KeyPair { key_pair, key_id })
1012    }
1013
1014    /// Export the key pair as a JWK, private key included.
1015    /// Use `public_key().to_jwk()` to share the public key.
1016    pub fn to_jwk(&self) -> String {
1017        let descriptor = rsa_jwk_descriptor(Self::jwt_alg_name(), KeyRole::SignaturePrivate);
1018        rsa_private_key_to_jwk(&self.key_pair.rsa_sk, &descriptor, self.key_id.as_deref())
1019    }
1020
1021    /// The JWK thumbprint of the public key.
1022    pub fn jwk_thumbprint(&self) -> String {
1023        rsa_private_key_thumbprint(&self.key_pair.rsa_sk)
1024    }
1025}
1026
1027impl RSAPublicKeyLike for RS384PublicKey {
1028    fn jwt_alg_name() -> &'static str {
1029        "RS384"
1030    }
1031
1032    fn hash() -> MessageDigest {
1033        MessageDigest::sha384()
1034    }
1035
1036    fn padding_scheme(&self) -> Padding {
1037        Padding::PKCS1
1038    }
1039
1040    fn public_key(&self) -> &RSAPublicKey {
1041        &self.pk
1042    }
1043
1044    fn key_id(&self) -> &Option<String> {
1045        &self.key_id
1046    }
1047
1048    fn set_key_id(&mut self, key_id: String) {
1049        self.key_id = Some(key_id);
1050    }
1051}
1052
1053impl RS384PublicKey {
1054    pub fn from_der(der: &[u8]) -> Result<Self, Error> {
1055        Ok(RS384PublicKey {
1056            pk: RSAPublicKey::from_der(der)?,
1057            key_id: None,
1058        })
1059    }
1060
1061    pub fn from_pem(pem: &str) -> Result<Self, Error> {
1062        Ok(RS384PublicKey {
1063            pk: RSAPublicKey::from_pem(pem)?,
1064            key_id: None,
1065        })
1066    }
1067
1068    pub fn from_components(n: &[u8], e: &[u8]) -> Result<Self, Error> {
1069        Ok(RS384PublicKey {
1070            pk: RSAPublicKey::from_components(n, e)?,
1071            key_id: None,
1072        })
1073    }
1074
1075    pub fn to_der(&self) -> Result<Vec<u8>, Error> {
1076        self.pk.to_der()
1077    }
1078
1079    pub fn to_pem(&self) -> Result<String, Error> {
1080        self.pk.to_pem()
1081    }
1082
1083    pub fn to_components(&self) -> RSAPublicKeyComponents {
1084        self.pk.to_components()
1085    }
1086
1087    pub fn with_key_id(mut self, key_id: &str) -> Self {
1088        self.key_id = Some(key_id.to_string());
1089        self
1090    }
1091
1092    /// Import a public key from an RSA JWK.
1093    ///
1094    /// The modulus must be 2048 to 4096 bits long, and the exponent 65537.
1095    /// See [strict JWK validation](crate#strict-jwk-validation) for the other rules.
1096    pub fn from_jwk(jwk: &str) -> Result<Self, Error> {
1097        let descriptor = rsa_jwk_descriptor(Self::jwt_alg_name(), KeyRole::SignaturePublic);
1098        let (rsa_pk, key_id) = rsa_public_key_from_jwk(jwk, &descriptor)?;
1099        Ok(RS384PublicKey {
1100            pk: RSAPublicKey(rsa_pk),
1101            key_id,
1102        })
1103    }
1104
1105    /// Export the public key as a JWK, with `alg: RS384` and `use: sig`.
1106    pub fn to_jwk(&self) -> String {
1107        let descriptor = rsa_jwk_descriptor(Self::jwt_alg_name(), KeyRole::SignaturePublic);
1108        rsa_public_key_to_jwk(&self.pk.0, &descriptor, self.key_id.as_deref())
1109    }
1110
1111    /// The JWK thumbprint of the key.
1112    pub fn jwk_thumbprint(&self) -> String {
1113        rsa_public_key_thumbprint(&self.pk.0)
1114    }
1115
1116    pub fn sha1_thumbprint(&self) -> String {
1117        self.pk.thumbprint(|data| SHA1::hash(data).to_vec())
1118    }
1119
1120    pub fn sha256_thumbprint(&self) -> String {
1121        self.pk.thumbprint(|data| SHA256::hash(data).to_vec())
1122    }
1123}
1124
1125//
1126
1127#[derive(Clone)]
1128pub struct PS256KeyPair {
1129    key_pair: RSAKeyPair,
1130    key_id: Option<String>,
1131}
1132
1133impl std::fmt::Debug for PS256KeyPair {
1134    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1135        write!(f, "Rsa")
1136    }
1137}
1138
1139#[derive(Debug, Clone)]
1140pub struct PS256PublicKey {
1141    pk: RSAPublicKey,
1142    key_id: Option<String>,
1143}
1144
1145impl RSAKeyPairLike for PS256KeyPair {
1146    fn jwt_alg_name() -> &'static str {
1147        "PS256"
1148    }
1149
1150    fn key_pair(&self) -> &RSAKeyPair {
1151        &self.key_pair
1152    }
1153
1154    fn key_id(&self) -> &Option<String> {
1155        &self.key_id
1156    }
1157
1158    fn metadata(&self) -> &Option<KeyMetadata> {
1159        &self.key_pair.metadata
1160    }
1161
1162    fn attach_metadata(&mut self, metadata: KeyMetadata) -> Result<(), Error> {
1163        self.key_pair.metadata = Some(metadata);
1164        Ok(())
1165    }
1166
1167    fn hash() -> MessageDigest {
1168        MessageDigest::sha256()
1169    }
1170
1171    fn padding_scheme(&self) -> Padding {
1172        Padding::PKCS1_PSS
1173    }
1174}
1175
1176impl PS256KeyPair {
1177    pub fn from_der(der: &[u8]) -> Result<Self, Error> {
1178        Ok(PS256KeyPair {
1179            key_pair: RSAKeyPair::from_der(der)?,
1180            key_id: None,
1181        })
1182    }
1183
1184    pub fn from_pem(pem: &str) -> Result<Self, Error> {
1185        Ok(PS256KeyPair {
1186            key_pair: RSAKeyPair::from_pem(pem)?,
1187            key_id: None,
1188        })
1189    }
1190
1191    pub fn to_der(&self) -> Result<Vec<u8>, Error> {
1192        self.key_pair.to_der()
1193    }
1194
1195    pub fn to_pem(&self) -> Result<String, Error> {
1196        self.key_pair.to_pem()
1197    }
1198
1199    pub fn public_key(&self) -> PS256PublicKey {
1200        PS256PublicKey {
1201            pk: self.key_pair.public_key(),
1202            key_id: self.key_id.clone(),
1203        }
1204    }
1205
1206    pub fn generate(modulus_bits: usize) -> Result<Self, Error> {
1207        Ok(PS256KeyPair {
1208            key_pair: RSAKeyPair::generate(modulus_bits)?,
1209            key_id: None,
1210        })
1211    }
1212
1213    pub fn with_key_id(mut self, key_id: &str) -> Self {
1214        self.key_id = Some(key_id.to_string());
1215        self
1216    }
1217
1218    /// Import a key pair from a private RSA JWK.
1219    ///
1220    /// The modulus must be 2048 to 4096 bits long, and the exponent 65537.
1221    /// See [strict JWK validation](crate#strict-jwk-validation) for the other rules.
1222    pub fn from_jwk(jwk: &str) -> Result<Self, Error> {
1223        let descriptor = rsa_jwk_descriptor(Self::jwt_alg_name(), KeyRole::SignaturePrivate);
1224        let (rsa_sk, key_id) = rsa_private_key_from_jwk(jwk, &descriptor)?;
1225        let key_pair = RSAKeyPair {
1226            rsa_sk,
1227            metadata: None,
1228        };
1229        Ok(PS256KeyPair { key_pair, key_id })
1230    }
1231
1232    /// Export the key pair as a JWK, private key included.
1233    /// Use `public_key().to_jwk()` to share the public key.
1234    pub fn to_jwk(&self) -> String {
1235        let descriptor = rsa_jwk_descriptor(Self::jwt_alg_name(), KeyRole::SignaturePrivate);
1236        rsa_private_key_to_jwk(&self.key_pair.rsa_sk, &descriptor, self.key_id.as_deref())
1237    }
1238
1239    /// The JWK thumbprint of the public key.
1240    pub fn jwk_thumbprint(&self) -> String {
1241        rsa_private_key_thumbprint(&self.key_pair.rsa_sk)
1242    }
1243}
1244
1245impl RSAPublicKeyLike for PS256PublicKey {
1246    fn jwt_alg_name() -> &'static str {
1247        "PS256"
1248    }
1249
1250    fn hash() -> MessageDigest {
1251        MessageDigest::sha256()
1252    }
1253
1254    fn padding_scheme(&self) -> Padding {
1255        Padding::PKCS1_PSS
1256    }
1257
1258    fn public_key(&self) -> &RSAPublicKey {
1259        &self.pk
1260    }
1261
1262    fn key_id(&self) -> &Option<String> {
1263        &self.key_id
1264    }
1265
1266    fn set_key_id(&mut self, key_id: String) {
1267        self.key_id = Some(key_id);
1268    }
1269}
1270
1271impl PS256PublicKey {
1272    pub fn from_der(der: &[u8]) -> Result<Self, Error> {
1273        Ok(PS256PublicKey {
1274            pk: RSAPublicKey::from_der(der)?,
1275            key_id: None,
1276        })
1277    }
1278
1279    pub fn from_pem(pem: &str) -> Result<Self, Error> {
1280        Ok(PS256PublicKey {
1281            pk: RSAPublicKey::from_pem(pem)?,
1282            key_id: None,
1283        })
1284    }
1285
1286    pub fn from_components(n: &[u8], e: &[u8]) -> Result<Self, Error> {
1287        Ok(PS256PublicKey {
1288            pk: RSAPublicKey::from_components(n, e)?,
1289            key_id: None,
1290        })
1291    }
1292
1293    pub fn to_der(&self) -> Result<Vec<u8>, Error> {
1294        self.pk.to_der()
1295    }
1296
1297    pub fn to_pem(&self) -> Result<String, Error> {
1298        self.pk.to_pem()
1299    }
1300
1301    pub fn to_components(&self) -> RSAPublicKeyComponents {
1302        self.pk.to_components()
1303    }
1304
1305    pub fn with_key_id(mut self, key_id: &str) -> Self {
1306        self.key_id = Some(key_id.to_string());
1307        self
1308    }
1309
1310    /// Import a public key from an RSA JWK.
1311    ///
1312    /// The modulus must be 2048 to 4096 bits long, and the exponent 65537.
1313    /// See [strict JWK validation](crate#strict-jwk-validation) for the other rules.
1314    pub fn from_jwk(jwk: &str) -> Result<Self, Error> {
1315        let descriptor = rsa_jwk_descriptor(Self::jwt_alg_name(), KeyRole::SignaturePublic);
1316        let (rsa_pk, key_id) = rsa_public_key_from_jwk(jwk, &descriptor)?;
1317        Ok(PS256PublicKey {
1318            pk: RSAPublicKey(rsa_pk),
1319            key_id,
1320        })
1321    }
1322
1323    /// Export the public key as a JWK, with `alg: PS256` and `use: sig`.
1324    pub fn to_jwk(&self) -> String {
1325        let descriptor = rsa_jwk_descriptor(Self::jwt_alg_name(), KeyRole::SignaturePublic);
1326        rsa_public_key_to_jwk(&self.pk.0, &descriptor, self.key_id.as_deref())
1327    }
1328
1329    /// The JWK thumbprint of the key.
1330    pub fn jwk_thumbprint(&self) -> String {
1331        rsa_public_key_thumbprint(&self.pk.0)
1332    }
1333}
1334
1335//
1336
1337#[derive(Clone)]
1338pub struct PS512KeyPair {
1339    key_pair: RSAKeyPair,
1340    key_id: Option<String>,
1341}
1342
1343impl std::fmt::Debug for PS512KeyPair {
1344    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1345        write!(f, "Rsa")
1346    }
1347}
1348
1349#[derive(Debug, Clone)]
1350pub struct PS512PublicKey {
1351    pk: RSAPublicKey,
1352    key_id: Option<String>,
1353}
1354
1355impl RSAKeyPairLike for PS512KeyPair {
1356    fn jwt_alg_name() -> &'static str {
1357        "PS512"
1358    }
1359
1360    fn key_pair(&self) -> &RSAKeyPair {
1361        &self.key_pair
1362    }
1363
1364    fn key_id(&self) -> &Option<String> {
1365        &self.key_id
1366    }
1367
1368    fn metadata(&self) -> &Option<KeyMetadata> {
1369        &self.key_pair.metadata
1370    }
1371
1372    fn attach_metadata(&mut self, metadata: KeyMetadata) -> Result<(), Error> {
1373        self.key_pair.metadata = Some(metadata);
1374        Ok(())
1375    }
1376
1377    fn hash() -> MessageDigest {
1378        MessageDigest::sha512()
1379    }
1380
1381    fn padding_scheme(&self) -> Padding {
1382        Padding::PKCS1_PSS
1383    }
1384}
1385
1386impl PS512KeyPair {
1387    pub fn from_der(der: &[u8]) -> Result<Self, Error> {
1388        Ok(PS512KeyPair {
1389            key_pair: RSAKeyPair::from_der(der)?,
1390            key_id: None,
1391        })
1392    }
1393
1394    pub fn from_pem(pem: &str) -> Result<Self, Error> {
1395        Ok(PS512KeyPair {
1396            key_pair: RSAKeyPair::from_pem(pem)?,
1397            key_id: None,
1398        })
1399    }
1400
1401    pub fn to_der(&self) -> Result<Vec<u8>, Error> {
1402        self.key_pair.to_der()
1403    }
1404
1405    pub fn to_pem(&self) -> Result<String, Error> {
1406        self.key_pair.to_pem()
1407    }
1408
1409    pub fn public_key(&self) -> PS512PublicKey {
1410        PS512PublicKey {
1411            pk: self.key_pair.public_key(),
1412            key_id: self.key_id.clone(),
1413        }
1414    }
1415
1416    pub fn generate(modulus_bits: usize) -> Result<Self, Error> {
1417        Ok(PS512KeyPair {
1418            key_pair: RSAKeyPair::generate(modulus_bits)?,
1419            key_id: None,
1420        })
1421    }
1422
1423    pub fn with_key_id(mut self, key_id: &str) -> Self {
1424        self.key_id = Some(key_id.to_string());
1425        self
1426    }
1427
1428    /// Import a key pair from a private RSA JWK.
1429    ///
1430    /// The modulus must be 2048 to 4096 bits long, and the exponent 65537.
1431    /// See [strict JWK validation](crate#strict-jwk-validation) for the other rules.
1432    pub fn from_jwk(jwk: &str) -> Result<Self, Error> {
1433        let descriptor = rsa_jwk_descriptor(Self::jwt_alg_name(), KeyRole::SignaturePrivate);
1434        let (rsa_sk, key_id) = rsa_private_key_from_jwk(jwk, &descriptor)?;
1435        let key_pair = RSAKeyPair {
1436            rsa_sk,
1437            metadata: None,
1438        };
1439        Ok(PS512KeyPair { key_pair, key_id })
1440    }
1441
1442    /// Export the key pair as a JWK, private key included.
1443    /// Use `public_key().to_jwk()` to share the public key.
1444    pub fn to_jwk(&self) -> String {
1445        let descriptor = rsa_jwk_descriptor(Self::jwt_alg_name(), KeyRole::SignaturePrivate);
1446        rsa_private_key_to_jwk(&self.key_pair.rsa_sk, &descriptor, self.key_id.as_deref())
1447    }
1448
1449    /// The JWK thumbprint of the public key.
1450    pub fn jwk_thumbprint(&self) -> String {
1451        rsa_private_key_thumbprint(&self.key_pair.rsa_sk)
1452    }
1453}
1454
1455impl RSAPublicKeyLike for PS512PublicKey {
1456    fn jwt_alg_name() -> &'static str {
1457        "PS512"
1458    }
1459
1460    fn hash() -> MessageDigest {
1461        MessageDigest::sha512()
1462    }
1463
1464    fn padding_scheme(&self) -> Padding {
1465        Padding::PKCS1_PSS
1466    }
1467
1468    fn public_key(&self) -> &RSAPublicKey {
1469        &self.pk
1470    }
1471
1472    fn key_id(&self) -> &Option<String> {
1473        &self.key_id
1474    }
1475
1476    fn set_key_id(&mut self, key_id: String) {
1477        self.key_id = Some(key_id);
1478    }
1479}
1480
1481impl PS512PublicKey {
1482    pub fn from_der(der: &[u8]) -> Result<Self, Error> {
1483        Ok(PS512PublicKey {
1484            pk: RSAPublicKey::from_der(der)?,
1485            key_id: None,
1486        })
1487    }
1488
1489    pub fn from_pem(pem: &str) -> Result<Self, Error> {
1490        Ok(PS512PublicKey {
1491            pk: RSAPublicKey::from_pem(pem)?,
1492            key_id: None,
1493        })
1494    }
1495
1496    pub fn from_components(n: &[u8], e: &[u8]) -> Result<Self, Error> {
1497        Ok(PS512PublicKey {
1498            pk: RSAPublicKey::from_components(n, e)?,
1499            key_id: None,
1500        })
1501    }
1502
1503    pub fn to_der(&self) -> Result<Vec<u8>, Error> {
1504        self.pk.to_der()
1505    }
1506
1507    pub fn to_pem(&self) -> Result<String, Error> {
1508        self.pk.to_pem()
1509    }
1510
1511    pub fn to_components(&self) -> RSAPublicKeyComponents {
1512        self.pk.to_components()
1513    }
1514
1515    pub fn with_key_id(mut self, key_id: &str) -> Self {
1516        self.key_id = Some(key_id.to_string());
1517        self
1518    }
1519
1520    /// Import a public key from an RSA JWK.
1521    ///
1522    /// The modulus must be 2048 to 4096 bits long, and the exponent 65537.
1523    /// See [strict JWK validation](crate#strict-jwk-validation) for the other rules.
1524    pub fn from_jwk(jwk: &str) -> Result<Self, Error> {
1525        let descriptor = rsa_jwk_descriptor(Self::jwt_alg_name(), KeyRole::SignaturePublic);
1526        let (rsa_pk, key_id) = rsa_public_key_from_jwk(jwk, &descriptor)?;
1527        Ok(PS512PublicKey {
1528            pk: RSAPublicKey(rsa_pk),
1529            key_id,
1530        })
1531    }
1532
1533    /// Export the public key as a JWK, with `alg: PS512` and `use: sig`.
1534    pub fn to_jwk(&self) -> String {
1535        let descriptor = rsa_jwk_descriptor(Self::jwt_alg_name(), KeyRole::SignaturePublic);
1536        rsa_public_key_to_jwk(&self.pk.0, &descriptor, self.key_id.as_deref())
1537    }
1538
1539    /// The JWK thumbprint of the key.
1540    pub fn jwk_thumbprint(&self) -> String {
1541        rsa_public_key_thumbprint(&self.pk.0)
1542    }
1543
1544    pub fn sha1_thumbprint(&self) -> String {
1545        self.pk.thumbprint(|data| SHA1::hash(data).to_vec())
1546    }
1547
1548    pub fn sha256_thumbprint(&self) -> String {
1549        self.pk.thumbprint(|data| SHA256::hash(data).to_vec())
1550    }
1551}
1552
1553//
1554
1555#[derive(Clone)]
1556pub struct PS384KeyPair {
1557    key_pair: RSAKeyPair,
1558    key_id: Option<String>,
1559}
1560
1561impl std::fmt::Debug for PS384KeyPair {
1562    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1563        write!(f, "Rsa")
1564    }
1565}
1566
1567#[derive(Debug, Clone)]
1568pub struct PS384PublicKey {
1569    pk: RSAPublicKey,
1570    key_id: Option<String>,
1571}
1572
1573impl RSAKeyPairLike for PS384KeyPair {
1574    fn jwt_alg_name() -> &'static str {
1575        "PS384"
1576    }
1577
1578    fn key_pair(&self) -> &RSAKeyPair {
1579        &self.key_pair
1580    }
1581
1582    fn key_id(&self) -> &Option<String> {
1583        &self.key_id
1584    }
1585
1586    fn metadata(&self) -> &Option<KeyMetadata> {
1587        &self.key_pair.metadata
1588    }
1589
1590    fn attach_metadata(&mut self, metadata: KeyMetadata) -> Result<(), Error> {
1591        self.key_pair.metadata = Some(metadata);
1592        Ok(())
1593    }
1594
1595    fn hash() -> MessageDigest {
1596        MessageDigest::sha384()
1597    }
1598
1599    fn padding_scheme(&self) -> Padding {
1600        Padding::PKCS1_PSS
1601    }
1602}
1603
1604impl PS384KeyPair {
1605    pub fn from_der(der: &[u8]) -> Result<Self, Error> {
1606        Ok(PS384KeyPair {
1607            key_pair: RSAKeyPair::from_der(der)?,
1608            key_id: None,
1609        })
1610    }
1611
1612    pub fn from_pem(pem: &str) -> Result<Self, Error> {
1613        Ok(PS384KeyPair {
1614            key_pair: RSAKeyPair::from_pem(pem)?,
1615            key_id: None,
1616        })
1617    }
1618
1619    pub fn to_der(&self) -> Result<Vec<u8>, Error> {
1620        self.key_pair.to_der()
1621    }
1622
1623    pub fn to_pem(&self) -> Result<String, Error> {
1624        self.key_pair.to_pem()
1625    }
1626
1627    pub fn public_key(&self) -> PS384PublicKey {
1628        PS384PublicKey {
1629            pk: self.key_pair.public_key(),
1630            key_id: self.key_id.clone(),
1631        }
1632    }
1633
1634    pub fn generate(modulus_bits: usize) -> Result<Self, Error> {
1635        Ok(PS384KeyPair {
1636            key_pair: RSAKeyPair::generate(modulus_bits)?,
1637            key_id: None,
1638        })
1639    }
1640
1641    pub fn with_key_id(mut self, key_id: &str) -> Self {
1642        self.key_id = Some(key_id.to_string());
1643        self
1644    }
1645
1646    /// Import a key pair from a private RSA JWK.
1647    ///
1648    /// The modulus must be 2048 to 4096 bits long, and the exponent 65537.
1649    /// See [strict JWK validation](crate#strict-jwk-validation) for the other rules.
1650    pub fn from_jwk(jwk: &str) -> Result<Self, Error> {
1651        let descriptor = rsa_jwk_descriptor(Self::jwt_alg_name(), KeyRole::SignaturePrivate);
1652        let (rsa_sk, key_id) = rsa_private_key_from_jwk(jwk, &descriptor)?;
1653        let key_pair = RSAKeyPair {
1654            rsa_sk,
1655            metadata: None,
1656        };
1657        Ok(PS384KeyPair { key_pair, key_id })
1658    }
1659
1660    /// Export the key pair as a JWK, private key included.
1661    /// Use `public_key().to_jwk()` to share the public key.
1662    pub fn to_jwk(&self) -> String {
1663        let descriptor = rsa_jwk_descriptor(Self::jwt_alg_name(), KeyRole::SignaturePrivate);
1664        rsa_private_key_to_jwk(&self.key_pair.rsa_sk, &descriptor, self.key_id.as_deref())
1665    }
1666
1667    /// The JWK thumbprint of the public key.
1668    pub fn jwk_thumbprint(&self) -> String {
1669        rsa_private_key_thumbprint(&self.key_pair.rsa_sk)
1670    }
1671}
1672
1673impl RSAPublicKeyLike for PS384PublicKey {
1674    fn jwt_alg_name() -> &'static str {
1675        "PS384"
1676    }
1677
1678    fn hash() -> MessageDigest {
1679        MessageDigest::sha384()
1680    }
1681
1682    fn padding_scheme(&self) -> Padding {
1683        Padding::PKCS1_PSS
1684    }
1685
1686    fn public_key(&self) -> &RSAPublicKey {
1687        &self.pk
1688    }
1689
1690    fn key_id(&self) -> &Option<String> {
1691        &self.key_id
1692    }
1693
1694    fn set_key_id(&mut self, key_id: String) {
1695        self.key_id = Some(key_id);
1696    }
1697}
1698
1699impl PS384PublicKey {
1700    pub fn from_der(der: &[u8]) -> Result<Self, Error> {
1701        Ok(PS384PublicKey {
1702            pk: RSAPublicKey::from_der(der)?,
1703            key_id: None,
1704        })
1705    }
1706
1707    pub fn from_pem(pem: &str) -> Result<Self, Error> {
1708        Ok(PS384PublicKey {
1709            pk: RSAPublicKey::from_pem(pem)?,
1710            key_id: None,
1711        })
1712    }
1713
1714    pub fn from_components(n: &[u8], e: &[u8]) -> Result<Self, Error> {
1715        Ok(PS384PublicKey {
1716            pk: RSAPublicKey::from_components(n, e)?,
1717            key_id: None,
1718        })
1719    }
1720
1721    pub fn to_der(&self) -> Result<Vec<u8>, Error> {
1722        self.pk.to_der()
1723    }
1724
1725    pub fn to_pem(&self) -> Result<String, Error> {
1726        self.pk.to_pem()
1727    }
1728
1729    pub fn to_components(&self) -> RSAPublicKeyComponents {
1730        self.pk.to_components()
1731    }
1732
1733    pub fn with_key_id(mut self, key_id: &str) -> Self {
1734        self.key_id = Some(key_id.to_string());
1735        self
1736    }
1737
1738    /// Import a public key from an RSA JWK.
1739    ///
1740    /// The modulus must be 2048 to 4096 bits long, and the exponent 65537.
1741    /// See [strict JWK validation](crate#strict-jwk-validation) for the other rules.
1742    pub fn from_jwk(jwk: &str) -> Result<Self, Error> {
1743        let descriptor = rsa_jwk_descriptor(Self::jwt_alg_name(), KeyRole::SignaturePublic);
1744        let (rsa_pk, key_id) = rsa_public_key_from_jwk(jwk, &descriptor)?;
1745        Ok(PS384PublicKey {
1746            pk: RSAPublicKey(rsa_pk),
1747            key_id,
1748        })
1749    }
1750
1751    /// Export the public key as a JWK, with `alg: PS384` and `use: sig`.
1752    pub fn to_jwk(&self) -> String {
1753        let descriptor = rsa_jwk_descriptor(Self::jwt_alg_name(), KeyRole::SignaturePublic);
1754        rsa_public_key_to_jwk(&self.pk.0, &descriptor, self.key_id.as_deref())
1755    }
1756
1757    /// The JWK thumbprint of the key.
1758    pub fn jwk_thumbprint(&self) -> String {
1759        rsa_public_key_thumbprint(&self.pk.0)
1760    }
1761
1762    pub fn sha1_thumbprint(&self) -> String {
1763        self.pk.thumbprint(|data| SHA1::hash(data).to_vec())
1764    }
1765
1766    pub fn sha256_thumbprint(&self) -> String {
1767        self.pk.thumbprint(|data| SHA256::hash(data).to_vec())
1768    }
1769}
1770
1771#[cfg(test)]
1772mod tests {
1773    use super::*;
1774    use crate::algorithms::rsa_test_keys::{
1775        der_from_pem, key_2048, TestKey, KEYS, OPENSSL_RS256_JWT_1024,
1776    };
1777    use crate::algorithms::test_util::{error_of, unb64};
1778
1779    fn assert_policy_error(key: &TestKey, error: JWTError, private: bool) {
1780        assert!(
1781            key.is_policy_error(&error, private),
1782            "unexpected error for {}-bit e={}: {:?}",
1783            key.bits,
1784            key.e,
1785            error
1786        );
1787    }
1788
1789    macro_rules! check_policy {
1790        ($key_pair:ident, $public_key:ident) => {
1791            for key in KEYS {
1792                let public_der = der_from_pem(key.public_pem);
1793                let rsa_pk = Rsa::<Public>::public_key_from_der(&public_der).ok();
1794                let components = rsa_pk.as_ref().map(|pk| (pk.n().to_vec(), pk.e().to_vec()));
1795
1796                if !key.is_allowed() {
1797                    for res in [
1798                        $key_pair::from_pem(key.private_pem),
1799                        $key_pair::from_der(&der_from_pem(key.private_pem)),
1800                    ] {
1801                        assert_policy_error(key, error_of(res), true);
1802                    }
1803                    let public_results = [
1804                        $public_key::from_pem(key.public_pem),
1805                        $public_key::from_der(&public_der),
1806                    ];
1807                    for res in public_results {
1808                        if key.backend_rejects_public_key() {
1809                            assert!(res.is_err(), "{}-bit", key.bits);
1810                        } else {
1811                            assert_policy_error(key, error_of(res), false);
1812                        }
1813                    }
1814                    if let Some((n, e)) = &components {
1815                        assert_policy_error(
1816                            key,
1817                            error_of($public_key::from_components(n, e)),
1818                            false,
1819                        );
1820                    }
1821                    continue;
1822                }
1823
1824                let key_pair = $key_pair::from_pem(key.private_pem).unwrap();
1825                let key_pair_der = $key_pair::from_der(&der_from_pem(key.private_pem)).unwrap();
1826                let (n, e) = components.unwrap();
1827                let public_keys = [
1828                    key_pair.public_key(),
1829                    $public_key::from_pem(key.public_pem).unwrap(),
1830                    $public_key::from_der(&public_der).unwrap(),
1831                    $public_key::from_components(&n, &e).unwrap(),
1832                ];
1833                for signer in [&key_pair, &key_pair_der] {
1834                    let token = signer
1835                        .sign(Claims::create(coarsetime::Duration::from_hours(1)))
1836                        .unwrap();
1837                    for public_key in &public_keys {
1838                        public_key
1839                            .verify_token::<NoCustomClaims>(&token, None)
1840                            .unwrap();
1841                    }
1842                }
1843            }
1844        };
1845    }
1846
1847    #[test]
1848    fn policy_applies_to_every_signature_type_and_format() {
1849        check_policy!(RS256KeyPair, RS256PublicKey);
1850        check_policy!(RS384KeyPair, RS384PublicKey);
1851        check_policy!(RS512KeyPair, RS512PublicKey);
1852        check_policy!(PS256KeyPair, PS256PublicKey);
1853        check_policy!(PS384KeyPair, PS384PublicKey);
1854        check_policy!(PS512KeyPair, PS512PublicKey);
1855    }
1856
1857    #[test]
1858    fn backend_accepts_the_1024_bit_fixture() {
1859        let key = KEYS.iter().find(|key| key.bits == 1024).unwrap();
1860        let rsa_sk = Rsa::<Private>::private_key_from_pem(key.private_pem.as_bytes()).unwrap();
1861        assert!(rsa_sk.check_key().unwrap());
1862
1863        let (signed, signature) = OPENSSL_RS256_JWT_1024.rsplit_once('.').unwrap();
1864        let rsa_pk = Rsa::<Public>::public_key_from_pem(key.public_pem.as_bytes()).unwrap();
1865        let pkey = PKey::from_rsa(rsa_pk).unwrap();
1866        let mut verifier = Verifier::new(MessageDigest::sha256(), &pkey).unwrap();
1867        verifier.set_rsa_padding(Padding::PKCS1).unwrap();
1868        verifier.update(signed.as_bytes()).unwrap();
1869        assert!(verifier.verify(&unb64(signature)).unwrap());
1870    }
1871
1872    #[test]
1873    fn components_are_checked_before_the_backend() {
1874        let pk = RS256PublicKey::from_pem(key_2048().public_pem).unwrap();
1875        let components = pk.to_components();
1876        let (n, e) = (components.n, components.e);
1877
1878        let padded_n = [&[0u8, 0][..], &n].concat();
1879        let padded = RS256PublicKey::from_components(&padded_n, &[0, 1, 0, 1]).unwrap();
1880        assert_eq!(padded.to_components().n, n);
1881
1882        let n4096 = [&[0x80][..], &[0u8; 510][..], &[1][..]].concat();
1883        let n4097 = [&[1][..], &[0u8; 511][..], &[1][..]].concat();
1884        assert_eq!(bit_length(&n4096), 4096);
1885        assert_eq!(bit_length(&n4097), 4097);
1886        assert!(check_rsa_key_policy(&n4096, &e, JWTError::InvalidPublicKey).is_ok());
1887
1888        let mut even_n = n.clone();
1889        *even_n.last_mut().unwrap() &= 0xfe;
1890        let large_e = [1, 0, 0, 0, 1];
1891        for (case, n, e, expected) in [
1892            ("even n", &even_n[..], &e[..], "InvalidPublicKey"),
1893            ("e = 3", &n[..], &[3][..], "InvalidPublicKey"),
1894            ("e = 2^32 + 1", &n[..], &large_e[..], "InvalidPublicKey"),
1895            ("empty e", &n[..], &[][..], "InvalidPublicKey"),
1896            ("n one byte short", &n[1..], &e[..], "WeakKey"),
1897            ("empty n", &[][..], &e[..], "WeakKey"),
1898            ("4097-bit n", &n4097[..], &e[..], "UnsupportedRSAModulus"),
1899        ] {
1900            let error = error_of(RS256PublicKey::from_components(n, e));
1901            assert_eq!(format!("{:?}", error), expected, "{}", case);
1902        }
1903    }
1904
1905    #[test]
1906    fn generation_sizes() {
1907        for bits in [2048, 3072] {
1908            let key_pair = RS256KeyPair::generate(bits).unwrap();
1909            let public_key = key_pair.public_key();
1910            RS256PublicKey::from_der(&public_key.to_der().unwrap()).unwrap();
1911        }
1912        for bits in [1024, 2047, 2560, 4097, 8192] {
1913            assert!(
1914                matches!(
1915                    error_of(RS256KeyPair::generate(bits)),
1916                    JWTError::UnsupportedRSAModulus
1917                ),
1918                "{} bits",
1919                bits
1920            );
1921        }
1922    }
1923}
1924
1925#[cfg(test)]
1926mod jwk_tests {
1927    use super::*;
1928    use crate::algorithms::jwk::MAX_JWK_LENGTH;
1929    use crate::algorithms::jwk_test_vectors;
1930    use crate::algorithms::rsa_test_keys::{der_from_pem, key_2048, KEYS, THREE_PRIME_PEM};
1931    use crate::algorithms::test_util::{
1932        b64, error_of, json as value, member_bytes, pem, with, without,
1933    };
1934
1935    const RFC7517_PRIVATE: &str = r#"{"kty":"RSA",
1936        "n":"0vx7agoebGcQSuuPiLJXZptN9nndrQmbXEps2aiAFbWhM78LhWx4cbbfAAtVT86zwu1RK7aPFFxuhDR1L6tSoc_BJECPebWKRXjBZCiFV4n3oknjhMstn64tZ_2W-5JsGY4Hc5n9yBXArwl93lqt7_RN5w6Cf0h4QyQ5v-65YGjQR0_FDW2QvzqY368QQMicAtaSqzs8KJZgnYb9c7d0zgdAZHzu6qMQvRL5hajrn1n91CbOpbISD08qNLyrdkt-bFTWhAI4vMQFh6WeZu0fM4lFd2NcRwr3XPksINHaQ-G_xBniIqbw0Ls1jF44-csFCur-kEgU8awapJzKnqDKgw",
1937        "e":"AQAB",
1938        "d":"X4cTteJY_gn4FYPsXB8rdXix5vwsg1FLN5E3EaG6RJoVH-HLLKD9M7dx5oo7GURknchnrRweUkC7hT5fJLM0WbFAKNLWY2vv7B6NqXSzUvxT0_YSfqijwp3RTzlBaCxWp4doFk5N2o8Gy_nHNKroADIkJ46pRUohsXywbReAdYaMwFs9tv8d_cPVY3i07a3t8MN6TNwm0dSawm9v47UiCl3Sk5ZiG7xojPLu4sbg1U2jx4IBTNBznbJSzFHK66jT8bgkuqsk0GjskDJk19Z4qwjwbsnn4j2WBii3RL-Us2lGVkY8fkFzme1z0HbIkfz0Y6mqnOYtqc0X4jfcKoAC8Q",
1939        "p":"83i-7IvMGXoMXCskv73TKr8637FiO7Z27zv8oj6pbWUQyLPQBQxtPVnwD20R-60eTDmD2ujnMt5PoqMrm8RfmNhVWDtjjMmCMjOpSXicFHj7XOuVIYQyqVWlWEh6dN36GVZYk93N8Bc9vY41xy8B9RzzOGVQzXvNEvn7O0nVbfs",
1940        "q":"3dfOR9cuYq-0S-mkFLzgItgMEfFzB2q3hWehMuG0oCuqnb3vobLyumqjVZQO1dIrdwgTnCdpYzBcOfW5r370AFXjiWft_NGEiovonizhKpo9VVS78TzFgxkIdrecRezsZ-1kYd_s1qDbxtkDEgfAITAG9LUnADun4vIcb6yelxk",
1941        "dp":"G4sPXkc6Ya9y8oJW9_ILj4xuppu0lzi_H7VTkS8xj5SdX3coE0oimYwxIi2emTAue0UOa5dpgFGyBJ4c8tQ2VF402XRugKDTP8akYhFo5tAA77Qe_NmtuYZc3C3m3I24G2GvR5sSDxUyAN2zq8Lfn9EUms6rY3Ob8YeiKkTiBj0",
1942        "dq":"s9lAH9fggBsoFR8Oac2R_E2gw282rT2kGOAhvIllETE1efrA6huUUvMfBcMpn8lqeW6vzznYY5SSQF7pMdC_agI3nG8Ibp1BUb0JUiraRNqUfLhcQb_d9GF4Dh7e74WbRsobRonujTYN1xCaP6TO61jvWrX-L18txXw494Q_cgk",
1943        "qi":"GyM_p6JrXySiz1toFgKbWV-JdI3jQ4ypu9rbMWx3rQJBfmt0FoYzgUIZEVFEcOqwemRN81zoDAaa-Bk0KWNGDjJHZDdDmFhW3AN7lI-puxk_mHZGJ11rxyR8O55XLSe3SPmRfKwZI6yU24ZxvQKFYItdldUKGzO6Ia6zTKhAVRU",
1944        "alg":"RS256",
1945        "kid":"2011-04-29"}"#;
1946    const RFC7638_THUMBPRINT: &str = "NzbLsXh8uDCcd-6MNwXF4W_7noWXFZAfHkxZsRGC9Xs";
1947    const PRIVATE_MEMBERS: [&str; 6] = ["d", "p", "q", "dp", "dq", "qi"];
1948
1949    fn rsa_2048() -> RS256KeyPair {
1950        RS256KeyPair::from_pem(key_2048().private_pem).unwrap()
1951    }
1952
1953    #[test]
1954    fn rfc_vectors() {
1955        let key_pair = RS256KeyPair::from_jwk(RFC7517_PRIVATE).unwrap();
1956        assert_eq!(key_pair.key_id.as_deref(), Some("2011-04-29"));
1957        assert_eq!(key_pair.jwk_thumbprint(), RFC7638_THUMBPRINT);
1958        let public_jwk = without(RFC7517_PRIVATE, &PRIVATE_MEMBERS);
1959        let public_key = RS256PublicKey::from_jwk(&public_jwk).unwrap();
1960        assert_eq!(public_key.jwk_thumbprint(), RFC7638_THUMBPRINT);
1961        assert_eq!(key_pair.public_key().jwk_thumbprint(), RFC7638_THUMBPRINT);
1962
1963        let token = key_pair
1964            .sign(Claims::create(coarsetime::Duration::from_hours(1)))
1965            .unwrap();
1966        public_key
1967            .verify_token::<NoCustomClaims>(&token, None)
1968            .unwrap();
1969
1970        let exported = value(&key_pair.to_jwk());
1971        let original = value(RFC7517_PRIVATE);
1972        for name in ["n", "e", "d", "p", "q", "dp", "dq", "qi", "kid", "alg"] {
1973            assert_eq!(exported[name], original[name], "{}", name);
1974        }
1975        assert_eq!(exported["use"], "sig");
1976
1977        assert!(PS256PublicKey::from_jwk(&public_jwk).is_err());
1978        assert!(PS256KeyPair::from_jwk(RFC7517_PRIVATE).is_err());
1979        PS256PublicKey::from_jwk(&without(&public_jwk, &["alg"])).unwrap();
1980    }
1981
1982    macro_rules! round_trip {
1983        ($key_pair:ident, $public_key:ident, $alg:expr) => {{
1984            let key = KEYS
1985                .iter()
1986                .find(|key| key.bits == 2560 && key.e == 65537)
1987                .unwrap();
1988            let key_pair = $key_pair::from_pem(key.private_pem)
1989                .unwrap()
1990                .with_key_id("rsa");
1991            let private_jwk = key_pair.to_jwk();
1992            let public_jwk = key_pair.public_key().to_jwk();
1993            let exported = value(&public_jwk);
1994            assert_eq!(exported["alg"], $alg);
1995            assert_eq!(exported["use"], "sig");
1996            assert_eq!(exported.as_object().unwrap().len(), 6);
1997            assert_eq!(value(&private_jwk).as_object().unwrap().len(), 12);
1998
1999            let restored = $key_pair::from_jwk(&private_jwk).unwrap();
2000            let public_key = $public_key::from_jwk(&public_jwk).unwrap();
2001            assert_eq!(restored.to_jwk(), private_jwk);
2002            assert_eq!(public_key.to_jwk(), public_jwk);
2003            assert_eq!(restored.jwk_thumbprint(), public_key.jwk_thumbprint());
2004            assert_eq!(restored.to_der().unwrap(), key_pair.to_der().unwrap());
2005            let token = restored
2006                .sign(Claims::create(coarsetime::Duration::from_hours(1)))
2007                .unwrap();
2008            let options = VerificationOptions {
2009                required_key_id: Some("rsa".into()),
2010                ..Default::default()
2011            };
2012            public_key
2013                .verify_token::<NoCustomClaims>(&token, Some(options))
2014                .unwrap();
2015        }};
2016    }
2017
2018    #[test]
2019    fn round_trips() {
2020        round_trip!(RS256KeyPair, RS256PublicKey, "RS256");
2021        round_trip!(RS384KeyPair, RS384PublicKey, "RS384");
2022        round_trip!(RS512KeyPair, RS512PublicKey, "RS512");
2023        round_trip!(PS256KeyPair, PS256PublicKey, "PS256");
2024        round_trip!(PS384KeyPair, PS384PublicKey, "PS384");
2025        round_trip!(PS512KeyPair, PS512PublicKey, "PS512");
2026    }
2027
2028    #[test]
2029    fn modulus_sign_byte() {
2030        let public_jwk = rsa_2048().public_key().to_jwk();
2031        let n = member_bytes(&public_jwk, "n");
2032        assert!(n[0] & 0x80 != 0);
2033
2034        let padded = with(&public_jwk, "n", b64(&[&[0][..], &n].concat()).into());
2035        let key = RS256PublicKey::from_jwk(&padded).unwrap();
2036        assert_eq!(key.to_jwk(), public_jwk);
2037        assert_eq!(
2038            key.jwk_thumbprint(),
2039            RS256PublicKey::from_jwk(&public_jwk)
2040                .unwrap()
2041                .jwk_thumbprint()
2042        );
2043
2044        let mut low = n.clone();
2045        low[0] &= 0x7f;
2046        for (case, bad_n) in [
2047            ("two zero bytes", b64(&[&[0, 0][..], &n].concat())),
2048            ("unneeded zero byte", b64(&[&[0][..], &low].concat())),
2049            ("empty", "".into()),
2050            ("zero", "AA".into()),
2051            ("zero on two bytes", "AAA".into()),
2052        ] {
2053            let jwk = with(&public_jwk, "n", bad_n.into());
2054            assert!(
2055                matches!(
2056                    error_of(RS256PublicKey::from_jwk(&jwk)),
2057                    JWTError::InvalidPublicKey
2058                ),
2059                "{}",
2060                case
2061            );
2062        }
2063        let low = with(&public_jwk, "n", b64(&low).into());
2064        assert!(matches!(
2065            error_of(RS256PublicKey::from_jwk(&low)),
2066            JWTError::WeakKey
2067        ));
2068
2069        let private_jwk = rsa_2048().to_jwk();
2070        let padded = with(&private_jwk, "n", b64(&[&[0][..], &n].concat()).into());
2071        let key_pair = RS256KeyPair::from_jwk(&padded).unwrap();
2072        assert_eq!(key_pair.to_jwk(), private_jwk);
2073    }
2074
2075    #[test]
2076    fn exponent_must_be_65537() {
2077        let public_jwk = rsa_2048().public_key().to_jwk();
2078        for e in ["AAEAAQ", "Aw", "EQ", "AQAAAAE", "", "AQAB="] {
2079            let jwk = with(&public_jwk, "e", e.into());
2080            assert!(
2081                matches!(
2082                    error_of(RS256PublicKey::from_jwk(&jwk)),
2083                    JWTError::InvalidPublicKey
2084                ),
2085                "{}",
2086                e
2087            );
2088        }
2089        let jwk = with(&rsa_2048().to_jwk(), "e", "AAEAAQ".into());
2090        assert!(matches!(
2091            error_of(RS256KeyPair::from_jwk(&jwk)),
2092            JWTError::InvalidKeyPair
2093        ));
2094    }
2095
2096    #[test]
2097    fn size_policy() {
2098        for key in KEYS.iter().filter(|key| key.e == 65537) {
2099            // The private key lets us test sizes the public key parser rejects.
2100            let rsa_sk = Rsa::<Private>::private_key_from_pem(key.private_pem.as_bytes());
2101            let n = rsa_sk.unwrap().n().to_vec();
2102            assert_eq!(bit_length(&n), key.bits);
2103            let jwk = format!(r#"{{"kty":"RSA","n":"{}","e":"AQAB"}}"#, b64(&n));
2104            let res = RS256PublicKey::from_jwk(&jwk);
2105            let as_expected = match key.bits {
2106                2048..=4096 => res.is_ok(),
2107                0..=2047 => matches!(error_of(res), JWTError::WeakKey),
2108                _ => matches!(error_of(res), JWTError::UnsupportedRSAModulus),
2109            };
2110            assert!(as_expected, "{}-bit", key.bits);
2111        }
2112
2113        let too_long = format!(r#"{{"kty":"RSA","n":"{}","e":"AQAB"}}"#, "q".repeat(700));
2114        assert!(matches!(
2115            error_of(RS256PublicKey::from_jwk(&too_long)),
2116            JWTError::UnsupportedRSAModulus
2117        ));
2118    }
2119
2120    #[test]
2121    fn the_largest_private_keys_fit_in_the_size_limit() {
2122        let key = KEYS
2123            .iter()
2124            .find(|key| key.bits == 4096 && key.e == 65537)
2125            .unwrap();
2126        let private_jwk = PS512KeyPair::from_pem(key.private_pem).unwrap().to_jwk();
2127        assert!(private_jwk.len() < 3300);
2128
2129        let base = with(&private_jwk, "kid", "".into());
2130        let kid = "k".repeat(MAX_JWK_LENGTH - base.len());
2131        let largest = with(&private_jwk, "kid", kid.clone().into());
2132        assert_eq!(largest.len(), MAX_JWK_LENGTH);
2133        PS512KeyPair::from_jwk(&largest).unwrap();
2134        let too_large = with(&private_jwk, "kid", format!("{}k", kid).into());
2135        assert!(matches!(
2136            error_of(PS512KeyPair::from_jwk(&too_large)),
2137            JWTError::InvalidKeyPair
2138        ));
2139    }
2140
2141    #[test]
2142    fn private_values_are_minimal_complete_and_consistent() {
2143        let private_jwk = rsa_2048().to_jwk();
2144        let rejected = |jwk: &str| {
2145            matches!(
2146                error_of(RS256KeyPair::from_jwk(jwk)),
2147                JWTError::InvalidKeyPair
2148            )
2149        };
2150        for name in PRIVATE_MEMBERS {
2151            let x = member_bytes(&private_jwk, name);
2152            let mut corrupted = x.clone();
2153            *corrupted.last_mut().unwrap() ^= 2;
2154            for (case, x) in [
2155                ("padded", b64(&[&[0][..], &x].concat()).into()),
2156                ("corrupted", b64(&corrupted).into()),
2157                ("oversized", b64(&[0x55u8; 513]).into()),
2158                ("null", serde_json::Value::Null),
2159            ] {
2160                assert!(rejected(&with(&private_jwk, name, x)), "{} {}", case, name);
2161            }
2162            assert!(
2163                rejected(&without(&private_jwk, &[name])),
2164                "missing {}",
2165                name
2166            );
2167        }
2168
2169        // The other private values must agree with p and q.
2170        let p = value(&private_jwk)["p"].clone();
2171        let q = value(&private_jwk)["q"].clone();
2172        assert!(rejected(&with(&with(&private_jwk, "p", q), "q", p)));
2173
2174        for oth in [serde_json::json!([]), serde_json::Value::Null] {
2175            let jwk = with(&private_jwk, "oth", oth.clone());
2176            assert!(rejected(&jwk), "oth: {}", oth);
2177        }
2178
2179        let public_jwk = rsa_2048().public_key().to_jwk();
2180        for name in PRIVATE_MEMBERS {
2181            let jwk = with(&public_jwk, name, value(&private_jwk)[name].clone());
2182            assert!(
2183                matches!(
2184                    error_of(RS256PublicKey::from_jwk(&jwk)),
2185                    JWTError::InvalidPublicKey
2186                ),
2187                "{}",
2188                name
2189            );
2190        }
2191    }
2192
2193    fn der_length(len: usize) -> Vec<u8> {
2194        match len {
2195            0..=0x7f => vec![len as u8],
2196            0x80..=0xff => vec![0x81, len as u8],
2197            _ => vec![0x82, (len >> 8) as u8, len as u8],
2198        }
2199    }
2200
2201    fn der_integer(x: &[u8]) -> Vec<u8> {
2202        let x = if x[0] & 0x80 != 0 {
2203            [&[0][..], x].concat()
2204        } else {
2205            x.to_vec()
2206        };
2207        [&[0x02][..], &der_length(x.len()), &x].concat()
2208    }
2209
2210    // Build malformed keys without the backend rejecting them first.
2211    fn pkcs1_der(values: &[Vec<u8>]) -> Vec<u8> {
2212        let body: Vec<u8> = std::iter::once(der_integer(&[0]))
2213            .chain(values.iter().map(|x| der_integer(x)))
2214            .flatten()
2215            .collect();
2216        [&[0x30][..], &der_length(body.len()), &body].concat()
2217    }
2218
2219    #[test]
2220    fn der_and_pem_private_keys_are_checked() {
2221        let private_jwk = rsa_2048().to_jwk();
2222        let names = ["n", "e", "d", "p", "q", "dp", "dq", "qi"];
2223        let values: Vec<Vec<u8>> = names
2224            .iter()
2225            .map(|name| member_bytes(&private_jwk, name))
2226            .collect();
2227        let der = pkcs1_der(&values);
2228        RS256KeyPair::from_der(&der).unwrap();
2229        RS256KeyPair::from_pem(&pem("RSA PRIVATE KEY", &der)).unwrap();
2230
2231        for (i, name) in names.iter().enumerate().skip(2) {
2232            let mut corrupted = values.clone();
2233            *corrupted[i].last_mut().unwrap() ^= 2;
2234            let der = pkcs1_der(&corrupted);
2235            assert!(RS256KeyPair::from_der(&der).is_err(), "{}", name);
2236            assert!(
2237                RS256KeyPair::from_pem(&pem("RSA PRIVATE KEY", &der)).is_err(),
2238                "{}",
2239                name
2240            );
2241        }
2242
2243        assert!(RS256KeyPair::from_pem(THREE_PRIME_PEM).is_err());
2244        assert!(RS256KeyPair::from_der(&der_from_pem(THREE_PRIME_PEM)).is_err());
2245    }
2246
2247    #[test]
2248    fn provider_keys() {
2249        let paypal = value(jwk_test_vectors::PAYPAL_JWKS);
2250        let keys = paypal["keys"].as_array().unwrap();
2251        let mut padded_moduli = 0;
2252        for jwk in keys.iter().filter(|jwk| jwk["kty"] == "RSA") {
2253            let text = jwk.to_string();
2254            let n = member_bytes(&text, "n");
2255            let exported = if jwk["alg"] == "PS256" {
2256                assert!(RS256PublicKey::from_jwk(&text).is_err());
2257                let key = PS256PublicKey::from_jwk(&text).unwrap();
2258                assert_eq!(key.key_id.as_deref(), jwk["kid"].as_str());
2259                key.to_jwk()
2260            } else {
2261                assert!(PS256PublicKey::from_jwk(&text).is_err());
2262                RS256PublicKey::from_jwk(&text).unwrap().to_jwk()
2263            };
2264            let exported_n = member_bytes(&exported, "n");
2265            if n.len() == 257 {
2266                padded_moduli += 1;
2267                assert_eq!(n[0], 0);
2268                assert_eq!(exported_n, n[1..]);
2269                let unpadded = with(&text, "n", b64(&n[1..]).into());
2270                let thumbprint = |jwk: &str| {
2271                    if jwk.contains("PS256") {
2272                        PS256PublicKey::from_jwk(jwk).unwrap().jwk_thumbprint()
2273                    } else {
2274                        RS256PublicKey::from_jwk(jwk).unwrap().jwk_thumbprint()
2275                    }
2276                };
2277                assert_eq!(thumbprint(&text), thumbprint(&unpadded));
2278            } else {
2279                assert_eq!(exported_n, n);
2280            }
2281        }
2282        assert_eq!(padded_moduli, 2);
2283
2284        // Yahoo's RSA key is 1024 bits.
2285        let yahoo = value(jwk_test_vectors::YAHOO_JWKS);
2286        let rsa = yahoo["keys"]
2287            .as_array()
2288            .unwrap()
2289            .iter()
2290            .find(|jwk| jwk["kty"] == "RSA")
2291            .unwrap();
2292        assert_eq!(member_bytes(&rsa.to_string(), "n").len(), 129);
2293        assert!(matches!(
2294            error_of(RS256PublicKey::from_jwk(&rsa.to_string())),
2295            JWTError::WeakKey
2296        ));
2297    }
2298
2299    #[test]
2300    fn webcrypto_exports() {
2301        for export in jwk_test_vectors::ALL {
2302            let export = value(export);
2303            let entry = &export["keys"]["RS256"];
2304            let key_pair = RS256KeyPair::from_jwk(&entry["private"].to_string()).unwrap();
2305            let public_key = RS256PublicKey::from_jwk(&entry["public"].to_string()).unwrap();
2306            assert_eq!(key_pair.jwk_thumbprint(), public_key.jwk_thumbprint());
2307            public_key
2308                .verify_token::<NoCustomClaims>(entry["jwt"].as_str().unwrap(), None)
2309                .unwrap();
2310            assert!(PS256PublicKey::from_jwk(&entry["public"].to_string()).is_err());
2311
2312            let entry = &export["keys"]["PS256"];
2313            let key_pair = PS256KeyPair::from_jwk(&entry["private"].to_string()).unwrap();
2314            let public_key = PS256PublicKey::from_jwk(&entry["public"].to_string()).unwrap();
2315            assert_eq!(key_pair.jwk_thumbprint(), public_key.jwk_thumbprint());
2316            public_key
2317                .verify_token::<NoCustomClaims>(entry["jwt"].as_str().unwrap(), None)
2318                .unwrap();
2319
2320            let entry = &export["keys"]["RSA-OAEP"];
2321            assert!(RS256PublicKey::from_jwk(&entry["public"].to_string()).is_err());
2322            assert!(RS256KeyPair::from_jwk(&entry["private"].to_string()).is_err());
2323        }
2324    }
2325}