summaryrefslogtreecommitdiffstats
path: root/openpgp
diff options
context:
space:
mode:
authorJustus Winter <justus@sequoia-pgp.org>2018-12-27 16:25:42 +0100
committerJustus Winter <justus@sequoia-pgp.org>2019-01-10 14:44:39 +0100
commitd678ea32802a4896b95fc9b01c86ba7114fb2b9f (patch)
tree377de42676043931b7ea1ef65d7088119ec86f39 /openpgp
parent6e53bb4f673786acee95a416fbf7859659d626b7 (diff)
openpgp: Use Signer when revoking TPKs.
Diffstat (limited to 'openpgp')
-rw-r--r--openpgp/src/tpk/builder.rs10
-rw-r--r--openpgp/src/tpk/mod.rs37
2 files changed, 31 insertions, 16 deletions
diff --git a/openpgp/src/tpk/builder.rs b/openpgp/src/tpk/builder.rs
index fa145720..4723157f 100644
--- a/openpgp/src/tpk/builder.rs
+++ b/openpgp/src/tpk/builder.rs
@@ -7,6 +7,7 @@ use crypto::KeyPair;
use SymmetricAlgorithm;
use HashAlgorithm;
use packet::signature::{self, Signature};
+use packet::key::SecretKey;
use TPK;
use PublicKeyAlgorithm;
use Error;
@@ -207,7 +208,14 @@ impl TPKBuilder {
let tpk = TPK::from_packet_pile(PacketPile::from_packets(packets))?;
- let revocation = tpk.revoke(ReasonForRevocation::Unspecified,
+ let sec =
+ if let Some(SecretKey::Unencrypted { ref mpis }) = primary.secret() {
+ mpis.clone()
+ } else {
+ unreachable!()
+ };
+ let revocation = tpk.revoke(&mut KeyPair::new(primary, sec)?,
+ ReasonForRevocation::Unspecified,
b"Unspecified")?;
// keys generated by the builder are never invalid
diff --git a/openpgp/src/tpk/mod.rs b/openpgp/src/tpk/mod.rs
index 6c092f80..2515b537 100644
--- a/openpgp/src/tpk/mod.rs
+++ b/openpgp/src/tpk/mod.rs
@@ -11,7 +11,7 @@ use time;
use failure;
use {
- crypto::KeyPair,
+ crypto::{Signer, KeyPair},
Error,
Result,
RevocationStatus,
@@ -1305,6 +1305,7 @@ impl TPK {
/// use openpgp::RevocationStatus;
/// use openpgp::constants::{ReasonForRevocation, SignatureType};
/// use openpgp::tpk::{CipherSuite, TPKBuilder};
+ /// use openpgp::crypto::KeyPair;
/// use openpgp::parse::Parse;
/// # fn main() { f().unwrap(); }
/// # fn f() -> Result<()>
@@ -1314,7 +1315,8 @@ impl TPK {
/// .generate()?;
/// assert_eq!(RevocationStatus::NotAsFarAsWeKnow, tpk.revoked());
///
- /// let sig = tpk.revoke(ReasonForRevocation::KeyCompromised,
+ /// let mut keypair = tpk.primary().clone().into_keypair()?;
+ /// let sig = tpk.revoke(&mut keypair, ReasonForRevocation::KeyCompromised,
/// b"It was the maid :/")?;
/// assert_eq!(sig.sigtype(), SignatureType::KeyRevocation);
///
@@ -1322,9 +1324,15 @@ impl TPK {
/// assert_eq!(RevocationStatus::Revoked(&[sig]), tpk.revoked());
/// # Ok(())
/// # }
- pub fn revoke(&self, code: ReasonForRevocation, reason: &[u8])
+ pub fn revoke(&self, primary_signer: &mut Signer,
+ code: ReasonForRevocation, reason: &[u8])
-> Result<Signature>
{
+ if primary_signer.public().fingerprint() != self.fingerprint() {
+ return Err(Error::InvalidArgument(
+ "signer is not the primary key".into()).into());
+ }
+
let mut sig = signature::Builder::new(SignatureType::KeyRevocation);
sig.set_signature_creation_time(time::now_utc())?;
sig.set_issuer_fingerprint(self.primary().fingerprint())?;
@@ -1338,14 +1346,7 @@ impl TPK {
let mut hash = hash_algo.context()?;
pair.hash(&mut hash);
- if let Some(SecretKey::Unencrypted{ mpis: ref sec }) = pair.secret() {
- // Generate the signature.
- sig.sign_hash(&mut KeyPair::new(pair.clone(), sec.clone())?,
- hash_algo, hash)
- } else {
- return Err(Error::InvalidOperation(
- "Secret key is encrypted".into()).into());
- }
+ sig.sign_hash(primary_signer, hash_algo, hash)
}
/// Revokes the TPK.
@@ -1358,6 +1359,7 @@ impl TPK {
/// use openpgp::RevocationStatus;
/// use openpgp::constants::{ReasonForRevocation, SignatureType};
/// use openpgp::tpk::{CipherSuite, TPKBuilder};
+ /// use openpgp::crypto::KeyPair;
/// use openpgp::parse::Parse;
/// # fn main() { f().unwrap(); }
/// # fn f() -> Result<()>
@@ -1367,7 +1369,9 @@ impl TPK {
/// .generate()?;
/// assert_eq!(RevocationStatus::NotAsFarAsWeKnow, tpk.revoked());
///
- /// let tpk = tpk.revoke_in_place(ReasonForRevocation::KeyCompromised,
+ /// let mut keypair = tpk.primary().clone().into_keypair()?;
+ /// let tpk = tpk.revoke_in_place(&mut keypair,
+ /// ReasonForRevocation::KeyCompromised,
/// b"It was the maid :/")?;
/// if let RevocationStatus::Revoked(sigs) = tpk.revoked() {
/// assert_eq!(sigs.len(), 1);
@@ -1381,10 +1385,11 @@ impl TPK {
/// # Ok(())
/// # }
/// ```
- pub fn revoke_in_place(self, code: ReasonForRevocation, reason: &[u8])
+ pub fn revoke_in_place(self, primary_signer: &mut Signer,
+ code: ReasonForRevocation, reason: &[u8])
-> Result<TPK>
{
- let sig = self.revoke(code, reason)?;
+ let sig = self.revoke(primary_signer, code, reason)?;
self.merge_packets(vec![sig.to_packet()])
}
@@ -3324,7 +3329,9 @@ mod test {
let tpk = tsk.into_tpk();
assert_eq!(RevocationStatus::NotAsFarAsWeKnow, tpk.revoked());
- let sig = tpk.revoke(ReasonForRevocation::KeyCompromised,
+ let mut keypair = tpk.primary().clone().into_keypair().unwrap();
+ let sig = tpk.revoke(&mut keypair,
+ ReasonForRevocation::KeyCompromised,
b"It was the maid :/").unwrap();
assert_eq!(sig.sigtype(), SignatureType::KeyRevocation);