Compare commits

...

1 Commits

Author SHA1 Message Date
Alexander Krotov
035a414c8f Use the first subkey for encryption instead of the primary key 2019-11-10 07:16:50 +03:00

View File

@@ -5,7 +5,7 @@ use std::io::Cursor;
use pgp::armor::BlockType; use pgp::armor::BlockType;
use pgp::composed::{ use pgp::composed::{
Deserializable, KeyType as PgpKeyType, Message, SecretKeyParamsBuilder, SignedPublicKey, Deserializable, KeyType as PgpKeyType, Message, SecretKeyParamsBuilder, SignedPublicKey,
SignedSecretKey, SubkeyParamsBuilder, SignedPublicSubKey, SignedSecretKey, SubkeyParamsBuilder,
}; };
use pgp::crypto::{HashAlgorithm, SymmetricKeyAlgorithm}; use pgp::crypto::{HashAlgorithm, SymmetricKeyAlgorithm};
use pgp::types::{CompressionAlgorithm, KeyTrait, SecretKeyTrait, StringToKey}; use pgp::types::{CompressionAlgorithm, KeyTrait, SecretKeyTrait, StringToKey};
@@ -97,18 +97,29 @@ pub fn create_keypair(addr: impl AsRef<str>) -> Option<(Key, Key)> {
Some((Key::Public(public_key), Key::Secret(private_key))) Some((Key::Public(public_key), Key::Secret(private_key)))
} }
/// Select subkey of the public key to use for encryption.
///
/// Currently the first subkey is selected.
fn select_pk_for_encryption(key: &SignedPublicKey) -> Option<&SignedPublicSubKey> {
key.public_subkeys.iter().find(|_k|
// TODO: check if it is an encryption subkey
true)
}
pub fn pk_encrypt( pub fn pk_encrypt(
plain: &[u8], plain: &[u8],
public_keys_for_encryption: &Keyring, public_keys_for_encryption: &Keyring,
private_key_for_signing: Option<&Key>, private_key_for_signing: Option<&Key>,
) -> Result<String, Error> { ) -> Result<String, Error> {
let lit_msg = Message::new_literal_bytes("", plain); let lit_msg = Message::new_literal_bytes("", plain);
let pkeys: Vec<&SignedPublicKey> = public_keys_for_encryption let pkeys: Vec<&SignedPublicSubKey> = public_keys_for_encryption
.keys() .keys()
.iter() .iter()
.filter_map(|key| { .filter_map(|key| {
let k: &Key = &key; key.as_ref()
k.try_into().ok() .try_into()
.ok()
.and_then(select_pk_for_encryption)
}) })
.collect(); .collect();