Skip to content

Commit 0776339

Browse files
committed
PKCS1 support for RSA-PSS (on top of PKCS8 which was already supported)
1 parent d9bbd56 commit 0776339

File tree

3 files changed

+49
-4
lines changed

3 files changed

+49
-4
lines changed

rustls-wolfcrypt-provider/src/sign/rsapkcs1.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ impl TryFrom<&PrivateKeyDer<'_>> for RsaPkcs1PrivateKey {
3838
fn try_from(value: &PrivateKeyDer<'_>) -> Result<Self, Self::Error> {
3939
match value {
4040
PrivateKeyDer::Pkcs1(der) => {
41+
log::info!("Converting PKCS1 to RSAPKCS1");
42+
4143
let pkcs1: &[u8] = der.secret_pkcs1_der();
4244
let pkcs1_sz: word32 = pkcs1.len() as word32;
4345
let mut ret;

rustls-wolfcrypt-provider/src/sign/rsapss.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ impl TryFrom<&PrivateKeyDer<'_>> for RsaPssPrivateKey {
3939
fn try_from(value: &PrivateKeyDer<'_>) -> Result<Self, Self::Error> {
4040
match value {
4141
PrivateKeyDer::Pkcs8(der) => {
42+
log::info!("Converting PKCS8 to RSAPSS");
43+
4244
let pkcs8: &[u8] = der.secret_pkcs8_der();
4345
let pkcs8_sz: word32 = pkcs8.len() as word32;
4446
let mut ret;
@@ -62,6 +64,37 @@ impl TryFrom<&PrivateKeyDer<'_>> for RsaPssPrivateKey {
6264
check_if_zero(ret)
6365
.map_err(|_| rustls::Error::General("FFI function failed".into()))?;
6466

67+
Ok(Self {
68+
key: Arc::new(rsa_key_object),
69+
algo: SignatureAlgorithm::RSA,
70+
})
71+
},
72+
PrivateKeyDer::Pkcs1(der) => {
73+
log::info!("Converting PKCS1 key to RSAPSS key");
74+
75+
let pkcs1: &[u8] = der.secret_pkcs1_der();
76+
let pkcs1_sz: word32 = pkcs1.len() as word32;
77+
let mut ret;
78+
let rsa_key_box = Box::new(unsafe { mem::zeroed::<RsaKey>() });
79+
let rsa_key_ptr = Box::into_raw(rsa_key_box);
80+
let rsa_key_object = unsafe { RsaKeyObject::from_ptr(rsa_key_ptr) };
81+
82+
ret = unsafe { wc_InitRsaKey(rsa_key_object.as_ptr(), ptr::null_mut()) };
83+
check_if_zero(ret).unwrap();
84+
85+
let mut idx: u32 = 0;
86+
87+
ret = unsafe {
88+
wc_RsaPrivateKeyDecode(
89+
pkcs1.as_ptr() as *mut u8,
90+
&mut idx,
91+
rsa_key_object.as_ptr(),
92+
pkcs1_sz,
93+
)
94+
};
95+
check_if_zero(ret)
96+
.map_err(|_| rustls::Error::General("FFI function failed".into()))?;
97+
6598
Ok(Self {
6699
key: Arc::new(rsa_key_object),
67100
algo: SignatureAlgorithm::RSA,

rustls-wolfcrypt-provider/tests/e2e.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -578,6 +578,8 @@ mod tests {
578578
fn rsa_pss_sign_and_verify() {
579579
init_thread_pool();
580580

581+
env_logger::init();
582+
581583
let wolfcrypt_default_provider = rustls_wolfcrypt_provider::provider();
582584
let schemes = [
583585
SignatureScheme::RSA_PSS_SHA256,
@@ -591,13 +593,19 @@ mod tests {
591593
.collect();
592594

593595
test_cases.par_iter().for_each(|&(scheme, key_size)| {
594-
generate_and_test_pss_key(&wolfcrypt_default_provider, scheme, key_size).expect(
596+
generate_and_test_rsa_pkcs8_key(&wolfcrypt_default_provider, scheme, key_size).expect(
597+
&format!("Failed for scheme {:?} with key size {}", scheme, key_size),
598+
);
599+
});
600+
601+
test_cases.par_iter().for_each(|&(scheme, key_size)| {
602+
generate_and_test_rsa_pkcs1_key(&wolfcrypt_default_provider, scheme, key_size).expect(
595603
&format!("Failed for scheme {:?} with key size {}", scheme, key_size),
596604
);
597605
});
598606
}
599607

600-
fn generate_and_test_pss_key(
608+
fn generate_and_test_rsa_pkcs8_key(
601609
provider: &CryptoProvider,
602610
scheme: SignatureScheme,
603611
key_size: usize,
@@ -663,6 +671,8 @@ mod tests {
663671
fn rsa_pkcs1_sign_and_verify() {
664672
init_thread_pool();
665673

674+
env_logger::init();
675+
666676
let wolfcrypt_default_provider = rustls_wolfcrypt_provider::provider();
667677
let test_cases: Vec<_> = [
668678
SignatureScheme::RSA_PKCS1_SHA256,
@@ -674,13 +684,13 @@ mod tests {
674684
.collect();
675685

676686
test_cases.par_iter().for_each(|&(scheme, key_size)| {
677-
generate_and_test_pkcs1_key(&wolfcrypt_default_provider, scheme, key_size).expect(
687+
generate_and_test_rsa_pkcs1_key(&wolfcrypt_default_provider, scheme, key_size).expect(
678688
&format!("Failed for scheme {:?} with key size {}", scheme, key_size),
679689
);
680690
});
681691
}
682692

683-
fn generate_and_test_pkcs1_key(
693+
fn generate_and_test_rsa_pkcs1_key(
684694
provider: &CryptoProvider,
685695
scheme: SignatureScheme,
686696
key_size: usize,

0 commit comments

Comments
 (0)