From c14aaa8518df3179e12100cea8b82aa96cd6c9be Mon Sep 17 00:00:00 2001 From: nsz Date: Wed, 30 Nov 2011 21:57:20 +0100 Subject: [PATCH] signature subpacket serialization patch --- patches/sig.diff | 90 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 patches/sig.diff diff --git a/patches/sig.diff b/patches/sig.diff new file mode 100644 index 0000000..07ef97f --- /dev/null +++ b/patches/sig.diff @@ -0,0 +1,90 @@ +diff -r 221f3eb76b52 src/pkg/crypto/openpgp/packet/signature.go +--- a/src/pkg/crypto/openpgp/packet/signature.go Thu Nov 24 08:51:47 2011 -0800 ++++ b/src/pkg/crypto/openpgp/packet/signature.go Wed Nov 30 21:54:03 2011 +0100 +@@ -163,7 +163,7 @@ + const ( + creationTimeSubpacket signatureSubpacketType = 2 + signatureExpirationSubpacket signatureSubpacketType = 3 +- keyExpirySubpacket signatureSubpacketType = 9 ++ keyExpirationSubpacket signatureSubpacketType = 9 + prefSymmetricAlgosSubpacket signatureSubpacketType = 11 + issuerSubpacket signatureSubpacketType = 16 + prefHashAlgosSubpacket signatureSubpacketType = 21 +@@ -235,7 +235,7 @@ + } + sig.SigLifetimeSecs = new(uint32) + *sig.SigLifetimeSecs = binary.BigEndian.Uint32(subpacket) +- case keyExpirySubpacket: ++ case keyExpirationSubpacket: + // Key expiration time, section 5.2.3.6 + if !isHashed { + return +@@ -541,10 +541,7 @@ + + func (sig *Signature) buildSubpackets() (subpackets []outputSubpacket) { + creationTime := make([]byte, 4) +- creationTime[0] = byte(sig.CreationTime >> 24) +- creationTime[1] = byte(sig.CreationTime >> 16) +- creationTime[2] = byte(sig.CreationTime >> 8) +- creationTime[3] = byte(sig.CreationTime) ++ binary.BigEndian.PutUint32(creationTime, sig.CreationTime) + subpackets = append(subpackets, outputSubpacket{true, creationTimeSubpacket, false, creationTime}) + + if sig.IssuerKeyId != nil { +@@ -553,5 +550,56 @@ + subpackets = append(subpackets, outputSubpacket{true, issuerSubpacket, false, keyId}) + } + ++ if sig.SigLifetimeSecs != nil && *sig.SigLifetimeSecs != 0 { ++ sigLifetime := make([]byte, 4) ++ binary.BigEndian.PutUint32(sigLifetime, *sig.SigLifetimeSecs) ++ subpackets = append(subpackets, outputSubpacket{true, signatureExpirationSubpacket, false, sigLifetime}) ++ } ++ ++ // The following subpackets may only appear in self-signatures ++ ++ if sig.KeyLifetimeSecs != nil && *sig.KeyLifetimeSecs != 0 { ++ keyLifetime := make([]byte, 4) ++ binary.BigEndian.PutUint32(keyLifetime, *sig.KeyLifetimeSecs) ++ subpackets = append(subpackets, outputSubpacket{true, keyExpirationSubpacket, false, keyLifetime}) ++ } ++ ++ if sig.IsPrimaryId != nil && *sig.IsPrimaryId { ++ subpackets = append(subpackets, outputSubpacket{true, primaryUserIdSubpacket, false, []byte{1}}) ++ } ++ ++ // []byte slices of preferred algorithms are not copied ++ ++ if len(sig.PreferredSymmetric) > 0 { ++ subpackets = append(subpackets, outputSubpacket{true, prefSymmetricAlgosSubpacket, false, sig.PreferredSymmetric}) ++ } ++ ++ if len(sig.PreferredHash) > 0 { ++ subpackets = append(subpackets, outputSubpacket{true, prefHashAlgosSubpacket, false, sig.PreferredHash}) ++ } ++ ++ if len(sig.PreferredCompression) > 0 { ++ subpackets = append(subpackets, outputSubpacket{true, prefCompressionSubpacket, false, sig.PreferredCompression}) ++ } ++ ++ // The Key Flags subpacket may only appear in self-signatures or certification signatures ++ ++ if sig.FlagsValid { ++ flags := byte(0) ++ if sig.FlagCertify { ++ flags |= 1 ++ } ++ if sig.FlagSign { ++ flags |= 2 ++ } ++ if sig.FlagEncryptCommunications { ++ flags |= 4 ++ } ++ if sig.FlagEncryptStorage { ++ flags |= 8 ++ } ++ subpackets = append(subpackets, outputSubpacket{true, keyFlagsSubpacket, false, []byte{flags}}) ++ } ++ + return + } -- 2.20.1