diff --git a/src/key.rs b/src/key.rs index f6e0b2f83..3ccddc8e5 100644 --- a/src/key.rs +++ b/src/key.rs @@ -1,7 +1,6 @@ use std::collections::BTreeMap; use std::ffi::{CStr, CString}; use std::io::Cursor; -use std::slice; use libc; use pgp::composed::{Deserializable, SignedPublicKey, SignedSecretKey}; @@ -106,15 +105,6 @@ impl Key { } } - pub fn from_binary(data: *const u8, len: libc::c_int, key_type: KeyType) -> Option { - if data.is_null() || len == 0 { - return None; - } - - let bytes = unsafe { slice::from_raw_parts(data, len as usize) }; - Self::from_slice(bytes, key_type) - } - pub fn from_armored_string( data: &str, key_type: KeyType, @@ -449,6 +439,27 @@ i8pcjGO+IZffvyZJVRWfVooBJmWWbPB1pueo3tx8w3+fcuzpxz+RLFKaPyqXO+dD assert_eq!(private_key, private_key2); } + #[test] + fn test_from_slice_bad_data() { + let mut bad_data: [u8; 4096] = [0; 4096]; + + for i in 0..4096 { + bad_data[i] = (i & 0xff) as u8; + } + + for j in 0..(4096 / 40) { + let bad_key = Key::from_slice( + &bad_data[j..j + 4096 / 2 + j], + if 0 != j & 1 { + KeyType::Public + } else { + KeyType::Private + }, + ); + assert!(bad_key.is_none()); + } + } + #[test] #[ignore] // is too expensive fn test_ascii_roundtrip() { diff --git a/tests/stress.rs b/tests/stress.rs index bf60a1961..1202392ab 100644 --- a/tests/stress.rs +++ b/tests/stress.rs @@ -12,7 +12,6 @@ use deltachat::contact::*; use deltachat::context::*; use deltachat::dc_imex::*; use deltachat::dc_tools::*; -use deltachat::key::*; use deltachat::keyring::*; use deltachat::oauth2::*; use deltachat::pgp::*; @@ -461,136 +460,111 @@ unsafe fn stress_functions(context: &Context) { #[test] #[ignore] // is too expensive fn test_encryption_decryption() { - unsafe { - let mut bad_data: [libc::c_uchar; 4096] = [0; 4096]; - let mut i_0: libc::c_int = 0i32; - while i_0 < 4096i32 { - bad_data[i_0 as usize] = (i_0 & 0xffi32) as libc::c_uchar; - i_0 += 1 - } - let mut j: libc::c_int = 0i32; + let (public_key, private_key) = dc_pgp_create_keypair("foo@bar.de").unwrap(); - while j < 4096 / 40 { - let bad_key = Key::from_binary( - &mut *bad_data.as_mut_ptr().offset(j as isize) as *const u8, - 4096 / 2 + j, - if 0 != j & 1 { - KeyType::Public - } else { - KeyType::Private - }, - ); + private_key.split_key().unwrap(); - assert!(bad_key.is_none()); - j += 1 - } + let (public_key2, private_key2) = dc_pgp_create_keypair("two@zwo.de").unwrap(); - let (public_key, private_key) = dc_pgp_create_keypair("foo@bar.de").unwrap(); + assert_ne!(public_key, public_key2); - private_key.split_key().unwrap(); + let original_text = b"This is a test"; + let mut keyring = Keyring::default(); + keyring.add_owned(public_key.clone()); + keyring.add_ref(&public_key2); - let (public_key2, private_key2) = dc_pgp_create_keypair("two@zwo.de").unwrap(); + let ctext_signed = dc_pgp_pk_encrypt(original_text, &keyring, Some(&private_key)).unwrap(); + assert!(!ctext_signed.is_empty()); + assert!(ctext_signed.starts_with("-----BEGIN PGP MESSAGE-----")); - assert_ne!(public_key, public_key2); + let ctext_unsigned = dc_pgp_pk_encrypt(original_text, &keyring, None).unwrap(); + assert!(!ctext_unsigned.is_empty()); + assert!(ctext_unsigned.starts_with("-----BEGIN PGP MESSAGE-----")); - let original_text = b"This is a test"; - let mut keyring = Keyring::default(); - keyring.add_owned(public_key.clone()); - keyring.add_ref(&public_key2); + let mut keyring = Keyring::default(); + keyring.add_owned(private_key); - let ctext_signed = dc_pgp_pk_encrypt(original_text, &keyring, Some(&private_key)).unwrap(); - assert!(!ctext_signed.is_empty()); - assert!(ctext_signed.starts_with("-----BEGIN PGP MESSAGE-----")); + let mut public_keyring = Keyring::default(); + public_keyring.add_ref(&public_key); - let ctext_unsigned = dc_pgp_pk_encrypt(original_text, &keyring, None).unwrap(); - assert!(!ctext_unsigned.is_empty()); - assert!(ctext_unsigned.starts_with("-----BEGIN PGP MESSAGE-----")); + let mut public_keyring2 = Keyring::default(); + public_keyring2.add_owned(public_key2.clone()); - let mut keyring = Keyring::default(); - keyring.add_owned(private_key); + let mut valid_signatures: HashSet = Default::default(); - let mut public_keyring = Keyring::default(); - public_keyring.add_ref(&public_key); + let plain = dc_pgp_pk_decrypt( + ctext_signed.as_bytes(), + &keyring, + &public_keyring, + Some(&mut valid_signatures), + ) + .unwrap(); - let mut public_keyring2 = Keyring::default(); - public_keyring2.add_owned(public_key2.clone()); + assert_eq!(plain, original_text,); + assert_eq!(valid_signatures.len(), 1); - let mut valid_signatures: HashSet = Default::default(); + valid_signatures.clear(); - let plain = dc_pgp_pk_decrypt( - ctext_signed.as_bytes(), - &keyring, - &public_keyring, - Some(&mut valid_signatures), - ) - .unwrap(); + let empty_keyring = Keyring::default(); + let plain = dc_pgp_pk_decrypt( + ctext_signed.as_bytes(), + &keyring, + &empty_keyring, + Some(&mut valid_signatures), + ) + .unwrap(); + assert_eq!(plain, original_text); + assert_eq!(valid_signatures.len(), 0); - assert_eq!(plain, original_text,); - assert_eq!(valid_signatures.len(), 1); + valid_signatures.clear(); - valid_signatures.clear(); + let plain = dc_pgp_pk_decrypt( + ctext_signed.as_bytes(), + &keyring, + &public_keyring2, + Some(&mut valid_signatures), + ) + .unwrap(); + assert_eq!(plain, original_text); + assert_eq!(valid_signatures.len(), 0); - let empty_keyring = Keyring::default(); - let plain = dc_pgp_pk_decrypt( - ctext_signed.as_bytes(), - &keyring, - &empty_keyring, - Some(&mut valid_signatures), - ) - .unwrap(); - assert_eq!(plain, original_text); - assert_eq!(valid_signatures.len(), 0); + valid_signatures.clear(); - valid_signatures.clear(); + public_keyring2.add_ref(&public_key); - let plain = dc_pgp_pk_decrypt( - ctext_signed.as_bytes(), - &keyring, - &public_keyring2, - Some(&mut valid_signatures), - ) - .unwrap(); - assert_eq!(plain, original_text); - assert_eq!(valid_signatures.len(), 0); + let plain = dc_pgp_pk_decrypt( + ctext_signed.as_bytes(), + &keyring, + &public_keyring2, + Some(&mut valid_signatures), + ) + .unwrap(); + assert_eq!(plain, original_text); + assert_eq!(valid_signatures.len(), 1); - valid_signatures.clear(); + valid_signatures.clear(); - public_keyring2.add_ref(&public_key); + let plain = dc_pgp_pk_decrypt( + ctext_unsigned.as_bytes(), + &keyring, + &public_keyring, + Some(&mut valid_signatures), + ) + .unwrap(); - let plain = dc_pgp_pk_decrypt( - ctext_signed.as_bytes(), - &keyring, - &public_keyring2, - Some(&mut valid_signatures), - ) - .unwrap(); - assert_eq!(plain, original_text); - assert_eq!(valid_signatures.len(), 1); + assert_eq!(plain, original_text); - valid_signatures.clear(); + valid_signatures.clear(); - let plain = dc_pgp_pk_decrypt( - ctext_unsigned.as_bytes(), - &keyring, - &public_keyring, - Some(&mut valid_signatures), - ) - .unwrap(); + let mut keyring = Keyring::default(); + keyring.add_ref(&private_key2); + let mut public_keyring = Keyring::default(); + public_keyring.add_ref(&public_key); - assert_eq!(plain, original_text); + let plain = + dc_pgp_pk_decrypt(ctext_signed.as_bytes(), &keyring, &public_keyring, None).unwrap(); - valid_signatures.clear(); - - let mut keyring = Keyring::default(); - keyring.add_ref(&private_key2); - let mut public_keyring = Keyring::default(); - public_keyring.add_ref(&public_key); - - let plain = - dc_pgp_pk_decrypt(ctext_signed.as_bytes(), &keyring, &public_keyring, None).unwrap(); - - assert_eq!(plain, original_text); - } + assert_eq!(plain, original_text); } unsafe extern "C" fn cb(