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
43pub(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
66pub(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
76fn 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
89trait 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
153pub(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 #[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 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 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 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 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 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 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#[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 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 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 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 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 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 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#[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 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 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 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 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 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 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#[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 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 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 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 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 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 pub fn jwk_thumbprint(&self) -> String {
1331 rsa_public_key_thumbprint(&self.pk.0)
1332 }
1333}
1334
1335#[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 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 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 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 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 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 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#[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 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 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 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 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 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 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 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 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 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 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}