From 35f64220433374e9988f150f96ca23c85e4acaed Mon Sep 17 00:00:00 2001 From: Maxime Bedard Date: Wed, 19 Jun 2024 10:45:34 -0400 Subject: [PATCH] Make RSA PrivateKey conversion symmetric --- jose-jwk/src/crypto/rsa.rs | 13 ++++++++++--- jose-jwk/tests/jwk.rs | 7 ++----- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/jose-jwk/src/crypto/rsa.rs b/jose-jwk/src/crypto/rsa.rs index a515344..8d9363f 100644 --- a/jose-jwk/src/crypto/rsa.rs +++ b/jose-jwk/src/crypto/rsa.rs @@ -12,7 +12,7 @@ use jose_jwa::{Algorithm, Algorithm::Signing, Signing::*}; use super::Error; use super::KeyInfo; -use crate::{Rsa, RsaPrivate}; +use crate::{Rsa, RsaOptional, RsaPrivate}; impl KeyInfo for RsaPublicKey { fn strength(&self) -> usize { @@ -95,15 +95,22 @@ impl TryFrom for RsaPublicKey { } } -// TODO: patch rsa crate to export the optional values impl From<&RsaPrivateKey> for Rsa { fn from(pk: &RsaPrivateKey) -> Self { + let opt = Some(RsaOptional { + p: pk.primes()[0].to_bytes_be().into(), + q: pk.primes()[1].to_bytes_be().into(), + dp: pk.dp().expect("unreachable").to_bytes_be().into(), + dq: pk.dq().expect("unreachable").to_bytes_be().into(), + qi: pk.qinv().expect("unreachable").to_bytes_be().1.into(), + oth: alloc::vec![], + }); Self { n: pk.n().to_bytes_be().into(), e: pk.e().to_bytes_be().into(), prv: Some(RsaPrivate { d: pk.d().to_bytes_be().into(), - opt: None, + opt, }), } } diff --git a/jose-jwk/tests/jwk.rs b/jose-jwk/tests/jwk.rs index 5119610..0ebbe73 100644 --- a/jose-jwk/tests/jwk.rs +++ b/jose-jwk/tests/jwk.rs @@ -132,7 +132,7 @@ mod rfc7517 { "qi":"GyM_p6JrXySiz1toFgKbWV-JdI3jQ4ypu9rbMWx3rQJBfmt0FoYzgUIZEVFEcOqwemRN81zoDAaa-Bk0KWNGDjJHZDdDmFhW3AN7lI-puxk_mHZGJ11rxyR8O55XLSe3SPmRfKwZI6yU24ZxvQKFYItdldUKGzO6Ia6zTKhAVRU", "alg":"RS256", "kid":"2011-04-29" - } + }, ] }); @@ -306,10 +306,7 @@ mod rfc7517 { #[cfg(feature = "rsa")] if let Key::Rsa(key) = &jwk.keys[1].key { let pk = ::rsa::RsaPrivateKey::try_from(key).unwrap(); - // FIXME: work around the serialization asymmetry. - let mut k: Rsa = pk.into(); - k.prv.as_mut().unwrap().opt = key.prv.as_ref().unwrap().opt.clone(); - assert_eq!(key, &k); + assert_eq!(key, &pk.into()); } else { unreachable!() }