diff --git a/src/dc_imex.rs b/src/dc_imex.rs index 50aa9780f..d9d785ba5 100644 --- a/src/dc_imex.rs +++ b/src/dc_imex.rs @@ -208,12 +208,8 @@ pub fn dc_render_setup_file(context: &Context, passphrase: &str) -> Result Some(("Autocrypt-Prefer-Encrypt", "mutual")), }; let private_key_asc = private_key.to_asc(ac_headers); - let encr = { - let private_key_asc_c = CString::yolo(private_key_asc); - let passphrase_c = CString::yolo(passphrase); - dc_pgp_symm_encrypt(passphrase_c.as_ptr(), private_key_asc_c.as_bytes()) - .ok_or(format_err!("Failed to encrypt private key."))? - }; + let encr = dc_pgp_symm_encrypt(&passphrase, private_key_asc.as_bytes()) + .ok_or(format_err!("Failed to encrypt private key."))?; let replacement = format!( concat!( "-----BEGIN PGP MESSAGE-----\r\n", @@ -445,7 +441,7 @@ pub unsafe fn dc_decrypt_setup_file( { /* decrypt symmetrically */ if let Some(plain) = dc_pgp_symm_decrypt( - passphrase, + as_str(passphrase), std::slice::from_raw_parts(binary as *const u8, binary_bytes), ) { let payload_c = CString::new(plain).unwrap(); diff --git a/src/pgp.rs b/src/pgp.rs index 46d1fc8b0..5adf95c51 100644 --- a/src/pgp.rs +++ b/src/pgp.rs @@ -1,6 +1,5 @@ use std::collections::HashSet; use std::convert::TryInto; -use std::ffi::CStr; use std::io::Cursor; use std::ptr; @@ -274,32 +273,25 @@ pub fn dc_pgp_pk_decrypt( } /// Symmetric encryption. -pub fn dc_pgp_symm_encrypt(passphrase: *const libc::c_char, plain: &[u8]) -> Option { - assert!(!passphrase.is_null(), "invalid passphrase"); - - let pw = unsafe { CStr::from_ptr(passphrase).to_str().unwrap() }; - +pub fn dc_pgp_symm_encrypt(passphrase: &str, plain: &[u8]) -> Option { let mut rng = thread_rng(); 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()); + let msg = + lit_msg.encrypt_with_password(&mut rng, s2k, Default::default(), || passphrase.into()); msg.and_then(|msg| msg.to_armored_string(None)).ok() } /// Symmetric decryption. -pub fn dc_pgp_symm_decrypt(passphrase: *const libc::c_char, ctext: &[u8]) -> Option> { - assert!(!passphrase.is_null(), "invalid passphrase"); - - let pw = unsafe { CStr::from_ptr(passphrase).to_str().unwrap() }; - +pub fn dc_pgp_symm_decrypt(passphrase: &str, ctext: &[u8]) -> Option> { let enc_msg = Message::from_bytes(Cursor::new(ctext)); enc_msg .and_then(|msg| { let mut decryptor = msg - .decrypt_with_password(|| pw.into()) + .decrypt_with_password(|| passphrase.into()) .expect("failed decryption"); decryptor.next().expect("no message") })