use rand::SeedableRng;
use rand_chacha::ChaChaRng;
#[test]
fn ecdh_roundtrip_with_rpgp_0_10() {
const MSG: &[u8] = b"hello world";
const KEYFILE: &str = "./tests/unit-tests/padding/alice.key";
let enc = std::fs::read_to_string("./tests/unit-tests/padding/rpgp-0-10.enc.asc").unwrap();
let dec = decrypt_rpgp_cur(&enc, KEYFILE);
assert_eq!(dec, MSG, "0.10 -> cur");
let enc = encrypt_rpgp_cur(MSG, KEYFILE);
let enc_expected =
std::fs::read_to_string("./tests/unit-tests/padding/rpgp-current.enc.asc").unwrap();
assert_eq!(enc, enc_expected.replace("\r\n", "\n"), "cur -> 0.10");
let enc = encrypt_rpgp_cur(MSG, KEYFILE);
let dec = decrypt_rpgp_cur(&enc, KEYFILE);
assert_eq!(dec, MSG, "cur -> cur");
}
fn decrypt_rpgp_cur(enc_msg: &str, keyfile: &str) -> Vec<u8> {
use pgp::composed::Deserializable;
let (enc_msg, _) = pgp::composed::Message::from_string(enc_msg).expect("decrypt_rpgp_cur");
let (ssk, _headers) =
pgp::composed::SignedSecretKey::from_armor_single(std::fs::File::open(keyfile).unwrap())
.expect("failed to read key");
let mut dec = enc_msg.decrypt(&"".into(), &ssk).unwrap();
dec.as_data_vec().unwrap()
}
fn encrypt_rpgp_cur(msg: &'static [u8], keyfile: &str) -> String {
use pgp::{
composed::{ArmorOptions, Deserializable, MessageBuilder},
crypto::sym::SymmetricKeyAlgorithm,
};
let mut rng = ChaChaRng::from_seed([0u8; 32]);
let (ssk, _headers) =
pgp::composed::SignedSecretKey::from_armor_single(std::fs::File::open(keyfile).unwrap())
.expect("failed to read key");
let enc = &ssk.secret_subkeys[0];
let mut builder =
MessageBuilder::from_bytes("", msg).seipd_v1(&mut rng, SymmetricKeyAlgorithm::AES128);
builder.encrypt_to_key(&mut rng, &enc.public_key()).unwrap();
builder
.to_armored_string(&mut rng, ArmorOptions::default())
.unwrap()
}