1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
use std::io::{self, Write};
use anyhow::Context;
use sequoia_openpgp as openpgp;
use openpgp::{
crypto::*,
fmt::hex,
packet::prelude::*,
serialize::{Serialize, stream::*},
types::*,
};
const PASSWORD: &str = "password";
const MESSAGE: &[u8] = b"Hello, world!";
fn main() -> openpgp::Result<()> {
let password = PASSWORD.into();
for sym_algo in &[SymmetricAlgorithm::AES128,
SymmetricAlgorithm::AES192,
SymmetricAlgorithm::AES256] {
let sk = SessionKey::new(sym_algo.key_size()?);
let mut sink = io::stdout();
let message = Message::new(&mut sink);
let mut message = Armorer::new(message)
.add_header("Comment", format!("Encrypted using {}", sym_algo))
.add_header("Comment", format!("Session key: {}", hex::encode(&sk)))
.build()?;
let mut salt = Default::default();
openpgp::crypto::random(&mut salt);
let skesk4 = SKESK4::with_password(*sym_algo,
*sym_algo,
S2K::Argon2 {
salt,
t: 1,
p: 4,
m: 21,
},
&sk, &password)?;
Packet::from(skesk4).serialize(&mut message)?;
let message = Encryptor::with_session_key(message, *sym_algo, sk)?
.build().context("Failed to create encryptor")?;
let mut message = LiteralWriter::new(message).build()
.context("Failed to create literal writer")?;
message.write_all(MESSAGE)?;
// Finally, finalize the OpenPGP message by tearing down the
// writer stack.
message.finalize()?;
}
Ok(())
}
|