Skip to content

Commit c26a84e

Browse files
Merge #115
115: Add accessors for RSA d, dp, dq, and qp r=raoulstrackx a=jethrogb Closes #109 Co-authored-by: Jack Lloyd <[email protected]>
2 parents 13bbeea + 9687c4b commit c26a84e

File tree

1 file changed

+109
-0
lines changed

1 file changed

+109
-0
lines changed

mbedtls/src/pk/mod.rs

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -469,6 +469,92 @@ impl Pk {
469469
Ok(q)
470470
}
471471

472+
pub fn rsa_private_exponent(&self) -> Result<Mpi> {
473+
match self.pk_type() {
474+
Type::Rsa => {}
475+
_ => return Err(Error::PkTypeMismatch),
476+
}
477+
478+
let mut d = Mpi::new(0)?;
479+
480+
unsafe {
481+
rsa_export(
482+
self.inner.pk_ctx as *const rsa_context,
483+
ptr::null_mut(),
484+
ptr::null_mut(),
485+
ptr::null_mut(),
486+
d.handle_mut(),
487+
ptr::null_mut(),
488+
)
489+
.into_result()?;
490+
}
491+
492+
Ok(d)
493+
}
494+
495+
pub fn rsa_crt_dp(&self) -> Result<Mpi> {
496+
match self.pk_type() {
497+
Type::Rsa => {}
498+
_ => return Err(Error::PkTypeMismatch),
499+
}
500+
501+
let mut dp = Mpi::new(0)?;
502+
503+
unsafe {
504+
rsa_export_crt(
505+
self.inner.pk_ctx as *const rsa_context,
506+
dp.handle_mut(),
507+
ptr::null_mut(),
508+
ptr::null_mut(),
509+
)
510+
.into_result()?;
511+
}
512+
513+
Ok(dp)
514+
}
515+
516+
pub fn rsa_crt_dq(&self) -> Result<Mpi> {
517+
match self.pk_type() {
518+
Type::Rsa => {}
519+
_ => return Err(Error::PkTypeMismatch),
520+
}
521+
522+
let mut dq = Mpi::new(0)?;
523+
524+
unsafe {
525+
rsa_export_crt(
526+
self.inner.pk_ctx as *const rsa_context,
527+
ptr::null_mut(),
528+
dq.handle_mut(),
529+
ptr::null_mut(),
530+
)
531+
.into_result()?;
532+
}
533+
534+
Ok(dq)
535+
}
536+
537+
pub fn rsa_crt_qp(&self) -> Result<Mpi> {
538+
match self.pk_type() {
539+
Type::Rsa => {}
540+
_ => return Err(Error::PkTypeMismatch),
541+
}
542+
543+
let mut qp = Mpi::new(0)?;
544+
545+
unsafe {
546+
rsa_export_crt(
547+
self.inner.pk_ctx as *const rsa_context,
548+
ptr::null_mut(),
549+
ptr::null_mut(),
550+
qp.handle_mut(),
551+
)
552+
.into_result()?;
553+
}
554+
555+
Ok(qp)
556+
}
557+
472558
pub fn rsa_public_exponent(&self) -> Result<u32> {
473559
match self.pk_type() {
474560
Type::Rsa => {}
@@ -1277,6 +1363,29 @@ iy6KC991zzvaWY/Ys+q/84Afqa+0qJKQnPuy/7F5GkVdQA/lfbhi
12771363
);
12781364
}
12791365

1366+
#[test]
1367+
fn rsa_params() {
1368+
let pk = Pk::from_private_key(TEST_DER, None).unwrap();
1369+
1370+
let n = pk.rsa_public_modulus().unwrap();
1371+
let d = pk.rsa_private_exponent().unwrap();
1372+
let p = pk.rsa_private_prime1().unwrap();
1373+
let q = pk.rsa_private_prime2().unwrap();
1374+
1375+
let dp = pk.rsa_crt_dp().unwrap();
1376+
let dq = pk.rsa_crt_dq().unwrap();
1377+
let qp = pk.rsa_crt_qp().unwrap();
1378+
1379+
let one = Mpi::new(1).unwrap();
1380+
1381+
let p1 = (&p - &one).unwrap();
1382+
let q1 = (&q - &one).unwrap();
1383+
assert_eq!(&p * &q, Ok(n));
1384+
assert_eq!(&d % &p1, Ok(dp));
1385+
assert_eq!(&d % &q1, Ok(dq));
1386+
assert_eq!((&qp * &q).unwrap().modulo(&p), Ok(one));
1387+
}
1388+
12801389
#[test]
12811390
fn custom_pk_obj() {
12821391
let pk = Pk::public_custom_algo(&[8, 0, 2], &[1, 2, 3, 4]).unwrap();

0 commit comments

Comments
 (0)