1#![allow(clippy::duplicate_mod)]
2
3use alloc::boxed::Box;
4use alloc::string::ToString;
5use alloc::vec::Vec;
6use alloc::{format, vec};
7use core::fmt::{self, Debug, Formatter};
8
9use pki_types::{PrivateKeyDer, PrivatePkcs8KeyDer, SubjectPublicKeyInfoDer, alg_id};
10
11use super::ring_like::rand::SystemRandom;
12use super::ring_like::signature::{self, EcdsaKeyPair, Ed25519KeyPair, KeyPair, RsaKeyPair};
13#[cfg(any(test, bench))]
14use crate::crypto::CryptoProvider;
15use crate::crypto::signer::{Signer, SigningKey, public_key_to_spki};
16use crate::enums::{SignatureAlgorithm, SignatureScheme};
17use crate::error::Error;
18use crate::sync::Arc;
19
20pub(super) struct RsaSigningKey {
22 key: Arc<RsaKeyPair>,
23}
24
25impl RsaSigningKey {
26 fn to_signer(&self, scheme: SignatureScheme) -> RsaSigner {
27 let encoding: &dyn signature::RsaEncoding = match scheme {
28 SignatureScheme::RSA_PKCS1_SHA256 => &signature::RSA_PKCS1_SHA256,
29 SignatureScheme::RSA_PKCS1_SHA384 => &signature::RSA_PKCS1_SHA384,
30 SignatureScheme::RSA_PKCS1_SHA512 => &signature::RSA_PKCS1_SHA512,
31 SignatureScheme::RSA_PSS_SHA256 => &signature::RSA_PSS_SHA256,
32 SignatureScheme::RSA_PSS_SHA384 => &signature::RSA_PSS_SHA384,
33 SignatureScheme::RSA_PSS_SHA512 => &signature::RSA_PSS_SHA512,
34 _ => unreachable!(),
35 };
36
37 RsaSigner {
38 key: self.key.clone(),
39 scheme,
40 encoding,
41 }
42 }
43
44 const SCHEMES: &[SignatureScheme] = &[
45 SignatureScheme::RSA_PSS_SHA512,
46 SignatureScheme::RSA_PSS_SHA384,
47 SignatureScheme::RSA_PSS_SHA256,
48 SignatureScheme::RSA_PKCS1_SHA512,
49 SignatureScheme::RSA_PKCS1_SHA384,
50 SignatureScheme::RSA_PKCS1_SHA256,
51 ];
52}
53
54impl SigningKey for RsaSigningKey {
55 fn choose_scheme(&self, offered: &[SignatureScheme]) -> Option<Box<dyn Signer>> {
56 Self::SCHEMES
57 .iter()
58 .find(|scheme| offered.contains(scheme))
59 .map(|&scheme| Box::new(self.to_signer(scheme)) as Box<dyn Signer>)
60 }
61
62 fn public_key(&self) -> Option<SubjectPublicKeyInfoDer<'_>> {
63 Some(public_key_to_spki(
64 &alg_id::RSA_ENCRYPTION,
65 self.key.public_key(),
66 ))
67 }
68
69 fn algorithm(&self) -> SignatureAlgorithm {
70 SignatureAlgorithm::RSA
71 }
72}
73
74impl TryFrom<&PrivateKeyDer<'_>> for RsaSigningKey {
75 type Error = Error;
76
77 fn try_from(der: &PrivateKeyDer<'_>) -> Result<Self, Self::Error> {
80 let key_pair = match der {
81 PrivateKeyDer::Pkcs1(pkcs1) => RsaKeyPair::from_der(pkcs1.secret_pkcs1_der()),
82 PrivateKeyDer::Pkcs8(pkcs8) => RsaKeyPair::from_pkcs8(pkcs8.secret_pkcs8_der()),
83 _ => {
84 return Err(Error::General(
85 "failed to parse RSA private key as either PKCS#1 or PKCS#8".into(),
86 ));
87 }
88 }
89 .map_err(|key_rejected| {
90 Error::General(format!("failed to parse RSA private key: {key_rejected}"))
91 })?;
92
93 Ok(Self {
94 key: Arc::new(key_pair),
95 })
96 }
97}
98
99impl Debug for RsaSigningKey {
100 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
101 f.debug_struct("RsaSigningKey")
102 .field("algorithm", &self.algorithm())
103 .finish()
104 }
105}
106
107struct RsaSigner {
108 key: Arc<RsaKeyPair>,
109 scheme: SignatureScheme,
110 encoding: &'static dyn signature::RsaEncoding,
111}
112
113impl RsaSigner {
114 fn sign(&self, message: &[u8]) -> Result<Vec<u8>, Error> {
115 let mut sig = vec![0; self.key.public_modulus_len()];
116
117 let rng = SystemRandom::new();
118 self.key
119 .sign(self.encoding, &rng, message, &mut sig)
120 .map(|_| sig)
121 .map_err(|_| Error::General("signing failed".to_string()))
122 }
123}
124
125impl Signer for RsaSigner {
126 fn sign(self: Box<Self>, message: &[u8]) -> Result<Vec<u8>, Error> {
127 (*self).sign(message)
128 }
129
130 fn scheme(&self) -> SignatureScheme {
131 self.scheme
132 }
133}
134
135impl Debug for RsaSigner {
136 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
137 f.debug_struct("RsaSigner")
138 .field("scheme", &self.scheme)
139 .finish()
140 }
141}
142
143#[derive(Clone)]
148pub(super) struct EcdsaSigner {
149 key: Arc<EcdsaKeyPair>,
150 scheme: SignatureScheme,
151}
152
153impl EcdsaSigner {
154 fn new(
157 der: &PrivateKeyDer<'_>,
158 scheme: SignatureScheme,
159 sigalg: &'static signature::EcdsaSigningAlgorithm,
160 ) -> Result<Self, ()> {
161 let key_pair = match der {
162 PrivateKeyDer::Sec1(sec1) => {
163 EcdsaKeyPair::from_private_key_der(sigalg, sec1.secret_sec1_der())
164 .map_err(|_| ())?
165 }
166 PrivateKeyDer::Pkcs8(pkcs8) => {
167 EcdsaKeyPair::from_pkcs8(sigalg, pkcs8.secret_pkcs8_der()).map_err(|_| ())?
168 }
169 _ => return Err(()),
170 };
171
172 Ok(Self {
173 key: Arc::new(key_pair),
174 scheme,
175 })
176 }
177
178 fn sign(&self, message: &[u8]) -> Result<Vec<u8>, Error> {
179 let rng = SystemRandom::new();
180 self.key
181 .sign(&rng, message)
182 .map_err(|_| Error::General("signing failed".into()))
183 .map(|sig| sig.as_ref().into())
184 }
185}
186
187impl SigningKey for EcdsaSigner {
188 fn choose_scheme(&self, offered: &[SignatureScheme]) -> Option<Box<dyn Signer>> {
189 if offered.contains(&self.scheme) {
190 Some(Box::new(self.clone()))
191 } else {
192 None
193 }
194 }
195
196 fn public_key(&self) -> Option<SubjectPublicKeyInfoDer<'_>> {
197 let id = match self.scheme {
198 SignatureScheme::ECDSA_NISTP256_SHA256 => alg_id::ECDSA_P256,
199 SignatureScheme::ECDSA_NISTP384_SHA384 => alg_id::ECDSA_P384,
200 SignatureScheme::ECDSA_NISTP521_SHA512 => alg_id::ECDSA_P521,
201 _ => unreachable!(),
202 };
203
204 Some(public_key_to_spki(&id, self.key.public_key()))
205 }
206
207 fn algorithm(&self) -> SignatureAlgorithm {
208 self.scheme.algorithm()
209 }
210}
211
212impl Signer for EcdsaSigner {
213 fn sign(self: Box<Self>, message: &[u8]) -> Result<Vec<u8>, Error> {
214 (*self).sign(message)
215 }
216
217 fn scheme(&self) -> SignatureScheme {
218 self.scheme
219 }
220}
221
222impl TryFrom<&PrivateKeyDer<'_>> for EcdsaSigner {
223 type Error = Error;
224
225 fn try_from(der: &PrivateKeyDer<'_>) -> Result<Self, Error> {
230 if let Ok(ecdsa_p256) = Self::new(
231 der,
232 SignatureScheme::ECDSA_NISTP256_SHA256,
233 &signature::ECDSA_P256_SHA256_ASN1_SIGNING,
234 ) {
235 return Ok(ecdsa_p256);
236 }
237
238 if let Ok(ecdsa_p384) = Self::new(
239 der,
240 SignatureScheme::ECDSA_NISTP384_SHA384,
241 &signature::ECDSA_P384_SHA384_ASN1_SIGNING,
242 ) {
243 return Ok(ecdsa_p384);
244 }
245
246 if let Ok(ecdsa_p521) = Self::new(
247 der,
248 SignatureScheme::ECDSA_NISTP521_SHA512,
249 &signature::ECDSA_P521_SHA512_ASN1_SIGNING,
250 ) {
251 return Ok(ecdsa_p521);
252 }
253
254 Err(Error::General(
255 "failed to parse ECDSA private key as PKCS#8 or SEC1".into(),
256 ))
257 }
258}
259
260impl Debug for EcdsaSigner {
261 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
262 f.debug_struct("EcdsaSigner")
263 .field("scheme", &self.scheme)
264 .finish()
265 }
266}
267
268#[derive(Clone)]
273pub(super) struct Ed25519Signer {
274 key: Arc<Ed25519KeyPair>,
275 scheme: SignatureScheme,
276}
277
278impl Ed25519Signer {
279 fn sign(&self, message: &[u8]) -> Result<Vec<u8>, Error> {
280 Ok(self.key.sign(message).as_ref().into())
281 }
282}
283
284impl SigningKey for Ed25519Signer {
285 fn choose_scheme(&self, offered: &[SignatureScheme]) -> Option<Box<dyn Signer>> {
286 if offered.contains(&self.scheme) {
287 Some(Box::new(self.clone()))
288 } else {
289 None
290 }
291 }
292
293 fn public_key(&self) -> Option<SubjectPublicKeyInfoDer<'_>> {
294 Some(public_key_to_spki(&alg_id::ED25519, self.key.public_key()))
295 }
296
297 fn algorithm(&self) -> SignatureAlgorithm {
298 self.scheme.algorithm()
299 }
300}
301
302impl Signer for Ed25519Signer {
303 fn sign(self: Box<Self>, message: &[u8]) -> Result<Vec<u8>, Error> {
304 (*self).sign(message)
305 }
306
307 fn scheme(&self) -> SignatureScheme {
308 self.scheme
309 }
310}
311
312impl TryFrom<&PrivatePkcs8KeyDer<'_>> for Ed25519Signer {
313 type Error = Error;
314
315 fn try_from(der: &PrivatePkcs8KeyDer<'_>) -> Result<Self, Error> {
322 match Ed25519KeyPair::from_pkcs8_maybe_unchecked(der.secret_pkcs8_der()) {
323 Ok(key_pair) => Ok(Self {
324 key: Arc::new(key_pair),
325 scheme: SignatureScheme::ED25519,
326 }),
327 Err(e) => Err(Error::General(format!(
328 "failed to parse Ed25519 private key: {e}"
329 ))),
330 }
331 }
332}
333
334impl Debug for Ed25519Signer {
335 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
336 f.debug_struct("Ed25519Signer")
337 .field("scheme", &self.scheme)
338 .finish()
339 }
340}
341
342#[cfg(any(test, bench))]
343fn load_key(
344 provider: &CryptoProvider,
345 der: PrivateKeyDer<'static>,
346) -> Result<Box<dyn SigningKey>, Error> {
347 provider
348 .key_provider
349 .load_private_key(der)
350}
351
352#[cfg(test)]
353mod tests {
354 use alloc::format;
355
356 use pki_types::{PrivatePkcs1KeyDer, PrivateSec1KeyDer};
357
358 use super::*;
359 use crate::crypto::aws_lc_rs::DEFAULT_PROVIDER;
360
361 #[test]
362 fn can_load_ecdsa_nistp256_pkcs8() {
363 let key =
364 PrivatePkcs8KeyDer::from(&include_bytes!("../../testdata/nistp256key.pkcs8.der")[..]);
365 assert!(Ed25519Signer::try_from(&key).is_err());
366 let key = PrivateKeyDer::Pkcs8(key);
367 assert!(load_key(&DEFAULT_PROVIDER, key.clone_key()).is_ok());
368 assert!(EcdsaSigner::try_from(&key).is_ok());
369 }
370
371 #[test]
372 fn can_load_ecdsa_nistp256_sec1() {
373 let key = PrivateKeyDer::Sec1(PrivateSec1KeyDer::from(
374 &include_bytes!("../../testdata/nistp256key.der")[..],
375 ));
376 assert!(load_key(&DEFAULT_PROVIDER, key.clone_key()).is_ok());
377 assert!(EcdsaSigner::try_from(&key).is_ok());
378 }
379
380 #[test]
381 fn can_sign_ecdsa_nistp256() {
382 let key = PrivateKeyDer::Sec1(PrivateSec1KeyDer::from(
383 &include_bytes!("../../testdata/nistp256key.der")[..],
384 ));
385
386 let k = load_key(&DEFAULT_PROVIDER, key.clone_key()).unwrap();
387 assert_eq!(
388 format!("{k:?}"),
389 "EcdsaSigner { scheme: ECDSA_NISTP256_SHA256 }"
390 );
391 assert_eq!(k.algorithm(), SignatureAlgorithm::ECDSA);
392
393 assert!(
394 k.choose_scheme(&[SignatureScheme::RSA_PKCS1_SHA256])
395 .is_none()
396 );
397 assert!(
398 k.choose_scheme(&[SignatureScheme::ECDSA_NISTP384_SHA384])
399 .is_none()
400 );
401 let s = k
402 .choose_scheme(&[SignatureScheme::ECDSA_NISTP256_SHA256])
403 .unwrap();
404 assert_eq!(
405 format!("{s:?}"),
406 "EcdsaSigner { scheme: ECDSA_NISTP256_SHA256 }"
407 );
408 assert_eq!(s.scheme(), SignatureScheme::ECDSA_NISTP256_SHA256);
409 assert!(
411 s.sign(b"hello")
412 .unwrap()
413 .starts_with(&[0x30])
414 );
415 }
416
417 #[test]
418 fn can_load_ecdsa_nistp384_pkcs8() {
419 let key =
420 PrivatePkcs8KeyDer::from(&include_bytes!("../../testdata/nistp384key.pkcs8.der")[..]);
421 assert!(Ed25519Signer::try_from(&key).is_err());
422 let key = PrivateKeyDer::Pkcs8(key);
423 assert!(load_key(&DEFAULT_PROVIDER, key.clone_key()).is_ok());
424 assert!(EcdsaSigner::try_from(&key).is_ok());
425 }
426
427 #[test]
428 fn can_load_ecdsa_nistp384_sec1() {
429 let key = PrivateKeyDer::Sec1(PrivateSec1KeyDer::from(
430 &include_bytes!("../../testdata/nistp384key.der")[..],
431 ));
432 assert!(load_key(&DEFAULT_PROVIDER, key.clone_key()).is_ok());
433 assert!(EcdsaSigner::try_from(&key).is_ok());
434 }
435
436 #[test]
437 fn can_sign_ecdsa_nistp384() {
438 let key = PrivateKeyDer::Sec1(PrivateSec1KeyDer::from(
439 &include_bytes!("../../testdata/nistp384key.der")[..],
440 ));
441
442 let k = load_key(&DEFAULT_PROVIDER, key.clone_key()).unwrap();
443 assert_eq!(
444 format!("{k:?}"),
445 "EcdsaSigner { scheme: ECDSA_NISTP384_SHA384 }"
446 );
447 assert_eq!(k.algorithm(), SignatureAlgorithm::ECDSA);
448
449 assert!(
450 k.choose_scheme(&[SignatureScheme::RSA_PKCS1_SHA256])
451 .is_none()
452 );
453 assert!(
454 k.choose_scheme(&[SignatureScheme::ECDSA_NISTP256_SHA256])
455 .is_none()
456 );
457 let s = k
458 .choose_scheme(&[SignatureScheme::ECDSA_NISTP384_SHA384])
459 .unwrap();
460 assert_eq!(
461 format!("{s:?}"),
462 "EcdsaSigner { scheme: ECDSA_NISTP384_SHA384 }"
463 );
464 assert_eq!(s.scheme(), SignatureScheme::ECDSA_NISTP384_SHA384);
465 assert!(
467 s.sign(b"hello")
468 .unwrap()
469 .starts_with(&[0x30])
470 );
471 }
472
473 #[test]
474 fn can_load_ecdsa_nistp521_pkcs8() {
475 let key =
476 PrivatePkcs8KeyDer::from(&include_bytes!("../../testdata/nistp521key.pkcs8.der")[..]);
477 assert!(Ed25519Signer::try_from(&key).is_err());
478 let key = PrivateKeyDer::Pkcs8(key);
479 assert!(load_key(&DEFAULT_PROVIDER, key.clone_key()).is_ok());
480 assert!(EcdsaSigner::try_from(&key).is_ok());
481 }
482
483 #[test]
484 fn can_load_ecdsa_nistp521_sec1() {
485 let key = PrivateKeyDer::Sec1(PrivateSec1KeyDer::from(
486 &include_bytes!("../../testdata/nistp521key.der")[..],
487 ));
488 assert!(load_key(&DEFAULT_PROVIDER, key.clone_key()).is_ok());
489 assert!(EcdsaSigner::try_from(&key).is_ok());
490 }
491
492 #[test]
493 fn can_sign_ecdsa_nistp521() {
494 let key = PrivateKeyDer::Sec1(PrivateSec1KeyDer::from(
495 &include_bytes!("../../testdata/nistp521key.der")[..],
496 ));
497
498 let k = load_key(&DEFAULT_PROVIDER, key.clone_key()).unwrap();
499 assert_eq!(
500 format!("{k:?}"),
501 "EcdsaSigner { scheme: ECDSA_NISTP521_SHA512 }"
502 );
503 assert_eq!(k.algorithm(), SignatureAlgorithm::ECDSA);
504
505 assert!(
506 k.choose_scheme(&[SignatureScheme::RSA_PKCS1_SHA256])
507 .is_none()
508 );
509 assert!(
510 k.choose_scheme(&[SignatureScheme::ECDSA_NISTP256_SHA256])
511 .is_none()
512 );
513 assert!(
514 k.choose_scheme(&[SignatureScheme::ECDSA_NISTP384_SHA384])
515 .is_none()
516 );
517 let s = k
518 .choose_scheme(&[SignatureScheme::ECDSA_NISTP521_SHA512])
519 .unwrap();
520 assert_eq!(
521 format!("{s:?}"),
522 "EcdsaSigner { scheme: ECDSA_NISTP521_SHA512 }"
523 );
524 assert_eq!(s.scheme(), SignatureScheme::ECDSA_NISTP521_SHA512);
525 assert!(
527 s.sign(b"hello")
528 .unwrap()
529 .starts_with(&[0x30])
530 );
531 }
532
533 #[test]
534 fn can_load_eddsa_pkcs8() {
535 let key = PrivatePkcs8KeyDer::from(&include_bytes!("../../testdata/eddsakey.der")[..]);
536 assert!(Ed25519Signer::try_from(&key).is_ok());
537 let key = PrivateKeyDer::Pkcs8(key);
538 assert!(load_key(&DEFAULT_PROVIDER, key.clone_key()).is_ok());
539 assert!(EcdsaSigner::try_from(&key).is_err());
540 }
541
542 #[test]
543 fn can_sign_eddsa() {
544 let key = PrivatePkcs8KeyDer::from(&include_bytes!("../../testdata/eddsakey.der")[..]);
545
546 let k = Ed25519Signer::try_from(&key).unwrap();
547 assert_eq!(format!("{k:?}"), "Ed25519Signer { scheme: ED25519 }");
548 assert_eq!(k.algorithm(), SignatureAlgorithm::ED25519);
549
550 assert!(
551 k.choose_scheme(&[SignatureScheme::RSA_PKCS1_SHA256])
552 .is_none()
553 );
554 assert!(
555 k.choose_scheme(&[SignatureScheme::ECDSA_NISTP256_SHA256])
556 .is_none()
557 );
558 let s = k
559 .choose_scheme(&[SignatureScheme::ED25519])
560 .unwrap();
561 assert_eq!(format!("{s:?}"), "Ed25519Signer { scheme: ED25519 }");
562 assert_eq!(s.scheme(), SignatureScheme::ED25519);
563 assert_eq!(s.sign(b"hello").unwrap().len(), 64);
564 }
565
566 #[test]
567 fn can_load_rsa2048_pkcs8() {
568 let key =
569 PrivatePkcs8KeyDer::from(&include_bytes!("../../testdata/rsa2048key.pkcs8.der")[..]);
570 assert!(Ed25519Signer::try_from(&key).is_err());
571 let key = PrivateKeyDer::Pkcs8(key);
572 assert!(load_key(&DEFAULT_PROVIDER, key.clone_key()).is_ok());
573 assert!(EcdsaSigner::try_from(&key).is_err());
574 }
575
576 #[test]
577 fn can_load_rsa2048_pkcs1() {
578 let key = PrivateKeyDer::Pkcs1(PrivatePkcs1KeyDer::from(
579 &include_bytes!("../../testdata/rsa2048key.pkcs1.der")[..],
580 ));
581 assert!(load_key(&DEFAULT_PROVIDER, key.clone_key()).is_ok());
582 assert!(EcdsaSigner::try_from(&key).is_err());
583 }
584
585 #[test]
586 fn can_sign_rsa2048() {
587 let key = PrivateKeyDer::Pkcs8(PrivatePkcs8KeyDer::from(
588 &include_bytes!("../../testdata/rsa2048key.pkcs8.der")[..],
589 ));
590
591 let k = load_key(&DEFAULT_PROVIDER, key.clone_key()).unwrap();
592 assert_eq!(format!("{k:?}"), "RsaSigningKey { algorithm: RSA }");
593 assert_eq!(k.algorithm(), SignatureAlgorithm::RSA);
594
595 assert!(
596 k.choose_scheme(&[SignatureScheme::ECDSA_NISTP256_SHA256])
597 .is_none()
598 );
599 assert!(
600 k.choose_scheme(&[SignatureScheme::ED25519])
601 .is_none()
602 );
603
604 let s = k
605 .choose_scheme(&[SignatureScheme::RSA_PSS_SHA256])
606 .unwrap();
607 assert_eq!(format!("{s:?}"), "RsaSigner { scheme: RSA_PSS_SHA256 }");
608 assert_eq!(s.scheme(), SignatureScheme::RSA_PSS_SHA256);
609 assert_eq!(s.sign(b"hello").unwrap().len(), 256);
610
611 for scheme in &[
612 SignatureScheme::RSA_PKCS1_SHA256,
613 SignatureScheme::RSA_PKCS1_SHA384,
614 SignatureScheme::RSA_PKCS1_SHA512,
615 SignatureScheme::RSA_PSS_SHA256,
616 SignatureScheme::RSA_PSS_SHA384,
617 SignatureScheme::RSA_PSS_SHA512,
618 ] {
619 k.choose_scheme(&[*scheme]).unwrap();
620 }
621 }
622
623 #[test]
624 fn cannot_load_invalid_pkcs8_encoding() {
625 let key = PrivateKeyDer::Pkcs8(PrivatePkcs8KeyDer::from(&b"invalid"[..]));
626 assert_eq!(
627 load_key(&DEFAULT_PROVIDER, key.clone_key()).err(),
628 Some(Error::General(
629 "failed to parse private key as RSA, ECDSA, or EdDSA".into()
630 ))
631 );
632 assert_eq!(
633 EcdsaSigner::try_from(&key).err(),
634 Some(Error::General(
635 "failed to parse ECDSA private key as PKCS#8 or SEC1".into()
636 ))
637 );
638 assert_eq!(
639 RsaSigningKey::try_from(&key).err(),
640 Some(Error::General(
641 "failed to parse RSA private key: InvalidEncoding".into()
642 ))
643 );
644 }
645}
646
647#[cfg(bench)]
648mod benchmarks {
649 use super::*;
650 use crate::crypto::aws_lc_rs::DEFAULT_PROVIDER;
651
652 #[bench]
653 fn bench_rsa2048_pkcs1_sha256(b: &mut test::Bencher) {
654 let key = PrivateKeyDer::Pkcs8(PrivatePkcs8KeyDer::from(
655 &include_bytes!("../../testdata/rsa2048key.pkcs8.der")[..],
656 ));
657
658 let signer = RsaSigningKey::try_from(&key)
659 .unwrap()
660 .to_signer(SignatureScheme::RSA_PKCS1_SHA256);
661
662 b.iter(|| {
663 test::black_box(
664 signer
665 .sign(SAMPLE_TLS13_MESSAGE)
666 .unwrap(),
667 );
668 });
669 }
670
671 #[bench]
672 fn bench_rsa2048_pss_sha256(b: &mut test::Bencher) {
673 let key = PrivateKeyDer::Pkcs8(PrivatePkcs8KeyDer::from(
674 &include_bytes!("../../testdata/rsa2048key.pkcs8.der")[..],
675 ));
676
677 let signer = RsaSigningKey::try_from(&key)
678 .unwrap()
679 .to_signer(SignatureScheme::RSA_PSS_SHA256);
680
681 b.iter(|| {
682 test::black_box(
683 signer
684 .sign(SAMPLE_TLS13_MESSAGE)
685 .unwrap(),
686 );
687 });
688 }
689
690 #[bench]
691 fn bench_eddsa(b: &mut test::Bencher) {
692 let key = PrivatePkcs8KeyDer::from(&include_bytes!("../../testdata/eddsakey.der")[..]);
693 let signer = Ed25519Signer::try_from(&key).unwrap();
694
695 b.iter(|| {
696 test::black_box(
697 signer
698 .sign(SAMPLE_TLS13_MESSAGE)
699 .unwrap(),
700 );
701 });
702 }
703
704 #[bench]
705 fn bench_ecdsa_p256_sha256(b: &mut test::Bencher) {
706 let key = PrivateKeyDer::Pkcs8(PrivatePkcs8KeyDer::from(
707 &include_bytes!("../../testdata/nistp256key.pkcs8.der")[..],
708 ));
709
710 let signer = EcdsaSigner::try_from(&key).unwrap();
711 b.iter(|| {
712 test::black_box(
713 signer
714 .sign(SAMPLE_TLS13_MESSAGE)
715 .unwrap(),
716 );
717 });
718 }
719
720 #[bench]
721 fn bench_ecdsa_p384_sha384(b: &mut test::Bencher) {
722 let key = PrivateKeyDer::Pkcs8(PrivatePkcs8KeyDer::from(
723 &include_bytes!("../../testdata/nistp384key.pkcs8.der")[..],
724 ));
725
726 let signer = EcdsaSigner::try_from(&key).unwrap();
727 b.iter(|| {
728 test::black_box(
729 signer
730 .sign(SAMPLE_TLS13_MESSAGE)
731 .unwrap(),
732 );
733 });
734 }
735
736 #[bench]
737 fn bench_ecdsa_p521_sha512(b: &mut test::Bencher) {
738 let key = PrivateKeyDer::Pkcs8(PrivatePkcs8KeyDer::from(
739 &include_bytes!("../../testdata/nistp521key.pkcs8.der")[..],
740 ));
741
742 let signer = EcdsaSigner::try_from(&key).unwrap();
743 b.iter(|| {
744 test::black_box(
745 signer
746 .sign(SAMPLE_TLS13_MESSAGE)
747 .unwrap(),
748 );
749 });
750 }
751
752 #[bench]
753 fn bench_load_and_validate_rsa2048(b: &mut test::Bencher) {
754 let key = PrivateKeyDer::Pkcs8(PrivatePkcs8KeyDer::from(
755 &include_bytes!("../../testdata/rsa2048key.pkcs8.der")[..],
756 ));
757
758 b.iter(|| {
759 test::black_box(load_key(&DEFAULT_PROVIDER, key.clone_key()).unwrap());
760 });
761 }
762
763 #[bench]
764 fn bench_load_and_validate_rsa4096(b: &mut test::Bencher) {
765 let key = PrivateKeyDer::Pkcs8(PrivatePkcs8KeyDer::from(
766 &include_bytes!("../../testdata/rsa4096key.pkcs8.der")[..],
767 ));
768
769 b.iter(|| {
770 test::black_box(load_key(&DEFAULT_PROVIDER, key.clone_key()).unwrap());
771 });
772 }
773
774 #[bench]
775 fn bench_load_and_validate_p256(b: &mut test::Bencher) {
776 let key = PrivateKeyDer::Pkcs8(PrivatePkcs8KeyDer::from(
777 &include_bytes!("../../testdata/nistp256key.pkcs8.der")[..],
778 ));
779
780 b.iter(|| {
781 test::black_box(EcdsaSigner::try_from(&key).unwrap());
782 });
783 }
784
785 #[bench]
786 fn bench_load_and_validate_p384(b: &mut test::Bencher) {
787 let key = PrivateKeyDer::Pkcs8(PrivatePkcs8KeyDer::from(
788 &include_bytes!("../../testdata/nistp384key.pkcs8.der")[..],
789 ));
790
791 b.iter(|| {
792 test::black_box(EcdsaSigner::try_from(&key).unwrap());
793 });
794 }
795
796 #[bench]
797 fn bench_load_and_validate_p521(b: &mut test::Bencher) {
798 let key = PrivateKeyDer::Pkcs8(PrivatePkcs8KeyDer::from(
799 &include_bytes!("../../testdata/nistp521key.pkcs8.der")[..],
800 ));
801
802 b.iter(|| {
803 test::black_box(EcdsaSigner::try_from(&key).unwrap());
804 });
805 }
806
807 #[bench]
808 fn bench_load_and_validate_eddsa(b: &mut test::Bencher) {
809 let key = PrivatePkcs8KeyDer::from(&include_bytes!("../../testdata/eddsakey.der")[..]);
810
811 b.iter(|| {
812 test::black_box(Ed25519Signer::try_from(&key).unwrap());
813 });
814 }
815
816 const SAMPLE_TLS13_MESSAGE: &[u8] = &[
817 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
818 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
819 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
820 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
821 0x20, 0x20, 0x20, 0x20, 0x54, 0x4c, 0x53, 0x20, 0x31, 0x2e, 0x33, 0x2c, 0x20, 0x73, 0x65,
822 0x72, 0x76, 0x65, 0x72, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,
823 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x00, 0x04, 0xca, 0xc4, 0x48, 0x0e, 0x70, 0xf2,
824 0x1b, 0xa9, 0x1c, 0x16, 0xca, 0x90, 0x48, 0xbe, 0x28, 0x2f, 0xc7, 0xf8, 0x9b, 0x87, 0x72,
825 0x93, 0xda, 0x4d, 0x2f, 0x80, 0x80, 0x60, 0x1a, 0xd3, 0x08, 0xe2, 0xb7, 0x86, 0x14, 0x1b,
826 0x54, 0xda, 0x9a, 0xc9, 0x6d, 0xe9, 0x66, 0xb4, 0x9f, 0xe2, 0x2c,
827 ];
828}