浏览代码

go.crypto/openpgp: support v3 detached signatures.

Although the package doesn't attempt to fully support ancient, version
3 messages, supporting v3 detached signatures is fairly easy and some
projects (in this case, Ubuntu) are using them for unknown reasons.

R=golang-dev, r
CC=golang-dev
https://golang.org/cl/14590043
Adam Langley 12 年之前
父节点
当前提交
7bb6c099c0
共有 2 个文件被更改,包括 28 次插入9 次删除
  1. 25 9
      openpgp/read.go
  2. 3 0
      openpgp/read_test.go

+ 25 - 9
openpgp/read.go

@@ -362,21 +362,32 @@ func CheckDetachedSignature(keyring KeyRing, signed, signature io.Reader) (signe
 		return
 	}
 
-	sig, ok := p.(*packet.Signature)
-	if !ok {
+	var issuerKeyId uint64
+	var hashFunc crypto.Hash
+	var sigType packet.SignatureType
+
+	switch sig := p.(type) {
+	case *packet.Signature:
+		if sig.IssuerKeyId == nil {
+			return nil, errors.StructuralError("signature doesn't have an issuer")
+		}
+		issuerKeyId = *sig.IssuerKeyId
+		hashFunc = sig.Hash
+		sigType = sig.SigType
+	case *packet.SignatureV3:
+		issuerKeyId = sig.IssuerKeyId
+		hashFunc = sig.Hash
+		sigType = sig.SigType
+	default:
 		return nil, errors.StructuralError("non signature packet found")
 	}
 
-	if sig.IssuerKeyId == nil {
-		return nil, errors.StructuralError("signature doesn't have an issuer")
-	}
-
-	keys := keyring.KeysById(*sig.IssuerKeyId)
+	keys := keyring.KeysById(issuerKeyId)
 	if len(keys) == 0 {
 		return nil, errors.ErrUnknownIssuer
 	}
 
-	h, wrappedHash, err := hashForSignature(sig.Hash, sig.SigType)
+	h, wrappedHash, err := hashForSignature(hashFunc, sigType)
 	if err != nil {
 		return
 	}
@@ -390,7 +401,12 @@ func CheckDetachedSignature(keyring KeyRing, signed, signature io.Reader) (signe
 		if key.SelfSignature.FlagsValid && !key.SelfSignature.FlagSign {
 			continue
 		}
-		err = key.PublicKey.VerifySignature(h, sig)
+		switch sig := p.(type) {
+		case *packet.Signature:
+			err = key.PublicKey.VerifySignature(h, sig)
+		case *packet.SignatureV3:
+			err = key.PublicKey.VerifySignatureV3(h, sig)
+		}
 		if err == nil {
 			return key.Entity, nil
 		}

文件差异内容过多而无法显示
+ 3 - 0
openpgp/read_test.go


部分文件因为文件数量过多而无法显示