summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJustus Winter <justus@sequoia-pgp.org>2021-03-18 17:21:45 +0100
committerJustus Winter <justus@sequoia-pgp.org>2021-03-19 11:48:38 +0100
commit963f060e5e3f300770bec3f844d35cde9496402f (patch)
treefddf56affb8a015b25f24c4d3e4fbe922339dbdb
parente0f82bfdccde09712ff704ee17d3f0f6e73af5fe (diff)
openpgp: Simplify key serialization code.
-rw-r--r--openpgp/src/serialize.rs80
-rw-r--r--openpgp/src/serialize/cert.rs3
2 files changed, 35 insertions, 48 deletions
diff --git a/openpgp/src/serialize.rs b/openpgp/src/serialize.rs
index 0e862692..9d38c736 100644
--- a/openpgp/src/serialize.rs
+++ b/openpgp/src/serialize.rs
@@ -1781,14 +1781,6 @@ impl<P: key::KeyParts, R: key::KeyRole> Marshal for Key<P, R> {
}
}
-impl<P: key::KeyParts, R: key::KeyRole> Key<P, R> {
- fn net_len_key(&self, serialize_secrets: bool) -> usize {
- match self {
- &Key::V4(ref p) => p.net_len_key(serialize_secrets),
- }
- }
-}
-
impl<P: key::KeyParts, R: key::KeyRole> MarshalInto for Key<P, R> {
fn serialized_len(&self) -> usize {
match self {
@@ -1812,18 +1804,7 @@ impl<P, R> Marshal for Key4<P, R>
R: key::KeyRole,
{
fn serialize(&self, o: &mut dyn io::Write) -> Result<()> {
- self.serialize_key(o, P::significant_secrets())
- }
-}
-
-impl<P, R> Key4<P, R>
- where P: key::KeyParts,
- R: key::KeyRole,
-{
- pub(crate) // For tests in key.
- fn serialize_key(&self, o: &mut dyn io::Write, serialize_secrets: bool)
- -> Result<()> {
- let have_secret_key = self.has_secret() && serialize_secrets;
+ let have_secret_key = P::significant_secrets() && self.has_secret();
write_byte(o, 4)?; // Version.
write_be_u32(o, Timestamp::try_from(self.creation_time())?.into())?;
@@ -1855,9 +1836,14 @@ impl<P, R> Key4<P, R>
Ok(())
}
+}
- fn net_len_key(&self, serialize_secrets: bool) -> usize {
- let have_secret_key = self.has_secret() && serialize_secrets;
+impl<P, R> NetLength for Key4<P, R>
+ where P: key::KeyParts,
+ R: key::KeyRole,
+{
+ fn net_len(&self) -> usize {
+ let have_secret_key = P::significant_secrets() && self.has_secret();
1 // Version.
+ 4 // Creation time.
@@ -1883,7 +1869,7 @@ impl<P, R> MarshalInto for Key4<P, R>
R: key::KeyRole,
{
fn serialized_len(&self) -> usize {
- self.net_len_key(P::significant_secrets())
+ self.net_len()
}
fn serialize_into(&self, buf: &mut [u8]) -> Result<usize> {
@@ -2593,10 +2579,10 @@ impl Marshal for Packet {
&Packet::Unknown(ref p) => p.serialize(o),
&Packet::Signature(ref p) => p.serialize(o),
&Packet::OnePassSig(ref p) => p.serialize(o),
- &Packet::PublicKey(ref p) => p.serialize_key(o, false),
- &Packet::PublicSubkey(ref p) => p.serialize_key(o, false),
- &Packet::SecretKey(ref p) => p.serialize_key(o, true),
- &Packet::SecretSubkey(ref p) => p.serialize_key(o, true),
+ &Packet::PublicKey(ref p) => p.serialize(o),
+ &Packet::PublicSubkey(ref p) => p.serialize(o),
+ &Packet::SecretKey(ref p) => p.serialize(o),
+ &Packet::SecretSubkey(ref p) => p.serialize(o),
&Packet::Marker(ref p) => p.serialize(o),
&Packet::Trust(ref p) => p.serialize(o),
&Packet::UserID(ref p) => p.serialize(o),
@@ -2634,10 +2620,10 @@ impl Marshal for Packet {
&Packet::Unknown(ref p) => p.export(o),
&Packet::Signature(ref p) => p.export(o),
&Packet::OnePassSig(ref p) => p.export(o),
- &Packet::PublicKey(ref p) => p.serialize_key(o, false),
- &Packet::PublicSubkey(ref p) => p.serialize_key(o, false),
- &Packet::SecretKey(ref p) => p.serialize_key(o, true),
- &Packet::SecretSubkey(ref p) => p.serialize_key(o, true),
+ &Packet::PublicKey(ref p) => p.serialize(o),
+ &Packet::PublicSubkey(ref p) => p.serialize(o),
+ &Packet::SecretKey(ref p) => p.serialize(o),
+ &Packet::SecretSubkey(ref p) => p.serialize(o),
&Packet::Marker(ref p) => p.export(o),
&Packet::Trust(ref p) => p.export(o),
&Packet::UserID(ref p) => p.export(o),
@@ -2659,10 +2645,10 @@ impl NetLength for Packet {
&Packet::Unknown(ref p) => p.net_len(),
&Packet::Signature(ref p) => p.net_len(),
&Packet::OnePassSig(ref p) => p.net_len(),
- &Packet::PublicKey(ref p) => p.net_len_key(false),
- &Packet::PublicSubkey(ref p) => p.net_len_key(false),
- &Packet::SecretKey(ref p) => p.net_len_key(true),
- &Packet::SecretSubkey(ref p) => p.net_len_key(true),
+ &Packet::PublicKey(ref p) => p.net_len(),
+ &Packet::PublicSubkey(ref p) => p.net_len(),
+ &Packet::SecretKey(ref p) => p.net_len(),
+ &Packet::SecretSubkey(ref p) => p.net_len(),
&Packet::Marker(ref p) => p.net_len(),
&Packet::Trust(ref p) => p.net_len(),
&Packet::UserID(ref p) => p.net_len(),
@@ -2819,10 +2805,10 @@ impl<'a> Marshal for PacketRef<'a> {
PacketRef::Unknown(p) => p.serialize(o),
PacketRef::Signature(p) => p.serialize(o),
PacketRef::OnePassSig(p) => p.serialize(o),
- PacketRef::PublicKey(p) => p.serialize_key(o, false),
- PacketRef::PublicSubkey(p) => p.serialize_key(o, false),
- PacketRef::SecretKey(p) => p.serialize_key(o, true),
- PacketRef::SecretSubkey(p) => p.serialize_key(o, true),
+ PacketRef::PublicKey(p) => p.serialize(o),
+ PacketRef::PublicSubkey(p) => p.serialize(o),
+ PacketRef::SecretKey(p) => p.serialize(o),
+ PacketRef::SecretSubkey(p) => p.serialize(o),
PacketRef::Marker(p) => p.serialize(o),
PacketRef::Trust(p) => p.serialize(o),
PacketRef::UserID(p) => p.serialize(o),
@@ -2860,10 +2846,10 @@ impl<'a> Marshal for PacketRef<'a> {
PacketRef::Unknown(p) => p.export(o),
PacketRef::Signature(p) => p.export(o),
PacketRef::OnePassSig(p) => p.export(o),
- PacketRef::PublicKey(p) => p.serialize_key(o, false),
- PacketRef::PublicSubkey(p) => p.serialize_key(o, false),
- PacketRef::SecretKey(p) => p.serialize_key(o, true),
- PacketRef::SecretSubkey(p) => p.serialize_key(o, true),
+ PacketRef::PublicKey(p) => p.serialize(o),
+ PacketRef::PublicSubkey(p) => p.serialize(o),
+ PacketRef::SecretKey(p) => p.serialize(o),
+ PacketRef::SecretSubkey(p) => p.serialize(o),
PacketRef::Marker(p) => p.export(o),
PacketRef::Trust(p) => p.export(o),
PacketRef::UserID(p) => p.export(o),
@@ -2885,10 +2871,10 @@ impl<'a> NetLength for PacketRef<'a> {
PacketRef::Unknown(p) => p.net_len(),
PacketRef::Signature(p) => p.net_len(),
PacketRef::OnePassSig(p) => p.net_len(),
- PacketRef::PublicKey(p) => p.net_len_key(false),
- PacketRef::PublicSubkey(p) => p.net_len_key(false),
- PacketRef::SecretKey(p) => p.net_len_key(true),
- PacketRef::SecretSubkey(p) => p.net_len_key(true),
+ PacketRef::PublicKey(p) => p.net_len(),
+ PacketRef::PublicSubkey(p) => p.net_len(),
+ PacketRef::SecretKey(p) => p.net_len(),
+ PacketRef::SecretSubkey(p) => p.net_len(),
PacketRef::Marker(p) => p.net_len(),
PacketRef::Trust(p) => p.net_len(),
PacketRef::UserID(p) => p.net_len(),
diff --git a/openpgp/src/serialize/cert.rs b/openpgp/src/serialize/cert.rs
index ab57457d..a3aa4cba 100644
--- a/openpgp/src/serialize/cert.rs
+++ b/openpgp/src/serialize/cert.rs
@@ -5,6 +5,7 @@ use crate::seal;
use crate::serialize::{
PacketRef,
Marshal, MarshalInto,
+ NetLength,
generic_serialize_into, generic_export_into,
};
@@ -546,7 +547,7 @@ impl<'a> MarshalInto for TSK<'a> {
|| tag == Tag::PublicSubkey) {
// Emit a GnuPG-style secret key stub. The stub
// extends the public key by 8 bytes.
- let l = key.net_len_key(false) + 8;
+ let l = key.parts_as_public().net_len() + 8;
return 1 // CTB
+ BodyLength::Full(l as u32).serialized_len()
+ l;