Conflicts:
	dkim.go
	dkim_test.go
	pubKeyRep.go
This commit is contained in:
Dolf Schimmel (Freeaqingme)
2016-07-19 21:41:17 +02:00
6 changed files with 241 additions and 160 deletions

View File

@@ -4,7 +4,6 @@ import (
"crypto/rsa"
"crypto/x509"
"encoding/base64"
"net"
"strings"
)
@@ -21,19 +20,18 @@ type PubKey struct {
Selector string
}
func PubKeyFromDns(selector, domain string) ([]*PubKey, verifyOutput, error) {
txt, err := net.LookupTXT(selector + "._domainkey." + domain)
func (dkim *dkim) PubKeyFromDns(selector, domain string) ([]*PubKey, error) {
txt, err := dkim.lookupTXT(selector + "._domainkey." + domain)
if err != nil {
if strings.HasSuffix(err.Error(), "no such host") {
return nil, PERMFAIL, ErrVerifyNoKeyForSignature
return nil, ErrVerifyNoKeyForSignature
} else {
return nil, TEMPFAIL, ErrVerifyKeyUnavailable
return nil, ErrVerifyKeyUnavailable
}
}
// empty record
if len(txt) == 0 {
return nil, PERMFAIL, ErrVerifyNoKeyForSignature
return nil, ErrVerifyNoKeyForSignature
}
pkr := new(PubKey)
@@ -59,11 +57,11 @@ func PubKeyFromDns(selector, domain string) ([]*PubKey, verifyOutput, error) {
case "v":
// RFC: is this tag is specified it MUST be the first in the record
if i != 0 {
return nil, PERMFAIL, ErrVerifyTagVMustBeTheFirst
return nil, ErrVerifyTagVMustBeTheFirst
}
pkr.Version = val
if pkr.Version != "DKIM1" {
return nil, PERMFAIL, ErrVerifyVersionMusBeDkim1
return nil, ErrVerifyVersionMusBeDkim1
}
case "h":
p := strings.Split(strings.ToLower(val), ":")
@@ -80,18 +78,18 @@ func PubKeyFromDns(selector, domain string) ([]*PubKey, verifyOutput, error) {
}
case "k":
if strings.ToLower(val) != "rsa" {
return nil, PERMFAIL, ErrVerifyBadKeyType
return nil, ErrVerifyBadKeyType
}
case "n":
pkr.Note = val
case "p":
rawkey := val
if rawkey == "" {
return nil, PERMFAIL, ErrVerifyRevokedKey
return nil, ErrVerifyRevokedKey
}
un64, err := base64.StdEncoding.DecodeString(rawkey)
if err != nil {
return nil, PERMFAIL, ErrVerifyBadKey
return nil, ErrVerifyBadKey
}
pk, err := x509.ParsePKIXPublicKey(un64)
pkr.PubKey = *pk.(*rsa.PublicKey)
@@ -122,8 +120,8 @@ func PubKeyFromDns(selector, domain string) ([]*PubKey, verifyOutput, error) {
// if no pubkey
if pkr.PubKey == (rsa.PublicKey{}) {
return nil, PERMFAIL, ErrVerifyNoKey
return nil, ErrVerifyNoKey
}
return []*PubKey{pkr}, SUCCESS, nil
return []*PubKey{pkr}, nil
}