fix dsa patches: truncate hash
authornsz <nsz@port70.net>
Sat, 31 Dec 2011 01:25:28 +0000 (02:25 +0100)
committernsz <nsz@port70.net>
Sat, 31 Dec 2011 01:25:28 +0000 (02:25 +0100)
patches/dsa.diff
patches/sig.diff
pkg/document/document_test.go

index 1970704..575aee7 100644 (file)
@@ -1,6 +1,6 @@
 diff -r 7ec969250bfc src/pkg/crypto/openpgp/packet/private_key.go
 --- a/src/pkg/crypto/openpgp/packet/private_key.go     Tue Dec 27 09:49:19 2011 -0500
-+++ b/src/pkg/crypto/openpgp/packet/private_key.go     Fri Dec 30 22:57:08 2011 +0100
++++ b/src/pkg/crypto/openpgp/packet/private_key.go     Sat Dec 31 02:23:50 2011 +0100
 @@ -28,7 +28,7 @@
        encryptedData []byte
        cipher        CipherFunction
@@ -46,7 +46,7 @@ diff -r 7ec969250bfc src/pkg/crypto/openpgp/packet/private_key.go
        if !pk.Encrypted {
 diff -r 7ec969250bfc src/pkg/crypto/openpgp/packet/public_key.go
 --- a/src/pkg/crypto/openpgp/packet/public_key.go      Tue Dec 27 09:49:19 2011 -0500
-+++ b/src/pkg/crypto/openpgp/packet/public_key.go      Fri Dec 30 22:57:08 2011 +0100
++++ b/src/pkg/crypto/openpgp/packet/public_key.go      Sat Dec 31 02:23:50 2011 +0100
 @@ -53,6 +53,23 @@
        return pk
  }
@@ -71,3 +71,18 @@ diff -r 7ec969250bfc src/pkg/crypto/openpgp/packet/public_key.go
  func (pk *PublicKey) parse(r io.Reader) (err error) {
        // RFC 4880, section 5.5.2
        var buf [6]byte
+@@ -291,7 +308,13 @@
+               return nil
+       case PubKeyAlgoDSA:
+               dsaPublicKey, _ := pk.PublicKey.(*dsa.PublicKey)
+-              if !dsa.Verify(dsaPublicKey, hashBytes, new(big.Int).SetBytes(sig.DSASigR.bytes), new(big.Int).SetBytes(sig.DSASigS.bytes)) {
++              // hash truncation according to FIPS 186-3 section 4.6
++              n := len(hashBytes)
++              k := (dsaPublicKey.Q.BitLen() + 7) / 8
++              if n > k {
++                      n = k
++              }
++              if !dsa.Verify(dsaPublicKey, hashBytes[:n], new(big.Int).SetBytes(sig.DSASigR.bytes), new(big.Int).SetBytes(sig.DSASigS.bytes)) {
+                       return error_.SignatureError("DSA verification failure")
+               }
+               return nil
index d3c49b5..7d00a73 100644 (file)
@@ -1,6 +1,6 @@
 diff -r 7ec969250bfc src/pkg/crypto/openpgp/packet/signature.go
 --- a/src/pkg/crypto/openpgp/packet/signature.go       Tue Dec 27 09:49:19 2011 -0500
-+++ b/src/pkg/crypto/openpgp/packet/signature.go       Fri Dec 30 22:56:55 2011 +0100
++++ b/src/pkg/crypto/openpgp/packet/signature.go       Sat Dec 31 02:23:37 2011 +0100
 @@ -164,7 +164,7 @@
  const (
        creationTimeSubpacket        signatureSubpacketType = 2
@@ -32,7 +32,23 @@ diff -r 7ec969250bfc src/pkg/crypto/openpgp/packet/signature.go
                // Key expiration time, section 5.2.3.6
                if !isHashed {
                        return
-@@ -556,5 +552,59 @@
+@@ -443,7 +439,14 @@
+               sig.RSASignature.bytes, err = rsa.SignPKCS1v15(rand.Reader, priv.PrivateKey.(*rsa.PrivateKey), sig.Hash, digest)
+               sig.RSASignature.bitLength = uint16(8 * len(sig.RSASignature.bytes))
+       case PubKeyAlgoDSA:
+-              r, s, err := dsa.Sign(rand.Reader, priv.PrivateKey.(*dsa.PrivateKey), digest)
++              dsaPrivateKey := priv.PrivateKey.(*dsa.PrivateKey)
++              // hash truncation according to FIPS 186-3 section 4.6
++              n := len(digest)
++              k := (dsaPrivateKey.Q.BitLen() + 7) / 8
++              if n > k {
++                      n = k
++              }
++              r, s, err := dsa.Sign(rand.Reader, dsaPrivateKey, digest[:n])
+               if err == nil {
+                       sig.DSASigR.bytes = r.Bytes()
+                       sig.DSASigR.bitLength = uint16(8 * len(sig.DSASigR.bytes))
+@@ -556,5 +559,59 @@
                subpackets = append(subpackets, outputSubpacket{true, issuerSubpacket, false, keyId})
        }
  
index b738afe..93b0584 100644 (file)
@@ -277,9 +277,9 @@ rBCAor4/6GOiSwi9Q4J+VK+tpyQzcE6jwS5Q5b0IwTDGihQC/CDaec/g3pMcQUNI
 kvYNWYPxdtLjEzk/HMo/3Mg6u/jK006CPqZRcx/m3B5R7gYb5D9PyF/tJsrht4nD
 eDuCAT00kHKYMElgwSzXg03cFcC5AEMf6U7MsrX1JLwY5Dq12gAAoOX6RPKzHB+1
 U7YCHnNg0H1dkf9eCuzNBklzc3VlcsJMBBMRCAAWBQIAAAAACRCRl3ps/DHg6wIZ
-AQIbAwAAIroAoDlcu9nMLGBLDu+2btwnZmcmI1YfAKB3eDLwVZgPuUxagy+FWheJ
-3A8FXQ==
-=fYUf
+AQIbAwAAIroAoBn5gA6TmLKXU9ASu+ENhV0UxowzAKA9Y/4CiQzAeCDcKIcWCg7W
+3r6Jow==
+=NVdT
 -----END PGP PRIVATE KEY BLOCK-----
 `)
 
@@ -294,8 +294,8 @@ rBCAor4/6GOiSwi9Q4J+VK+tpyQzcE6jwS5Q5b0IwTDGihQC/CDaec/g3pMcQUNI
 0ysQBACFl7Go0A5UqlnmwRmsLfvAEBM2+tsIoBlBDEwcgd+nJZzCQpAqO/OpSqHk
 Yx4imGcdknfPLkMmN+Kz9j4o0T+LZuYyblhuj2t1M9lf0Is/Go0Drf/7oc2KpHAo
 nfKu7fkM5nfZWFsgE9TxOz8SQa2RuuhpbkpB2k0Vg2TbqTpFeM0GSXNzdWVywkwE
-ExEIABYFAgAAAAAJEKqJF6U/VQ52AhkBAhsDAADIMwCgNbdkttOHpGZVWdYN56A8
-5ICdzZAAoI9mhDD3u0maGsAEa+1CvWQMgzUy
-=NEom
+ExEIABYFAgAAAAAJEKqJF6U/VQ52AhkBAhsDAADIMwCgt/kmhRwmlzcnc1S3Qlfo
+BD0PBa8AoG5Vm9U4gzWQM/BzVxDToJPB1ZHf
+=MNqN
 -----END PGP PUBLIC KEY BLOCK-----
 `)