signature subpacket serialization patch
authornsz <nsz@port70.net>
Wed, 30 Nov 2011 20:57:20 +0000 (21:57 +0100)
committernsz <nsz@port70.net>
Wed, 30 Nov 2011 20:57:20 +0000 (21:57 +0100)
patches/sig.diff [new file with mode: 0644]

diff --git a/patches/sig.diff b/patches/sig.diff
new file mode 100644 (file)
index 0000000..07ef97f
--- /dev/null
@@ -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
+ }