diff --git a/src/dc_imex.rs b/src/dc_imex.rs index 1882b4302..bafe83126 100644 --- a/src/dc_imex.rs +++ b/src/dc_imex.rs @@ -211,12 +211,8 @@ pub fn dc_render_setup_file(context: &Context, passphrase: &str) -> Result) -> Option<(Key, Key)> { } pub fn dc_pgp_pk_encrypt( - plain_text: *const libc::c_void, - plain_bytes: size_t, + plain: &[u8], public_keys_for_encryption: &Keyring, private_key_for_signing: Option<&Key>, ) -> Option { - assert!(!plain_text.is_null() && !plain_bytes > 0, "invalid input"); - - let bytes = unsafe { std::slice::from_raw_parts(plain_text as *const u8, plain_bytes) }; - let lit_msg = Message::new_literal_bytes("", bytes); + let lit_msg = Message::new_literal_bytes("", plain); let pkeys: Vec<&SignedPublicKey> = public_keys_for_encryption .keys() .into_iter() @@ -227,16 +223,11 @@ pub fn dc_pgp_pk_encrypt( } pub fn dc_pgp_pk_decrypt( - ctext: *const libc::c_void, - ctext_bytes: size_t, + ctext: &[u8], private_keys_for_decryption: &Keyring, public_keys_for_validation: &Keyring, ret_signature_fingerprints: Option<&mut HashSet>, ) -> Option> { - assert!(!ctext.is_null() && ctext_bytes > 0, "invalid input"); - - let ctext = unsafe { std::slice::from_raw_parts(ctext as *const u8, ctext_bytes) }; - // TODO: proper error handling if let Ok((msg, _)) = Message::from_armor_single(Cursor::new(ctext)) { let skeys: Vec<&SignedSecretKey> = private_keys_for_decryption @@ -283,19 +274,13 @@ pub fn dc_pgp_pk_decrypt( } /// Symmetric encryption. -pub fn dc_pgp_symm_encrypt( - passphrase: *const libc::c_char, - plain: *const libc::c_void, - plain_bytes: size_t, -) -> Option { +pub fn dc_pgp_symm_encrypt(passphrase: *const libc::c_char, plain: &[u8]) -> Option { assert!(!passphrase.is_null(), "invalid passphrase"); - assert!(!plain.is_null() && !plain_bytes > 0, "invalid input"); let pw = unsafe { CStr::from_ptr(passphrase).to_str().unwrap() }; - let bytes = unsafe { std::slice::from_raw_parts(plain as *const u8, plain_bytes) }; let mut rng = thread_rng(); - let lit_msg = Message::new_literal_bytes("", bytes); + let lit_msg = Message::new_literal_bytes("", plain); let s2k = StringToKey::new_default(&mut rng); let msg = lit_msg.encrypt_with_password(&mut rng, s2k, Default::default(), || pw.into()); @@ -304,18 +289,12 @@ pub fn dc_pgp_symm_encrypt( } /// Symmetric decryption. -pub fn dc_pgp_symm_decrypt( - passphrase: *const libc::c_char, - ctext: *const libc::c_void, - ctext_bytes: size_t, -) -> Option> { +pub fn dc_pgp_symm_decrypt(passphrase: *const libc::c_char, ctext: &[u8]) -> Option> { assert!(!passphrase.is_null(), "invalid passphrase"); - assert!(!ctext.is_null() && !ctext_bytes > 0, "invalid input"); let pw = unsafe { CStr::from_ptr(passphrase).to_str().unwrap() }; - let bytes = unsafe { std::slice::from_raw_parts(ctext as *const u8, ctext_bytes) }; - let enc_msg = Message::from_bytes(Cursor::new(bytes)); + let enc_msg = Message::from_bytes(Cursor::new(ctext)); enc_msg .and_then(|msg| { diff --git a/tests/stress.rs b/tests/stress.rs index 3795f98d7..ab903f727 100644 --- a/tests/stress.rs +++ b/tests/stress.rs @@ -1,7 +1,6 @@ //! Stress some functions for testing; if used as a lib, this file is obsolete. use std::collections::HashSet; -use std::ffi::CString; use std::ptr; use tempfile::{tempdir, TempDir}; @@ -494,39 +493,20 @@ fn test_encryption_decryption() { assert_ne!(public_key, public_key2); - let original_text: *const libc::c_char = - b"This is a test\x00" as *const u8 as *const libc::c_char; + 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 ctext = dc_pgp_pk_encrypt( - original_text as *const libc::c_void, - strlen(original_text), - &keyring, - Some(&private_key), - ) - .unwrap(); + let ctext = dc_pgp_pk_encrypt(original_text, &keyring, Some(&private_key)).unwrap(); assert!(!ctext.is_empty()); assert!(ctext.starts_with("-----BEGIN PGP MESSAGE-----")); - let ctext_signed_bytes = ctext.len(); - let ctext_signed = CString::yolo(ctext); - - let ctext = dc_pgp_pk_encrypt( - original_text as *const libc::c_void, - strlen(original_text), - &keyring, - None, - ) - .unwrap(); + let ctext = dc_pgp_pk_encrypt(original_text, &keyring, None).unwrap(); assert!(!ctext.is_empty()); assert!(ctext.starts_with("-----BEGIN PGP MESSAGE-----")); - let ctext_unsigned_bytes = ctext.len(); - let ctext_unsigned = CString::yolo(ctext); - let mut keyring = Keyring::default(); keyring.add_owned(private_key); @@ -539,42 +519,39 @@ fn test_encryption_decryption() { let mut valid_signatures: HashSet = Default::default(); let plain = dc_pgp_pk_decrypt( - ctext_signed.as_ptr() as *const _, - ctext_signed_bytes, + ctext.as_bytes(), &keyring, &public_keyring, Some(&mut valid_signatures), ) .unwrap(); - assert_eq!(std::str::from_utf8(&plain).unwrap(), as_str(original_text),); + assert_eq!(plain, original_text,); assert_eq!(valid_signatures.len(), 1); valid_signatures.clear(); let empty_keyring = Keyring::default(); let plain = dc_pgp_pk_decrypt( - ctext_signed.as_ptr() as *const _, - ctext_signed_bytes, + ctext.as_bytes(), &keyring, &empty_keyring, Some(&mut valid_signatures), ) .unwrap(); - assert_eq!(std::str::from_utf8(&plain).unwrap(), as_str(original_text),); + assert_eq!(plain, original_text); assert_eq!(valid_signatures.len(), 0); valid_signatures.clear(); let plain = dc_pgp_pk_decrypt( - ctext_signed.as_ptr() as *const _, - ctext_signed_bytes, + ctext.as_bytes(), &keyring, &public_keyring2, Some(&mut valid_signatures), ) .unwrap(); - assert_eq!(std::str::from_utf8(&plain).unwrap(), as_str(original_text),); + assert_eq!(plain, original_text); assert_eq!(valid_signatures.len(), 0); valid_signatures.clear(); @@ -582,28 +559,26 @@ fn test_encryption_decryption() { public_keyring2.add_ref(&public_key); let plain = dc_pgp_pk_decrypt( - ctext_signed.as_ptr() as *const _, - ctext_signed_bytes, + ctext.as_bytes(), &keyring, &public_keyring2, Some(&mut valid_signatures), ) .unwrap(); - assert_eq!(std::str::from_utf8(&plain).unwrap(), as_str(original_text),); + assert_eq!(plain, original_text); assert_eq!(valid_signatures.len(), 1); valid_signatures.clear(); let plain = dc_pgp_pk_decrypt( - ctext_unsigned.as_ptr() as *const _, - ctext_unsigned_bytes, + ctext.as_bytes(), &keyring, &public_keyring, Some(&mut valid_signatures), ) .unwrap(); - assert_eq!(std::str::from_utf8(&plain).unwrap(), as_str(original_text),); + assert_eq!(plain, original_text); valid_signatures.clear(); @@ -612,16 +587,9 @@ fn test_encryption_decryption() { let mut public_keyring = Keyring::default(); public_keyring.add_ref(&public_key); - let plain = dc_pgp_pk_decrypt( - ctext_signed.as_ptr() as *const _, - ctext_signed_bytes, - &keyring, - &public_keyring, - None, - ) - .unwrap(); + let plain = dc_pgp_pk_decrypt(ctext.as_bytes(), &keyring, &public_keyring, None).unwrap(); - assert_eq!(std::str::from_utf8(&plain).unwrap(), as_str(original_text),); + assert_eq!(plain, original_text); } }