pax_global_header00006660000000000000000000000064135524131430014513gustar00rootroot0000000000000052 comment=a683815bdae8772117bbb85c02ff4458a9f726a8 golang-blitiri-go-spf-0.0+git20191018.0.a683815/000077500000000000000000000000001355241314300201275ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/.gitignore000066400000000000000000000003451355241314300221210ustar00rootroot00000000000000# Ignore anything beginning with a dot: these are usually temporary or # unimportant. .* # Exceptions to the rule above: files we care about that would otherwise be # excluded. !.gitignore # go-fuzz build artifacts. *-fuzz.zip golang-blitiri-go-spf-0.0+git20191018.0.a683815/.travis.yml000066400000000000000000000006721355241314300222450ustar00rootroot00000000000000# Configuration for https://travis-ci.org/ language: go dist: trusty sudo: false go_import_path: blitiri.com.ar/go/spf go: - 1.7 - stable - master before_install: - go get github.com/mattn/goveralls script: - go test ./... - go test -race ./... - go test -v -covermode=count -coverprofile=coverage.out - $HOME/gopath/bin/goveralls -coverprofile=coverage.out -service=travis-ci -repotoken $COVERALLS_TOKEN golang-blitiri-go-spf-0.0+git20191018.0.a683815/LICENSE000066400000000000000000000022041355241314300211320ustar00rootroot00000000000000 Licensed under the MIT licence, which is reproduced below (from https://opensource.org/licenses/MIT). ----- Copyright (c) 2016 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. golang-blitiri-go-spf-0.0+git20191018.0.a683815/README.md000066400000000000000000000033211355241314300214050ustar00rootroot00000000000000 # blitiri.com.ar/go/spf [![GoDoc](https://godoc.org/blitiri.com.ar/go/spf?status.svg)](https://godoc.org/blitiri.com.ar/go/spf) [![Build Status](https://travis-ci.org/albertito/spf.svg?branch=master)](https://travis-ci.org/albertito/spf) [![Go Report Card](https://goreportcard.com/badge/github.com/albertito/spf)](https://goreportcard.com/report/github.com/albertito/spf) [![Coverage Status](https://coveralls.io/repos/github/albertito/spf/badge.svg?branch=next)](https://coveralls.io/github/albertito/spf) [spf](https://godoc.org/blitiri.com.ar/go/spf) is an open source implementation of the Sender Policy Framework (SPF) in Go. It is used by the [chasquid](https://blitiri.com.ar/p/chasquid/) SMTP server. ## Example The API is quite simple: it has only one main function to perform the SPF check, similar to the one suggested in the [RFC](https://tools.ietf.org/html/rfc7208). ```go // Check if `sender` is authorized to send from the given `ip`. The `domain` // is used if the sender doesn't have one. result, err := spf.CheckHostWithSender(ip, domain, sender) if result == spf.Fail { // Not authorized to use the domain. } ``` See the [documentation](https://godoc.org/blitiri.com.ar/go/spf) for more details. ## Status The API should be considered stable. Major version changes will be announced to the mailing list (details below). Branch v1 will only have backwards-compatible changes made to it. There are no plans for v2 at the moment. ## Contact If you have any questions, comments or patches please send them to the mailing list, chasquid@googlegroups.com. To subscribe, send an email to chasquid+subscribe@googlegroups.com. You can also browse the [archives](https://groups.google.com/forum/#!forum/chasquid). golang-blitiri-go-spf-0.0+git20191018.0.a683815/dns_test.go000066400000000000000000000026641355241314300223110ustar00rootroot00000000000000package spf import ( "flag" "net" "os" "strings" "testing" ) // DNS overrides for testing. type DNS struct { txt map[string][]string mx map[string][]*net.MX ip map[string][]net.IP addr map[string][]string errors map[string]error } func NewDNS() DNS { return DNS{ txt: map[string][]string{}, mx: map[string][]*net.MX{}, ip: map[string][]net.IP{}, addr: map[string][]string{}, errors: map[string]error{}, } } // Single global variable that the overridden resolvers use. // This way it's easier to get a clean slate between tests. var dns DNS func LookupTXT(domain string) (txts []string, err error) { domain = strings.ToLower(domain) domain = strings.TrimRight(domain, ".") return dns.txt[domain], dns.errors[domain] } func LookupMX(domain string) (mxs []*net.MX, err error) { domain = strings.ToLower(domain) domain = strings.TrimRight(domain, ".") return dns.mx[domain], dns.errors[domain] } func LookupIP(host string) (ips []net.IP, err error) { host = strings.ToLower(host) host = strings.TrimRight(host, ".") return dns.ip[host], dns.errors[host] } func LookupAddr(host string) (addrs []string, err error) { host = strings.ToLower(host) host = strings.TrimRight(host, ".") return dns.addr[host], dns.errors[host] } func TestMain(m *testing.M) { dns = NewDNS() lookupTXT = LookupTXT lookupMX = LookupMX lookupIP = LookupIP lookupAddr = LookupAddr flag.Parse() os.Exit(m.Run()) } golang-blitiri-go-spf-0.0+git20191018.0.a683815/fuzz.go000066400000000000000000000042601355241314300214560ustar00rootroot00000000000000// Fuzz testing for package spf. // // Run it with: // // go-fuzz-build blitiri.com.ar/go/spf // go-fuzz -bin=./spf-fuzz.zip -workdir=testdata/fuzz // // +build gofuzz package spf import "net" // Parsed IP addresses, for convenience. var ( ip1110 = net.ParseIP("1.1.1.0") ip1111 = net.ParseIP("1.1.1.1") ip6666 = net.ParseIP("2001:db8::68") ip6660 = net.ParseIP("2001:db8::0") ) // Results for TXT lookups. This one is global as the values will be set by // the fuzzer. The other lookup types are static and configured in init, see // below). var txtResults = map[string][]string{} func init() { // Make the resolving functions return our test data. // The test data is fixed, the fuzzer doesn't change it. // TODO: Once go-fuzz can run functions from _test.go files, move this to // spf_test.go to avoid duplicating all this boilerplate. var ( mxResults = map[string][]*net.MX{} ipResults = map[string][]net.IP{} addrResults = map[string][]string{} ) lookupTXT = func(domain string) (txts []string, err error) { return txtResults[domain], nil } lookupMX = func(domain string) (mxs []*net.MX, err error) { return mxResults[domain], nil } lookupIP = func(host string) (ips []net.IP, err error) { return ipResults[host], nil } lookupAddr = func(host string) (addrs []string, err error) { return addrResults[host], nil } ipResults["d1111"] = []net.IP{ip1111} ipResults["d1110"] = []net.IP{ip1110} mxResults["d1110"] = []*net.MX{{"d1110", 5}, {"nothing", 10}} ipResults["d6666"] = []net.IP{ip6666} ipResults["d6660"] = []net.IP{ip6660} mxResults["d6660"] = []*net.MX{{"d6660", 5}, {"nothing", 10}} addrResults["2001:db8::68"] = []string{"sonlas6.", "domain.", "d6666."} addrResults["1.1.1.1"] = []string{"lalala.", "domain.", "d1111."} } func Fuzz(data []byte) int { // The domain's TXT record comes from the fuzzer. txtResults["domain"] = []string{string(data)} v4result, _ := CheckHost(ip1111, "domain") // IPv4 v6result, _ := CheckHost(ip6666, "domain") // IPv6 // Raise priority if any of the results was something other than // PermError, as it means the data was better formed. if v4result != PermError || v6result != PermError { return 1 } return 0 } golang-blitiri-go-spf-0.0+git20191018.0.a683815/spf.go000066400000000000000000000523571355241314300212620ustar00rootroot00000000000000// Package spf implements SPF (Sender Policy Framework) lookup and validation. // // Sender Policy Framework (SPF) is a simple email-validation system designed // to detect email spoofing by providing a mechanism to allow receiving mail // exchangers to check that incoming mail from a domain comes from a host // authorized by that domain's administrators [Wikipedia]. // // This is a Go implementation of it, which is used by the chasquid SMTP // server (https://blitiri.com.ar/p/chasquid/). // // Supported mechanisms and modifiers: // all // include // a // mx // ip4 // ip6 // redirect // exists // exp (ignored) // Macros // // References: // https://tools.ietf.org/html/rfc7208 // https://en.wikipedia.org/wiki/Sender_Policy_Framework package spf // import "blitiri.com.ar/go/spf" import ( "fmt" "net" "net/url" "regexp" "strconv" "strings" ) // Functions that we can override for testing purposes. var ( lookupTXT = net.LookupTXT lookupMX = net.LookupMX lookupIP = net.LookupIP lookupAddr = net.LookupAddr trace = func(f string, a ...interface{}) {} ) // The Result of an SPF check. Note the values have meaning, we use them in // headers. https://tools.ietf.org/html/rfc7208#section-8 type Result string // Valid results. var ( // https://tools.ietf.org/html/rfc7208#section-8.1 // Not able to reach any conclusion. None = Result("none") // https://tools.ietf.org/html/rfc7208#section-8.2 // No definite assertion (positive or negative). Neutral = Result("neutral") // https://tools.ietf.org/html/rfc7208#section-8.3 // Client is authorized to inject mail. Pass = Result("pass") // https://tools.ietf.org/html/rfc7208#section-8.4 // Client is *not* authorized to use the domain Fail = Result("fail") // https://tools.ietf.org/html/rfc7208#section-8.5 // Not authorized, but unwilling to make a strong policy statement/ SoftFail = Result("softfail") // https://tools.ietf.org/html/rfc7208#section-8.6 // Transient error while performing the check. TempError = Result("temperror") // https://tools.ietf.org/html/rfc7208#section-8.7 // Records could not be correctly interpreted. PermError = Result("permerror") ) var qualToResult = map[byte]Result{ '+': Pass, '-': Fail, '~': SoftFail, '?': Neutral, } var ( errLookupLimitReached = fmt.Errorf("lookup limit reached") errUnknownField = fmt.Errorf("unknown field") errInvalidIP = fmt.Errorf("invalid ipX value") errInvalidMask = fmt.Errorf("invalid mask") errInvalidMacro = fmt.Errorf("invalid macro") errInvalidDomain = fmt.Errorf("invalid domain") errNoResult = fmt.Errorf("lookup yielded no result") errMultipleRecords = fmt.Errorf("multiple matching DNS records") errTooManyMXRecords = fmt.Errorf("too many MX records") errMatchedAll = fmt.Errorf("matched 'all'") errMatchedA = fmt.Errorf("matched 'a'") errMatchedIP = fmt.Errorf("matched 'ip'") errMatchedMX = fmt.Errorf("matched 'mx'") errMatchedPTR = fmt.Errorf("matched 'ptr'") errMatchedExists = fmt.Errorf("matched 'exists'") ) // CheckHost fetches SPF records for `domain`, parses them, and evaluates them // to determine if `ip` is permitted to send mail for it. // Because it doesn't receive enough information to handle macros well, its // usage is not recommended, but remains supported for backwards // compatibility. // Reference: https://tools.ietf.org/html/rfc7208#section-4 func CheckHost(ip net.IP, domain string) (Result, error) { trace("check host %q %q", ip, domain) r := &resolution{ip, 0, "@" + domain, nil} return r.Check(domain) } // CheckHostWithSender fetches SPF records for `sender`'s domain, parses them, // and evaluates them to determine if `ip` is permitted to send mail for it. // The `helo` domain is used if the sender has no domain part. // Reference: https://tools.ietf.org/html/rfc7208#section-4 func CheckHostWithSender(ip net.IP, helo, sender string) (Result, error) { _, domain := split(sender) if domain == "" { domain = helo } trace("check host with sender %q %q %q (%q)", ip, helo, sender, domain) r := &resolution{ip, 0, sender, nil} return r.Check(domain) } // split an user@domain address into user and domain. func split(addr string) (string, string) { ps := strings.SplitN(addr, "@", 2) if len(ps) != 2 { return addr, "" } return ps[0], ps[1] } type resolution struct { ip net.IP count uint sender string // Result of doing a reverse lookup for ip (so we only do it once). ipNames []string } var aField = regexp.MustCompile(`^a$|a:|a/`) var mxField = regexp.MustCompile(`^mx$|mx:|mx/`) var ptrField = regexp.MustCompile(`^ptr$|ptr:`) func (r *resolution) Check(domain string) (Result, error) { r.count++ trace("check %s %d", domain, r.count) txt, err := getDNSRecord(domain) if err != nil { if isTemporary(err) { trace("dns temp error: %v", err) return TempError, err } if err == errMultipleRecords { trace("multiple dns records") return PermError, err } // Could not resolve the name, it may be missing the record. // https://tools.ietf.org/html/rfc7208#section-2.6.1 trace("dns perm error: %v", err) return None, err } trace("dns record %q", txt) if txt == "" { // No record => None. // https://tools.ietf.org/html/rfc7208#section-4.6 return None, nil } fields := strings.Split(txt, " ") // redirects must be handled after the rest; instead of having two loops, // we just move them to the end. var newfields, redirects []string for _, field := range fields { if strings.HasPrefix(field, "redirect=") { redirects = append(redirects, field) } else { newfields = append(newfields, field) } } if len(redirects) > 1 { // At most a single redirect is allowed. // https://tools.ietf.org/html/rfc7208#section-6 return PermError, errInvalidDomain } fields = append(newfields, redirects...) for _, field := range fields { if field == "" { continue } // The version check should be case-insensitive (it's a // case-insensitive constant in the standard). // https://tools.ietf.org/html/rfc7208#section-12 if strings.HasPrefix(field, "v=") || strings.HasPrefix(field, "V=") { continue } // Limit the number of resolutions to 10 // https://tools.ietf.org/html/rfc7208#section-4.6.4 if r.count > 10 { trace("lookup limit reached") return PermError, errLookupLimitReached } // See if we have a qualifier, defaulting to + (pass). // https://tools.ietf.org/html/rfc7208#section-4.6.2 result, ok := qualToResult[field[0]] if ok { field = field[1:] } else { result = Pass } // Mechanism and modifier names are case-insensitive. // https://tools.ietf.org/html/rfc7208#section-4.6.1 lfield := strings.ToLower(field) if lfield == "all" { // https://tools.ietf.org/html/rfc7208#section-5.1 trace("%v matched all", result) return result, errMatchedAll } else if strings.HasPrefix(lfield, "include:") { if ok, res, err := r.includeField(result, field, domain); ok { trace("include ok, %v %v", res, err) return res, err } } else if aField.MatchString(lfield) { if ok, res, err := r.aField(result, field, domain); ok { trace("a ok, %v %v", res, err) return res, err } } else if mxField.MatchString(lfield) { if ok, res, err := r.mxField(result, field, domain); ok { trace("mx ok, %v %v", res, err) return res, err } } else if strings.HasPrefix(lfield, "ip4:") || strings.HasPrefix(lfield, "ip6:") { if ok, res, err := r.ipField(result, field); ok { trace("ip ok, %v %v", res, err) return res, err } } else if ptrField.MatchString(lfield) { if ok, res, err := r.ptrField(result, field, domain); ok { trace("ptr ok, %v %v", res, err) return res, err } } else if strings.HasPrefix(lfield, "exists:") { if ok, res, err := r.existsField(result, field, domain); ok { trace("exists ok, %v %v", res, err) return res, err } } else if strings.HasPrefix(lfield, "exp=") { trace("exp= not used, skipping") continue } else if strings.HasPrefix(lfield, "redirect=") { trace("redirect, %q", field) return r.redirectField(field, domain) } else { // http://www.openspf.org/SPF_Record_Syntax trace("permerror, unknown field") return PermError, errUnknownField } } // Got to the end of the evaluation without a result => Neutral. // https://tools.ietf.org/html/rfc7208#section-4.7 trace("fallback to neutral") return Neutral, nil } // getDNSRecord gets TXT records from the given domain, and returns the SPF // (if any). Note that at most one SPF is allowed per a given domain: // https://tools.ietf.org/html/rfc7208#section-3 // https://tools.ietf.org/html/rfc7208#section-3.2 // https://tools.ietf.org/html/rfc7208#section-4.5 func getDNSRecord(domain string) (string, error) { txts, err := lookupTXT(domain) if err != nil { return "", err } records := []string{} for _, txt := range txts { // The version check should be case-insensitive (it's a // case-insensitive constant in the standard). // https://tools.ietf.org/html/rfc7208#section-12 if strings.HasPrefix(strings.ToLower(txt), "v=spf1 ") { records = append(records, txt) } // An empty record is explicitly allowed: // https://tools.ietf.org/html/rfc7208#section-4.5 if strings.ToLower(txt) == "v=spf1" { records = append(records, txt) } } // 0 records is ok, handled by the parent. // 1 record is what we expect, return the record. // More than that, it's a permanent error: // https://tools.ietf.org/html/rfc7208#section-4.5 l := len(records) if l == 0 { return "", nil } else if l == 1 { return records[0], nil } return "", errMultipleRecords } func isTemporary(err error) bool { derr, ok := err.(*net.DNSError) return ok && derr.Temporary() } // ipField processes an "ip" field. func (r *resolution) ipField(res Result, field string) (bool, Result, error) { fip := field[4:] if strings.Contains(fip, "/") { _, ipnet, err := net.ParseCIDR(fip) if err != nil { return true, PermError, errInvalidMask } if ipnet.Contains(r.ip) { return true, res, errMatchedIP } } else { ip := net.ParseIP(fip) if ip == nil { return true, PermError, errInvalidIP } if ip.Equal(r.ip) { return true, res, errMatchedIP } } return false, "", nil } // ptrField processes a "ptr" field. func (r *resolution) ptrField(res Result, field, domain string) (bool, Result, error) { // Extract the domain if the field is in the form "ptr:domain". ptrDomain := domain if len(field) >= 4 { ptrDomain = field[4:] } ptrDomain, err := r.expandMacros(ptrDomain, domain) if err != nil { return true, PermError, errInvalidMacro } if ptrDomain == "" { return true, PermError, errInvalidDomain } if r.ipNames == nil { r.ipNames = []string{} r.count++ ns, err := lookupAddr(r.ip.String()) if err != nil { // https://tools.ietf.org/html/rfc7208#section-5 if isTemporary(err) { return true, TempError, err } return false, "", err } for _, n := range ns { // Validate the record by doing a forward resolution: it has to // have some A/AAAA. // https://tools.ietf.org/html/rfc7208#section-5.5 if r.count > 10 { return false, "", errLookupLimitReached } r.count++ addrs, err := lookupIP(n) if err != nil { // RFC explicitly says to skip domains which error here. continue } trace("ptr forward resolution %q -> %q", n, addrs) if len(addrs) > 0 { // Append the lower-case variants so we do a case-insensitive // lookup below. r.ipNames = append(r.ipNames, strings.ToLower(n)) } } } trace("ptr evaluating %q in %q", ptrDomain, r.ipNames) ptrDomain = strings.ToLower(ptrDomain) for _, n := range r.ipNames { if strings.HasSuffix(n, ptrDomain+".") { return true, res, errMatchedPTR } } return false, "", nil } // existsField processes a "exists" field. // https://tools.ietf.org/html/rfc7208#section-5.7 func (r *resolution) existsField(res Result, field, domain string) (bool, Result, error) { // The field is in the form "exists:". eDomain := field[7:] eDomain, err := r.expandMacros(eDomain, domain) if err != nil { return true, PermError, errInvalidMacro } if eDomain == "" { return true, PermError, errInvalidDomain } r.count++ ips, err := lookupIP(eDomain) if err != nil { // https://tools.ietf.org/html/rfc7208#section-5 if isTemporary(err) { return true, TempError, err } return false, "", err } // Exists only counts if there are IPv4 matches. for _, ip := range ips { if ip.To4() != nil { return true, res, errMatchedExists } } return false, "", nil } // includeField processes an "include" field. func (r *resolution) includeField(res Result, field, domain string) (bool, Result, error) { // https://tools.ietf.org/html/rfc7208#section-5.2 incdomain := field[len("include:"):] incdomain, err := r.expandMacros(incdomain, domain) if err != nil { return true, PermError, errInvalidMacro } ir, err := r.Check(incdomain) switch ir { case Pass: return true, res, err case Fail, SoftFail, Neutral: return false, ir, err case TempError: return true, TempError, err case PermError: return true, PermError, err case None: return true, PermError, errNoResult } return false, "", fmt.Errorf("This should never be reached") } type dualMasks struct { v4 int v6 int } func ipMatch(ip, tomatch net.IP, masks dualMasks) (bool, error) { mask := -1 if tomatch.To4() != nil && masks.v4 >= 0 { mask = masks.v4 } else if tomatch.To4() == nil && masks.v6 >= 0 { mask = masks.v6 } if mask >= 0 { _, ipnet, err := net.ParseCIDR( fmt.Sprintf("%s/%d", tomatch.String(), mask)) if err != nil { return false, errInvalidMask } return ipnet.Contains(ip), nil } return ip.Equal(tomatch), nil } var aRegexp = regexp.MustCompile(`^[aA](:([^/]+))?(/(\w+))?(//(\w+))?$`) var mxRegexp = regexp.MustCompile(`^[mM][xX](:([^/]+))?(/(\w+))?(//(\w+))?$`) func domainAndMask(re *regexp.Regexp, field, domain string) (string, dualMasks, error) { masks := dualMasks{-1, -1} groups := re.FindStringSubmatch(field) if groups != nil { if groups[2] != "" { domain = groups[2] } if groups[4] != "" { mask4, err := strconv.Atoi(groups[4]) if err != nil || mask4 < 0 || mask4 > 32 { return "", masks, errInvalidMask } masks.v4 = mask4 } if groups[6] != "" { mask6, err := strconv.Atoi(groups[6]) if err != nil || mask6 < 0 || mask6 > 128 { return "", masks, errInvalidMask } masks.v6 = mask6 } } trace("masks on %q: %q %q %v", field, groups, domain, masks) // Test to catch malformed entries: if there's a /, there must be at least // one mask. if strings.Contains(field, "/") && masks.v4 == -1 && masks.v6 == -1 { return "", masks, errInvalidMask } return domain, masks, nil } // aField processes an "a" field. func (r *resolution) aField(res Result, field, domain string) (bool, Result, error) { // https://tools.ietf.org/html/rfc7208#section-5.3 aDomain, masks, err := domainAndMask(aRegexp, field, domain) if err != nil { return true, PermError, err } aDomain, err = r.expandMacros(aDomain, domain) if err != nil { return true, PermError, errInvalidMacro } r.count++ ips, err := lookupIP(aDomain) if err != nil { // https://tools.ietf.org/html/rfc7208#section-5 if isTemporary(err) { return true, TempError, err } return false, "", err } for _, ip := range ips { ok, err := ipMatch(r.ip, ip, masks) if ok { trace("mx matched %v, %v, %v", r.ip, ip, masks) return true, res, errMatchedA } else if err != nil { return true, PermError, err } } return false, "", nil } // mxField processes an "mx" field. func (r *resolution) mxField(res Result, field, domain string) (bool, Result, error) { // https://tools.ietf.org/html/rfc7208#section-5.4 mxDomain, masks, err := domainAndMask(mxRegexp, field, domain) if err != nil { return true, PermError, err } mxDomain, err = r.expandMacros(mxDomain, domain) if err != nil { return true, PermError, errInvalidMacro } r.count++ mxs, err := lookupMX(mxDomain) if err != nil { // https://tools.ietf.org/html/rfc7208#section-5 if isTemporary(err) { return true, TempError, err } return false, "", err } // There's an explicit maximum of 10 MX records per match. // https://tools.ietf.org/html/rfc7208#section-4.6.4 if len(mxs) > 10 { return true, PermError, errTooManyMXRecords } mxips := []net.IP{} for _, mx := range mxs { r.count++ ips, err := lookupIP(mx.Host) if err != nil { // https://tools.ietf.org/html/rfc7208#section-5 if isTemporary(err) { return true, TempError, err } return false, "", err } mxips = append(mxips, ips...) } for _, ip := range mxips { ok, err := ipMatch(r.ip, ip, masks) if ok { trace("mx matched %v, %v, %v", r.ip, ip, masks) return true, res, errMatchedMX } else if err != nil { return true, PermError, err } } return false, "", nil } // redirectField processes a "redirect=" field. func (r *resolution) redirectField(field, domain string) (Result, error) { rDomain := field[len("redirect="):] rDomain, err := r.expandMacros(rDomain, domain) if err != nil { return PermError, errInvalidMacro } if rDomain == "" { return PermError, errInvalidDomain } // https://tools.ietf.org/html/rfc7208#section-6.1 result, err := r.Check(rDomain) if result == None { result = PermError } return result, err } // Group extraction of macro-string from the formal specification. // https://tools.ietf.org/html/rfc7208#section-7.1 var macroRegexp = regexp.MustCompile( `([slodiphcrtvSLODIPHCRTV])([0-9]+)?([rR])?([-.+,/_=]+)?`) // Expand macros, return the expanded string. // This expects to be passed the domain-spec within a field, not an entire // field or larger (that has problematic security implications). // https://tools.ietf.org/html/rfc7208#section-7 func (r *resolution) expandMacros(s, domain string) (string, error) { // Macros/domains shouldn't contain CIDR. Our parsing should prevent it // from happening in case where it matters (a, mx), but for the ones which // doesn't, prevent them from sneaking through. if strings.Contains(s, "/") { trace("macro contains /") return "", errInvalidDomain } // Bypass the complex logic if there are no macros present. if !strings.Contains(s, "%") { return s, nil } // Are we processing the character right after "%"? afterPercent := false // Are we inside a macro definition (%{...}) ? inMacroDefinition := false // Macro string, where we accumulate the values inside the definition. macroS := "" var err error n := "" for _, c := range s { if afterPercent { afterPercent = false switch c { case '%': n += "%" continue case '_': n += " " continue case '-': n += "%20" continue case '{': inMacroDefinition = true continue } return "", errInvalidMacro } if inMacroDefinition { if c != '}' { macroS += string(c) continue } inMacroDefinition = false // Extract letter, digit transformer, reverse transformer, and // delimiters. groups := macroRegexp.FindStringSubmatch(macroS) trace("macro %q: %q", macroS, groups) macroS = "" if groups == nil { return "", errInvalidMacro } letter := groups[1] digits := 0 if groups[2] != "" { // Use 0 as "no digits given"; an explicit value of 0 is not // valid. digits, err = strconv.Atoi(groups[2]) if err != nil || digits <= 0 { return "", errInvalidMacro } } reverse := groups[3] == "r" || groups[3] == "R" delimiters := groups[4] if delimiters == "" { // By default, split strings by ".". delimiters = "." } // Uppercase letters indicate URL escaping of the results. urlEscape := letter == strings.ToUpper(letter) letter = strings.ToLower(letter) str := "" switch letter { case "s": str = r.sender case "l": str, _ = split(r.sender) case "o": _, str = split(r.sender) case "d": str = domain case "i": str = r.ip.String() case "p": // This shouldn't be used, we don't want to support it, it's // risky. "unknown" is a safe value. // https://tools.ietf.org/html/rfc7208#section-7.3 str = "unknown" case "v": if r.ip.To4() != nil { str = "in-addr" } else { str = "ip6" } case "h": str = domain default: // c, r, t are allowed in exp only, and we don't expand macros // in exp so they are just as invalid as the rest. return "", errInvalidMacro } // Split str using the given separators. splitFunc := func(r rune) bool { return strings.ContainsRune(delimiters, r) } split := strings.FieldsFunc(str, splitFunc) // Reverse if requested. if reverse { reverseStrings(split) } // Leave the last $digits fields, if given. if digits > 0 { if digits > len(split) { digits = len(split) } split = split[len(split)-digits:] } // Join back, always with "." str = strings.Join(split, ".") // Escape if requested. Note this doesn't strictly escape ALL // unreserved characters, it's the closest we can get without // reimplmenting it ourselves. if urlEscape { str = url.QueryEscape(str) } n += str continue } if c == '%' { afterPercent = true continue } n += string(c) } trace("macro expanded %q to %q", s, n) return n, nil } func reverseStrings(a []string) { for left, right := 0, len(a)-1; left < right; left, right = left+1, right-1 { a[left], a[right] = a[right], a[left] } } golang-blitiri-go-spf-0.0+git20191018.0.a683815/spf_test.go000066400000000000000000000272061355241314300223140ustar00rootroot00000000000000package spf import ( "fmt" "net" "testing" ) var ip1110 = net.ParseIP("1.1.1.0") var ip1111 = net.ParseIP("1.1.1.1") var ip6666 = net.ParseIP("2001:db8::68") var ip6660 = net.ParseIP("2001:db8::0") func TestBasic(t *testing.T) { dns = NewDNS() trace = t.Logf cases := []struct { txt string res Result err error }{ {"", None, nil}, {"blah", None, nil}, {"v=spf1", Neutral, nil}, {"v=spf1 ", Neutral, nil}, {"v=spf1 -", PermError, errUnknownField}, {"v=spf1 all", Pass, errMatchedAll}, {"v=spf1 exp=blah +all", Pass, errMatchedAll}, {"v=spf1 +all", Pass, errMatchedAll}, {"v=spf1 -all ", Fail, errMatchedAll}, {"v=spf1 ~all", SoftFail, errMatchedAll}, {"v=spf1 ?all", Neutral, errMatchedAll}, {"v=spf1 a ~all", SoftFail, errMatchedAll}, {"v=spf1 a/24", Neutral, nil}, {"v=spf1 a:d1110/24", Pass, errMatchedA}, {"v=spf1 a:d1110/montoto", PermError, errInvalidMask}, {"v=spf1 a:d1110/99", PermError, errInvalidMask}, {"v=spf1 a:d1110/32", Neutral, nil}, {"v=spf1 a:d1110", Neutral, nil}, {"v=spf1 a:d1111", Pass, errMatchedA}, {"v=spf1 a:nothing/24", Neutral, nil}, {"v=spf1 mx", Neutral, nil}, {"v=spf1 mx/24", Neutral, nil}, {"v=spf1 mx:a/montoto ~all", PermError, errInvalidMask}, {"v=spf1 mx:d1110/24 ~all", Pass, errMatchedMX}, {"v=spf1 mx:d1110/24//100 ~all", Pass, errMatchedMX}, {"v=spf1 mx:d1110/24//129 ~all", PermError, errInvalidMask}, {"v=spf1 mx:d1110/24/100 ~all", PermError, errInvalidMask}, {"v=spf1 mx:d1110/99 ~all", PermError, errInvalidMask}, {"v=spf1 ip4:1.2.3.4 ~all", SoftFail, errMatchedAll}, {"v=spf1 ip6:12 ~all", PermError, errInvalidIP}, {"v=spf1 ip4:1.1.1.1 -all", Pass, errMatchedIP}, {"v=spf1 ip4:1.1.1.1/24 -all", Pass, errMatchedIP}, {"v=spf1 ip4:1.1.1.1/lala -all", PermError, errInvalidMask}, {"v=spf1 ip4:1.1.1.1/33 -all", PermError, errInvalidMask}, {"v=spf1 include:doesnotexist", PermError, errNoResult}, {"v=spf1 ptr -all", Pass, errMatchedPTR}, {"v=spf1 ptr:d1111 -all", Pass, errMatchedPTR}, {"v=spf1 ptr:lalala -all", Pass, errMatchedPTR}, {"v=spf1 ptr:doesnotexist -all", Fail, errMatchedAll}, {"v=spf1 blah", PermError, errUnknownField}, {"v=spf1 exists:d1111 -all", Pass, errMatchedExists}, {"v=spf1 redirect=", PermError, errInvalidDomain}, } dns.ip["d1111"] = []net.IP{ip1111} dns.ip["d1110"] = []net.IP{ip1110} dns.mx["d1110"] = []*net.MX{{"d1110", 5}, {"nothing", 10}} dns.addr["1.1.1.1"] = []string{"lalala.", "xx.domain.", "d1111."} dns.ip["lalala"] = []net.IP{ip1111} dns.ip["xx.domain"] = []net.IP{ip1111} for _, c := range cases { dns.txt["domain"] = []string{c.txt} res, err := CheckHost(ip1111, "domain") if (res == TempError || res == PermError) && (err == nil) { t.Errorf("%q: expected error, got nil", c.txt) } if res != c.res { t.Errorf("%q: expected %q, got %q", c.txt, c.res, res) } if err != c.err { t.Errorf("%q: expected error [%v], got [%v]", c.txt, c.err, err) } } } func TestIPv6(t *testing.T) { dns = NewDNS() trace = t.Logf cases := []struct { txt string res Result err error }{ {"v=spf1 all", Pass, errMatchedAll}, {"v=spf1 a ~all", SoftFail, errMatchedAll}, {"v=spf1 a/24", Neutral, nil}, {"v=spf1 a:d6660//24", Pass, errMatchedA}, {"v=spf1 a:d6660/24//100", Pass, errMatchedA}, {"v=spf1 a:d6660", Neutral, nil}, {"v=spf1 a:d6666", Pass, errMatchedA}, {"v=spf1 a:nothing//24", Neutral, nil}, {"v=spf1 mx:d6660//24 ~all", Pass, errMatchedMX}, {"v=spf1 mx:d6660/24//100 ~all", Pass, errMatchedMX}, {"v=spf1 mx:d6660/24/100 ~all", PermError, errInvalidMask}, {"v=spf1 ip6:2001:db8::68 ~all", Pass, errMatchedIP}, {"v=spf1 ip6:2001:db8::1/24 ~all", Pass, errMatchedIP}, {"v=spf1 ip6:2001:db8::1/100 ~all", Pass, errMatchedIP}, {"v=spf1 ptr -all", Pass, errMatchedPTR}, {"v=spf1 ptr:d6666 -all", Pass, errMatchedPTR}, {"v=spf1 ptr:sonlas6 -all", Pass, errMatchedPTR}, {"v=spf1 ptr:sonlas7 -all", Fail, errMatchedAll}, } dns.ip["d6666"] = []net.IP{ip6666} dns.ip["d6660"] = []net.IP{ip6660} dns.mx["d6660"] = []*net.MX{{"d6660", 5}, {"nothing", 10}} dns.addr["2001:db8::68"] = []string{"sonlas6.", "domain.", "d6666."} dns.ip["domain"] = []net.IP{ip1111} dns.ip["sonlas6"] = []net.IP{ip6666} for _, c := range cases { dns.txt["domain"] = []string{c.txt} res, err := CheckHost(ip6666, "domain") if (res == TempError || res == PermError) && (err == nil) { t.Errorf("%q: expected error, got nil", c.txt) } if res != c.res { t.Errorf("%q: expected %q, got %q", c.txt, c.res, res) } if err != c.err { t.Errorf("%q: expected error [%v], got [%v]", c.txt, c.err, err) } } } func TestInclude(t *testing.T) { // Test that the include is doing a recursive lookup. // If we got a match on 1.1.1.1, is because include:domain2 did not match. dns = NewDNS() dns.txt["domain"] = []string{"v=spf1 include:domain2 ip4:1.1.1.1"} trace = t.Logf cases := []struct { txt string res Result err error }{ {"", PermError, errNoResult}, {"v=spf1 all", Pass, errMatchedAll}, // domain2 did not pass, so continued and matched parent's ip4. {"v=spf1", Pass, errMatchedIP}, {"v=spf1 -all", Pass, errMatchedIP}, } for _, c := range cases { dns.txt["domain2"] = []string{c.txt} res, err := CheckHost(ip1111, "domain") if res != c.res || err != c.err { t.Errorf("%q: expected [%v/%v], got [%v/%v]", c.txt, c.res, c.err, res, err) } } } func TestRecursionLimit(t *testing.T) { dns = NewDNS() dns.txt["domain"] = []string{"v=spf1 include:domain ~all"} trace = t.Logf res, err := CheckHost(ip1111, "domain") if res != PermError || err != errLookupLimitReached { t.Errorf("expected permerror, got %v (%v)", res, err) } } func TestRedirect(t *testing.T) { dns = NewDNS() dns.txt["domain"] = []string{"v=spf1 redirect=domain2"} dns.txt["domain2"] = []string{"v=spf1 ip4:1.1.1.1 -all"} trace = t.Logf res, err := CheckHost(ip1111, "domain") if res != Pass { t.Errorf("expected pass, got %v (%v)", res, err) } } func TestInvalidRedirect(t *testing.T) { // Redirect to a non-existing host; the inner check returns None, but due // to the redirection, this lookup should return PermError. // https://tools.ietf.org/html/rfc7208#section-6.1 dns = NewDNS() dns.txt["domain"] = []string{"v=spf1 redirect=doesnotexist"} trace = t.Logf res, err := CheckHost(ip1111, "doesnotexist") if res != None { t.Errorf("expected none, got %v (%v)", res, err) } res, err = CheckHost(ip1111, "domain") if res != PermError || err != nil { t.Errorf("expected permerror, got %v (%v)", res, err) } } func TestRedirectOrder(t *testing.T) { // We should only check redirects after all mechanisms, even if the // redirect modifier appears before them. dns = NewDNS() dns.txt["faildom"] = []string{"v=spf1 -all"} trace = t.Logf dns.txt["domain"] = []string{"v=spf1 redirect=faildom"} res, err := CheckHost(ip1111, "domain") if res != Fail || err != errMatchedAll { t.Errorf("expected fail, got %v (%v)", res, err) } dns.txt["domain"] = []string{"v=spf1 redirect=faildom all"} res, err = CheckHost(ip1111, "domain") if res != Pass || err != errMatchedAll { t.Errorf("expected pass, got %v (%v)", res, err) } } func TestNoRecord(t *testing.T) { dns = NewDNS() dns.txt["d1"] = []string{""} dns.txt["d2"] = []string{"loco", "v=spf2"} dns.errors["nospf"] = fmt.Errorf("no such domain") trace = t.Logf for _, domain := range []string{"d1", "d2", "d3", "nospf"} { res, err := CheckHost(ip1111, domain) if res != None { t.Errorf("expected none, got %v (%v)", res, err) } } } func TestDNSTemporaryErrors(t *testing.T) { dns = NewDNS() dnsError := &net.DNSError{ Err: "temporary error for testing", IsTemporary: true, } // Domain "tmperr" will fail resolution with a temporary error. dns.errors["tmperr"] = dnsError dns.errors["1.1.1.1"] = dnsError dns.mx["tmpmx"] = []*net.MX{{"tmperr", 10}} trace = t.Logf cases := []struct { txt string res Result }{ {"v=spf1 include:tmperr", TempError}, {"v=spf1 a:tmperr", TempError}, {"v=spf1 mx:tmperr", TempError}, {"v=spf1 ptr:tmperr", TempError}, {"v=spf1 mx:tmpmx", TempError}, } for _, c := range cases { dns.txt["domain"] = []string{c.txt} res, err := CheckHost(ip1111, "domain") if res != c.res { t.Errorf("%q: expected %v, got %v (%v)", c.txt, c.res, res, err) } } } func TestDNSPermanentErrors(t *testing.T) { dns = NewDNS() dnsError := &net.DNSError{ Err: "permanent error for testing", IsTemporary: false, } // Domain "tmperr" will fail resolution with a temporary error. dns.errors["tmperr"] = dnsError dns.errors["1.1.1.1"] = dnsError dns.mx["tmpmx"] = []*net.MX{{"tmperr", 10}} trace = t.Logf cases := []struct { txt string res Result }{ {"v=spf1 include:tmperr", PermError}, {"v=spf1 a:tmperr", Neutral}, {"v=spf1 mx:tmperr", Neutral}, {"v=spf1 ptr:tmperr", Neutral}, {"v=spf1 mx:tmpmx", Neutral}, } for _, c := range cases { dns.txt["domain"] = []string{c.txt} res, err := CheckHost(ip1111, "domain") if res != c.res { t.Errorf("%q: expected %v, got %v (%v)", c.txt, c.res, res, err) } } } func TestMacros(t *testing.T) { dns = NewDNS() trace = t.Logf // Most of the cases are covered by the standard test suite, so this is // targeted at gaps in coverage. cases := []struct { txt string res Result err error }{ {"v=spf1 ptr:%{fff} -all", PermError, errInvalidMacro}, {"v=spf1 mx:%{fff} -all", PermError, errInvalidMacro}, {"v=spf1 redirect=%{fff}", PermError, errInvalidMacro}, {"v=spf1 a:%{o0}", PermError, errInvalidMacro}, {"v=spf1 +a:sss-%{s}-sss", Pass, errMatchedA}, {"v=spf1 +a:ooo-%{o}-ooo", Pass, errMatchedA}, {"v=spf1 +a:OOO-%{O}-OOO", Pass, errMatchedA}, {"v=spf1 +a:ppp-%{p}-ppp", Pass, errMatchedA}, {"v=spf1 +a:vvv-%{v}-vvv", Pass, errMatchedA}, {"v=spf1 a:%{x}", PermError, errInvalidMacro}, {"v=spf1 +a:ooo-%{o7}-ooo", Pass, errMatchedA}, } dns.ip["sss-user@domain-sss"] = []net.IP{ip6666} dns.ip["ooo-domain-ooo"] = []net.IP{ip6666} dns.ip["ppp-unknown-ppp"] = []net.IP{ip6666} dns.ip["vvv-ip6-vvv"] = []net.IP{ip6666} for _, c := range cases { dns.txt["domain"] = []string{c.txt} res, err := CheckHostWithSender(ip6666, "helo", "user@domain") if (res == TempError || res == PermError) && (err == nil) { t.Errorf("%q: expected error, got nil", c.txt) } if res != c.res { t.Errorf("%q: expected %q, got %q", c.txt, c.res, res) } if err != c.err { t.Errorf("%q: expected error [%v], got [%v]", c.txt, c.err, err) } } } func TestMacrosV4(t *testing.T) { dns = NewDNS() trace = t.Logf // Like TestMacros above, but specifically for IPv4. // It's easier to have a separate suite. // While at it, test some of the reversals, for variety. cases := []struct { txt string res Result err error }{ {"v=spf1 +a:sr-%{sr}-sr", Pass, errMatchedA}, {"v=spf1 +a:sra-%{sr.}-sra", Pass, errMatchedA}, {"v=spf1 +a:o7-%{o7}-o7", Pass, errMatchedA}, {"v=spf1 +a:o1-%{o1}-o1", Pass, errMatchedA}, {"v=spf1 +a:o1r-%{o1r}-o1r", Pass, errMatchedA}, {"v=spf1 +a:vvv-%{v}-vvv", Pass, errMatchedA}, } dns.ip["sr-com.user@domain-sr"] = []net.IP{ip1111} dns.ip["sra-com.user@domain-sra"] = []net.IP{ip1111} dns.ip["o7-domain.com-o7"] = []net.IP{ip1111} dns.ip["o1-com-o1"] = []net.IP{ip1111} dns.ip["o1r-domain-o1r"] = []net.IP{ip1111} dns.ip["vvv-in-addr-vvv"] = []net.IP{ip1111} for _, c := range cases { dns.txt["domain.com"] = []string{c.txt} res, err := CheckHostWithSender(ip1111, "helo", "user@domain.com") if (res == TempError || res == PermError) && (err == nil) { t.Errorf("%q: expected error, got nil", c.txt) } if res != c.res { t.Errorf("%q: expected %q, got %q", c.txt, c.res, res) } if err != c.err { t.Errorf("%q: expected error [%v], got [%v]", c.txt, c.err, err) } } } golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/000077500000000000000000000000001355241314300217405ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/000077500000000000000000000000001355241314300227365ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/000077500000000000000000000000001355241314300242515ustar00rootroot0000000000000000411bf44dbea39f3278c2cface16398f239e7ca-12000066400000000000000000000000531355241314300321300ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:1:b:6:1:b:6:1:0/1 include:domain00cf37c4fa061abb08aeed0981d8d0e26a1e1323-4000066400000000000000000000000301355241314300320110ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 include:domain 01438665d70f99814773625c2b18eb2104f4ea13-5000066400000000000000000000000271355241314300312560ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 𫞡𫞡𫞡𫞡0175b61366f0bae34f123456ba2bf7154a6af668-3000066400000000000000000000000201355241314300315310ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:%{I} -02c83942c0ae728b90c0a9ea44de2781e884d1bb000066400000000000000000000000161355241314300315450ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%{o0}031baaf383cfebcacc31eeb3c4d060743adc6be0-3000066400000000000000000000000171355241314300323670ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ΥσΥοο403279b4fd8a0a693cc9bf81bcd225fcae6101d24-9000066400000000000000000000000411355241314300320410ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/ a/ a/ a/ a/ a/ a/ a/ a/048ed20064c6350703216668dd23ea6bb5f66315000066400000000000000000000000241355241314300311560ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip4:1.1.1.1/004c9de854b93f2607c3fd25a5559cd3e4db9c1e8000066400000000000000000000000351355241314300316520ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 exists:%{I_}%{O_}%{l-}0556fcf18a86a09f6048c933b57e54cb9f2c3d20-11000066400000000000000000000000571355241314300317260ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:::1 ip6:Cafe:Babe:0:: include:domain0646a02a7b4f134295dccc4f3b6d4f74a98fd107-5000066400000000000000000000000311355241314300317060ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 include:domain 06bec983ccd57eed211cbd4bda8583ace4c45c8c-7000066400000000000000000000000211355241314300323500ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx mx a mx079ead839c297839a931cdea8b00dde0de22049a-1000066400000000000000000000000241355241314300317720ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:%{{.%{i} -07d761d89cec1e613b391dae889ac55b2dceec9e-14000066400000000000000000000000651355241314300323160ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:σ‚‚‚σ‚‚‚σ‚‚‚σ‚‚‚σ‚‚‚σ‚‚‚σ‚‚½ include:domain07e9ac18500412e857ac88d53d2d14fa38763489-2000066400000000000000000000000321355241314300314230ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:d1€ήΠEa110~al+-l0845f1c9d86392058834dd993061f55fd35986a3-13000066400000000000000000000000521355241314300313730ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip4:1.2.3.4 ip6:::/4 include:domain0864783451aeddd592bf6840e0329f46598ed9d7-4000066400000000000000000000000341355241314300315320ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:6:1:8:1::6:1:8:0.08ba70fdee26f6942453c1420b4823fcac5821b1-1000066400000000000000000000000251355241314300316110ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip4:1.71160442096680e0fa303a874fe940143073b3b606d11482000066400000000000000000000000231355241314300310730ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip4:1.2.3.4:0a2058b18f2a5fb7c02077742dc8874d015c6f53-4000066400000000000000000000000471355241314300314710ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 redirect=%{d0027755927159263581}0a2060a21e9dfea36b635404b1dfa34ad9540063-23000066400000000000000000000000401355241314300316510ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%%%%%%%% include:domain0a7b5cdc8eac7830d419515b47c11a0cbcf0bdd3-11000066400000000000000000000000341355241314300322370ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:ŁŁ include:domain0ae0ed61b45093f6121612116ac41e611b7ca57c-13000066400000000000000000000000341355241314300315720ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:Aa‚ include:domain0b23284bbc74c7e72dcad1e56ad2c0c422c76f6c-2000066400000000000000000000000301355241314300321040ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 include:domain 1 0b5b6a45778d16db6c3a53ec6d96d8ddb70cbf3b-3000066400000000000000000000000371355241314300322170ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/-1107186264514923057030c4314c16a99b6d5be7b506088e5194bc01edf1e-9000066400000000000000000000000511355241314300317110ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:d1110/1 a:d1110/1 include:domain0c5f76d791418c99ac7dc9148ebffe4b226037d2000066400000000000000000000000171355241314300315740ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%{H} -0ce9a737495f56e975b86c862d1b2ce62b0997bc-4000066400000000000000000000000151355241314300316650ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 σσ‚‚)0d45f75bc08ac9bf702effdb893ca87c801a7294-4000066400000000000000000000000211355241314300320610ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx1 mx/ a/0e5d97173ab36db60868cd5b0ac136c4657e0c79-13000066400000000000000000000000541355241314300317200ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%{IR}%{IR}%{IR}%{IR} include:domain0e955ff9c6d5c2d145779ddc32e8af92f3fce15c-2000066400000000000000000000000121355241314300321540ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 0f2c4e38efb96812b9ab096bcdd0a4d295879169-2000066400000000000000000000000261355241314300317320ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 redirect=%{d1:}107174d48130ff0c7b15437e348ba16d8649b3dc-15000066400000000000000000000000351355241314300315520ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:1:: include:domain1079f2c1b9f8fe829d185321520db4489ddc2a80-12000066400000000000000000000000411355241314300316370ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:%{i}%{i} include:domain10af261a4eba5d6a09178858f7f7b2bdc8a4d2ed-6000066400000000000000000000000311355241314300321300ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 include:domain β113d1b233d0b182ce8dec943a01a213dbc1bfc32-4000066400000000000000000000000131355241314300317730ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 󁂂115c29a6c848857a691de2267b7d3ac92ce5f384-2000066400000000000000000000000121355241314300315670ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a a124eddd031bfaecce3884922d2180332032e4156-5000066400000000000000000000000701355241314300315250ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 σhΏ½½ρΏ/½ο½οΏ)½½½Ά€Ώ½ρΏ/½ρΏ/½ο½οΏ)½½½Ά€Ώ½ρΏ/½1266c0d0f5c4ca735e3a71c9edff3d4e5aca9bbd000066400000000000000000000000241355241314300322000ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:d6660/24 l1344b11657d8c0b3d0d7f6e76c0d728905615894000066400000000000000000000000201355241314300311760ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 exists:%(1380aa5a0953cae35d64ff6c145b5c0a3ba84228-20000066400000000000000000000000651355241314300317500ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:σ mx:σ‚σ‚σ‚σ€σ‚‚σ‚σ‚σ‚σ‚‚σ‚σ‚σ€σ‚‚σ‚σ‚σ‚σ‚/13d1473f6d375e492efdf7d50e696907721bf5d1-11000066400000000000000000000000341355241314300316550ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%{V} include:domain157b209632435b7b661b3438c96d1e8548550476-6000066400000000000000000000000201355241314300311240ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 σσψ‘‚σ159729fed614b134e57b677bc72474f6463d362b-6000066400000000000000000000000321355241314300314350ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 include:domain ²15da32d2909f118a0fc25ca4dccf07b03ff3c483-6000066400000000000000000000000531355241314300320330ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 π—ž΅π—ž΅π—ž΅π—ž΅π—ž΅π—ž΅π—ž΅π—ž΅π—ž΅15f3b6fef4391fd987ffc0ddf0c449046f0898b2-3000066400000000000000000000000151355241314300320210ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 160f80a8549044c6e3aca7b9d1e3964238615667-6000066400000000000000000000000231355241314300313460ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 σ‚‚‚σ‚‚‚σ‚‚€16524c09938afe9f06450277c89b75b6f31c3cb4-21000066400000000000000000000000401355241314300315650ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%_%_%_%_ include:domain1677b850a2b9471330774daab8ee651332ba4373-6000066400000000000000000000000401355241314300314010ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:d1110/4 include:domain176cbdaa14dd6b36843f55f3f52d93bacd4e5955-13000066400000000000000000000000411355241314300321370ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip4:1.2.3.4 include:domain182f3cb4545f1f16b4a58f54db1a64c6f94d7db8-2000066400000000000000000000000341355241314300320010ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/071862645a4B361qZ_u1845de197b696ae69aa7a1a800bc3658f3b93946-2000066400000000000000000000000121355241314300315650ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/C190b3bd4bd8de1bda728ed60865624b5177f554c-5000066400000000000000000000000121355241314300317130ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 193c50b3e52fe33fe67cb982ade55dbecb14896d-11000066400000000000000000000000441355241314300322240ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a: a: a: a: a: include:domain19530aae226c629fa64a142ade8d8edcaef2bc8a000066400000000000000000000000251355241314300321170ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:sr-%{sr}-sr 198de5285b908cd3f854185f75003361dc2e735e-11000066400000000000000000000000431355241314300315120ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx mx mx mx mx mx mx mx mx m19b7f4b8fe98a86a6a4b845dfb7a803ae7198274-6000066400000000000000000000000141355241314300317460ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ½ 19f2ae36f0113911c2f2caf4d94425ead0cf12d5-12000066400000000000000000000000331355241314300320250ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:Σ³ include:domain1aa7c2119ab155decb1e32c8efc1102a23030355-4000066400000000000000000000000201355241314300316310ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/-4 a/-11abffb38597e7d7ca8287c59af3a580dd94082bc-16000066400000000000000000000000351355241314300321610ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ptr ptr include:domain1af13087f6bb92df8764a5b00eb5c0561dc8b840-4000066400000000000000000000000301355241314300316770ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a: include:domain1b2840abfb70a1fb6b0ca9e8cd79b1d0aab1d7da-5000066400000000000000000000000151355241314300323740ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 σσ‚Β)1bc7b6182a4b27c3e44ef85bb4c3f023b5895445-10000066400000000000000000000000421355241314300317040ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx mx mx: a mx mx a a mx mx1c9cf133f11bf274dd446ff4245b8f53a8911374-4000066400000000000000000000000161355241314300315570ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 σσ‚οΏ½1d765a2f64502be5ce3b5af46b730baf5f571c5f-15000066400000000000000000000000641355241314300321320ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%{I}%{I}%{I}%{I}%{I}%{I}%{I} include:domain1e7da528e7ea94d28e0b06b9ad59d3e5f0176505-13000066400000000000000000000000321355241314300320000ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 Gνa: include:domain1ec151f32d7f2c3dc2a0a080076d58907c5d9936-1000066400000000000000000000000361355241314300315450ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:1::1.2.3.4 ip6:::F.1fb9a5465af43f2c57e70ca491cfe4e18b057e03000066400000000000000000000000151355241314300316300ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%{v}201fd81935a2589e34ead502b014bc0f6f7bc997-4000066400000000000000000000000161355241314300316320ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 σ‚‚σ‚‚ο20f917fc7cf15d12876ee3a7091d886878528861-6000066400000000000000000000000151355241314300313750ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mxσ‚­)21057897c2a43f23eba4b7a7ec4105fcfe16c000-2000066400000000000000000000000221355241314300316610ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ΥσΥοοοοοο421295637cfffaceb4887c0f9575ae03901b496f2-13000066400000000000000000000000261355241314300317340ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 include:domain2136c0d1947b42b3db810eed459886dd7e2fa578-13000066400000000000000000000000531355241314300317260ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/1107186261862645451 include:domain21505c4e4d334b454dc5eebce4ebacdf7637e7d0-6000066400000000000000000000000321355241314300322040ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/-1 include:domain2257d0500932ac25815c565e3eb907d10fc0b277-6000066400000000000000000000000341355241314300313760ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mxσ‚­) include:domain245dd24e4b3d44f11b3c0558b1e40b37099a854a-4000066400000000000000000000000211355241314300315300ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 246db128b29bc81da0d3e9ec5e5cf8a3ed09a338-1000066400000000000000000000000151355241314300321250ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx/24l25b17e0f6aa9f73463b5a125f94427462931c764000066400000000000000000000000131355241314300311750ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:261144f593cb8f1c9efddc3ad230fc5328461f64-2000066400000000000000000000000571355241314300317170ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/0xAAdecEcFRCodeServerFailureEDCfddaFcb26c5e455a3b81a4d3a09b80f4b46ec10896b48e1-5000066400000000000000000000000161355241314300316270ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/1 a/f26ef2aac1d567ca7f26c5ca33f35b7105854cbcd-1000066400000000000000000000000351355241314300321160ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/0xAAdecEcFEDCfddaFcb277313194b11458746bc9563ff021603f86026be-5000066400000000000000000000000521355241314300311750ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/1107186265149230545149230570spf1328ffad3f6a424067d4d18ec1247140b443b4afcd-2000066400000000000000000000000251355241314300317530ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 redirect=%{οd}29874695932eb1c2f99f7e132ae49b7344217e09-1000066400000000000000000000000441355241314300313640ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 exists:%{p.should.example.com29e28385d0d3df9278eef7e091f5eef38a77299a-14000066400000000000000000000000421355241314300320430ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 exists:d6660 include:domain2a18fe68ef661a1fc3be98b97172e74e9921953f-12000066400000000000000000000000541355241314300317530ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%{I=}%{I=}%{I=}%{I=} include:domain2ab0225495089b6fa60083d05140b5ce80dd1096-8000066400000000000000000000000211355241314300313700ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 Β½Β½Β½Β½Β½2ad9cbaa3fa9a83192bab623d544ced459390b15-17000066400000000000000000000000521355241314300321230ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6::: ip6::: ip6::: include:domain2c34d594739876049e7ad50a5b30becd1dee9f6d-5000066400000000000000000000000331355241314300320100ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 π—ž΅π—ž΅π—ž΅π—ž΅π—ž΅2c614e3b2bc205fc21f286208ad90f5852a3a3c0000066400000000000000000000000301355241314300314340ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:2001:db8::1/22cb1af576215fede0d684c6b3794579865999d6d-2000066400000000000000000000000161355241314300316160ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx/ a/C2ce45a34e51535f32ece92b6c504e2baafbd6b8f-2000066400000000000000000000000341355241314300321770ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/0_AAdecEcFEDCfddaFc2dd167b87fa68dfbbb01dd347eaf5fb26668a6a8-4000066400000000000000000000000331355241314300322230ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:d1¬1ήΠEa110~allPe2dee827f4fa52b8e782790a06e69e3149c0ac7df-2000066400000000000000000000000121355241314300320060ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 Υσ‚2e761908b14b9886eadf46c97bef3443c4f34279000066400000000000000000000000351355241314300314460ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip4:1.1.1.1 redirect=e2e92f60a822db191e6a3696047757d19b87b442e-2000066400000000000000000000000521355241314300314260ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/ecEcFEDCfddaFcxAAdecEcFEDCfddaFcb2e9e26ae6d47e762073b4ee9631156e9a31fc053-10000066400000000000000000000000341355241314300316400ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6::: include:domain2f6dea636578de2c87a881fea9375167c07bef69-3000066400000000000000000000000241355241314300317520ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 redirect=%{o}2f90dd963ee0a06299d1a626e91c06a1e2ce426a-1000066400000000000000000000000231355241314300316770ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 exists:%{ir}2fa9261819c9517006f54dfec93077a5ffeefc8d-5000066400000000000000000000001051355241314300320220ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:d1¬1ήΠEa867361737988403547205962240695953369140625110~allPe3033e7b46da95858f3ed9ca0446e84028f94cbb1-14000066400000000000000000000000471355241314300317330ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:::/1 ip6:::/4 include:domain309a479231ac2f99ab6a3f5f89b9e1f6c915fe3e-9000066400000000000000000000000341355241314300320250ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/107_8107_86564func230c46fec4d22edd4d1148041840693900926fc98-2000066400000000000000000000000341355241314300314140ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/0xecEcFEDCfddaFcb__316359122b01ab00929f7a7aea0291f66f227598-7000066400000000000000000000000321355241314300313260ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/4 a/4 a/4 a/4 a/131e0d230a07f7ba48c522c9d0f1bff66e37d9c5d-7000066400000000000000000000000531355241314300320510ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx1 mx1 mx/ mx/ mx1 mx1 mx/ mx/ mx//32ae1061275f98e132845ab4973ec066c5652dd3-3000066400000000000000000000000361355241314300314150ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:d1€ήΠEa110~al+-lPe.(334d89acc8738699117dd37ba157f822e0ec2d17-13000066400000000000000000000000311355241314300316470ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 νa: include:domain338e1b5e0a09e5f518cfd79791fa93f8017d6b57-10000066400000000000000000000000441355241314300317370ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:ήΠQήΠQοQο)½ include:domain351f1e33b980a8c83d1d7b18a177458fd5a26dfe-14000066400000000000000000000000731355241314300320060ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%{IR}%{IR}%{IR}%{IR}%{IR}%{IR}%{IR} include:domain354fe722065c1cd0ab4032ee1048731740d31bcd-24000066400000000000000000000000461355241314300316010ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%%%%%%%%%%%%%% include:domain35e9e0e05acc1088fb73dafbb69ba6cb1594d8ec-1000066400000000000000000000000071355241314300322710ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 35ee7e5ddb6e8ae9a243785b8139e0e73ba636b7-12000066400000000000000000000000601355241314300320730ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:σ‚‚σ‚‚σ‚‚σ‚‚σ‚‚σ‚‚Χσ‚‚½ include:domain36a4254e1961ad0fca4c222636abe6a814bcf850-10000066400000000000000000000001171355241314300317470ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 𫞡𫢡𫞡𫞡𫞡𫢡𫞡𫞡𫎡𫞡𫞡𫞡𫞡𫎡𫞡𫞡𫞡𫞡377fa2d8517cb2e0b76535bc38b5d8c47d0d5283-13000066400000000000000000000000351355241314300317210ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:::/1 ip4:1.2.3.0/037c95310204accca732a0e73a4d5adea8c5e5fce-8000066400000000000000000000000231355241314300321710ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx mx a a mx37d1952e25d8fe4fa79a0fe4f50b90087eb75ceb-11000066400000000000000000000000341355241314300321470ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%%%% include:domain382cef3168021f6d496ec419b439a6fbb1b4ce35-7000066400000000000000000000000531355241314300317210ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\3898299a8b2a624638b68bb2a84da413fd22a3a7-9000066400000000000000000000001271355241314300315670ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½ο5551115123125782702118158340454101J625Ώ½ include:domain38f649f7346700239d5522449476b86083d76219-7000066400000000000000000000000321355241314300310120ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 include:domain τβ392cfa3036a12606981bea810dfa3e3037e1c335-1000066400000000000000000000000351355241314300315230ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 exists:%{i}%{ser.%{d2}39615f91d3139087871dea5423785d06b9b510a7000066400000000000000000000000231355241314300311230ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:a/montoto3a1ac72b5fae00487171fbbf7e8ed23e9cfa2801-4000066400000000000000000000000061355241314300321170ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusŁŁŁ3a98f3c661d7d5f7e4fceb7738b85f493364af5f-1000066400000000000000000000000171355241314300320350ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip4:1:F.3acf06a7395f978f44fe56f8b3677aef69eb95c0000066400000000000000000000000161355241314300317010ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:CB/3b32c5fe3ad89b114b25bbed3a5a1f3671946259-14000066400000000000000000000000501355241314300317620ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%-%-%-%-%-%-%-%- include:domain3b5dab0aa1953bea3b79dce43b97a9a05b2ad778-19000066400000000000000000000000371355241314300322710ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:σ‚‚σ‚σ‚σ€σ‚‚σ‚σ‚σ‚σ‚/3bc13ee064af8ab5dae4d4c06a5daecc5a7c221b000066400000000000000000000000151355241314300322330ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a//1293c208a50d0fe369bbf2dc88be86a0fb911f9efda-8000066400000000000000000000000331355241314300322770ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 σ‚‚‚σ‚‚‚σ«ž΅σ‚‚‚σ«Ώ½3c757915c56d6e6261b56366ec4cb21ed2ffea62-5000066400000000000000000000000161355241314300317240ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 β  3d21efa964a356b0cab7875359464aea0dc6ad0f-8000066400000000000000000000000531355241314300320500ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 𫞡𫢡𫞡𫞡𫎡𫞡𫞡𫞡𫞡3d6ae04fe800272eb51288db6176ce8f46a42bf1-1000066400000000000000000000000201355241314300317000ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ptr ptr -3e704e64145afc057e4f02234b55c772718c161c-4000066400000000000000000000000361355241314300314050ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ΥσΥοοοοοοοοοΥσΥοοΥσΥοο3ee74f7037ce9790e2162c3ce5e6bafa89dfc65b-5000066400000000000000000000000301355241314300321520ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 3f40bd478e8379ac87548da7017d4a4b7d30254f-11000066400000000000000000000000361355241314300316460ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:%{i}‚ include:domain3f6e987ce012be6005576673865864ec7e99d3a1-6000066400000000000000000000000131355241314300314500ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 Β½Β½3f82cc6f3d954c07aab89004e03b634d34dbf462-14000066400000000000000000000001131355241314300317640ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/1_7_7_1_7_7_1_4_7_7_1_0_4_7_7_1_1_7_7_1_7_7_1_4_7_7_1_0_4_7_7_1_7_3fdb0915e3ddb50a67a2bbd242fdd8fca9809e4f000066400000000000000000000000401355241314300321250ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip4:1.2.3.4 ip6:::FFFF:1.40008dcd4553ae76a44b29bca36088ab89c1dee2-13000066400000000000000000000000371355241314300320450ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:1::/1 include:domain402e4e9ad96ea7d59a4659e12e606f05e305932c-11000066400000000000000000000000341355241314300316430ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/1_7_107_861_7_8107_40c31e4805ee2897df4430511b8287f842a41737-16000066400000000000000000000000471355241314300313500ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:::1:b:6:1:b:6 include:domain41236d8c1423ef106d6854b3f198ec0972ecace3-2000066400000000000000000000001151355241314300316310ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:2006:2001:db8:2001:db::1f1 ip6:2001:db8:2001:db::1f1 ip6:2001:db884160602921c7d135ae47b10c4777dce5feb6b4f5-14000066400000000000000000000000501355241314300317040ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%{p}%{p}%{p}%{p} include:domain4167d538cfc03975c215cfaf40929c93842867b6-4000066400000000000000000000000341355241314300314410ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:CAF:CAFE:BE:BABEi421a3ef0790b962fc48296c328c19921791ee25f-3000066400000000000000000000000151355241314300314300ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ο»½οΏ―43b520e9d15b1406a66f15cf7049d473669d349f-12000066400000000000000000000000331355241314300315040ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 aGνa: include:domain43ec78237974dab44efdd20f7fc7e17e0084eec5-3000066400000000000000000000000301355241314300320640ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:::1:b:6:1:8:84503e3f4c0c8727025ee51d06e5832243c70a9e7-3000066400000000000000000000000121355241314300314020ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ΥσΥ45f58a2e37b8c691e40ea6f26408d6f5e6234d6a-7000066400000000000000000000001131355241314300316510ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 σρΏο½οΏρΏρΏο½οΏσρΏσρΏο½οΏρΏρΏο½οΏσρΏο½οΏρΏρΏο½οΏο½οΏρΏρΏο½οΏρΏ/½461d4557426af8b282e79ce5d6bb25916f98a706-13000066400000000000000000000000341355241314300316030ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mxσ‚‚‚ include:domain4677a5eff032ececff3c72e905271d34af4a4a1b-7000066400000000000000000000000721355241314300321320ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 οΏ―ο»½οΏ―ο»½ο»½οΏ―ο»½οΏ―ο»½ο»½οΏ―ο»½ο»½οΏ―ο»½ο»½οΏ―46af4d8af841946ea02faebfadfcf2e282b63e15-10000066400000000000000000000001121355241314300323450ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%{Ώ½½½½½½ο1½ο555Ώ1151231257827021181583€454101%J&25 e½½de:domain46c5b1a9ad5133f42174f2474c4845fa094b0ae9000066400000000000000000000000211355241314300314010ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 redirect=e46f3c6f8dbf187794e8cad8748192684ced6ebbe-1000066400000000000000000000000171355241314300321200ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%%%% -475e8ffdb31020d60e29cffc34013fe2a2ca5c8f-4000066400000000000000000000000111355241314300321130ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 485b5dfc7b96f912c1b98ddccb9127f167fd997c-11000066400000000000000000000002131355241314300321720ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 σ‚‚‚σ‚‚‚σ«ž΅σ‚‚‚σ«ž΅σ‚‚‚σ«ž΅σ‚‚‚σ‚‚‚σ«ž΅σ‚‚‚σ«Ώ½σ‚‚‚σ«ž΅σ‚‚‚σ‚‚‚σ«ž΅σ‚‚‚σ«Ώ½σΏž΅σ‚‚‚σ‚‚‚σ«ž΅σ‚‚‚σ«Ώ½σ‚‚‚σ«ž΅σ‚‚‚σ‚‚‚σ«ž΅σ‚‚‚σ«Ώ½σ«Ώ½486e98cf7b182565ddd3095d5f57b68ec12d91f6-4000066400000000000000000000000321355241314300316720ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 σΏ½οΏ/½ο½οΏ)½½½Ά€4a88aeeef6ee62498731df98ef39a181ca031d7f-1000066400000000000000000000000301355241314300320740ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip4:1.2.3.4 ip6:.4ada9982255464020458f90c31409f083dd3cec4-5000066400000000000000000000000301355241314300314100ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 include:domain Ε4b44d6f2f223de32f6d97221017c72b135b6fc8f-8000066400000000000000000000000341355241314300316340ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/+554551866include:d4b4906e4bf471486b1a1ebddfb9bbbd4f375939f-1000066400000000000000000000000231355241314300321400ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:d1110~all4b9765f8f632dfebc4eeff12147cffd66cf29f1e-4000066400000000000000000000000301355241314300323220ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 aΚ include:domain4c6d20565dc5823444f3be8860a98d4e58b8fe3d-20000066400000000000000000000000361355241314300317400ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%%%_%_ include:domain4c754e7f659c7041831fe8af2e6ea197ecb71fee000066400000000000000000000000121355241314300317350ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ptr4ca27bea96aa9b43cd75e990b3aaf486e184d731-3000066400000000000000000000000211355241314300320530ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 Ձσσ‚‚)4ca8520bd82b4ac343bb4e1cd7e9950d10b238c7-7000066400000000000000000000000151355241314300317550ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 Β½Β½Β½4cc5a579d3fcdf1e05d673591d322edd04ce43c4-10000066400000000000000000000000411355241314300321240ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a::/1 a:0/1 include:domain4d26846d4153063a9af7a8f839b188ff037ef53c-1000066400000000000000000000000311355241314300315720ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:d6660/1 a:d11114df53e976f13c312ab2ec5721ebe7f42e7c5f314-14000066400000000000000000000000411355241314300320520ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ptr:e ptr:4 include:domain4e623b674b72c0ccb74be1a22452b492076e305b-14000066400000000000000000000000531355241314300316110ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip4:1.2.3.4 ip6:4::/4 include:domain4f62290526f37f0c23a89db6d711726773e0a7b3-4000066400000000000000000000001021355241314300314130ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:%{78800500929355621337890%%{363797880709171295166015625}4ff3cabbe468bac11f8bb34a4bb9e2e98c8efefa-3000066400000000000000000000000271355241314300325770ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 include:domain 50ae7645c456657f3cc80cb4583543de6cad4771-2000066400000000000000000000000101355241314300315550ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 \50f714a03a1b2d022e689425d03f454d82b30c9f-1000066400000000000000000000000241355241314300314450ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 redirect=%{d}51c669411f5eb38639755018ac9f20f44e912a2c-13000066400000000000000000000000351355241314300315020ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:d6660 include:domain522509938b7f74a2c32b5ccc319b1bc9506ed08b000066400000000000000000000000241355241314300314640ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip4:1.1.1.1 -527ba1667ccfa821072b2398d968f48e514a129c-3000066400000000000000000000000341355241314300315030ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 σhΏ½οΏ/½ο½οΏ)½½½Ά€52b82bd1069487c6717cc5d7a643ef643b33efc3-12000066400000000000000000000000341355241314300317220ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:αΌ­ include:domain52c9f09174d10e2046bd2bc56d08a7cfa1b94c88-2000066400000000000000000000000121355241314300317010ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 οΏΏ52ccacd4bf39b5336bdd46704462e94181e2757d000066400000000000000000000000151355241314300314750ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a//3 -53c9798f3a3093cc4829925722019dff356aebbc000066400000000000000000000000331355241314300314320ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 -include:_spfh.%{d2}5594ae6ef897d6063f01e0adf41caceff607c7e2-7000066400000000000000000000000341355241314300321500ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/1107J86564func2cont5637f99d2a8d09e94609bf972de37a1f74b31b9b-5000066400000000000000000000000141355241314300316660ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ΥσΥψ56628f9e0351e9b115c764ffbe94c19efaeb0389-3000066400000000000000000000000311355241314300317350ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 redirect=%{l3}%{o}56a1bc1c7a3649800dbe3280f23d247155155e51000066400000000000000000000000261355241314300312330ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:ppp-%{p}-ppp 56d71aa7952234711b33c3afbccc1207d73eeb14-2000066400000000000000000000000121355241314300316570ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 οΌ­5710e8c342174148ee462f030f4cac29e664c767-2000066400000000000000000000000121355241314300314120ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 σ‚574189fe1098971730f7f8ba309a172e4325bc2f000066400000000000000000000000161355241314300312700ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%{o1}58a9b1b0abcd5cf81ddd1a0ad4488b363729fb2b-1000066400000000000000000000000541355241314300321750ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 exists:%{i}%{l82350949848729030}%{d2}59093d3787922a8015fb0e8d81df61675c82278e-2000066400000000000000000000000131355241314300313600ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx/+595d366d1274aefa2271820ff4ef2da05cddc6bc-10000066400000000000000000000000551355241314300322050ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 Β½Β½Β½Β½Β½Β½Β½Β½Β½Β½Β½Β½Β½Β½Β½Β½Β½Β½Β½598f7b8e006d6633a74f959a5466655a27fbd478000066400000000000000000000000221355241314300313140ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip4:1.2.3.45c68ecddd321d7279a3b0e620317935b7d4e8ce1-2000066400000000000000000000000651355241314300317170ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip4:1862645a4B361qZ_usk_cs__68t____gWGu__k_y-5ceab670fb0fb39a5c23d2f611f7d217e756f423-9000066400000000000000000000001121355241314300317700ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 𫞡𫢡𫞡𫞡𫞡𫢡𫞡𫞡𫎡𫞡𫞡π«žπ«Ž΅π«ž΅π«ž΅π«ž΅π«ž΅5d1cfec0c5dadf382dc141d47562d2ffe79615b8-2000066400000000000000000000000311355241314300321320ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½5d7e1ee1c59f39bc3e122815c4944b0e39914898-6000066400000000000000000000000421355241314300315210ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 οΏ―ο»½οΏ―ο»½ο»½οΏ―ο»½ο»½οΏ―5ec5c2a5a29cbff4a99457cdc0e178c81b284f73-12000066400000000000000000000000351355241314300321460ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:σ‚‚‚ include:domain5ed2b1d1a581990d92eb9175ff45e1ffb6f2a2cd-6000066400000000000000000000000341355241314300321420ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 include:domain 7 5f5bf6d1cdcce6a626a65df489dfcc07f788bd85-2000066400000000000000000000000131355241314300323210ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 𫞡5fdf397505b4fc0d3761721f15489860dd65b2b6-1000066400000000000000000000000221355241314300315020ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 exists:%{r}60658aaa3f93cd568bdf81690c1c0d3640d124be000066400000000000000000000000231355241314300315400ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%%%_%_%- -60b77bed79cf2f081d781270f6c64500c65f2141-1000066400000000000000000000000221355241314300314660ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:e:e:0:$60f915049f6f1a9cc5ac4ef693fa3e9094321cc4-13000066400000000000000000000000311355241314300320010ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ptr include:domain61c4b104c84b6d8d909e3b0290c6af0c12388bf3-1000066400000000000000000000000221355241314300316130ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 exists:%{V}620a8868eec3a22ace93f372a6337d579f55d866-6000066400000000000000000000000341355241314300316040ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/1107J8656421492cont62246f1db31d1d885c74e8060e344ca1759a1545-1000066400000000000000000000000131355241314300314020ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/-162645dad2ddf207c474064e153fd468adf0d7403-7000066400000000000000000000001131355241314300316270ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 π—ž΅π—ž΅π—ž΅π—ž΅π—ž΅π—ž΅π—ž΅π—ž΅π—ž΅π—ž΅π—ž΅π—ž΅π—ž΅π—ž΅π—ž΅π—ž΅π—ž΅6273611346aa5c20c3ce44cae49017f9124aa5de-12000066400000000000000000000000341355241314300316660ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/1_7_7_1_4_7_7_1_07_627d548125420021aa6578008ecf12cbfb4115c8-7000066400000000000000000000000311355241314300313670ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 include:domain η ²632efcbdcb1acc95d5438c0465d1974675f9529c-15000066400000000000000000000001141355241314300320140ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%{V}%{V}%{V}%{V}%{V}%{V}%{V}%{V}%{V}%{V}%{V}%{V}%{V} include:domain63c66382abda05c270d4103e259d7efaf9e77bbb-5000066400000000000000000000000611355241314300320510ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ΥσΥοοοοοοοοοΥσΥοοΥΥοοοοοοοοοΥσΥοοΥσΥοσΥοο63d6872579dc76522b1003f2a21320d38d953410-13000066400000000000000000000000261355241314300312410ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 +include:domain6432d829ef0ce88b09ab309f0784f4bf23730f9f-4000066400000000000000000000000211355241314300316500ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ՁσՁσ‚οΏ½66db2560a9ac8dac4bf979cb47812b01decf06eb000066400000000000000000000000151355241314300320470ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ptr:%}66e8dd891c16ec4c27e041b82c3115a92ad5832a000066400000000000000000000000271355241314300314670ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:d1110/24//12967950ee5ca4bd409b333f587498af2bc6cf6f0a8-5000066400000000000000000000000421355241314300320130ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:d1110/21862645149230570367e6e2e608167be0596021157131b64ad7b91da2-2000066400000000000000000000000331355241314300314020ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:1:8:1:b::6:1:8:867e9e013657986390e1fe563584321c7e062a435-1000066400000000000000000000000221355241314300312070ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/moC”ntoto6896ec67b390b407509284648c9aa7c474a04039-8000066400000000000000000000000411355241314300312770ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ½ptr: ½ptr: include:domain689da1b392dfdb3776bb8ffa04f5d731638e92f3-3000066400000000000000000000000251355241314300320160ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 redirect=%{dr}6977a2fdabe378064fef5e1fd941faf4d8d4c4b5000066400000000000000000000000311355241314300320730ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:2001:db8::68 l6980033ab26f3cc54dbfe98d88535bcc707142fd-3000066400000000000000000000000171355241314300317240ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx1 mx/C6a2815028adf404edc3f4b1cc38c1b4de687b80e-7000066400000000000000000000000471355241314300320510ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 𫞡𫞡𫞡𫞡𫞡𫞡𫞡𫞡6a956db6d33cbf2fcf72a99e692b4c198281aa13-3000066400000000000000000000000361355241314300320060ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 include:domain ՁՁՁՁ6a96f7df5daf601f47990aef577392392f4a664a-4000066400000000000000000000000271355241314300316720ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 redirect=%{d}6bb4c18efdc2f761e270d1fb94c68de69d3db79b-1000066400000000000000000000000351355241314300322320ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 pt•uaiίr:d6666l-all6cb70020584efe94d39ec4c86c331b987bced76d-5000066400000000000000000000000241355241314300320140ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 σ‚‚σ‚‚σ‚‚σ‚‚ο6d7bb009e8728bd239a22e5319974b3a5b87614e-1000066400000000000000000000000401355241314300315000ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:Cafe:Babe:6:Cafe:B0: 6d9c90e1d0e3649b67945b2d0406f339540cf98c-12000066400000000000000000000000401355241314300315700ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%{s}%{s} include:domain6ef264dc7512c4232e16d8db5eb28eb1b0250d4d-16000066400000000000000000000001141355241314300320360ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%{I}%{I}%{I}%{I}%{I}%{I}%{I}%{I}%{I}%{I}%{I}%{I}%{I} include:domain6fce1d04d6f69c32320685a4a9c0349fc05c8ebb-2000066400000000000000000000000151355241314300317670ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 €«Ά7161abeb77fc6476927a2472ef098aa104c045de-5000066400000000000000000000000201355241314300316270ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 \\\\\\\\\72640f46c1303246ecca69b3e6866c471f32645b000066400000000000000000000000141355241314300312520ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip4:/72dd6c39431c5518730e9d9484962bc778fb2544-22000066400000000000000000000000461355241314300314510ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%_%_%_%_%_%_%_ include:domain73463692358cdf893e7cf552b3b2b5e311b85305000066400000000000000000000000211355241314300312600ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:d1110/2737ebd2b89624cd21e3f0721b456355588f4ece8-12000066400000000000000000000000521355241314300316520ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 exp=‚σ‚‚σ‚‚σ‚‚σ‚‚σ‚‚ include:domain739f18ee4881e1138630b0d7ffadc8d041040476-13000066400000000000000000000000341355241314300315550ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:94304040/7434844973e1afe5697623bdcfe1211204f7e0fb951a4c32-6000066400000000000000000000000401355241314300317000ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 redirect=%{l}%{l}%{l}%{o}74391ecf9d5baefd2cd7535363ced8e5cafdfb4a-12000066400000000000000000000000401355241314300325220ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%{V}%{V} include:domain755e57e00fb8fe9343195c109153983b458c48f1-15000066400000000000000000000000511355241314300314420ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip4:4::/4 ip6:4::/4 include:domain756598fcdae09b8a543f39a9dd1aee7468ec07bc-11000066400000000000000000000000321355241314300322360ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%- include:domain75a64f372534aebaf3838c8cab4260113be8fa08-7000066400000000000000000000000471355241314300317130ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ptr:½ ptr:½ ptr:½ include:domain7652ffe29e111d0db9410539df17d79bc238208c-13000066400000000000000000000001101355241314300316330ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:d1110/32 a:d1110/5 a:d1110/1 a:d1110/1 a:d1110/1 include:domain777410981fb83bfc115b9d73658384744ca5b9aa-13000066400000000000000000000000311355241314300315700ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:d6660//1 a:d111177adc4c141f7dd876302adc5983bbde56337d906-1000066400000000000000000000000211355241314300317160ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%{o}%{o}77bb421687cc142f2f7a00ff7000f32ac2eeeef9-3000066400000000000000000000000421355241314300320400ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½77cc93fcf61cd9d6662ef18d4ebf9e5b9751781e-2000066400000000000000000000000101355241314300321110ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 σ794406f33696ace311f39f658bf82d68621203de-5000066400000000000000000000000471355241314300314420ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ptr:½ ptr:½ ptra: include:domain7949acda013fef8a8ac8159d6956f06da5498bb8-1000066400000000000000000000000311355241314300320200ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip4:1.2.3.4 ip6:::79550c23af893e793e1d2781a8fc252f601a5b8e-7000066400000000000000000000000441355241314300315740ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 include:domain 7 7  7a02070902448225aff2b49eadd31e52be253870-4000066400000000000000000000000131355241314300314500ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 \\\\7aa0a78cf5866b022ec350c48ee9ff1f3f2cffb8-6000066400000000000000000000000301355241314300322220ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 \\\\\\\\\\\\\\\\\7b240b945ea1c29125653542c1f293550fd3efea-2000066400000000000000000000000441355241314300315420ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 exists:%{{82350949848729030-}7be59d49de0d3d7a60ecd3b1ff47053082cd9dbf-4000066400000000000000000000000311355241314300322150ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 include:domain ₁7bef4f9bf55a5b438de0d3676f7a4a06897999cf-12000066400000000000000000000000431355241314300321210ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6::: ip6::: include:domain7c47587b4bbec9f37bf2ffd00c146a531e8ece00-2000066400000000000000000000000301355241314300321240ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:%{i}%{i}%{i} -7cb312d9ce11e08ae0a60571635410ae5469dd4e000066400000000000000000000000111355241314300314460ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 l 7d884e5b6f9dc98e899115e691cd826b3cc3a232-4000066400000000000000000000000231355241314300316700ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 π—ž΅π—ž΅π—ž΅7e265eeca3402d2943bd206b4c6226c1d1ff8c32-3000066400000000000000000000000171355241314300316740ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 π—ž΅π—ž΅7e754abadb7626d1b3776736f275db37751a8229-5000066400000000000000000000001601355241314300315130ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½7f3742ba9ae6dba0322c0d7a442610680e5ced0f-10000066400000000000000000000000411355241314300320220ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:ՁՁՁՁ include:domain7f532ba7aff56bd68a6dae1c144764732fda8873-5000066400000000000000000000000221355241314300320050ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx1 mx/ mx/7f5b9fea2aabe47c7d5fa23f72a3d6f67967c789-1000066400000000000000000000000151355241314300321650ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:::7f94a20a3d14ae96187abe57face44d86ff654d1-12000066400000000000000000000000541355241314300321470ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%{I}%{i}%{i}%{i}%{i} include:domain7faf5ae33da6badb519834e598cdbc10c35f0835-7000066400000000000000000000000511355241314300321340ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ՁՁՁՁՁՁՁՁՁՁՁՁՁՁՁՁՁ80381ec0dd66440317fa79bd0ab362ba82719e65-7000066400000000000000000000000441355241314300315520ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 redirect=%{l}%{l}%{l}%{l}%{o}803ef28eca844e4f18371148de536af8d94e182f-2000066400000000000000000000000151355241314300316550ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:4 a808d8bc898a22d6dc2724c9523b59034256fe597-3000066400000000000000000000000151355241314300314410ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 80ac09e7f0993b0086e842b1684a3cf6b7ed2dae-14000066400000000000000000000000311355241314300320550ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 Ga: include:domain80d071bba183948fd3cb643b9ac6356a4f78ded1-6000066400000000000000000000000321355241314300317760ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx1 mx1 mx/ mx/ mx/81b936e916edaf4f077c21175dedf1c67a281c4d-11000066400000000000000000000000471355241314300320640ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:ՁՁՁՁՁՁՁ include:domain828c73a6223be952748d5fdb5246ddc8d1072236-3000066400000000000000000000000741355241314300315060ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:2006:2001:8:2001::11 ip6:2001:8:2001::116:2001:88837dce66ca9aaa4d4995ac40d00fe066c2a1c4f8000066400000000000000000000000351355241314300317660ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/exAAdecEcFEDCfddaFcb838423f0949b7ed6bb1656550dbfe62c6ca7f196000066400000000000000000000000171355241314300315150ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 include:84ad86ae4a2dc2f61c974f4de865f88b42f8eacc-10000066400000000000000000000000441355241314300323170ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%{I}%{i}%{i} include:domain859199c9754e10f22cd1e8841ab2a80c75566cf6000066400000000000000000000000371355241314300313600ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ptr:ae ptr:ae exp=ae al 85c7a4d79af67f0a01b9a00a52be6d4d5279ac55-5000066400000000000000000000000341355241314300317710ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 redirect=%{l}%{l}%{o}85d61d763d07622fbecaea3c97ed3fcb5be2d69f-11000066400000000000000000000001071355241314300323650ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:d1110/1 a:d1110/1 a:d1110/1 a:d1110/1 a:d1110/1 include:domain869b75c33d0c2cda002c62bfae7f15ff0e79a88c-2000066400000000000000000000000631355241314300321340ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:nothΏ½pf1IοiΏg/½οn½οΏ(BADINDEX)½½pf1I½½248709b73da7598cd719e92c2ac3033f417b607a56000066400000000000000000000000141355241314300313440ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ptr:d8720a8ba3df38ed0888e218c974e0e034f762e71-11000066400000000000000000000001111355241314300316440ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 Β½Β½Β½Β½Β½Β½Β½Β½Β½Β½Β½Β½Β½Β½Β½Β½Β½Β½Β½Β½Β½Β½Β½Β½Β½Β½Β½Β½Β½Β½Β½Β½Β½88165e348fbb0dddac43be4d6625224722f87133000066400000000000000000000000171355241314300314140ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 exists:/8927772091f444bee910b24247e9ff25c95d58fb-12000066400000000000000000000000341355241314300316050ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%{p} include:domain89797fe777479f9c9d65954ac2fd590731fc804c-2000066400000000000000000000000631355241314300315630ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 m11102230246251565404236316680908203125x/24l8a2bcea52de4fad8ffd0827e4a2dc12a44de4926-1000066400000000000000000000000541355241314300322640ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/-110723edb186264514923057031258::68a2ed564fcca3c565439075767ff8684ac49ac8a-4000066400000000000000000000000231355241314300317420ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 𫞡𫞡𫞡8aa2ae9ccfc3c3920a4333084aa3c3b92e80b087-3000066400000000000000000000000221355241314300317440ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ՁσՁσ‚‚οΏ½8ac59d1ab0b3a5fac14b352f92584f4dea4a9b2e-19000066400000000000000000000000331355241314300322640ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 V= V= include:domain8b29df6acaf2fcc4f29d3b709f85c3cb17717867000066400000000000000000000000141355241314300317350ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/4 -8b2bb8cd4f6eb4a879d359d84345308003e3362b-14000066400000000000000000000000641355241314300316450ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%{V}%{V}%{V}%{V}%{V}%{V}%{V} include:domain8bde59e5dcbea61da549b56ab78536f314eaf270-4000066400000000000000000000000361355241314300321440ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/1107186264514923057038c190342c9ce178aa2030cfe9000a63e58005f3a-7000066400000000000000000000000201355241314300315230ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 8c40888b73dd06e8f4d972b5e3542226b966e6fe-1000066400000000000000000000000221355241314300316030ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 /ՁBσ‚`!448c4f9dfe76423ff4683bdd5058779d9101f24b79-15000066400000000000000000000000431355241314300317000ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:::1.2.3.4 include:domain8ca3a2b7da51ce13aca07b6bc6a587c4efed0d53-15000066400000000000000000000000431355241314300324110ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:σ‚σ‚σ‚σ‚z½ include:domain8cd0357fbfa90ec0e69c17b10c374a1223924d17-12000066400000000000000000000000111355241314300316710ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 Β 8cd9b00e5b14dcc74e3e389691552b26b35e590c-5000066400000000000000000000000211355241314300316360ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ՁՁՁՁՁ8cebd1fdd0164acca4c62330f79f3c02d9a60763-2000066400000000000000000000000231355241314300320330ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:1::1.3:/8cff895127532675e2b4105f5c65be8de5be6306-4000066400000000000000000000000421355241314300315730ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 σhΏ½ρΏ/½ο½οΏ)½½½Ά€Ώ½ρΏ/½8d029147e2084816fb319802ea77b01efd391b54-13000066400000000000000000000000531355241314300314750ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/1_7_7_1_7_7_1_4_7_7_1_0_4_7_7_1_7_8d6aece1b5f58b476ce948504782e0b1d4a90149-6000066400000000000000000000000501355241314300316470ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 8e053980cb3e6f47e74cc8f2bdeae555e8fea559-3000066400000000000000000000000471355241314300321710ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 redirect=%{d4027755927159263581}8e59eb0d01a975d66f10113cdbaa95304313e420-12000066400000000000000000000000421355241314300316030ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%{IR}%{IR} include:domain8e6cb36297f26f8fa23daa259eb12b61ab100fec-1000066400000000000000000000000101355241314300321070ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 8ea434243522f18f9835c93d8593cf5a8be51521-4000066400000000000000000000000131355241314300314300ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1  β8ef23048dcf25f403e61a34d72a6c327d2927fe4-3000066400000000000000000000000151355241314300316330ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 β‚‚β‚‚906833637b8b72be70013f4922eff2836bbece00-9000066400000000000000000000000311355241314300315540ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 Β½Β½Β½Β½Β½Β½Β½Β½Β½9164a7c22279e6b8ff72aea10563c56aa2b13f88000066400000000000000000000000251355241314300314740ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:::1.1.1.1/91c2784bafbbc998e0bd22a4285540852ad966ed000066400000000000000000000000171355241314300315640ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%{h} +92180f784e583d9201c52bcd251686c1ce420493-13000066400000000000000000000000341355241314300314150ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:οΌ­ include:domain923156e1b572d3a1a88c85b6f4e0001658257dbe-1000066400000000000000000000000121355241314300314610ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 αΌ­9362b24013a5f29755c8140c47724dce20d8aa92000066400000000000000000000000141355241314300312410ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ptr -93830b163ebb827cf93a17d1ef59613eb8f240b1-6000066400000000000000000000000141355241314300316330ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 94820540f7b8dd7d056c7872b24464bc28e22f90-6000066400000000000000000000000311355241314300314260ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ՁՁՁՁՁՁՁՁՁ9625cf271d4bea92494cc6c08d37605675fdf9fd-1000066400000000000000000000000241355241314300317400ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:%{i}%{i} -9651d650fafafaef76745a776a998bb96241b8fa-1000066400000000000000000000000151355241314300320220ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a: mx:97c03960e91dde1ab193ea2d82ff742fcc3ddbad-1000066400000000000000000000000211355241314300322620ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:::1../97d3dd37d1f19b7bd31b1eac4a6257dba655c41c-1000066400000000000000000000000561355241314300321230ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx/35527136788005009293556213378906253397d69f2939425aec568d67ad8617d134cd9d2965000066400000000000000000000000201355241314300313750ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:%{fff}98cc679b25e4a323f7023b3e53fbf770030528c5-4000066400000000000000000000000341355241314300314740ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:1:b:6:1:b:6:1:8:898cd39213ce1336e8bcba3b49ecd1cfc7e4a1d16-5000066400000000000000000000000271355241314300322110ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/-1 a/-4 a a/-19a34fb50762330df190864d0ddb25e15e042e662-4000066400000000000000000000000201355241314300314540ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 οΏ―ο»½οΏ―9a9d5cb818c6f69cf9df6da156aa00e3eac1da59-6000066400000000000000000000000271355241314300323100ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 σ‚‚σ‚‚σ‚‚σ‚‚σ‚‚σ9aaf904c7427b850ea7a57316cf41c4e5d34a1a5-12000066400000000000000000000000321355241314300317610ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx: include:domain9abcdf6390b0613fff3e3decb747d6e93a89a36a000066400000000000000000000000361355241314300320670ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx mx a mx a mx a ptr a9b858a7cba052affb1e7682e9f3b49292abe736b-10000066400000000000000000000001171355241314300321470ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 σ‚‚‚σ‚‚‚σ«ž΅σ‚‚‚σ«ž΅σ‚‚‚σ‚‚‚σ«ž΅σ‚‚‚σ«Ώ½σ‚‚‚σ«ž΅σ‚‚‚σ‚‚‚σ«ž΅σ‚‚‚σ«Ώ½σ«Ώ½9c8c99cb61c1c4d741328197f647ed8aab6a4c1c-1000066400000000000000000000000121355241314300317770ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/-9cf1b9b09464e4499ed3dcb2d9140f85bc1a9ca1-13000066400000000000000000000000401355241314300321360ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%{p}%{p} include:domain9d12f3efb61be364e1606de5b629553a60985713-1000066400000000000000000000000261355241314300315010ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 p6:2001:db8::689e319cac94086116535095207d04b5c224e59526-15000066400000000000000000000000421355241314300312560ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:d6660//128 include:domain9f4f35b562b1335d5226eb15f579b40f78902b08000066400000000000000000000000141355241314300312600ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 0a: -9f971c708dcddd95fad64e2cce4b5a3beff74e55-16000066400000000000000000000000401355241314300324600ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:1::1/6 include:domaina1c703c19dcb0dd1393a1aa550dab9d22064411a-13000066400000000000000000000000501355241314300317740ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%{V}%{V}%{V}%{V} include:domaina1c93210c3cd9aa445842cbb7c8b8db89700eb5c-8000066400000000000000000000001521355241314300320460ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 οΏ―ο»½οΏ―ο»½οΏ―ο»½οΏ―ο»½ο»½ο£―ο»½οΏ―ο»½ο»½οΏ―ο»½ο»½οΏ―ο»½ο»½οΏ»ο£―ο»½οΏ―ο»½ο»½οΏ―ο»½ο»½οΏ―ο»½ο»½οΏ―a3ca5b314a00a0468e38b3f02e5d5324f7b2df22-5000066400000000000000000000000261355241314300316570ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 οΏ―ο»½οΏ―ο»½οΏ―a3dc3b202c007a96d2a9392d3088e35d3b6656ab-7000066400000000000000000000000501355241314300316160ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a3ed7c1bdbf2a23bca4ce8320d99d56c39d5ceb9000066400000000000000000000000221355241314300322030ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:d6660/24a4501217ce3dd66c7722843d546ac04d8157d655-5000066400000000000000000000000431355241314300314130ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:CF:CAFE:BAF:CAFE:BEBABEia4f0f97a227003aa1442f010c1ab4b11b75eb8a2-4000066400000000000000000000000721355241314300316370ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½a5555f3e52f2a50dc83da59781278cab8af8f43a-1000066400000000000000000000000161355241314300320000ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:1.1a55848179e2ef78c5d48df2b55174fd2c94216f3-5000066400000000000000000000000231355241314300316040ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ՁσՁσψ‘‚Ձa66793d056da563f93a724bffffb4046343be07a-14000066400000000000000000000000531355241314300320010ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/+107186261862645451 include:domaina7446b3e3a4aed6193665967f0857bc9a62a3715-3000066400000000000000000000000321355241314300315050ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 exists:%{645149230}a80eeb54e51f5a7ff6bbfa7ecaf41690555c8779-1000066400000000000000000000000231355241314300321510ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:d1110/4 ~a8865f15dc42b146da6aad2fc9f74eae1dd255fd-19000066400000000000000000000000551355241314300323650ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ptr ptr ptr ptr ptr ptr include:domaina911eff5c6cd79e98ead8dfabd2d4e6f468e6837-2000066400000000000000000000000541355241314300323370ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:eff:ffff:ffff:ffff:ffff:ffff:ffffa93f5beaa58d9a1a6524ef74a724d1af206a3bfa000066400000000000000000000000201355241314300320300ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 include:/a9895ef31ad26725518daeeaf172dd8434b7b926000066400000000000000000000001011355241314300315630ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 exists:%{p}.should.example.com exists:%{p}.ok.example.com a9949b17b74723c2633356fd6ea8e58c0988cf39-16000066400000000000000000000000511355241314300316170ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:σ‚σ‚σ‚σ‚σ‚σ‚σ‚z½ include:domaina9cc0118e3aaec859d8ebc0230521844f4a9e941000066400000000000000000000000121355241314300315410ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/2a9ec7cbe37eef444da71026fb51aed63343beae8-5000066400000000000000000000000601355241314300322700ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/1107186564214923 a/11071865642149205703a9f36515a6f362c384c12c7633f7d940204833a7000066400000000000000000000000241355241314300311740ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:d6660//100aa24926aa5504d84c2bc24ccbdce190657dc542d-6000066400000000000000000000000331355241314300320320ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 𫞡𫞡𫞡𫞡𫞡aa540d18eefc008c3114d2b93278edc1be1ff1f3-1000066400000000000000000000000571355241314300321130ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:2001:db8:2001:db::1f1 ip6:2001:db8:8aa6c9169f459f167c749030c9d1987afd3d6cd74-12000066400000000000000000000000501355241314300317440ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:::1 ip6:e::0/4 include:domainaaed2222466dce9a6d3426ccd625cc9dec66b753-7000066400000000000000000000000501355241314300321340ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:οΏ½οΏ½οΏ½οΏ½οΏ½ include:domainab1143a7650029d54d16c3086123cf8c62ae0e03-14000066400000000000000000000000771355241314300315300ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip4:1.2.3.4 ip6:::/4 ip4:1.2.3.4 ip6:::/4 include:domainab4ae974caed9ac3dd1fdd26aeccd792b8a8eef3000066400000000000000000000000241355241314300325150ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:d1110/24 ~ac6f486856003dabf941a7b559667829730f4b85000066400000000000000000000000151355241314300313010ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6::/acca12db014f6aea3028a84f6c5866f647b2d4cc000066400000000000000000000000221355241314300317520ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 redirect=%}accc8bc507abbfb1ec387e67d264bd2663eebfb7000066400000000000000000000000141355241314300322660ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 -a: +acd182846170dcef1c7546d4ab6a98490796f113-2000066400000000000000000000000301355241314300315560ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:1::1 ip6:1::8ad152c49557a64647f046f959dcc68bf93658dc3000066400000000000000000000000311355241314300314460ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:Cafe:Babe:0:: adee88e332493162e4c544440c41ab05fc55caba-8000066400000000000000000000000411355241314300317540ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 include:domain    ae8ea51dda8860b90e3f7caae055efc79af00d1d-2000066400000000000000000000000231355241314300323410ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:%{{i} -af313e5429328f99a3e14fe6ed7d2d7171b4f8b0-1000066400000000000000000000000171355241314300317230ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:0/4 aaf836fcd042d6927a687fc3d9a840d970d920696-8000066400000000000000000000001111355241314300316050ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ՁՁՁՁՁՁՁՁՁՁՁՁՁՁՁՁՁՁՁՁՁՁՁՁՁՁՁՁՁՁՁՁՁb00876a702c3af1b72c5b0b4220f0aff86419453-7000066400000000000000000000000321355241314300315240ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/+1 include:domainb01623ff6afbb38f9413d06ea47dfe8c11ee7829-6000066400000000000000000000000671355241314300320720ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 σhρΏ/ο½οΏ)ρΏ/ρΏ/ο½οΏ)σhρΏ/ο½οΏ)ρΏ/ρΏ/ο½οΏ)ρΏ/½b0e49cd5a0eea69e8e80d9e712acbd263cbf0568-13000066400000000000000000000000451355241314300323000ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:::1 ip6:::0 include:domainb0f5dc28d923c125a2f3eb76f7502201ace60e7c-12000066400000000000000000000000331355241314300320300ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx//1 include:domainb0fa0056db33c9338bd4dc90a73c48c4553d9894-5000066400000000000000000000000331355241314300316360ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 include:domain  b100873d47c1870d8711f29c28431fea30c4ec4c-1000066400000000000000000000000251355241314300315360ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:2001:29538b145fe0a881625a35bab0b433476a0c021165c61-1000066400000000000000000000000171355241314300314260ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%%%%%%b15a623eeb971a4e7734a44a7e8ed23e87963af4-1000066400000000000000000000000201355241314300317170ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 aaoaeaeamb17aa7e8ad6c575f52c22192fc3fd1eec24e997c-16000066400000000000000000000000471355241314300322330ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:1::1 ip6:1::b include:domainb1f947edcc1ef0f288fd926baf4a95e8b9d97775-5000066400000000000000000000000111355241314300321740ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 Β½b2c7175d14c4ab51e25dae9ce2d45bbcfde9c0aa-9000066400000000000000000000000561355241314300324210ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 b2ce5c9c42e721bded3c31f0438bf9d366636ece-2000066400000000000000000000000251355241314300321330ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 redirect=%{da}b2d7f31602f04aa2ab5287fd1a47262719c8b66e000066400000000000000000000000271355241314300314630ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip4:1.2.3.4/32 -b307e1380f2f39d76abefed30d6272c44624f8b7-4000066400000000000000000000000311355241314300317140ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 exp= redirect=%{D}b36467ce1bf29b7c3258c6e0ea1987c5e0989ac4-13000066400000000000000000000000411355241314300320120ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:d6660//1 include:domainb488275d23ef85adb645e037d8f7524ac51b3e5f000066400000000000000000000000341355241314300315660ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 redirect=doesnotexistb5a98679ef576a7410544e1e367ecd869cbc56ee-7000066400000000000000000000000331355241314300317550ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ½ptr: include:domainb6507f7406c96d99dd64e849129d39069c85f9a9-11000066400000000000000000000000501355241314300315510ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%{I}%{i}%{i}%{i} include:domainb6f608755614309cd073ff4b9ff12ffdddbc7aef-10000066400000000000000000000000461355241314300323110ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:σ‚‚σ‚‚σ‚‚σ‚‚5 include:domainb70ea87f1e3a7a71c74c0d1c9a82752b4046c658-8000066400000000000000000000000411355241314300316330ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/4 a/4 a/4 a/4 a/4 a/ a/1b817cf09acdda44e8d910c19dd59a705ea223067-14000066400000000000000000000000261355241314300320520ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:d6666 a:d1111b8855d0c786eba4683fbf8cde3459b8a9101d2ea-8000066400000000000000000000000341355241314300320740ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/1107_86564func2contb8d0e747da40b2501b1c2c39ed3bcd1e9c7c46d8-1000066400000000000000000000000201355241314300321100ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 redirect=ba4579a4b3ecf61155909dd7f561849c58cdc1b8-1000066400000000000000000000000261355241314300317330ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:d1110/24~allbc54f7f235fbe4eb55a7066dfe301b396bc1c634000066400000000000000000000000151355241314300317060ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx -albd34c53e2b4b044ca65993b5b21b5c1ab97e7a18-2000066400000000000000000000000131355241314300317500ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 π—ž΅bd74e6de533aa3f9d3a9ff0694639bac7cef1a02-3000066400000000000000000000000311355241314300322130ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 redirect=%{daAFAE}be6fc50d936510262252e2706edcacff891fe185-7000066400000000000000000000000361355241314300317240ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 include:domain   bf8b39b3f7dc8b62718454e41a18b3fdf166b52a-14000066400000000000000000000000641355241314300320640ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%{s}%{s}%{S}%{s}%{s}%{S}%{s} include:domainc01b6f2672804a8b6abc85afa130f4db06ea1cb6-1000066400000000000000000000000301355241314300320720ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 include:domain ~ac0eb81476da375b12c3dc6199325f6728fca8c25-6000066400000000000000000000000221355241314300316370ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/4 a/4 a/1c1063b885395233902ccc891ececb6af2f1fb279-4000066400000000000000000000000251355241314300317170ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ՁσՁσψ‘‚Ձσc1210ffd398a720b89fa9b2fd7d071c759848ccc-13000066400000000000000000000000501355241314300320660ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%{I}%{I}%{I}%{I} include:domainc19da7619ae805156926cde722e4753648e555b4-1000066400000000000000000000000211355241314300314270ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:e::0::c226841652a967c26fa9f1ca08bf90ea9df9bc4b000066400000000000000000000000211355241314300317170ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/-110723ec2672e5a51b373fa65f8edf478576d4cdbe5a09b-1000066400000000000000000000000251355241314300320660ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:CAFE:BABEEc34e8478439a802cd4aa682a54b865382a6e6b04-1000066400000000000000000000000121355241314300314710ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mc37b8935a53aa115c6ba7677fbf413b039c635c8-3000066400000000000000000000000261355241314300316330ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ΥσΥοοοοοοΥσΥοοc4b1bacbc00d582954dc53e6f6284236bf9fc64e000066400000000000000000000000271355241314300317150ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 include:domain ~c4d74e144b5811566925a3b84809485f5e6b5571-2000066400000000000000000000000471355241314300313000ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/-1107186264514923057031258::6c4f22db76ae464b5239fb7761091382756c3f3b6000066400000000000000000000000131355241314300313400ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%}c56287852954cfe96a89b3482b7afbb7a3a50f71-3000066400000000000000000000000221355241314300316530ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 Υσκοοοοοο4c566a989b153b7baf61decdf8580937596bef959-11000066400000000000000000000000421355241314300320400ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:ΣΨΠήΠοο)½ include:domainc58d87a54c389bab92d1f4a209adc75523fc7574-2000066400000000000000000000000341355241314300317250ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 exists:%{i645149230r}c642abd702594b1bef94016873d29be7c3426428000066400000000000000000000000161355241314300313350ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ptr:aalc6e2ae81a2d096b2e9faf154beb78f8aaf715cff000066400000000000000000000000171355241314300322220ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip4:1.3 c891ebdca240564cd6be85db7ec4f2419cca1560-1000066400000000000000000000000171355241314300321240ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:::E c8d66f4be86f0a428754e8150fae408f21421bb8-13000066400000000000000000000000501355241314300317160ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%{s}%{s}%{s}%{s} include:domainc8f75ab19304bff1037246dfbafe8e5903bb90cc-2000066400000000000000000000000271355241314300321310ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:%{{{Šžυ¨ji} -c960d3112bff1a12d9bfe4f7e6ea1dd8c114e7d6000066400000000000000000000000321355241314300320430ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 redirect= redirect=c989438a20e09ca08d8d0a8bc3f3ff6e788aec7b-12000066400000000000000000000000441355241314300322350ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%{I}%{I}%{I} include:domainc9fd32fb5a9d5c888423d58bcd6796c1b79c4933-8000066400000000000000000000000371355241314300317620ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:d1110/1 include:domainca425f5a4795eda3ba095d08f2fed2b9b56e294d000066400000000000000000000000261355241314300320010ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:ooo-%{o}-ooo cb2c25e688500463cbd57cccaf4651bd985b411e-14000066400000000000000000000000361355241314300320510ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:1::1 include:domaincb9c9d95ff6e8ad02f6dfa35614c56ee3ef8e70b000066400000000000000000000000231355241314300321570ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 exists:d1111cbd464ac586e17e09c93883119fae5001195bccf-9000066400000000000000000000000531355241314300317250ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 σ‚‚‚σ‚‚‚σ«ž΅σ‚‚‚σ‚‚‚σ«ž΅σ‚‚‚σ«Ώ½σ«Ώ½cc183fa6e5f3eb5fa47e5b5207fe9a25cf68bcd6-5000066400000000000000000000000161355241314300323070ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/4 a/1cc6bc932909f1589479e1129791402e99ffe2b98-11000066400000000000000000000000421355241314300315370ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%{I=}%{I=} include:domaincc9dc2f9d4124f385fb9589c57d26388ac1d584e-11000066400000000000000000000000341355241314300320300ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%{s} include:domainccf0020a2b2da0b9440b8d6c98aac522f04e3f96-13000066400000000000000000000000551355241314300321070ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:σ‚‚‚σ‚‚‚σ‚‚‚σ‚‚‚σ‚‚½ include:domaincd8b93cd61b30a1f045173bce142d6861bef88a2-5000066400000000000000000000000301355241314300317550ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ptr:½ ptr:½ ptr6cdd335e7f0ca5359d324600ff443c5c8b2ad6b31-10000066400000000000000000000000631355241314300320350ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:d1110/1 a:d1110/1 a:d1110/1 include:domaincdd60476f4ef91a97ff0161196731409d8dc4187-15000066400000000000000000000000571355241314300316060ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%{i0490116119384765625} include:domaince2c5d5257e32149064eb16f95ca854373d7bae3-12000066400000000000000000000000341355241314300317160ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%-%- include:domaince47ddf5b00c777dbf2214a2d8ac4579127464d0000066400000000000000000000000361355241314300315500ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 include:ipexamplecomallce5296fce5bbc097e72fea0331519a92290a56be-13000066400000000000000000000000301355241314300320500ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 MX include:domaince5b33baf137d522804df44ba49054ed0c99d86e000066400000000000000000000000311355241314300316300ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:CAFE:BABE:0:: ce91e7bf355c66eb7b54bd9eec6f9c3e1128abfa000066400000000000000000000000461355241314300322310ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 exists:%{l2r-}%{d2}%{l2r-}%{d2}cee815b2b87629959c5aaf8d9529de4302365eaf-11000066400000000000000000000000351355241314300320220ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%{IR} include:domainceeaed584be8a2f84755b388bc2eca9d91e301dd-2000066400000000000000000000000151355241314300323010ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:/ ad010cd01f60d366a490939ba7e734ee0205bbf95-5000066400000000000000000000000311355241314300316150ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 aΚ1 include:domaind127e98987abe4687f4aac11b2405cf2028d9d7b-6000066400000000000000000000000501355241314300317240ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 exp= exp= exp= exp= redirect=%{D}d1567d96b1c0e32073b56c363eb83d854bc2742f-12000066400000000000000000000000441355241314300316330ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/110718626451 include:domaind1f256c13fc6d25a1ce60bee676bdc6dbf370b17-14000066400000000000000000000000541355241314300322640ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%{I}%{I}%{I}%{I}%{I} include:domaind3e99d5a3f89a6fec79bb8209d9584d55b99b650-6000066400000000000000000000000211355241314300317630ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1  β  d48d9dfb5381fd1acaec2c9e7900a3fd86742674-3000066400000000000000000000000141355241314300320660ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a a ad4dc7ea8bce557418650da7fdc34e3f03877bdb9-3000066400000000000000000000000131355241314300321450ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ՁŁd4f0fe1f081eee99d09ec18d0320e49421d796be-2000066400000000000000000000000241355241314300320020ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 redirect=%{h}d5032b820a2b0b9e853b55878217fa9d262a314f-13000066400000000000000000000000401355241314300315400ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%-%-%-%- include:domaind50ae4884ceef9773629d9dda6a742e631fd4b04-1000066400000000000000000000000131355241314300320060ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ptr:d72da001152934c26ffdc5f09b8e6930a6029bf2000066400000000000000000000000261355241314300314640ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a a a a a a a d7367455b7cc6e9d9e0a32d7e6ebf28c6c88aeae-6000066400000000000000000000000221355241314300322420ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx mx/ a mxd77c09dca3ad4265127e3cb9ab223a51af746e2f-3000066400000000000000000000000251355241314300320360ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:CAFE:BABEid781c18c85da9ab3b4775e4db674a590ac73ef36-5000066400000000000000000000000261355241314300320120ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx mx/ a mx/ a/d7f48fadee3af3b910ccc8cf04657a445cd4c9f4-3000066400000000000000000000000101355241314300322750ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 d8c678392de65db470dae4b9f613ec42415ff864-5000066400000000000000000000000231355241314300317370ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 σ‚‚‚σ‚‚‚σ‚‚οd94e5b5d8b5854e3caba0444add40baaaba86996-1000066400000000000000000000000521355241314300322030ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:nothing/οΏ½οΏ½οΏ½οΏ½pf1IοΏ½οΏ½24da33d09eda59c78659696af049567c7ef68fb02f-8000066400000000000000000000000301355241314300317560ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 dae9a77a60e1491680c1d805118ac3751112909f-3000066400000000000000000000000271355241314300314050ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:Ώ½οΏ/½ο½οΏ)½½½dbd0db742720740c10282518e4577cec3998e5cc-5000066400000000000000000000000201355241314300315510ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 dbf895f600893e37727da6399b4285606db5f526-12000066400000000000000000000000441355241314300315320ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip4:1.2.3.4/31 include:domaindc0b19445201ed2c3996cdc6f3c244ee9f652f35-1000066400000000000000000000000161355241314300317150ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:%{S}dcc0a5de6197e7baf94c9bd0c312f3b3a8b5ffb8-6000066400000000000000000000000301355241314300323510ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 dda2d834936fe89fbd3f55adc62f793c19b5bb9c-1000066400000000000000000000000651355241314300322430ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/071862645a4B361qZ_usk_cs__685t____gWGu__k_y-de07275958226e06cd1a914c7f9b9016b61c5b1f-12000066400000000000000000000000361355241314300316400ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 exists:‚ include:domainde4785b5ee386672dbf8e5db8273e0351ea1862b-14000066400000000000000000000000571355241314300320210ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%{i1490116119384765625} include:domainde933a63454be499e4e9bed43e408d3d8e1ff567-18000066400000000000000000000000301355241314300321100ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 V= include:domainded54786ddda6dc0f3ffaf5a73c619c3ff8e4b15-10000066400000000000000000000000341355241314300324460ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/1_7_8107_86564func2dfe0b41c561174c2b49287ef075144ceef8da296-6000066400000000000000000000000341355241314300317230ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/0718626H51492305703e02efe936c6ee8076f09724e5bb9e561c953300e-12000066400000000000000000000000311355241314300317270ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mX: include:domaine0fd54a63505541388b2f103523d8aa89bdb5bc6-11000066400000000000000000000002161355241314300317020ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 𨞡𫢡𫞡π«΅π«ž΅π«ž΅π«ž΅π«Ά΅π«ž΅π«ž΅π«Ž΅π«ž΅π«ž΅π«ž΅π«ž΅π«Ž΅π«ž΅π«ž΅π«ž΅π«ž΅π«ž΅π«Ά΅π«ž΅π«ž΅π«Ž΅π«ž΅π«ž΅π«ž΅π«ž΅π«Ž΅π«ž΅π«ž΄π«ž΅π«ž΅e10b4f7eaaad2300375a565a8dae9f2e85608a52-13000066400000000000000000000000141355241314300320360ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mX: ie208097be0b0dc8618075d6583ce1f50568c15e2-1000066400000000000000000000000261355241314300314730ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 include:domain e28579d8a072e6615a51a0112bee851dc3a1f5fd-4000066400000000000000000000000301355241314300316760ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 redirect=%{l}%{o}e2d874886a559a516efd5dc3a169334c7a963b30-12000066400000000000000000000000361355241314300316530ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:d6660 include:domaine3e07997d1dc92146f6984ff5720fa16894e7c53-9000066400000000000000000000000161355241314300315430ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a//4 a/e41fcf365302845c2340ccb398af2cfefb43f232-13000066400000000000000000000000641355241314300320450ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%{I}%{i}%{i}%{i}%{i}%{i}%{i} include:domaine54a3e98730496df3ea28dbfef487790c60708fb-11000066400000000000000000000000571355241314300320310ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:σ‚‚σ‚‚σ‚‚σ‚‚σ‚‚σ‚‚σ‚‚5 include:domaine57744a0dd15293f65d65428a78b2ee3f130d009000066400000000000000000000000271355241314300313360ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:2001:db8::68e5880258d09616bbddf50349c7f55002c79b0022-3000066400000000000000000000000361355241314300314120ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:%{{{Šžυ¨j{{Šžυ¨ji} -e60dbbdca9e3329fe3f1fb14b05d7f88a2c6ea63-14000066400000000000000000000000531355241314300323530ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/-107186261862645451 include:domaine68c75a01a4dfa8bbba43e271e396726d72c2f5b000066400000000000000000000000151355241314300317060ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 exp= -e69204559a621f21dc8f0e7002fd7fca9a7b8ae8-12000066400000000000000000000000511355241314300320570ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:1:: ip6:e:e:0:: include:domaine73a0dbc0b873c3e1ddf99f0ac22927b1163e7c8-14000066400000000000000000000000431355241314300321300ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:d6660//128 include:domaine7914ed96774117a2015925f790c57fe8000c008-8000066400000000000000000000000521355241314300312670ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/4 a/4 a/4 a/4 a/4 a/4 a/4 a/4 a/1e93a4f40a1901c685ac5a409a1f07ba714ef956c-2000066400000000000000000000000361355241314300317030ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 redirect=%{l29030}%{d2}e964873ffd42a21f02c1b2248873c0a901365005-1000066400000000000000000000000461355241314300313170ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip4:1.2.3.4/31 ip4:1.2.3.4/32 2ea5be69cc8b6644519c5a167ca753a863b757097000066400000000000000000000000521355241314300314360ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:%{l}.%{d}.%{i}.spf.example.net -ec0f6eace689ed6111acd7ec285057da01a1eb21-18000066400000000000000000000000611355241314300322560ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6::: ip6::: ip6::: ip6::: include:domainec41195137f57066d8f0d799ac8bb252dfdc93dc-2000066400000000000000000000000321355241314300320070ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 /ՁBσ/ՁBσ‚‚)`!44ec8282bd3e0bf237005a5a65e6bf5bffbf51e758-1000066400000000000000000000000161355241314300321310ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:e:Bec93b5d52903ed882f9f6f24d6ec969012ed55ff-15000066400000000000000000000000471355241314300321200ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:::/6 ip6:::/4 include:domained29237e59b78657edc357bf1fd4460a66268a5e-5000066400000000000000000000000361355241314300316670ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 exp= exp= redirect=%{D}eda8a35bd40b21a692a4995f705855c7312886c3-9000066400000000000000000000000401355241314300315040ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx mx a a mx mx a a mx mxee703a3c97844bd923f94fcee3f4b1653c10fb6d-14000066400000000000000000000000411355241314300321420ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:::1:b:6 include:domainee79058d876696355d87d2126ad04f156ee520aa-2000066400000000000000000000000231355241314300315100ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 m0οΏ½110~allee8656006a06959c1879616effb85a634b0aca13000066400000000000000000000000231355241314300314200ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 exists:d6660eebf4b0d9b6cc26f1e7ee704bb832dcc7647ac8c-18000066400000000000000000000000511355241314300324430ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ptr ptr ptr ptr ptr include:domainefcb64bb622abb09cdf3c05e731cf05ab568f832-2000066400000000000000000000000161355241314300321750ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 οΏ½efd13ba66006cb10e54fd5c8a2992aa935a8756e000066400000000000000000000000261355241314300316320ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip4:1.1.1.1 allf00d320792f2005cc22836f5dffde0be97502329-13000066400000000000000000000000511355241314300316220ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:1:b:6:1:b:6:1:1 include:domainf00d61fecdc4f66b5c9d8327c224e31776d2ed0e-8000066400000000000000000000000351355241314300320620ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 include:domain η η ² ²f045bb4e8964c3e50f041d64f4af9d0183705b31-5000066400000000000000000000000341355241314300315470ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/0718626451492305703f0790f92fc3c35ccf7e8a7fb6b48035edf0780a3000066400000000000000000000001341355241314300317260ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx=7_7MN3__a4B361qZ_usk_cs__685t____gWGu__k_y6__J____5Gb_NM30_uxX__/0xFA2467A2fFde5 ~f0edc684d8e8f6bab6d61c4219dbe9d58d39d326-17000066400000000000000000000000411355241314300322420ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ptr ptr ptr include:domainf2ea57ec6f67baa4734129213423b9ebb4cde80b-1000066400000000000000000000000341355241314300320410ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip4:irect=eexamplecomf350da396279e5e30cf92a6d3204c5220a02ef0a-9000066400000000000000000000000341355241314300316130ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%{I} include:domainf37f1e713b1f67e3482d7e866517f016e1a13ce0-10000066400000000000000000000000351355241314300316340ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a:%{I=} include:domainf3c307e9e0eaf6bd44a3ab6737ee11f342866326-15000066400000000000000000000000421355241314300317740ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:1::1:b:6 include:domainf40589b11b7e03c9d880bd69b76e01e27c743df3-16000066400000000000000000000000431355241314300317300ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:CF:CAFE:: include:domainf4b8cedf44980c648c7e5e5fc44327c456156f57-12000066400000000000000000000000341355241314300317500ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mxσ‚05 include:domainf56d2e286b7ecc555ea356fe649fbf322ea02fc5-8000066400000000000000000000000611355241314300321520ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½ include:domainf57ba6df08bfc3da035f8333e18bc446ba1f0e2d-1000066400000000000000000000000231355241314300321720ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:2001db8:f5bb1d1b02d908d9d249b8bc120e37abd12d94de-4000066400000000000000000000000221355241314300321120ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ptr:½ ptr6f650013dbeb971d05740a25bcd8f6726a35cc47e000066400000000000000000000000101355241314300315350ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 af70408cf87bef7015e9c01e21fe4d656bbe091f1-1000066400000000000000000000000151355241314300317710ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 οΏ½οΏ½f86d796e245a7f6baab8943e91639f3abe312654-3000066400000000000000000000000361355241314300316620ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:ήΠQ½ΏΏο½)½ΏΏΏοQ½ΏΏο½f8a1991053a5a58d92e38049974f307b888d6124000066400000000000000000000000241355241314300311420ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 exists:%{l-}.f8e2610fa172fcf57c5a78abc250c624ea258abd-2000066400000000000000000000000321355241314300321160ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:1:8:1:b:6:1:8:8f97b07022630b9bb9d443021f67c6616a5e2499b-3000066400000000000000000000000411355241314300314130ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:1::1 ip6:1::1 ip6:1:::f9f5579076d85ecffef2bc4201d38e2168c95486-6000066400000000000000000000000341355241314300316760ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 a/-110723451492305703fab1282ee7602b9bc7dd8814723a391dc902ad0d-12000066400000000000000000000000331355241314300320400ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ip6:1::6/1 a:d1110/1fb893e6d6923eb8bc63274ff5faad450b0c40abb-3000066400000000000000000000000271355241314300322100ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 Β include:domainfbfceed3f5d78a2c71b217856a3c8b12f6f22f5b-4000066400000000000000000000000171355241314300322170ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 οΏ/ο½οΏ)fc0a076254f8732cae001b698d036a858ca6dfb6-3000066400000000000000000000000111355241314300317020ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 \\fc7ec2e1564e22897591d02e3abc43245cd46ba1-6000066400000000000000000000000411355241314300317040ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 ptr:½ ptr:½ include:domainfc9b2b87a881c97370779482229c8b6e56ff43f0-3000066400000000000000000000000631355241314300315370ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:%{i}%{i}%{363797880709171295166015625i} -fd8c9d87b2d24a6e2d677bc551b32e3fd26cc0a8-18000066400000000000000000000000301355241314300322200ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:σ‚‚σ‚σ‚σ‚σ‚σ‚/fdb54165041061eb1bb177f83c824f7785124ee7-2000066400000000000000000000000141355241314300314710ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 Ձ�fe0cfa994f142b9dbbcf323d29affdd09798c1ab000066400000000000000000000000141355241314300322170ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx/33fe1c45453c73861dfb5cf5ab1e032e90dc154572-4000066400000000000000000000000611355241314300317040ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 mx:ήΠQ½ΏΏο½ήΠQ½ΏΏο½)½ΏΏΏοQ½ΏΏο)½ΏΏΏοQ½ΏΏο½fe256c829f42896f75caaac59f3344d1657770a0-3000066400000000000000000000000241355241314300315740ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 redirect=%{D}fe43d6d6a17b0d49226f25260bc5b76dc4d815da-7000066400000000000000000000000121355241314300317650ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 σσσff4c34829a3c7ad090d43175030a9e9ebb7b40af-3000066400000000000000000000000171355241314300317630ustar00rootroot00000000000000golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpusv=spf1 𫞡𫞡golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-000000066400000000000000000000000061355241314300247300ustar00rootroot00000000000000v=spf1golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-001000066400000000000000000000000061355241314300247310ustar00rootroot00000000000000v=spf1golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-002000066400000000000000000000000101355241314300247250ustar00rootroot00000000000000v=spf1 -golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-003000066400000000000000000000000121355241314300247300ustar00rootroot00000000000000v=spf1 allgolang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-004000066400000000000000000000000131355241314300247320ustar00rootroot00000000000000v=spf1 +allgolang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-005000066400000000000000000000000131355241314300247330ustar00rootroot00000000000000v=spf1 -allgolang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-006000066400000000000000000000000131355241314300247340ustar00rootroot00000000000000v=spf1 ~allgolang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-007000066400000000000000000000000131355241314300247350ustar00rootroot00000000000000v=spf1 ?allgolang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-008000066400000000000000000000000151355241314300247400ustar00rootroot00000000000000v=spf1 a ~allgolang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-009000066400000000000000000000000131355241314300247370ustar00rootroot00000000000000v=spf1 a/24golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-010000066400000000000000000000000211355241314300247260ustar00rootroot00000000000000v=spf1 a:d1110/24golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-011000066400000000000000000000000161355241314300247330ustar00rootroot00000000000000v=spf1 a:d1110golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-012000066400000000000000000000000161355241314300247340ustar00rootroot00000000000000v=spf1 a:d1111golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-013000066400000000000000000000000231355241314300247330ustar00rootroot00000000000000v=spf1 a:nothing/24golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-014000066400000000000000000000000111355241314300247310ustar00rootroot00000000000000v=spf1 mxgolang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-015000066400000000000000000000000141355241314300247350ustar00rootroot00000000000000v=spf1 mx/24golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-016000066400000000000000000000000301355241314300247340ustar00rootroot00000000000000v=spf1 mx:a/montoto ~allgolang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-017000066400000000000000000000000271355241314300247430ustar00rootroot00000000000000v=spf1 mx:d1110/24 ~allgolang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-018000066400000000000000000000000271355241314300247440ustar00rootroot00000000000000v=spf1 ip4:1.2.3.4 ~allgolang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-019000066400000000000000000000000221355241314300247400ustar00rootroot00000000000000v=spf1 ip6:12 ~allgolang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-020000066400000000000000000000000271355241314300247350ustar00rootroot00000000000000v=spf1 ip4:1.1.1.1 -allgolang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-021000066400000000000000000000000171355241314300247350ustar00rootroot00000000000000v=spf1 ptr -allgolang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-022000066400000000000000000000000251355241314300247350ustar00rootroot00000000000000v=spf1 ptr:d1111 -allgolang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-023000066400000000000000000000000261355241314300247370ustar00rootroot00000000000000v=spf1 ptr:lalala -allgolang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-024000066400000000000000000000000131355241314300247340ustar00rootroot00000000000000v=spf1 blahgolang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-025000066400000000000000000000000121355241314300247340ustar00rootroot00000000000000v=spf1 allgolang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-026000066400000000000000000000000151355241314300247400ustar00rootroot00000000000000v=spf1 a ~allgolang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-027000066400000000000000000000000131355241314300247370ustar00rootroot00000000000000v=spf1 a/24golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-028000066400000000000000000000000211355241314300247370ustar00rootroot00000000000000v=spf1 a:d6660/24golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-029000066400000000000000000000000161355241314300247440ustar00rootroot00000000000000v=spf1 a:d6660golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-030000066400000000000000000000000161355241314300247340ustar00rootroot00000000000000v=spf1 a:d6666golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-031000066400000000000000000000000231355241314300247330ustar00rootroot00000000000000v=spf1 a:nothing/24golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-032000066400000000000000000000000271355241314300247400ustar00rootroot00000000000000v=spf1 mx:d6660/24 ~allgolang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-033000066400000000000000000000000341355241314300247370ustar00rootroot00000000000000v=spf1 ip6:2001:db8::68 ~allgolang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-034000066400000000000000000000000361355241314300247420ustar00rootroot00000000000000v=spf1 ip6:2001:db8::1/24 ~allgolang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-035000066400000000000000000000000371355241314300247440ustar00rootroot00000000000000v=spf1 ip6:2001:db8::1/100 ~allgolang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-036000066400000000000000000000000171355241314300247430ustar00rootroot00000000000000v=spf1 ptr -allgolang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-037000066400000000000000000000000251355241314300247430ustar00rootroot00000000000000v=spf1 ptr:d6666 -allgolang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-038000066400000000000000000000000271355241314300247460ustar00rootroot00000000000000v=spf1 ptr:sonlas6 -allgolang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-039000066400000000000000000000000271355241314300247470ustar00rootroot00000000000000v=spf1 exists:blah -allgolang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-040000066400000000000000000000000241355241314300247340ustar00rootroot00000000000000v=spf1 exp=blah -allgolang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-041000066400000000000000000000000221355241314300247330ustar00rootroot00000000000000v=spf1 a:%{o} -allgolang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-042000066400000000000000000000000321355241314300247350ustar00rootroot00000000000000v=spf1 include:domain ~allgolang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-043000066400000000000000000000000321355241314300247360ustar00rootroot00000000000000v=spf1 redirect=blah -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-044000066400000000000000000000000171355241314300247420ustar00rootroot00000000000000v=spf1 1up=foo golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-045000066400000000000000000000000121355241314300247360ustar00rootroot00000000000000v=spf1 a: golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-046000066400000000000000000000000211355241314300247370ustar00rootroot00000000000000v=spf1 a//0 -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-047000066400000000000000000000000201355241314300247370ustar00rootroot00000000000000v=spf1 a/0 -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-048000066400000000000000000000000271355241314300247470ustar00rootroot00000000000000v=spf1 a:111.222.33.44 golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-049000066400000000000000000000000231355241314300247440ustar00rootroot00000000000000v=spf1 a//129 -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-050000066400000000000000000000000251355241314300247360ustar00rootroot00000000000000v=spf1 a/24//64 -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-051000066400000000000000000000000241355241314300247360ustar00rootroot00000000000000v=spf1 a/24/64 -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-052000066400000000000000000000000211355241314300247340ustar00rootroot00000000000000v=spf1 a/24 -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-053000066400000000000000000000000221355241314300247360ustar00rootroot00000000000000v=spf1 a//33 -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-054000066400000000000000000000000211355241314300247360ustar00rootroot00000000000000v=spf1 a/33 -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-055000066400000000000000000000000221355241314300247400ustar00rootroot00000000000000v=spf1 a//64 -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-056000066400000000000000000000001331355241314300247440ustar00rootroot00000000000000v=spf1 a:a123456789012345678901234567890123456789012345678901234567890123.example.com -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-057000066400000000000000000000000271355241314300247470ustar00rootroot00000000000000v=spf1 a a a a a a a a golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-058000066400000000000000000000000211355241314300247420ustar00rootroot00000000000000v=spf1 a:abc.123 golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-059000066400000000000000000000000371355241314300247520ustar00rootroot00000000000000v=spf1 a a:c1.example.com -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-060000066400000000000000000000000371355241314300247420ustar00rootroot00000000000000v=spf1 a:%{a}.example.com -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-061000066400000000000000000000000161355241314300247400ustar00rootroot00000000000000v=spf1 a -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-062000066400000000000000000000000161355241314300247410ustar00rootroot00000000000000v=spf1 a -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-063000066400000000000000000000000161355241314300247420ustar00rootroot00000000000000v=spf1 a -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-064000066400000000000000000000000461355241314300247460ustar00rootroot00000000000000v=spf1 a:ctrl.example.com\x0dptr -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-065000066400000000000000000000000231355241314300247420ustar00rootroot00000000000000v=spf1 a:d6660//24 golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-066000066400000000000000000000000271355241314300247470ustar00rootroot00000000000000v=spf1 a:d6660/24//100 golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-067000066400000000000000000000001001355241314300247400ustar00rootroot00000000000000v=spf1 a:erehwon.example.com a:foobar.com exp=nxdomain.com -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-068000066400000000000000000000001041355241314300247450ustar00rootroot00000000000000v=spf1 a:err.example.com a:err1.example.com a:err2.example.com ?all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-069000066400000000000000000000000611355241314300247500ustar00rootroot00000000000000v=spf1 a:err.example.com a:err1.example.com ?all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-070000066400000000000000000000000331355241314300247370ustar00rootroot00000000000000v=spf1 a:examplea.com:8080 golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-071000066400000000000000000000000261355241314300247420ustar00rootroot00000000000000v=spf1 a:example.-com golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-072000066400000000000000000000000321355241314300247400ustar00rootroot00000000000000v=spf1 a:example.com:8080 golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-073000066400000000000000000000000321355241314300247410ustar00rootroot00000000000000v=spf1 a:example.net -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-074000066400000000000000000000000351355241314300247450ustar00rootroot00000000000000v=spf1 a:example.net \x96all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-075000066400000000000000000000000261355241314300247460ustar00rootroot00000000000000v=spf1 a:foo-bar -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-076000066400000000000000000000000411355241314300247440ustar00rootroot00000000000000v=spf1 a:foo:bar/baz.example.com golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-077000066400000000000000000000000331355241314300247460ustar00rootroot00000000000000v=spf1 a:foo.example.com\0 golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-078000066400000000000000000000000341355241314300247500ustar00rootroot00000000000000v=spf1 a:foo.example.com/24 golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-079000066400000000000000000000000451355241314300247530ustar00rootroot00000000000000v=spf1 a:foo.example.xn--zckzah -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-080000066400000000000000000000000231355241314300247370ustar00rootroot00000000000000v=spf1 a:%{H} -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-081000066400000000000000000000000241355241314300247410ustar00rootroot00000000000000v=spf1 -a:%{h} +all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-082000066400000000000000000000000271355241314300247450ustar00rootroot00000000000000v=spf1 a:%{H}.bar -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-083000066400000000000000000000000641355241314300247470ustar00rootroot00000000000000v=spf1 a include:inc.example.com a ip4:1.2.3.4 -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-084000066400000000000000000000000651355241314300247510ustar00rootroot00000000000000v=spf1 a include:inc.example.com ip4:1.2.3.4 mx -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-085000066400000000000000000000000141355241314300247440ustar00rootroot00000000000000v=spf1 +all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-086000066400000000000000000000000141355241314300247450ustar00rootroot00000000000000v=spf1 -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-087000066400000000000000000000000151355241314300247470ustar00rootroot00000000000000v=spf1 -all. golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-088000066400000000000000000000000141355241314300247470ustar00rootroot00000000000000v=spf1 =all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-089000066400000000000000000000000141355241314300247500ustar00rootroot00000000000000v=spf1 ?all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-090000066400000000000000000000000161355241314300247420ustar00rootroot00000000000000v=spf1 -all/8 golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-091000066400000000000000000000000201355241314300247360ustar00rootroot00000000000000v=spf1 all -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-092000066400000000000000000000000431355241314300247440ustar00rootroot00000000000000v=spf1 -all exp=e11msg.example.com golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-093000066400000000000000000000000421355241314300247440ustar00rootroot00000000000000v=spf1 -all exp=e4msg.example.com golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-094000066400000000000000000000000421355241314300247450ustar00rootroot00000000000000v=spf1 -all exp=e6msg.example.com golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-095000066400000000000000000000000411355241314300247450ustar00rootroot00000000000000v=spf1 -all exp=exp2.example.com golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-096000066400000000000000000000000411355241314300247460ustar00rootroot00000000000000v=spf1 -all exp=exp4.example.com golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-097000066400000000000000000000000401355241314300247460ustar00rootroot00000000000000v=spf1 -all exp=exp.example.net golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-098000066400000000000000000000001131355241314300247500ustar00rootroot00000000000000v=spf1 -all exp=foobar.%{o}.%{o}.%{o}.%{o}.%{o}.%{o}.%{o}.%{o}.example.com golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-099000066400000000000000000000000421355241314300247520ustar00rootroot00000000000000v=spf1 -all exp=%{ir}.example.com golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-100000066400000000000000000000000331355241314300247310ustar00rootroot00000000000000v=spf1 -all exp=msg8.%{D2} golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-101000066400000000000000000000000411355241314300247310ustar00rootroot00000000000000v=spf1 -all exp=%{r}.example.com golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-102000066400000000000000000000000251355241314300247340ustar00rootroot00000000000000v=spf1 -all foo=%abc golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-103000066400000000000000000000000231355241314300247330ustar00rootroot00000000000000v=spf1 -all:foobar golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-104000066400000000000000000000000201355241314300247310ustar00rootroot00000000000000v=spf1 -all ip6 golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-105000066400000000000000000000000261355241314300247400ustar00rootroot00000000000000v=spf1 ?all redirect= golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-106000066400000000000000000000000751355241314300247450ustar00rootroot00000000000000v=spf1 a:macro%%percent%_%_space%-url-space.example.com -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-107000066400000000000000000000000411355241314300247370ustar00rootroot00000000000000v=spf1 a:mail.example...com -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-108000066400000000000000000000000201355241314300247350ustar00rootroot00000000000000v=spf1 a:museum golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-109000066400000000000000000000000211355241314300247370ustar00rootroot00000000000000v=spf1 a:museum. golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-110000066400000000000000000000000611355241314300247330ustar00rootroot00000000000000v=spf1 a:mx1.example.com mx:mx1.example.com ~all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-111000066400000000000000000000000641355241314300247370ustar00rootroot00000000000000v=spf1 a mx a mx a mx a mx a ptr a ip4:1.2.3.4 -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-112000066400000000000000000000000621355241314300247360ustar00rootroot00000000000000v=spf1 a mx a mx a mx a mx a ptr ip4:1.2.3.4 -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-113000066400000000000000000000000321355241314300247340ustar00rootroot00000000000000v=spf1 a mx include:a.com golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-114000066400000000000000000000000321355241314300247350ustar00rootroot00000000000000v=spf1 a mx include:b.com golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-115000066400000000000000000000000251355241314300247400ustar00rootroot00000000000000v=spf1 a:nothing//24 golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-116000066400000000000000000000000171355241314300247420ustar00rootroot00000000000000v=spf1 a:%{o0} golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-117000066400000000000000000000000261355241314300247430ustar00rootroot00000000000000v=spf1 +a:o1-%{o1}-o1 golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-118000066400000000000000000000000311355241314300247400ustar00rootroot00000000000000v=spf1 +a:o1r-%{o1r}-o1r golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-119000066400000000000000000000000261355241314300247450ustar00rootroot00000000000000v=spf1 +a:o7-%{o7}-o7 golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-120000066400000000000000000000000301355241314300247300ustar00rootroot00000000000000v=spf1 +a:ooo-%{o7}-ooo golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-121000066400000000000000000000000271355241314300247370ustar00rootroot00000000000000v=spf1 +a:ooo-%{o}-ooo golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-122000066400000000000000000000000271355241314300247400ustar00rootroot00000000000000v=spf1 +a:OOO-%{O}-OOO golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-123000066400000000000000000000000271355241314300247410ustar00rootroot00000000000000v=spf1 +a:ppp-%{p}-ppp golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-124000066400000000000000000000000311355241314300247350ustar00rootroot00000000000000v=spf1 +a:sra-%{sr.}-sra golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-125000066400000000000000000000000261355241314300247420ustar00rootroot00000000000000v=spf1 +a:sr-%{sr}-sr golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-126000066400000000000000000000000271355241314300247440ustar00rootroot00000000000000v=spf1 +a:sss-%{s}-sss golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-127000066400000000000000000000000271355241314300247450ustar00rootroot00000000000000v=spf1 +a:vvv-%{v}-vvv golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-128000066400000000000000000000000161355241314300247440ustar00rootroot00000000000000v=spf1 a:%{x} golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-129000066400000000000000000000000561355241314300247510ustar00rootroot00000000000000v=spf1 a:\xEF\xBB\xBFgarbage.example.net -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-130000066400000000000000000000000211355241314300247310ustar00rootroot00000000000000v=spf1 default=+ golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-131000066400000000000000000000000211355241314300247320ustar00rootroot00000000000000v=spf1 default=- golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-132000066400000000000000000000000241355241314300247360ustar00rootroot00000000000000v=spf1 default=pass golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-133000066400000000000000000000000161355241314300247400ustar00rootroot00000000000000v=spf1 exists golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-134000066400000000000000000000000171355241314300247420ustar00rootroot00000000000000v=spf1 exists: golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-135000066400000000000000000000000311355241314300247370ustar00rootroot00000000000000v=spf1 exists:d1111 -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-136000066400000000000000000000000431355241314300247430ustar00rootroot00000000000000v=spf1 exists:err.example.com -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-137000066400000000000000000000000541355241314300247460ustar00rootroot00000000000000v=spf1 exists:foo%(ir).sbl.example.com ?all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-138000066400000000000000000000000501355241314300247430ustar00rootroot00000000000000v=spf1 exists:foo%.sbl.example.com ?all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-139000066400000000000000000000000461355241314300247510ustar00rootroot00000000000000v=spf1 exists:%{i}.%{l2r-}.user.%{d2} golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-140000066400000000000000000000000521355241314300247360ustar00rootroot00000000000000v=spf1 -exists:%(ir).sbl.example.com ?all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-141000066400000000000000000000000421355241314300247360ustar00rootroot00000000000000v=spf1 exists:%{l2r+-}.user.%{d2} golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-142000066400000000000000000000000451355241314300247420ustar00rootroot00000000000000v=spf1 exists:mail6.example.com -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-143000066400000000000000000000000371355241314300247440ustar00rootroot00000000000000v=spf1 exists:mail.example.com golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-144000066400000000000000000000000421355241314300247410ustar00rootroot00000000000000v=spf1 exists:mail.example.com/24 golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-145000066400000000000000000000001021355241314300247370ustar00rootroot00000000000000v=spf1 exists:%{p}.should.example.com ~exists:%{p}.ok.example.com golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-146000066400000000000000000000000211355241314300247400ustar00rootroot00000000000000v=spf1 exp= -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-147000066400000000000000000000000201355241314300247400ustar00rootroot00000000000000v=spf1 exp=-all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-148000066400000000000000000000000431355241314300247460ustar00rootroot00000000000000v=spf1 exp=badexp.example.com -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-149000066400000000000000000000000251355241314300247470ustar00rootroot00000000000000v=spf1 exp=blah +all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-150000066400000000000000000000000431355241314300247370ustar00rootroot00000000000000v=spf1 exp=e13msg.example.com -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-151000066400000000000000000000000721355241314300247420ustar00rootroot00000000000000v=spf1 exp=e13msg.example.com -all exp=e11msg.example.com golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-152000066400000000000000000000000431355241314300247410ustar00rootroot00000000000000v=spf1 exp=e21msg.example.com -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-153000066400000000000000000000000641355241314300247450ustar00rootroot00000000000000v=spf1 exp=exp1.example.com redirect=e2.example.com golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-154000066400000000000000000000000641355241314300247460ustar00rootroot00000000000000v=spf1 exp=exp1.example.com redirect=e4.example.com golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-155000066400000000000000000000000411355241314300247420ustar00rootroot00000000000000v=spf1 exp=mail.example.com -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-156000066400000000000000000000000411355241314300247430ustar00rootroot00000000000000v=spf1 exp=msg.example.com. -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-157000066400000000000000000000000431355241314300247460ustar00rootroot00000000000000v=spf1 exp=twoexp.example.com -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-158000066400000000000000000000000241355241314300247460ustar00rootroot00000000000000v=spf1 include +all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-159000066400000000000000000000000251355241314300247500ustar00rootroot00000000000000v=spf1 include: -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-160000066400000000000000000000000431355241314300247400ustar00rootroot00000000000000v=spf1 include:domain2 ip4:1.1.1.1 golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-161000066400000000000000000000000331355241314300247400ustar00rootroot00000000000000v=spf1 include:domain ~all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-162000066400000000000000000000000361355241314300247440ustar00rootroot00000000000000v=spf1 include:e2.example.com golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-163000066400000000000000000000000361355241314300247450ustar00rootroot00000000000000v=spf1 include:e3.example.com golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-164000066400000000000000000000000701355241314300247440ustar00rootroot00000000000000v=spf1 include:e3.example.com -all exp=exp3.example.com golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-165000066400000000000000000000000431355241314300247450ustar00rootroot00000000000000v=spf1 include:e6.example.com -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-166000066400000000000000000000000501355241314300247440ustar00rootroot00000000000000v=spf1 include:erehwon.example.com -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-167000066400000000000000000000000471355241314300247530ustar00rootroot00000000000000v=spf1 include:ip5.example.com/24 -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-168000066400000000000000000000000441355241314300247510ustar00rootroot00000000000000v=spf1 include:ip5.example.com ~all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-169000066400000000000000000000000431355241314300247510ustar00rootroot00000000000000v=spf1 include:ip6.example.com all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-170000066400000000000000000000000441355241314300247420ustar00rootroot00000000000000v=spf1 include:ip7.example.com -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-171000066400000000000000000000000441355241314300247430ustar00rootroot00000000000000v=spf1 include:ip8.example.com -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-172000066400000000000000000000000471355241314300247470ustar00rootroot00000000000000v=spf1 include:o.spf.example.com. ~all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-173000066400000000000000000000000601355241314300247430ustar00rootroot00000000000000v=spf1 -include:_spfh.%{d2} ip4:1.2.3.0/24 -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-174000066400000000000000000000000131355241314300247420ustar00rootroot00000000000000v=spf1 ip4 golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-175000066400000000000000000000000321355241314300247440ustar00rootroot00000000000000v=spf1 ip4:1.1.1.1/0 -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-176000066400000000000000000000000331355241314300247460ustar00rootroot00000000000000v=spf1 ip4:1.1.1.1/33 -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-177000066400000000000000000000000301355241314300247440ustar00rootroot00000000000000v=spf1 ip4:1.1.1.1 -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-178000066400000000000000000000000531355241314300247520ustar00rootroot00000000000000v=spf1 ip4:1.1.1.1 redirect=e1.example.com golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-179000066400000000000000000000000211355241314300247460ustar00rootroot00000000000000v=spf1 ip4:1.2.3 golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-180000066400000000000000000000000231355241314300247400ustar00rootroot00000000000000v=spf1 ip4:1.2.3.4 golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-181000066400000000000000000000000341355241314300247430ustar00rootroot00000000000000v=spf1 ip4:1.2.3.4/032 -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-182000066400000000000000000000000271355241314300247460ustar00rootroot00000000000000v=spf1 ip4:1.2.3.4//32 golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-183000066400000000000000000000000331355241314300247440ustar00rootroot00000000000000v=spf1 ip4:1.2.3.4/32 -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-184000066400000000000000000000000331355241314300247450ustar00rootroot00000000000000v=spf1 ip4:1.2.3.4/33 -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-185000066400000000000000000000000301355241314300247430ustar00rootroot00000000000000v=spf1 ip4:1.2.3.4:8080 golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-186000066400000000000000000000000341355241314300247500ustar00rootroot00000000000000v=spf1 ip4:1.2.3.4 -all moo golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-187000066400000000000000000000000471355241314300247550ustar00rootroot00000000000000v=spf1 -ip4:1.2.3.4 ip6:::FFFF:1.2.3.4 golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-188000066400000000000000000000000531355241314300247530ustar00rootroot00000000000000v=spf1 ip4:1.2.3.4 redirect:t2.example.com golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-189000066400000000000000000000000531355241314300247540ustar00rootroot00000000000000v=spf1 ip4:1.2.3.4 redirect=t2.example.com golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-190000066400000000000000000000000301355241314300247370ustar00rootroot00000000000000v=spf1 ip4:1.2.3.5 -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-191000066400000000000000000000000301355241314300247400ustar00rootroot00000000000000v=spf1 ip4:1.2.3.6 ~all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-192000066400000000000000000000000301355241314300247410ustar00rootroot00000000000000v=spf1 ip4:1.2.3.7 ?all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-193000066400000000000000000000000321355241314300247440ustar00rootroot00000000000000v=spf1 ip4:192.168.218.40 golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-194000066400000000000000000000000271355241314300247510ustar00rootroot00000000000000v=spf1 ip6:::1.1.1.1/0 golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-195000066400000000000000000000000311355241314300247450ustar00rootroot00000000000000v=spf1 ip6:::1.1.1.1/129 golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-196000066400000000000000000000000311355241314300247460ustar00rootroot00000000000000v=spf1 ip6:::1.1.1.1//33 golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-197000066400000000000000000000000271355241314300247540ustar00rootroot00000000000000v=spf1 ip6::CAFE::BABE golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-198000066400000000000000000000000371355241314300247560ustar00rootroot00000000000000v=spf1 ip6:Cafe:Babe:8000::/33 golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-199000066400000000000000000000000371355241314300247570ustar00rootroot00000000000000v=spf1 ip6:CAFE:BABE:8000::/33 golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-200000066400000000000000000000000641355241314300247360ustar00rootroot00000000000000v=spf1 moo.cow-far_out=man:dog/cat ip4:1.2.3.4 -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-201000066400000000000000000000000641355241314300247370ustar00rootroot00000000000000v=spf1 moo.cow/far_out=man:dog/cat ip4:1.2.3.4 -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-202000066400000000000000000000000641355241314300247400ustar00rootroot00000000000000v=spf1 moo.cow:far_out=man:dog/cat ip4:1.2.3.4 -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-203000066400000000000000000000000121355241314300247320ustar00rootroot00000000000000v=spf1 mx golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-204000066400000000000000000000000221355241314300247340ustar00rootroot00000000000000v=spf1 mx//0 -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-205000066400000000000000000000000211355241314300247340ustar00rootroot00000000000000v=spf1 mx/0 -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-206000066400000000000000000000000241355241314300247400ustar00rootroot00000000000000v=spf1 mx//129 -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-207000066400000000000000000000000701355241314300247420ustar00rootroot00000000000000v=spf1 mx/26 exists:%{l}.%{d}.%{i}.spf.example.net -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-208000066400000000000000000000000231355241314300247410ustar00rootroot00000000000000v=spf1 mx//33 -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-209000066400000000000000000000000221355241314300247410ustar00rootroot00000000000000v=spf1 mx/33 -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-210000066400000000000000000000000221355241314300247310ustar00rootroot00000000000000v=spf1 mx:abc.123 golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-211000066400000000000000000000000201355241314300247300ustar00rootroot00000000000000v=spf1 mx: -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-212000066400000000000000000000000351355241314300247370ustar00rootroot00000000000000v=spf1 mx:d1110/24//100 ~all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-213000066400000000000000000000000341355241314300247370ustar00rootroot00000000000000v=spf1 mx:d1110/24/100 ~all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-214000066400000000000000000000000351355241314300247410ustar00rootroot00000000000000v=spf1 mx:d1110/24//129 ~all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-215000066400000000000000000000000351355241314300247420ustar00rootroot00000000000000v=spf1 mx:d6660/24//100 ~all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-216000066400000000000000000000000341355241314300247420ustar00rootroot00000000000000v=spf1 mx:d6660/24/100 ~all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-217000066400000000000000000000000311355241314300247400ustar00rootroot00000000000000v=spf1 mx:d6660//24 ~all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-218000066400000000000000000000000271355241314300247460ustar00rootroot00000000000000v=spf1 mx:example.-com golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-219000066400000000000000000000000331355241314300247440ustar00rootroot00000000000000v=spf1 mx:example.com:8080 golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-220000066400000000000000000000000261355241314300247360ustar00rootroot00000000000000v=spf1 mx:%{fff} -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-221000066400000000000000000000000421355241314300247350ustar00rootroot00000000000000v=spf1 mx:foo:bar/baz.example.com golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-222000066400000000000000000000000341355241314300247370ustar00rootroot00000000000000v=spf1 mx:foo.example.com\0 golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-223000066400000000000000000000000351355241314300247410ustar00rootroot00000000000000v=spf1 mx:foo.example.com/24 golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-224000066400000000000000000000000441355241314300247420ustar00rootroot00000000000000v=spf1 mx redirect=_spf.example.com golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-225000066400000000000000000000000131355241314300247370ustar00rootroot00000000000000v=spf1 ptr golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-226000066400000000000000000000000141355241314300247410ustar00rootroot00000000000000v=spf1 ptr: golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-227000066400000000000000000000000221355241314300247410ustar00rootroot00000000000000v=spf1 ptr/0 -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-228000066400000000000000000000000201355241314300247400ustar00rootroot00000000000000v=spf1 ptr -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-229000066400000000000000000000000341355241314300247460ustar00rootroot00000000000000v=spf1 ptr:example.com -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-230000066400000000000000000000000341355241314300247360ustar00rootroot00000000000000v=spf1 ptr:example.Com -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-231000066400000000000000000000001131355241314300247350ustar00rootroot00000000000000v=spf1 ptr:fe.example.org ptr:sgp.example.com exp=_expspf.example.org -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-232000066400000000000000000000000271355241314300247420ustar00rootroot00000000000000v=spf1 ptr:%{fff} -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-233000066400000000000000000000000301355241314300247350ustar00rootroot00000000000000v=spf1 ptr:sonlas7 -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-234000066400000000000000000000000211355241314300247360ustar00rootroot00000000000000v=spf1 redirect= golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-235000066400000000000000000000000321355241314300247410ustar00rootroot00000000000000v=spf1 redirect=-all ?all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-236000066400000000000000000000000421355241314300247430ustar00rootroot00000000000000v=spf1 redirect=a.spf.example.com golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-237000066400000000000000000000000501355241314300247430ustar00rootroot00000000000000v=spf1 redirect=%{d}.d.spf.example.com. golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-238000066400000000000000000000000351355241314300247470ustar00rootroot00000000000000v=spf1 redirect=doesnotexist golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-239000066400000000000000000000000301355241314300247430ustar00rootroot00000000000000v=spf1 redirect=domain2 golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-240000066400000000000000000000000761355241314300247450ustar00rootroot00000000000000v=spf1 redirect=e12.example.com -all redirect=e12.example.com golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-241000066400000000000000000000000441355241314300247410ustar00rootroot00000000000000v=spf1 redirect=erehwon.example.com golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-242000066400000000000000000000000301355241314300247350ustar00rootroot00000000000000v=spf1 redirect=faildom golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-243000066400000000000000000000000341355241314300247420ustar00rootroot00000000000000v=spf1 redirect=faildom all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-244000066400000000000000000000000271355241314300247450ustar00rootroot00000000000000v=spf1 redirect=%{fff} golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-245000066400000000000000000000000441355241314300247450ustar00rootroot00000000000000v=spf1 redirect=t5.example.com ~all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-246000066400000000000000000000000511355241314300247440ustar00rootroot00000000000000v=spf1 redirect=testimplicit.example.com golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/fuzz/corpus/t-247000066400000000000000000000000361355241314300247500ustar00rootroot00000000000000v=spf1 \x80a:example.net -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/pyspf-tests.LICENSE000066400000000000000000000002021355241314300252370ustar00rootroot00000000000000The pyspf tests come from pyspf project as of commit de8d8fb150. pysf is licenced under the Python Software Foundation License. golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/pyspf-tests.yml000066400000000000000000000125431355241314300247710ustar00rootroot00000000000000# This is the test suite used during development of the pyspf library. # It is a collection of ad hoc tests based on bug reports. It is the # goal of the SPF test project to have an elegant and minimal test suite # that reflects RFC 4408. However, this should help get things started # by serving as a example of what tests look like. Also, any implementation # that flunks this, should flunk the minimal elegant suite as well. # # We extended the test attributes with 'receiver' and 'header' to test # our implementation of the Received-SPF header. This cannot easily # be part of the RFC test suite because of wide latitude in formatting. # --- comment: | check basic exists with macros tests: exists-pass: helo: mail.example.net host: 1.2.3.5 mailfrom: lyme.eater@example.co.uk result: pass receiver: receiver.com header: >- Pass (receiver.com: domain of example.co.uk designates 1.2.3.5 as permitted sender) client-ip=1.2.3.5; envelope-from="lyme.eater@example.co.uk"; helo=mail.example.net; receiver=receiver.com; mechanism="exists:%{l}.%{d}.%{i}.spf.example.net"; identity=mailfrom exists-fail: helo: mail.example.net host: 1.2.3.4 mailfrom: lyme.eater@example.co.uk result: fail zonedata: lyme.eater.example.co.uk.1.2.3.5.spf.example.net: - A: 127.0.0.1 example.co.uk: - SPF: v=spf1 mx/26 exists:%{l}.%{d}.%{i}.spf.example.net -all --- comment: | permerror detection tests: incloop: comment: | include loop helo: mail.example.com host: 66.150.186.79 mailfrom: chuckvsr@examplea.com result: permerror badall: helo: mail.example.com host: 66.150.186.79 mailfrom: chuckvsr@examplec.com result: permerror baddomain: helo: mail.example.com host: 66.150.186.79 mailfrom: chuckvsr@exampled.com result: permerror receiver: receiver.com header: >- PermError (receiver.com: permanent error in processing domain of exampled.com: Invalid domain found (use FQDN)) client-ip=66.150.186.79; envelope-from="chuckvsr@exampled.com"; helo=mail.example.com; receiver=receiver.com; problem="examplea.com:8080"; identity=mailfrom skip: Not worth the complexity of erroring on this. tworecs: helo: mail.example.com host: 66.150.186.79 mailfrom: chuckvsr@examplef.com result: permerror receiver: receiver.com header: >- PermError (receiver.com: permanent error in processing domain of examplef.com: Two or more type TXT spf records found.) client-ip=66.150.186.79; envelope-from="chuckvsr@examplef.com"; helo=mail.example.com; receiver=receiver.com; identity=mailfrom badip: helo: mail.example.com host: 66.150.186.79 mailfrom: chuckvsr@examplee.com result: permerror zonedata: examplea.com: - SPF: v=spf1 a mx include:b.com exampleb.com: - SPF: v=spf1 a mx include:a.com examplec.com: - SPF: v=spf1 -all:foobar exampled.com: - SPF: v=spf1 a:examplea.com:8080 examplee.com: - SPF: v=spf1 ip4:1.2.3.4:8080 examplef.com: - SPF: v=spf1 -all - SPF: v=spf1 +all --- tests: nospace1: comment: | test no space test multi-line comment helo: mail.example1.com host: 1.2.3.4 mailfrom: foo@example2.com result: none empty: comment: | test empty helo: mail1.example1.com host: 1.2.3.4 mailfrom: foo@example1.com result: neutral nospace2: helo: mail.example1.com host: 1.2.3.4 mailfrom: foo@example3.com result: pass zonedata: example3.com: - SPF: [ 'v=spf1','mx' ] - SPF: [ 'v=spf1 ', 'mx' ] - MX: [0, mail.example1.com] example1.com: - SPF: v=spf1 example2.com: - SPF: v=spf1mx mail.example1.com: - A: 1.2.3.4 --- comment: | corner cases tests: emptyMX: comment: | test empty MX helo: mail.example.com host: 1.2.3.4 mailfrom: "" result: neutral localhost: helo: mail.example.com host: 127.0.0.1 mailfrom: root@example.com result: fail default-modifier: comment: | default modifier implemented in lax mode for compatibility helo: mail.example.com host: 1.2.3.4 mailfrom: root@e1.example.com result: fail strict: 0 skip: It's not clear this is problematic. default-modifier-harsh: comment: | default modifier implemented in lax mode for compatibility helo: mail.example.com host: 1.2.3.4 mailfrom: root@e1.example.com result: ambiguous strict: 2 skip: It's not clear this is problematic. cname-chain: comment: | pyspf was duplicating TXT (and other) records while following CNAME helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e2.example.com result: pass skip: Test runner doesn't handle CNAMEs yet. null-cname: comment: | pyspf was getting a type error for null CNAMEs Thanks to Kazuhiro Ogura helo: mail.example.com host: 1.2.3.4 mailfrom: bar@e3.example.com result: softfail zonedata: mail.example.com: - MX: [0, ''] - SPF: v=spf1 mx example.com: - SPF: v=spf1 -all e1.example.com: - SPF: v=spf1 default=- e2.example.com: - CNAME: c1.example.com. c1.example.com: - CNAME: c2.example.com. c2.example.com: - SPF: v=spf1 a a:c1.example.com -all - A: 1.2.3.4 mx1.example.com: - CNAME: '' e3.example.com: - SPF: v=spf1 a:mx1.example.com mx:mx1.example.com ~all golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/rfc-tests.README000066400000000000000000000003671355241314300245370ustar00rootroot00000000000000 The RFC tests were copied from the pyspf repository at https://github.com/sdgathman/pyspf. They are licensed separately, and only used for testing purposes. See the open-spf test suite page for more details: http://www.open-spf.org/Test_Suite/ golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/rfc4408-tests.LICENSE000066400000000000000000000027431355241314300252040ustar00rootroot00000000000000The RFC 4408 test-suite (rfc4408-tests.yml) is (C) 2006-2007 Stuart D Gathman 2007 Julian Mehnle All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/rfc4408-tests.yml000066400000000000000000002224501355241314300247220ustar00rootroot00000000000000# This is the openspf.org test suite (release 2009.10) based on RFC 4408. # http://www.openspf.org/Test_Suite # # $Id$ # vim:sw=2 sts=2 et # # See rfc4408-tests.CHANGES for a changelog. # # Contributors: # Stuart D Gathman 90% of the tests # Julian Mehnle proofread YAML syntax, spelling, formal schema # Informal contributors (suggestions but no code): # Craig Whitmore # Frank Ellermann # Scott Kitterman # Wayne Schlitt # Craig Whitmore # Norman Maurer # Mark Shewmaker # Philip Gladstone # # While the test suite is designed for all types of implementations, it only # needs to explicitly concern itself with SPF-only (type 99) and TXT-only # implementations. This is because while an implementation may support both, # it must use only one record type for a given query - see 4.5/5. If an # implementation finds SPF (type 99) records and decides to use them, they # override TXT, and it must ignore any TXT records. Note that an # implementation may decide whether to use SPF records on a case by case basis. # Maybe it looks TXT and SPF up in parallel and goes with the first result to # come back. Or maybe one is cached already. Or maybe it chooses at random. # Think of dual SPF/TXT implementations as a quantum superposition of SPF-only # and TXT-only. It must collapse to one or the other on each observation to be # compliant. # # The "Selecting records" test section is the only one concerned with weeding # out (incorrect) mixed behaviour and checking for proper response to duplicate # or conflicting records. Other sections rely on auto-magic duplication # of SPF to TXT records (by test suite drivers) to test all implementation # types with one specification. # --- description: Initial processing tests: toolonglabel: description: >- DNS labels limited to 63 chars. comment: >- For initial processing, a long label results in None, not TempError spec: 4.3/1 helo: mail.example.net host: 1.2.3.5 mailfrom: lyme.eater@A123456789012345678901234567890123456789012345678901234567890123.example.com result: none longlabel: description: >- DNS labels limited to 63 chars. spec: 4.3/1 helo: mail.example.net host: 1.2.3.5 mailfrom: lyme.eater@A12345678901234567890123456789012345678901234567890123456789012.example.com result: fail emptylabel: spec: 4.3/1 helo: mail.example.net host: 1.2.3.5 mailfrom: lyme.eater@A...example.com result: none helo-not-fqdn: spec: 4.3/1 helo: A2345678 host: 1.2.3.5 mailfrom: "" result: none helo-domain-literal: spec: 4.3/1 helo: "[1.2.3.5]" host: 1.2.3.5 mailfrom: "" result: none nolocalpart: spec: 4.3/2 helo: mail.example.net host: 1.2.3.4 mailfrom: '@example.net' result: fail explanation: postmaster domain-literal: spec: 4.3/1 helo: OEMCOMPUTER host: 1.2.3.5 mailfrom: "foo@[1.2.3.5]" result: none non-ascii-policy: description: >- SPF policies are restricted to 7-bit ascii. spec: 3.1.1/1 helo: hosed host: 1.2.3.4 mailfrom: "foobar@hosed.example.com" result: permerror skip: We don't enforce 7-bit ascii. non-ascii-mech: description: >- SPF policies are restricted to 7-bit ascii. comment: >- Checking a possibly different code path for non-ascii chars. spec: 3.1.1/1 helo: hosed host: 1.2.3.4 mailfrom: "foobar@hosed2.example.com" result: permerror skip: We don't enforce 7-bit ascii. non-ascii-result: description: >- SPF policies are restricted to 7-bit ascii. comment: >- Checking yet another code path for non-ascii chars. spec: 3.1.1/1 helo: hosed host: 1.2.3.4 mailfrom: "foobar@hosed3.example.com" result: permerror non-ascii-non-spf: description: >- Non-ascii content in non-SPF related records. comment: >- Non-SPF related TXT records are none of our business. (But what about SPF records?) spec: 3.1.1/1 helo: hosed host: 1.2.3.4 mailfrom: "foobar@nothosed.example.com" result: fail explanation: DEFAULT two-spaces: description: >- ABNF for term separation is one or more spaces, not just one. spec: 4.6.1 helo: hosed host: 1.2.3.4 mailfrom: "actually@fine.example.com" result: fail zonedata: example.com: - TIMEOUT: true example.net: - SPF: v=spf1 -all exp=exp.example.net a.example.net: - SPF: v=spf1 -all exp=exp.example.net exp.example.net: - TXT: '%{l}' a12345678901234567890123456789012345678901234567890123456789012.example.com: - SPF: v=spf1 -all hosed.example.com: - SPF: "v=spf1 a:\xEF\xBB\xBFgarbage.example.net -all" hosed2.example.com: - SPF: "v=spf1 \x80a:example.net -all" hosed3.example.com: - SPF: "v=spf1 a:example.net \x96all" nothosed.example.com: - SPF: "v=spf1 a:example.net -all" - SPF: "\x96" fine.example.com: - TXT: "v=spf1 a -all" --- description: Record lookup tests: both: spec: 4.4/1 helo: mail.example.net host: 1.2.3.4 mailfrom: foo@both.example.net result: fail txtonly: description: Result is none if checking SPF records only. spec: 4.4/1 helo: mail.example.net host: 1.2.3.4 mailfrom: foo@txtonly.example.net result: [fail, none] spfonly: description: Result is none if checking TXT records only. spec: 4.4/1 helo: mail.example.net host: 1.2.3.4 mailfrom: foo@spfonly.example.net result: [fail, none] spftimeout: description: >- TXT record present, but SPF lookup times out. Result is temperror if checking SPF records only. comment: >- This actually happens for a popular braindead DNS server. spec: 4.4/1 helo: mail.example.net host: 1.2.3.4 mailfrom: foo@spftimeout.example.net result: [fail, temperror] txttimeout: description: >- SPF record present, but TXT lookup times out. If only TXT records are checked, result is temperror. spec: 4.4/1 helo: mail.example.net host: 1.2.3.4 mailfrom: foo@txttimeout.example.net result: [fail, temperror] nospftxttimeout: description: >- No SPF record present, and TXT lookup times out. If only TXT records are checked, result is temperror. comment: >- Because TXT records is where v=spf1 records will likely be, returning temperror will try again later. A timeout due to a braindead server is unlikely in the case of TXT, as opposed to the newer SPF RR. spec: 4.4/1 helo: mail.example.net host: 1.2.3.4 mailfrom: foo@nospftxttimeout.example.net result: [temperror, none] alltimeout: description: Both TXT and SPF queries time out spec: 4.4/2 helo: mail.example.net host: 1.2.3.4 mailfrom: foo@alltimeout.example.net result: temperror zonedata: both.example.net: - TXT: v=spf1 -all - SPF: v=spf1 -all txtonly.example.net: - TXT: v=spf1 -all spfonly.example.net: - SPF: v=spf1 -all - TXT: NONE spftimeout.example.net: - TXT: v=spf1 -all - TIMEOUT: true txttimeout.example.net: - SPF: v=spf1 -all - TXT: NONE - TIMEOUT: true nospftxttimeout.example.net: - SPF: "v=spf3 !a:yahoo.com -all" - TXT: NONE - TIMEOUT: true alltimeout.example.net: - TIMEOUT: true --- description: Selecting records tests: nospace1: description: >- Version must be terminated by space or end of record. TXT pieces are joined without intervening spaces. spec: 4.5/4 helo: mail.example1.com host: 1.2.3.4 mailfrom: foo@example2.com result: none empty: description: Empty SPF record. spec: 4.5/4 helo: mail1.example1.com host: 1.2.3.4 mailfrom: foo@example1.com result: neutral nospace2: spec: 4.5/4 helo: mail.example1.com host: 1.2.3.4 mailfrom: foo@example3.com result: pass spfoverride: description: >- SPF records override TXT records. Older implementation may check TXT records only. spec: 4.5/5 helo: mail.example1.com host: 1.2.3.4 mailfrom: foo@example4.com result: [pass, fail] multitxt1: description: >- Older implementations will give permerror/unknown because of the conflicting TXT records. However, RFC 4408 says the SPF records overrides them. spec: 4.5/5 helo: mail.example1.com host: 1.2.3.4 mailfrom: foo@example5.com result: [pass, permerror] multitxt2: description: >- Multiple records is a permerror, v=spf1 is case insensitive spec: 4.5/6 helo: mail.example1.com host: 1.2.3.4 mailfrom: foo@example6.com result: permerror multispf1: description: >- Multiple records is a permerror, even when they are identical. However, this situation cannot be reliably reproduced with live DNS since cache and resolvers are allowed to combine identical records. spec: 4.5/6 helo: mail.example1.com host: 1.2.3.4 mailfrom: foo@example7.com result: [permerror, fail] multispf2: description: >- Older implementations ignoring SPF-type records will give pass because there is a (single) TXT record. But RFC 4408 requires permerror because the SPF records override and there are more than one. spec: 4.5/6 helo: mail.example1.com host: 1.2.3.4 mailfrom: foo@example8.com result: [permerror, pass] nospf: spec: 4.5/7 helo: mail.example1.com host: 1.2.3.4 mailfrom: foo@mail.example1.com result: none case-insensitive: description: >- v=spf1 is case insensitive spec: 4.5/6 helo: mail.example1.com host: 1.2.3.4 mailfrom: foo@example9.com result: softfail zonedata: example3.com: - SPF: v=spf10 - SPF: v=spf1 mx - MX: [0, mail.example1.com] example1.com: - SPF: v=spf1 example2.com: - SPF: ['v=spf1', 'mx'] mail.example1.com: - A: 1.2.3.4 example4.com: - SPF: v=spf1 +all - TXT: v=spf1 -all example5.com: - SPF: v=spf1 +all - TXT: v=spf1 -all - TXT: v=spf1 +all example6.com: - SPF: v=spf1 -all - SPF: V=sPf1 +all example7.com: - SPF: v=spf1 -all - SPF: v=spf1 -all example8.com: - SPF: V=spf1 -all - SPF: v=spf1 -all - TXT: v=spf1 +all example9.com: - SPF: v=SpF1 ~all --- description: Record evaluation tests: detect-errors-anywhere: description: Any syntax errors anywhere in the record MUST be detected. spec: 4.6 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@t1.example.com result: permerror skip: We don't catch errors after a match. modifier-charset-good: description: name = ALPHA *( ALPHA / DIGIT / "-" / "_" / "." ) spec: 4.6.1/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@t2.example.com result: pass skip: We don't enforce the domain charset. modifier-charset-bad1: description: >- '=' character immediately after the name and before any ":" or "/" spec: 4.6.1/4 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@t3.example.com result: permerror modifier-charset-bad2: description: >- '=' character immediately after the name and before any ":" or "/" spec: 4.6.1/4 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@t4.example.com result: permerror redirect-after-mechanisms1: description: >- The "redirect" modifier has an effect after all the mechanisms. comment: >- The redirect in this example would violate processing limits, except that it is never used because of the all mechanism. spec: 4.6.3 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@t5.example.com result: softfail redirect-after-mechanisms2: description: >- The "redirect" modifier has an effect after all the mechanisms. spec: 4.6.3 helo: mail.example.com host: 1.2.3.5 mailfrom: foo@t6.example.com result: fail skip: Not worth the complexity of erroring on this. default-result: description: Default result is neutral. spec: 4.7/1 helo: mail.example.com host: 1.2.3.5 mailfrom: foo@t7.example.com result: neutral redirect-is-modifier: description: |- Invalid mechanism. Redirect is a modifier. spec: 4.6.1/4 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@t8.example.com result: permerror skip: We don't catch errors after a match. invalid-domain: description: >- Domain-spec must end in macro-expand or valid toplabel. spec: 8.1/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@t9.example.com result: permerror skip: We don't enforce TLD structure. invalid-domain-empty-label: description: >- target-name that is a valid domain-spec per RFC 4408 but an invalid domain name per RFC 1035 (empty label) must be treated as non-existent. comment: >- An empty domain label, i.e. two successive dots, in a mechanism target-name is valid domain-spec syntax, even though a DNS query cannot be composed from it. The spec being unclear about it, this could either be considered a syntax error, or, by analogy to 4.3/1 and 5/10/3, the mechanism chould be treated as a no-match. spec: [4.3/1, 5/10/3] helo: mail.example.com host: 1.2.3.4 mailfrom: foo@t10.example.com result: [permerror, fail] invalid-domain-long: description: >- target-name that is a valid domain-spec per RFC 4408 but an invalid domain name per RFC 1035 (long label) must be treated as non-existent. comment: >- A domain label longer than 63 characters in a mechanism target-name is valid domain-spec syntax, even though a DNS query cannot be composed from it. The spec being unclear about it, this could either be considered a syntax error, or, by analogy to 4.3/1 and 5/10/3, the mechanism chould be treated as a no-match. spec: [4.3/1, 5/10/3] helo: mail.example.com host: 1.2.3.4 mailfrom: foo@t11.example.com result: [permerror,fail] invalid-domain-long-via-macro: description: >- target-name that is a valid domain-spec per RFC 4408 but an invalid domain name per RFC 1035 (long label) must be treated as non-existent. comment: >- A domain label longer than 63 characters that results from macro expansion in a mechanism target-name is valid domain-spec syntax (and is not even subject to syntax checking after macro expansion), even though a DNS query cannot be composed from it. The spec being unclear about it, this could either be considered a syntax error, or, by analogy to 4.3/1 and 5/10/3, the mechanism chould be treated as a no-match. spec: [4.3/1, 5/10/3] helo: "%%%%%%%%%%%%%%%%%%%%%%" host: 1.2.3.4 mailfrom: foo@t12.example.com result: [permerror,fail] zonedata: mail.example.com: - A: 1.2.3.4 t1.example.com: - SPF: v=spf1 ip4:1.2.3.4 -all moo t2.example.com: - SPF: v=spf1 moo.cow-far_out=man:dog/cat ip4:1.2.3.4 -all t3.example.com: - SPF: v=spf1 moo.cow/far_out=man:dog/cat ip4:1.2.3.4 -all t4.example.com: - SPF: v=spf1 moo.cow:far_out=man:dog/cat ip4:1.2.3.4 -all t5.example.com: - SPF: v=spf1 redirect=t5.example.com ~all t6.example.com: - SPF: v=spf1 ip4:1.2.3.4 redirect=t2.example.com t7.example.com: - SPF: v=spf1 ip4:1.2.3.4 t8.example.com: - SPF: v=spf1 ip4:1.2.3.4 redirect:t2.example.com t9.example.com: - SPF: v=spf1 a:foo-bar -all t10.example.com: - SPF: v=spf1 a:mail.example...com -all t11.example.com: - SPF: v=spf1 a:a123456789012345678901234567890123456789012345678901234567890123.example.com -all t12.example.com: - SPF: v=spf1 a:%{H}.bar -all --- description: ALL mechanism syntax tests: all-dot: description: | all = "all" comment: |- At least one implementation got this wrong spec: 5.1/1 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e1.example.com result: permerror all-arg: description: | all = "all" comment: |- At least one implementation got this wrong spec: 5.1/1 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e2.example.com result: permerror all-cidr: description: | all = "all" spec: 5.1/1 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e3.example.com result: permerror all-neutral: description: | all = "all" spec: 5.1/1 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e4.example.com result: neutral all-double: description: | all = "all" spec: 5.1/1 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e5.example.com result: pass zonedata: mail.example.com: - A: 1.2.3.4 e1.example.com: - SPF: v=spf1 -all. e2.example.com: - SPF: v=spf1 -all:foobar e3.example.com: - SPF: v=spf1 -all/8 e4.example.com: - SPF: v=spf1 ?all e5.example.com: - SPF: v=spf1 all -all --- description: PTR mechanism syntax tests: ptr-cidr: description: |- PTR = "ptr" [ ":" domain-spec ] spec: 5.5/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e1.example.com result: permerror ptr-match-target: description: >- Check all validated domain names to see if they end in the domain. spec: 5.5/5 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e2.example.com result: pass ptr-match-implicit: description: >- Check all validated domain names to see if they end in the domain. spec: 5.5/5 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e3.example.com result: pass ptr-nomatch-invalid: description: >- Check all validated domain names to see if they end in the domain. comment: >- This PTR record does not validate spec: 5.5/5 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e4.example.com result: fail ptr-match-ip6: description: >- Check all validated domain names to see if they end in the domain. spec: 5.5/5 helo: mail.example.com host: CAFE:BABE::1 mailfrom: foo@e3.example.com result: pass ptr-empty-domain: description: >- domain-spec cannot be empty. spec: 5.5/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e5.example.com result: permerror zonedata: mail.example.com: - A: 1.2.3.4 e1.example.com: - SPF: v=spf1 ptr/0 -all e2.example.com: - SPF: v=spf1 ptr:example.com -all 4.3.2.1.in-addr.arpa: - PTR: e3.example.com - PTR: e4.example.com - PTR: mail.example.com 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.E.B.A.B.E.F.A.C.ip6.arpa: - PTR: e3.example.com e3.example.com: - SPF: v=spf1 ptr -all - A: 1.2.3.4 - AAAA: CAFE:BABE::1 e4.example.com: - SPF: v=spf1 ptr -all e5.example.com: - SPF: "v=spf1 ptr:" --- description: A mechanism syntax tests: a-cidr6: description: | A = "a" [ ":" domain-spec ] [ dual-cidr-length ] dual-cidr-length = [ ip4-cidr-length ] [ "/" ip6-cidr-length ] spec: 5.3/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e6.example.com result: fail a-bad-cidr4: description: | A = "a" [ ":" domain-spec ] [ dual-cidr-length ] dual-cidr-length = [ ip4-cidr-length ] [ "/" ip6-cidr-length ] spec: 5.3/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e6a.example.com result: permerror a-bad-cidr6: description: | A = "a" [ ":" domain-spec ] [ dual-cidr-length ] dual-cidr-length = [ ip4-cidr-length ] [ "/" ip6-cidr-length ] spec: 5.3/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e7.example.com result: permerror a-dual-cidr-ip4-match: description: | A = "a" [ ":" domain-spec ] [ dual-cidr-length ] dual-cidr-length = [ ip4-cidr-length ] [ "/" ip6-cidr-length ] spec: 5.3/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e8.example.com result: pass a-dual-cidr-ip4-err: description: | A = "a" [ ":" domain-spec ] [ dual-cidr-length ] dual-cidr-length = [ ip4-cidr-length ] [ "/" ip6-cidr-length ] spec: 5.3/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e8e.example.com result: permerror a-dual-cidr-ip6-match: description: | A = "a" [ ":" domain-spec ] [ dual-cidr-length ] dual-cidr-length = [ ip4-cidr-length ] [ "/" ip6-cidr-length ] spec: 5.3/2 helo: mail.example.com host: 2001:db8:1234::cafe:babe mailfrom: foo@e8.example.com result: pass a-dual-cidr-ip4-default: description: | A = "a" [ ":" domain-spec ] [ dual-cidr-length ] dual-cidr-length = [ ip4-cidr-length ] [ "/" ip6-cidr-length ] spec: 5.3/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e8b.example.com result: fail a-dual-cidr-ip6-default: description: | A = "a" [ ":" domain-spec ] [ dual-cidr-length ] dual-cidr-length = [ ip4-cidr-length ] [ "/" ip6-cidr-length ] spec: 5.3/2 helo: mail.example.com host: 2001:db8:1234::cafe:babe mailfrom: foo@e8a.example.com result: fail a-multi-ip1: description: >- A matches any returned IP. spec: 5.3/3 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e10.example.com result: pass a-multi-ip2: description: >- A matches any returned IP. spec: 5.3/3 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e10.example.com result: pass a-bad-domain: description: >- domain-spec must pass basic syntax checks; a ':' may appear in domain-spec, but not in top-label spec: 8.1/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e9.example.com result: permerror skip: We don't enforce domain charset. a-nxdomain: description: >- If no ips are returned, A mechanism does not match, even with /0. spec: 5.3/3 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e1.example.com result: fail a-cidr4-0: description: >- Matches if any A records are present in DNS. spec: 5.3/3 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e2.example.com result: pass a-cidr4-0-ip6: description: >- Matches if any A records are present in DNS. spec: 5.3/3 helo: mail.example.com host: 1234::1 mailfrom: foo@e2.example.com result: fail a-cidr6-0-ip4: description: >- Would match if any AAAA records are present in DNS, but not for an IP4 connection. spec: 5.3/3 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e2a.example.com result: fail a-cidr6-0-ip4mapped: description: >- Would match if any AAAA records are present in DNS, but not for an IP4 connection. spec: 5.3/3 helo: mail.example.com host: ::FFFF:1.2.3.4 mailfrom: foo@e2a.example.com result: fail a-cidr6-0-ip6: description: >- Matches if any AAAA records are present in DNS. spec: 5.3/3 helo: mail.example.com host: 1234::1 mailfrom: foo@e2a.example.com result: pass a-ip6-dualstack: description: >- Simple IP6 Address match with dual stack. spec: 5.3/3 helo: mail.example.com host: 1234::1 mailfrom: foo@ipv6.example.com result: pass a-cidr6-0-nxdomain: description: >- No match if no AAAA records are present in DNS. spec: 5.3/3 helo: mail.example.com host: 1234::1 mailfrom: foo@e2b.example.com result: fail a-null: description: >- Null octets not allowed in toplabel spec: 8.1/2 helo: mail.example.com host: 1.2.3.5 mailfrom: foo@e3.example.com result: permerror skip: We don't enforce charset. a-numeric: description: >- toplabel may not be all numeric comment: >- A common publishing mistake is using ip4 addresses with A mechanism. This should receive special diagnostic attention in the permerror. spec: 8.1/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e4.example.com result: permerror skip: We don't enforce domain structure. a-numeric-toplabel: description: >- toplabel may not be all numeric spec: 8.1/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e5.example.com result: permerror skip: We don't enforce TLD structure. a-dash-in-toplabel: description: >- toplabel may contain dashes comment: >- Going from the "toplabel" grammar definition, an implementation using regular expressions in incrementally parsing SPF records might erroneously try to match a TLD such as ".xn--zckzah" (cf. IDN TLDs!) to '( *alphanum ALPHA *alphanum )' first before trying the alternative '( 1*alphanum "-" *( alphanum / "-" ) alphanum )', essentially causing a non-greedy, and thus, incomplete match. Make sure a greedy match is performed! spec: 8.1/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e14.example.com result: pass a-bad-toplabel: description: >- toplabel may not begin with a dash spec: 8.1/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e12.example.com result: permerror skip: We don't enforce TLD structure. a-only-toplabel: description: >- domain-spec may not consist of only a toplabel. spec: 8.1/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e5a.example.com result: permerror skip: We don't enforce TLD structure. a-only-toplabel-trailing-dot: description: >- domain-spec may not consist of only a toplabel. comment: >- "A trailing dot doesn't help." spec: 8.1/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e5b.example.com result: permerror skip: We don't enforce TLD structure. a-colon-domain: description: >- domain-spec may contain any visible char except % spec: 8.1/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e11.example.com result: pass skip: Allowing / in domain names is not worth the complexity a-colon-domain-ip4mapped: description: >- domain-spec may contain any visible char except % spec: 8.1/2 helo: mail.example.com host: ::FFFF:1.2.3.4 mailfrom: foo@e11.example.com result: pass skip: Allowing / in domain names is not worth the complexity a-empty-domain: description: >- domain-spec cannot be empty. spec: 5.3/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e13.example.com result: permerror skip: Not worth the complexity of erroring on this. zonedata: mail.example.com: - A: 1.2.3.4 e1.example.com: - SPF: v=spf1 a/0 -all e2.example.com: - A: 1.1.1.1 - AAAA: 1234::2 - SPF: v=spf1 a/0 -all e2a.example.com: - AAAA: 1234::1 - SPF: v=spf1 a//0 -all e2b.example.com: - A: 1.1.1.1 - SPF: v=spf1 a//0 -all ipv6.example.com: - AAAA: 1234::1 - A: 1.1.1.1 - SPF: v=spf1 a -all e3.example.com: - SPF: "v=spf1 a:foo.example.com\0" e4.example.com: - SPF: v=spf1 a:111.222.33.44 e5.example.com: - SPF: v=spf1 a:abc.123 e5a.example.com: - SPF: v=spf1 a:museum e5b.example.com: - SPF: v=spf1 a:museum. e6.example.com: - SPF: v=spf1 a//33 -all e6a.example.com: - SPF: v=spf1 a/33 -all e7.example.com: - SPF: v=spf1 a//129 -all e8.example.com: - A: 1.2.3.5 - AAAA: 2001:db8:1234::dead:beef - SPF: v=spf1 a/24//64 -all e8e.example.com: - A: 1.2.3.5 - AAAA: 2001:db8:1234::dead:beef - SPF: v=spf1 a/24/64 -all e8a.example.com: - A: 1.2.3.5 - AAAA: 2001:db8:1234::dead:beef - SPF: v=spf1 a/24 -all e8b.example.com: - A: 1.2.3.5 - AAAA: 2001:db8:1234::dead:beef - SPF: v=spf1 a//64 -all e9.example.com: - SPF: v=spf1 a:example.com:8080 e10.example.com: - SPF: v=spf1 a:foo.example.com/24 foo.example.com: - A: 1.1.1.1 - A: 1.2.3.5 e11.example.com: - SPF: v=spf1 a:foo:bar/baz.example.com foo:bar/baz.example.com: - A: 1.2.3.4 e12.example.com: - SPF: v=spf1 a:example.-com e13.example.com: - SPF: "v=spf1 a:" e14.example.com: - SPF: "v=spf1 a:foo.example.xn--zckzah -all" foo.example.xn--zckzah: - A: 1.2.3.4 --- description: Include mechanism semantics and syntax tests: include-fail: description: >- recursive check_host() result of fail causes include to not match. spec: 5.2/9 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e1.example.com result: softfail include-softfail: description: >- recursive check_host() result of softfail causes include to not match. spec: 5.2/9 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e2.example.com result: pass include-neutral: description: >- recursive check_host() result of neutral causes include to not match. spec: 5.2/9 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e3.example.com result: fail include-temperror: description: >- recursive check_host() result of temperror causes include to temperror spec: 5.2/9 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e4.example.com result: temperror include-permerror: description: >- recursive check_host() result of permerror causes include to permerror spec: 5.2/9 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e5.example.com result: permerror include-syntax-error: description: >- include = "include" ":" domain-spec spec: 5.2/1 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e6.example.com result: permerror include-cidr: description: >- include = "include" ":" domain-spec spec: 5.2/1 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e9.example.com result: permerror include-none: description: >- recursive check_host() result of none causes include to permerror spec: 5.2/9 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e7.example.com result: permerror include-empty-domain: description: >- domain-spec cannot be empty. spec: 5.2/1 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e8.example.com result: permerror zonedata: mail.example.com: - A: 1.2.3.4 ip5.example.com: - SPF: v=spf1 ip4:1.2.3.5 -all ip6.example.com: - SPF: v=spf1 ip4:1.2.3.6 ~all ip7.example.com: - SPF: v=spf1 ip4:1.2.3.7 ?all ip8.example.com: - TIMEOUT: true erehwon.example.com: - TXT: v=spfl am not an SPF record e1.example.com: - SPF: v=spf1 include:ip5.example.com ~all e2.example.com: - SPF: v=spf1 include:ip6.example.com all e3.example.com: - SPF: v=spf1 include:ip7.example.com -all e4.example.com: - SPF: v=spf1 include:ip8.example.com -all e5.example.com: - SPF: v=spf1 include:e6.example.com -all e6.example.com: - SPF: v=spf1 include +all e7.example.com: - SPF: v=spf1 include:erehwon.example.com -all e8.example.com: - SPF: "v=spf1 include: -all" e9.example.com: - SPF: "v=spf1 include:ip5.example.com/24 -all" --- description: MX mechanism syntax tests: mx-cidr6: description: | MX = "mx" [ ":" domain-spec ] [ dual-cidr-length ] dual-cidr-length = [ ip4-cidr-length ] [ "/" ip6-cidr-length ] spec: 5.4/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e6.example.com result: fail mx-bad-cidr4: description: | MX = "mx" [ ":" domain-spec ] [ dual-cidr-length ] dual-cidr-length = [ ip4-cidr-length ] [ "/" ip6-cidr-length ] spec: 5.4/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e6a.example.com result: permerror mx-bad-cidr6: description: | MX = "mx" [ ":" domain-spec ] [ dual-cidr-length ] dual-cidr-length = [ ip4-cidr-length ] [ "/" ip6-cidr-length ] spec: 5.4/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e7.example.com result: permerror mx-multi-ip1: description: >- MX matches any returned IP. spec: 5.4/3 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e10.example.com result: pass mx-multi-ip2: description: >- MX matches any returned IP. spec: 5.4/3 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e10.example.com result: pass mx-bad-domain: description: >- domain-spec must pass basic syntax checks comment: >- A ':' may appear in domain-spec, but not in top-label. spec: 8.1/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e9.example.com result: permerror skip: We don't enforce domain syntax. mx-nxdomain: description: >- If no ips are returned, MX mechanism does not match, even with /0. spec: 5.4/3 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e1.example.com result: fail mx-cidr4-0: description: >- Matches if any A records for any MX records are present in DNS. spec: 5.4/3 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e2.example.com result: pass mx-cidr4-0-ip6: description: >- cidr4 doesn't apply to IP6 connections. spec: 5.4/3 helo: mail.example.com host: 1234::1 mailfrom: foo@e2.example.com result: fail mx-cidr6-0-ip4: description: >- Would match if any AAAA records for MX records are present in DNS, but not for an IP4 connection. spec: 5.4/3 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e2a.example.com result: fail mx-cidr6-0-ip4mapped: description: >- Would match if any AAAA records for MX records are present in DNS, but not for an IP4 connection. spec: 5.4/3 helo: mail.example.com host: ::FFFF:1.2.3.4 mailfrom: foo@e2a.example.com result: fail mx-cidr6-0-ip6: description: >- Matches if any AAAA records for any MX records are present in DNS. spec: 5.3/3 helo: mail.example.com host: 1234::1 mailfrom: foo@e2a.example.com result: pass mx-cidr6-0-nxdomain: description: >- No match if no AAAA records for any MX records are present in DNS. spec: 5.4/3 helo: mail.example.com host: 1234::1 mailfrom: foo@e2b.example.com result: fail mx-null: description: >- Null not allowed in top-label. spec: 8.1/2 helo: mail.example.com host: 1.2.3.5 mailfrom: foo@e3.example.com result: permerror skip: We don't enforce charset. mx-numeric-top-label: description: >- Top-label may not be all numeric spec: 8.1/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e5.example.com result: permerror skip: We don't validate top-level domains. mx-colon-domain: description: >- Domain-spec may contain any visible char except % spec: 8.1/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e11.example.com result: pass skip: Allowing / in domain names is not worth the complexity mx-colon-domain-ip4mapped: description: >- Domain-spec may contain any visible char except % spec: 8.1/2 helo: mail.example.com host: ::FFFF:1.2.3.4 mailfrom: foo@e11.example.com result: pass skip: Allowing / in domain names is not worth the complexity mx-bad-toplab: description: >- Toplabel may not begin with - spec: 8.1/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e12.example.com result: permerror skip: We don't enforce TLD structure. mx-empty: description: >- test null MX comment: >- Some implementations have had trouble with null MX spec: 5.4/3 helo: mail.example.com host: 1.2.3.4 mailfrom: "" result: neutral mx-implicit: description: >- If the target name has no MX records, check_host() MUST NOT pretend the target is its single MX, and MUST NOT default to an A lookup on the target-name directly. spec: 5.4/4 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e4.example.com result: neutral mx-empty-domain: description: >- domain-spec cannot be empty. spec: 5.2/1 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e13.example.com result: permerror skip: Not worth the complexity of erroring on this. zonedata: mail.example.com: - A: 1.2.3.4 - MX: [0, ""] - SPF: v=spf1 mx e1.example.com: - SPF: v=spf1 mx/0 -all - MX: [0, e1.example.com] e2.example.com: - A: 1.1.1.1 - AAAA: 1234::2 - MX: [0, e2.example.com] - SPF: v=spf1 mx/0 -all e2a.example.com: - AAAA: 1234::1 - MX: [0, e2a.example.com] - SPF: v=spf1 mx//0 -all e2b.example.com: - A: 1.1.1.1 - MX: [0, e2b.example.com] - SPF: v=spf1 mx//0 -all e3.example.com: - SPF: "v=spf1 mx:foo.example.com\0" e4.example.com: - SPF: v=spf1 mx - A: 1.2.3.4 e5.example.com: - SPF: v=spf1 mx:abc.123 e6.example.com: - SPF: v=spf1 mx//33 -all e6a.example.com: - SPF: v=spf1 mx/33 -all e7.example.com: - SPF: v=spf1 mx//129 -all e9.example.com: - SPF: v=spf1 mx:example.com:8080 e10.example.com: - SPF: v=spf1 mx:foo.example.com/24 foo.example.com: - MX: [0, foo1.example.com] foo1.example.com: - A: 1.1.1.1 - A: 1.2.3.5 e11.example.com: - SPF: v=spf1 mx:foo:bar/baz.example.com foo:bar/baz.example.com: - MX: [0, "foo:bar/baz.example.com"] - A: 1.2.3.4 e12.example.com: - SPF: v=spf1 mx:example.-com e13.example.com: - SPF: "v=spf1 mx: -all" --- description: EXISTS mechanism syntax tests: exists-empty-domain: description: >- domain-spec cannot be empty. spec: 5.7/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e1.example.com result: permerror exists-implicit: description: >- exists = "exists" ":" domain-spec spec: 5.7/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e2.example.com result: permerror exists-cidr: description: >- exists = "exists" ":" domain-spec spec: 5.7/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e3.example.com result: permerror exists-ip4: description: >- mechanism matches if any DNS A RR exists spec: 5.7/3 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e4.example.com result: pass exists-ip6: description: >- The lookup type is A even when the connection is ip6 spec: 5.7/3 helo: mail.example.com host: CAFE:BABE::3 mailfrom: foo@e4.example.com result: pass exists-ip6only: description: >- The lookup type is A even when the connection is ip6 spec: 5.7/3 helo: mail.example.com host: CAFE:BABE::3 mailfrom: foo@e5.example.com result: fail exists-dnserr: description: >- Result for DNS error is being clarified in spfbis spec: 5.7/3 helo: mail.example.com host: CAFE:BABE::3 mailfrom: foo@e6.example.com result: [fail, temperror] zonedata: mail.example.com: - A: 1.2.3.4 mail6.example.com: - AAAA: CAFE:BABE::4 err.example.com: - TIMEOUT: true e1.example.com: - SPF: "v=spf1 exists:" e2.example.com: - SPF: "v=spf1 exists" e3.example.com: - SPF: "v=spf1 exists:mail.example.com/24" e4.example.com: - SPF: "v=spf1 exists:mail.example.com" e5.example.com: - SPF: "v=spf1 exists:mail6.example.com -all" e6.example.com: - SPF: "v=spf1 exists:err.example.com -all" --- description: IP4 mechanism syntax tests: cidr4-0: description: >- ip4-cidr-length = "/" 1*DIGIT spec: 5.6/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e1.example.com result: pass cidr4-32: description: >- ip4-cidr-length = "/" 1*DIGIT spec: 5.6/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e2.example.com result: pass cidr4-33: description: >- Invalid CIDR should get permerror. comment: >- The RFC is silent on ip4 CIDR > 32 or ip6 CIDR > 128. However, since there is no reasonable interpretation (except a noop), we have read between the lines to see a prohibition on invalid CIDR. spec: 5.6/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e3.example.com result: permerror cidr4-032: description: >- Invalid CIDR should get permerror. comment: >- Leading zeros are not explicitly prohibited by the RFC. However, since the RFC explicity prohibits leading zeros in ip4-network, our interpretation is that CIDR should be also. spec: 5.6/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e4.example.com result: permerror skip: It's not clear this is problematic. bare-ip4: description: >- IP4 = "ip4" ":" ip4-network [ ip4-cidr-length ] spec: 5.6/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e5.example.com result: permerror bad-ip4-port: description: >- IP4 = "ip4" ":" ip4-network [ ip4-cidr-length ] comment: >- This has actually been published in SPF records. spec: 5.6/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e8.example.com result: permerror bad-ip4-short: description: >- It is not permitted to omit parts of the IP address instead of using CIDR notations. spec: 5.6/4 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e9.example.com result: permerror ip4-dual-cidr: description: >- dual-cidr-length not permitted on ip4 spec: 5.6/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e6.example.com result: permerror ip4-mapped-ip6: description: >- IP4 mapped IP6 connections MUST be treated as IP4 spec: 5/9/2 helo: mail.example.com host: ::FFFF:1.2.3.4 mailfrom: foo@e7.example.com result: fail zonedata: mail.example.com: - A: 1.2.3.4 e1.example.com: - SPF: v=spf1 ip4:1.1.1.1/0 -all e2.example.com: - SPF: v=spf1 ip4:1.2.3.4/32 -all e3.example.com: - SPF: v=spf1 ip4:1.2.3.4/33 -all e4.example.com: - SPF: v=spf1 ip4:1.2.3.4/032 -all e5.example.com: - SPF: v=spf1 ip4 e6.example.com: - SPF: v=spf1 ip4:1.2.3.4//32 e7.example.com: - SPF: v=spf1 -ip4:1.2.3.4 ip6:::FFFF:1.2.3.4 e8.example.com: - SPF: v=spf1 ip4:1.2.3.4:8080 e9.example.com: - SPF: v=spf1 ip4:1.2.3 --- description: IP6 mechanism syntax comment: >- IP4 only implementations may skip tests where host is not IP4 tests: bare-ip6: description: >- IP6 = "ip6" ":" ip6-network [ ip6-cidr-length ] spec: 5.6/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e1.example.com result: permerror skip: There's an early match. cidr6-0-ip4: description: >- IP4 connections do not match ip6. comment: >- There is controversy over ip4 mapped connections. RFC4408 clearly requires such connections to be considered as ip4. However, some interpret the RFC to mean that such connections should *also* match appropriate ip6 mechanisms (but not, inexplicably, A or MX mechanisms). Until there is consensus, both results are acceptable. spec: 5/9/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e2.example.com result: [neutral, pass] cidr6-ip4: description: >- Even if the SMTP connection is via IPv6, an IPv4-mapped IPv6 IP address (see RFC 3513, Section 2.5.5) MUST still be considered an IPv4 address. comment: >- There is controversy over ip4 mapped connections. RFC4408 clearly requires such connections to be considered as ip4. However, some interpret the RFC to mean that such connections should *also* match appropriate ip6 mechanisms (but not, inexplicably, A or MX mechanisms). Until there is consensus, both results are acceptable. spec: 5/9/2 helo: mail.example.com host: ::FFFF:1.2.3.4 mailfrom: foo@e2.example.com result: [neutral, pass] cidr6-0: description: >- Match any IP6 spec: 5/8 helo: mail.example.com host: DEAF:BABE::CAB:FEE mailfrom: foo@e2.example.com result: pass cidr6-129: description: >- Invalid CIDR comment: >- IP4 only implementations MUST fully syntax check all mechanisms, even if they otherwise ignore them. spec: 5.6/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e3.example.com result: permerror cidr6-bad: description: >- dual-cidr syntax not used for ip6 comment: >- IP4 only implementations MUST fully syntax check all mechanisms, even if they otherwise ignore them. spec: 5.6/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e4.example.com result: permerror cidr6-33: description: >- make sure ip4 cidr restriction are not used for ip6 spec: 5.6/2 helo: mail.example.com host: "CAFE:BABE:8000::" mailfrom: foo@e5.example.com result: pass cidr6-33-ip4: description: >- make sure ip4 cidr restriction are not used for ip6 spec: 5.6/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e5.example.com result: neutral ip6-bad1: description: >- spec: 5.6/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e6.example.com result: permerror zonedata: mail.example.com: - A: 1.2.3.4 e1.example.com: - SPF: v=spf1 -all ip6 e2.example.com: - SPF: v=spf1 ip6:::1.1.1.1/0 e3.example.com: - SPF: v=spf1 ip6:::1.1.1.1/129 e4.example.com: - SPF: v=spf1 ip6:::1.1.1.1//33 e5.example.com: - SPF: v=spf1 ip6:CAFE:BABE:8000::/33 e6.example.com: - SPF: v=spf1 ip6::CAFE::BABE --- description: Semantics of exp and other modifiers comment: >- Implementing exp= is optional. If not implemented, the test driver should not check the explanation field. tests: redirect-none: description: >- If no SPF record is found, or if the target-name is malformed, the result is a "PermError" rather than "None". spec: 6.1/4 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e10.example.com result: permerror redirect-cancels-exp: description: >- when executing "redirect", exp= from the original domain MUST NOT be used. spec: 6.2/13 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e1.example.com result: fail explanation: DEFAULT redirect-syntax-error: description: | redirect = "redirect" "=" domain-spec comment: >- A literal application of the grammar causes modifier syntax errors (except for macro syntax) to become unknown-modifier. modifier = explanation | redirect | unknown-modifier However, it is generally agreed, with precedent in other RFCs, that unknown-modifier should not be "greedy", and should not match known modifier names. There should have been explicit prose to this effect, and some has been proposed as an erratum. spec: 6.1/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e17.example.com result: permerror skip: We don't enforce charset within the redirect. include-ignores-exp: description: >- when executing "include", exp= from the target domain MUST NOT be used. spec: 6.2/13 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e7.example.com result: fail explanation: Correct! redirect-cancels-prior-exp: description: >- when executing "redirect", exp= from the original domain MUST NOT be used. spec: 6.2/13 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e3.example.com result: fail explanation: See me. invalid-modifier: description: | unknown-modifier = name "=" macro-string name = ALPHA *( ALPHA / DIGIT / "-" / "_" / "." ) comment: >- Unknown modifier name must begin with alpha. spec: A/3 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e5.example.com result: permerror empty-modifier-name: description: | name = ALPHA *( ALPHA / DIGIT / "-" / "_" / "." ) comment: >- Unknown modifier name must not be empty. spec: A/3 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e6.example.com result: permerror dorky-sentinel: description: >- An implementation that uses a legal expansion as a sentinel. We cannot check them all, but we can check this one. comment: >- Spaces are allowed in local-part. spec: 8.1/6 helo: mail.example.com host: 1.2.3.4 mailfrom: "Macro Error@e8.example.com" result: fail explanation: Macro Error in implementation exp-multiple-txt: description: | Ignore exp if multiple TXT records. comment: >- If domain-spec is empty, or there are any DNS processing errors (any RCODE other than 0), or if no records are returned, or if more than one record is returned, or if there are syntax errors in the explanation string, then proceed as if no exp modifier was given. spec: 6.2/4 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e11.example.com result: fail explanation: DEFAULT exp-no-txt: description: | Ignore exp if no TXT records. comment: >- If domain-spec is empty, or there are any DNS processing errors (any RCODE other than 0), or if no records are returned, or if more than one record is returned, or if there are syntax errors in the explanation string, then proceed as if no exp modifier was given. spec: 6.2/4 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e22.example.com result: fail explanation: DEFAULT exp-dns-error: description: | Ignore exp if DNS error. comment: >- If domain-spec is empty, or there are any DNS processing errors (any RCODE other than 0), or if no records are returned, or if more than one record is returned, or if there are syntax errors in the explanation string, then proceed as if no exp modifier was given. spec: 6.2/4 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e21.example.com result: fail explanation: DEFAULT exp-empty-domain: description: | PermError if exp= domain-spec is empty. comment: >- Section 6.2/4 says, "If domain-spec is empty, or there are any DNS processing errors (any RCODE other than 0), or if no records are returned, or if more than one record is returned, or if there are syntax errors in the explanation string, then proceed as if no exp modifier was given." However, "if domain-spec is empty" conflicts with the grammar given for the exp modifier. This was reported as an erratum, and the solution chosen was to report explicit "exp=" as PermError, but ignore problems due to macro expansion, DNS, or invalid explanation string. spec: 6.2/4 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e12.example.com result: permerror skip: We ignore exp, and is harmless. explanation-syntax-error: description: | Ignore exp if the explanation string has a syntax error. comment: >- If domain-spec is empty, or there are any DNS processing errors (any RCODE other than 0), or if no records are returned, or if more than one record is returned, or if there are syntax errors in the explanation string, then proceed as if no exp modifier was given. spec: 6.2/4 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e13.example.com result: fail explanation: DEFAULT exp-syntax-error: description: | explanation = "exp" "=" domain-spec comment: >- A literal application of the grammar causes modifier syntax errors (except for macro syntax) to become unknown-modifier. modifier = explanation | redirect | unknown-modifier However, it is generally agreed, with precedent in other RFCs, that unknown-modifier should not be "greedy", and should not match known modifier names. There should have been explicit prose to this effect, and some has been proposed as an erratum. spec: 6.2/1 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e16.example.com result: permerror skip: We don't enforce exp values. exp-twice: description: | exp= appears twice. comment: >- These two modifiers (exp,redirect) MUST NOT appear in a record more than once each. If they do, then check_host() exits with a result of "PermError". spec: 6/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e14.example.com result: permerror skip: We ignore exp, and is harmless. redirect-empty-domain: description: | redirect = "redirect" "=" domain-spec comment: >- Unlike for exp, there is no instruction to override the permerror for an empty domain-spec (which is invalid syntax). spec: 6.2/4 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e18.example.com result: permerror skip: There's an early match. redirect-twice: description: | redirect= appears twice. comment: >- These two modifiers (exp,redirect) MUST NOT appear in a record more than once each. If they do, then check_host() exits with a result of "PermError". spec: 6/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e15.example.com result: permerror unknown-modifier-syntax: description: | unknown-modifier = name "=" macro-string comment: >- Unknown modifiers must have valid macro syntax. spec: A/3 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e9.example.com result: permerror skip: There's an early match. default-modifier-obsolete: description: | Unknown modifiers do not modify the RFC SPF result. comment: >- Some implementations may have a leftover default= modifier from earlier drafts. spec: 6/3 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e19.example.com result: neutral skip: Not worth the complexity of erroring on this. default-modifier-obsolete2: description: | Unknown modifiers do not modify the RFC SPF result. comment: >- Some implementations may have a leftover default= modifier from earlier drafts. spec: 6/3 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e20.example.com result: neutral skip: Not worth the complexity of erroring on this. non-ascii-exp: description: >- SPF explanation text is restricted to 7-bit ascii. comment: >- Checking a possibly different code path for non-ascii chars. spec: 6.2/5 helo: hosed host: 1.2.3.4 mailfrom: "foobar@nonascii.example.com" result: fail explanation: DEFAULT two-exp-records: description: >- Must ignore exp= if DNS returns more than one TXT record. spec: 6.2/4 helo: hosed host: 1.2.3.4 mailfrom: "foobar@tworecs.example.com" result: fail explanation: DEFAULT zonedata: mail.example.com: - A: 1.2.3.4 e1.example.com: - SPF: v=spf1 exp=exp1.example.com redirect=e2.example.com e2.example.com: - SPF: v=spf1 -all e3.example.com: - SPF: v=spf1 exp=exp1.example.com redirect=e4.example.com e4.example.com: - SPF: v=spf1 -all exp=exp2.example.com exp1.example.com: - TXT: No-see-um exp2.example.com: - TXT: See me. exp3.example.com: - TXT: Correct! exp4.example.com: - TXT: "%{l} in implementation" e5.example.com: - SPF: v=spf1 1up=foo e6.example.com: - SPF: v=spf1 =all e7.example.com: - SPF: v=spf1 include:e3.example.com -all exp=exp3.example.com e8.example.com: - SPF: v=spf1 -all exp=exp4.example.com e9.example.com: - SPF: v=spf1 -all foo=%abc e10.example.com: - SPF: v=spf1 redirect=erehwon.example.com e11.example.com: - SPF: v=spf1 -all exp=e11msg.example.com e11msg.example.com: - TXT: Answer a fool according to his folly. - TXT: Do not answer a fool according to his folly. e12.example.com: - SPF: v=spf1 exp= -all e13.example.com: - SPF: v=spf1 exp=e13msg.example.com -all e13msg.example.com: - TXT: The %{x}-files. e14.example.com: - SPF: v=spf1 exp=e13msg.example.com -all exp=e11msg.example.com e15.example.com: - SPF: v=spf1 redirect=e12.example.com -all redirect=e12.example.com e16.example.com: - SPF: v=spf1 exp=-all e17.example.com: - SPF: v=spf1 redirect=-all ?all e18.example.com: - SPF: v=spf1 ?all redirect= e19.example.com: - SPF: v=spf1 default=pass e20.example.com: - SPF: "v=spf1 default=+" e21.example.com: - SPF: v=spf1 exp=e21msg.example.com -all e21msg.example.com: - TIMEOUT: true e22.example.com: - SPF: v=spf1 exp=mail.example.com -all nonascii.example.com: - SPF: v=spf1 exp=badexp.example.com -all badexp.example.com: - TXT: "\xEF\xBB\xBFExplanation" tworecs.example.com: - SPF: v=spf1 exp=twoexp.example.com -all twoexp.example.com: - TXT: "one" - TXT: "two" --- description: Macro expansion rules tests: trailing-dot-domain: spec: 8.1/16 description: >- trailing dot is ignored for domains helo: msgbas2x.cos.example.com host: 192.168.218.40 mailfrom: test@example.com result: pass trailing-dot-exp: spec: 8.1 description: >- trailing dot is not removed from explanation comment: >- A simple way for an implementation to ignore trailing dots on domains is to remove it when present. But be careful not to remove it for explanation text. helo: msgbas2x.cos.example.com host: 192.168.218.40 mailfrom: test@exp.example.com result: fail explanation: This is a test. exp-only-macro-char: spec: 8.1/8 description: >- The following macro letters are allowed only in "exp" text: c, r, t helo: msgbas2x.cos.example.com host: 192.168.218.40 mailfrom: test@e2.example.com result: permerror skip: We ignore exp, and is harmless. invalid-macro-char: spec: 8.1/9 description: >- A '%' character not followed by a '{', '%', '-', or '_' character is a syntax error. helo: msgbas2x.cos.example.com host: 192.168.218.40 mailfrom: test@e1.example.com result: permerror invalid-embedded-macro-char: spec: 8.1/9 description: >- A '%' character not followed by a '{', '%', '-', or '_' character is a syntax error. helo: msgbas2x.cos.example.com host: 192.168.218.40 mailfrom: test@e1e.example.com result: permerror invalid-trailing-macro-char: spec: 8.1/9 description: >- A '%' character not followed by a '{', '%', '-', or '_' character is a syntax error. helo: msgbas2x.cos.example.com host: 192.168.218.40 mailfrom: test@e1t.example.com result: permerror macro-mania-in-domain: description: >- macro-encoded percents (%%), spaces (%_), and URL-percent-encoded spaces (%-) spec: 8.1/3, 8.1/4 helo: mail.example.com host: 1.2.3.4 mailfrom: test@e1a.example.com result: pass exp-txt-macro-char: spec: 8.1/20 description: >- For IPv4 addresses, both the "i" and "c" macros expand to the standard dotted-quad format. helo: msgbas2x.cos.example.com host: 192.168.218.40 mailfrom: test@e3.example.com result: fail explanation: Connections from 192.168.218.40 not authorized. domain-name-truncation: spec: 8.1/25 description: >- When the result of macro expansion is used in a domain name query, if the expanded domain name exceeds 253 characters, the left side is truncated to fit, by removing successive domain labels until the total length does not exceed 253 characters. helo: msgbas2x.cos.example.com host: 192.168.218.40 mailfrom: test@somewhat.long.exp.example.com result: fail explanation: Congratulations! That was tricky. v-macro-ip4: spec: 8.1/6 description: |- v = the string "in-addr" if is ipv4, or "ip6" if is ipv6 helo: msgbas2x.cos.example.com host: 192.168.218.40 mailfrom: test@e4.example.com result: fail explanation: 192.168.218.40 is queried as 40.218.168.192.in-addr.arpa v-macro-ip6: spec: 8.1/6 description: |- v = the string "in-addr" if is ipv4, or "ip6" if is ipv6 helo: msgbas2x.cos.example.com host: CAFE:BABE::1 mailfrom: test@e4.example.com result: fail explanation: cafe:babe::1 is queried as 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.E.B.A.B.E.F.A.C.ip6.arpa undef-macro: spec: 8.1/6 description: >- Allowed macros chars are 'slodipvh' plus 'crt' in explanation. helo: msgbas2x.cos.example.com host: CAFE:BABE::192.168.218.40 mailfrom: test@e5.example.com result: permerror p-macro-ip4-novalid: spec: 8.1/22 description: |- p = the validated domain name of comment: >- The PTR in this example does not validate. helo: msgbas2x.cos.example.com host: 192.168.218.40 mailfrom: test@e6.example.com result: fail explanation: connect from unknown p-macro-ip4-valid: spec: 8.1/22 description: |- p = the validated domain name of comment: >- If a subdomain of the is present, it SHOULD be used. helo: msgbas2x.cos.example.com host: 192.168.218.41 mailfrom: test@e6.example.com result: fail explanation: connect from mx.example.com p-macro-ip6-novalid: spec: 8.1/22 description: |- p = the validated domain name of comment: >- The PTR in this example does not validate. helo: msgbas2x.cos.example.com host: CAFE:BABE::1 mailfrom: test@e6.example.com result: fail explanation: connect from unknown p-macro-ip6-valid: spec: 8.1/22 description: |- p = the validated domain name of comment: >- If a subdomain of the is present, it SHOULD be used. helo: msgbas2x.cos.example.com host: CAFE:BABE::3 mailfrom: test@e6.example.com result: fail explanation: connect from mx.example.com p-macro-multiple: spec: 8.1/22 description: |- p = the validated domain name of comment: >- If a subdomain of the is present, it SHOULD be used. helo: msgbas2x.cos.example.com host: 192.168.218.42 mailfrom: test@e7.example.com result: [pass, softfail] skip: p macro is not supported upper-macro: spec: 8.1/26 description: >- Uppercased macros expand exactly as their lowercased equivalents, and are then URL escaped. helo: msgbas2x.cos.example.com host: 192.168.218.42 mailfrom: jack&jill=up@e8.example.com result: fail explanation: http://example.com/why.html?l=jack%26jill%3Dup hello-macro: spec: 8.1/6 description: |- h = HELO/EHLO domain helo: msgbas2x.cos.example.com host: 192.168.218.40 mailfrom: test@e9.example.com result: pass skip: We don't have a HELO-explicit mode. invalid-hello-macro: spec: 8.1/2 description: |- h = HELO/EHLO domain, but HELO is invalid comment: >- Domain-spec must end in either a macro, or a valid toplabel. It is not correct to check syntax after macro expansion. helo: "JUMPIN' JUPITER" host: 192.168.218.40 mailfrom: test@e9.example.com result: fail hello-domain-literal: spec: 8.1/2 description: |- h = HELO/EHLO domain, but HELO is a domain literal comment: >- Domain-spec must end in either a macro, or a valid toplabel. It is not correct to check syntax after macro expansion. helo: "[192.168.218.40]" host: 192.168.218.40 mailfrom: test@e9.example.com result: fail require-valid-helo: spec: 8.1/6 description: >- Example of requiring valid helo in sender policy. This is a complex policy testing several points at once. helo: OEMCOMPUTER host: 1.2.3.4 mailfrom: test@e10.example.com result: fail macro-reverse-split-on-dash: spec: [8.1/15, 8.1/16, 8.1/17, 8.1/18] description: >- Macro value transformation (splitting on arbitrary characters, reversal, number of right-hand parts to use) helo: mail.example.com host: 1.2.3.4 mailfrom: philip-gladstone-test@e11.example.com result: pass macro-multiple-delimiters: spec: [8.1/15, 8.1/16] description: |- Multiple delimiters may be specified in a macro expression. macro-expand = ( "%{" macro-letter transformers *delimiter "}" ) / "%%" / "%_" / "%-" helo: mail.example.com host: 1.2.3.4 mailfrom: foo-bar+zip+quux@e12.example.com result: pass zonedata: example.com.d.spf.example.com: - SPF: v=spf1 redirect=a.spf.example.com a.spf.example.com: - SPF: v=spf1 include:o.spf.example.com. ~all o.spf.example.com: - SPF: v=spf1 ip4:192.168.218.40 msgbas2x.cos.example.com: - A: 192.168.218.40 example.com: - A: 192.168.90.76 - SPF: v=spf1 redirect=%{d}.d.spf.example.com. exp.example.com: - SPF: v=spf1 exp=msg.example.com. -all msg.example.com: - TXT: This is a test. e1.example.com: - SPF: v=spf1 -exists:%(ir).sbl.example.com ?all e1e.example.com: - SPF: v=spf1 exists:foo%(ir).sbl.example.com ?all e1t.example.com: - SPF: v=spf1 exists:foo%.sbl.example.com ?all e1a.example.com: - SPF: "v=spf1 a:macro%%percent%_%_space%-url-space.example.com -all" "macro%percent space%20url-space.example.com": - A: 1.2.3.4 e2.example.com: - SPF: v=spf1 -all exp=%{r}.example.com e3.example.com: - SPF: v=spf1 -all exp=%{ir}.example.com 40.218.168.192.example.com: - TXT: Connections from %{c} not authorized. somewhat.long.exp.example.com: - SPF: v=spf1 -all exp=foobar.%{o}.%{o}.%{o}.%{o}.%{o}.%{o}.%{o}.%{o}.example.com somewhat.long.exp.example.com.somewhat.long.exp.example.com.somewhat.long.exp.example.com.somewhat.long.exp.example.com.somewhat.long.exp.example.com.somewhat.long.exp.example.com.somewhat.long.exp.example.com.somewhat.long.exp.example.com.example.com: - TXT: Congratulations! That was tricky. e4.example.com: - SPF: v=spf1 -all exp=e4msg.example.com e4msg.example.com: - TXT: "%{c} is queried as %{ir}.%{v}.arpa" e5.example.com: - SPF: v=spf1 a:%{a}.example.com -all e6.example.com: - SPF: v=spf1 -all exp=e6msg.example.com e6msg.example.com: - TXT: "connect from %{p}" mx.example.com: - A: 192.168.218.41 - A: 192.168.218.42 - AAAA: CAFE:BABE::2 - AAAA: CAFE:BABE::3 40.218.168.192.in-addr.arpa: - PTR: mx.example.com 41.218.168.192.in-addr.arpa: - PTR: mx.example.com 42.218.168.192.in-addr.arpa: - PTR: mx.example.com - PTR: mx.e7.example.com 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.E.B.A.B.E.F.A.C.ip6.arpa: - PTR: mx.example.com 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.E.B.A.B.E.F.A.C.ip6.arpa: - PTR: mx.example.com mx.e7.example.com: - A: 192.168.218.42 mx.e7.example.com.should.example.com: - A: 127.0.0.2 mx.example.com.ok.example.com: - A: 127.0.0.2 e7.example.com: - SPF: v=spf1 exists:%{p}.should.example.com ~exists:%{p}.ok.example.com e8.example.com: - SPF: v=spf1 -all exp=msg8.%{D2} msg8.example.com: - TXT: "http://example.com/why.html?l=%{L}" e9.example.com: - SPF: v=spf1 a:%{H} -all e10.example.com: - SPF: v=spf1 -include:_spfh.%{d2} ip4:1.2.3.0/24 -all _spfh.example.com: - SPF: v=spf1 -a:%{h} +all e11.example.com: - SPF: v=spf1 exists:%{i}.%{l2r-}.user.%{d2} 1.2.3.4.gladstone.philip.user.example.com: - A: 127.0.0.2 e12.example.com: - SPF: v=spf1 exists:%{l2r+-}.user.%{d2} bar.foo.user.example.com: - A: 127.0.0.2 --- description: Processing limits tests: redirect-loop: description: >- SPF implementations MUST limit the number of mechanisms and modifiers that do DNS lookups to at most 10 per SPF check. spec: 10.1/6 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e1.example.com result: permerror include-loop: description: >- SPF implementations MUST limit the number of mechanisms and modifiers that do DNS lookups to at most 10 per SPF check. spec: 10.1/6 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e2.example.com result: permerror mx-limit: description: >- there MUST be a limit of no more than 10 MX looked up and checked. comment: >- The required result for this test was the subject of much controversy. Many felt that the RFC *should* have specified permerror, but the consensus was that it failed to actually do so. The preferred result reflects evaluating the 10 allowed MX records in the order returned by the test data - or sorted via priority. If testing with live DNS, the MX order may be random, and a pass result would still be compliant. The SPF result is effectively random. spec: 10.1/7 helo: mail.example.com host: 1.2.3.5 mailfrom: foo@e4.example.com result: [neutral, pass, permerror] ptr-limit: description: >- there MUST be a limit of no more than 10 PTR looked up and checked. comment: >- The result of this test cannot be permerror not only because the RFC does not specify it, but because the sender has no control over the PTR records of spammers. The preferred result reflects evaluating the 10 allowed PTR records in the order returned by the test data. If testing with live DNS, the PTR order may be random, and a pass result would still be compliant. The SPF result is effectively randomized. spec: 10.1/7 helo: mail.example.com host: 1.2.3.5 mailfrom: foo@e5.example.com result: [neutral, pass] false-a-limit: description: >- unlike MX, PTR, there is no RR limit for A comment: >- There seems to be a tendency for developers to want to limit A RRs in addition to MX and PTR. These are IPs, not usable for 3rd party DoS attacks, and hence need no low limit. spec: 10.1/7 helo: mail.example.com host: 1.2.3.12 mailfrom: foo@e10.example.com result: pass mech-at-limit: description: >- SPF implementations MUST limit the number of mechanisms and modifiers that do DNS lookups to at most 10 per SPF check. spec: 10.1/6 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e6.example.com result: pass skip: This is a legitimate fail because we don't do caching. mech-over-limit: description: >- SPF implementations MUST limit the number of mechanisms and modifiers that do DNS lookups to at most 10 per SPF check. comment: >- We do not check whether an implementation counts mechanisms before or after evaluation. The RFC is not clear on this. spec: 10.1/6 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e7.example.com result: permerror include-at-limit: description: >- SPF implementations MUST limit the number of mechanisms and modifiers that do DNS lookups to at most 10 per SPF check. comment: >- The part of the RFC that talks about MAY parse the entire record first (4.6) is specific to syntax errors. Processing limits is a different, non-syntax issue. Processing limits (10.1) specifically talks about limits during a check. spec: 10.1/6 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e8.example.com result: pass include-over-limit: description: >- SPF implementations MUST limit the number of mechanisms and modifiers that do DNS lookups to at most 10 per SPF check. spec: 10.1/6 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e9.example.com result: permerror zonedata: mail.example.com: - A: 1.2.3.4 e1.example.com: - SPF: v=spf1 ip4:1.1.1.1 redirect=e1.example.com - A: 1.2.3.6 e2.example.com: - SPF: v=spf1 include:e3.example.com - A: 1.2.3.7 e3.example.com: - SPF: v=spf1 include:e2.example.com - A: 1.2.3.8 e4.example.com: - SPF: v=spf1 mx - MX: [0, mail.example.com] - MX: [1, mail.example.com] - MX: [2, mail.example.com] - MX: [3, mail.example.com] - MX: [4, mail.example.com] - MX: [5, mail.example.com] - MX: [6, mail.example.com] - MX: [7, mail.example.com] - MX: [8, mail.example.com] - MX: [9, mail.example.com] - MX: [10, e4.example.com] - A: 1.2.3.5 e5.example.com: - SPF: v=spf1 ptr - A: 1.2.3.5 5.3.2.1.in-addr.arpa: - PTR: e1.example.com. - PTR: e2.example.com. - PTR: e3.example.com. - PTR: e4.example.com. - PTR: example.com. - PTR: e6.example.com. - PTR: e7.example.com. - PTR: e8.example.com. - PTR: e9.example.com. - PTR: e10.example.com. - PTR: e5.example.com. e6.example.com: - SPF: v=spf1 a mx a mx a mx a mx a ptr ip4:1.2.3.4 -all - A: 1.2.3.8 - MX: [10, e6.example.com] e7.example.com: - SPF: v=spf1 a mx a mx a mx a mx a ptr a ip4:1.2.3.4 -all - A: 1.2.3.20 e8.example.com: - SPF: v=spf1 a include:inc.example.com ip4:1.2.3.4 mx -all - A: 1.2.3.4 inc.example.com: - SPF: v=spf1 a a a a a a a a - A: 1.2.3.10 e9.example.com: - SPF: v=spf1 a include:inc.example.com a ip4:1.2.3.4 -all - A: 1.2.3.21 e10.example.com: - SPF: v=spf1 a -all - A: 1.2.3.1 - A: 1.2.3.2 - A: 1.2.3.3 - A: 1.2.3.4 - A: 1.2.3.5 - A: 1.2.3.6 - A: 1.2.3.7 - A: 1.2.3.8 - A: 1.2.3.9 - A: 1.2.3.10 - A: 1.2.3.11 - A: 1.2.3.12 golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/rfc7208-tests.CHANGES000066400000000000000000000145261355241314300251750ustar00rootroot00000000000000# Legend: # --- = A new release # ! = Added a test case or otherwise tightened a requirement, possibly # causing implementations to become incompliant with the current # test-suite release # - = Removed a test case or otherwise relaxed a requirement # * = Fixed a bug, or made a minor improvement --- 2014.04 (UNRELEASED) ! Updates for RFC 7208 (4408bis) ! Updated multiple tests not to consider type SPF records under mixed conditions - Note: due to the way the test suite is structured, many records are still labled SPF internally, but for test functions, it doesn't matter externally. - Removed "invalid-domain-empty-label", "invalid-domain-long", and "invalid-domain-long-via-macro". Since RFC 7208 explicitly describes the results for these conditions as undefined, there's no point in testing for a particular result. ! Modified multiple tests to remove ambiguous results for cases that were ambiguous in RFC 4408, but have been clarified in RFC 7208. ! Changed "mx-limit" test to produce permerror result per changes in RFC 7208 ! Added "invalid-trailing-macro-char" and "invalid-embedded-macro-char" tests from Stuart on pyspf trunk --- 2009.10 (2009-10-31 20:00) ! Added test case: ! "macro-multiple-delimiters": Multiple delimiters in a macro expression must be supported. * Fixed "multitxt2" test case failing with SPF-type-only implementations. Tolerate a "None" result to accomodate those. --- 2008.08 (2008-08-17 16:00) ! "invalid-domain-empty-label", "invalid-domain-long", "invalid-domain-long-via-macro" test cases: A that is a valid domain-spec per RFC 4408 but an invalid domain name per RFC 1035 (two successive dots or labels longer than 63 characters) must be treated either as a "PermError" or as non-existent and thus a no-match. (In particular, those cases can never cause a TempError because the error is guaranteed to reoccur given the same input data. This applies likewise to RFC-1035-invalid s that are the result of macro expansion.) Refined descriptions and comments to that end. The no-match behavior can be inferred by analogy from 4.3/1 and 5/10/3. The spec reference to 8.1/2 is bogus because the formal grammar does not preclude such invalid domain names. ! The "exp= without domain-spec" controversy has been resolved; it must be a syntax error. Tightened "exp-empty-domain" test case accordingly. ! Added test cases: ! "a-dash-in-toplabel": may contain dashes. Implementations matching non-greedily may get that wrong. ! "a-only-toplabel", "a-only-toplabel-trailing-dot": Both "a:museum" and "a:museum." are invalid syntax. A bare top-label is insufficient, with or without a trailing dot. ! "exp-no-txt", "exp-dns-error": Clearly, "exp=" referring to a non-existent TXT RR, or the look-up resulting in a DNS error, must cause the "exp=" modifier to be ignored per 6.2/4. ! "macro-mania-in-domain": Test macro-encoded percents (%%), spaces (%_), and URL-percent-encoded spaces (%20) in . ! "macro-reverse-split-on-dash": Test transformation of macro expansion results: splitting on non-dot separator characters, reversal, number of right-hand parts to use. - Removed "a-valid-syntax-but-unqueryable" test case. It is redundant to the "invalid-domain-empty-label" test case. - Relaxed "multispf1" test case: If performed via live DNS (yes, some people do that!), this test may be ineffective as DNS resolvers may combine multiple identical RRs. Thus, tolerate the test failing in this manner. * Adjusted "multispf2" test case: Avoid combination of multiple identical RRs by using different capitalization in intentionally duplicate RRs. * Renamed test cases: a-numeric-top-label -> a-numeric-toplabel a-bad-toplab -> a-bad-toplabel --- 2007.05 (2007-05-30 21:00) - "exp-empty-domain" test case is subject to controversy. "exp=" with an empty domain-spec may be considered a syntax error or not, thus both "Fail" and "PermError" results are acceptable for now. * Renamed the old "exp-syntax-error" test case to "explanation-syntax-error" to indicate that it refers to syntax errors in the explanation string, not in the "exp=" modifier. ! Added test cases: ! "exp-syntax-error", "redirect-syntax-error": Syntax errors in "exp=" and "redirect=" must be treated as such. ! "a-empty-domain", "mx-empty-domain", "ptr-empty-domain", "include-empty-domain", "redirect-empty-domain": "a:", "mx:", "ptr:", "include:", and "redirect=" with an empty domain-spec are syntax errors. ! "include-cidr": "include:/" is a syntax error. ! "helo-not-fqdn", "helo-domain-literal", "domain-literal": A non-FQDN HELO or MAIL FROM must result in a "None" result. ! "hello-domain-literal": Macro expansion results must not be checked for syntax errors, but must rather be treated as non-matches if nonsensical. ! "false-a-limit": There is no limit for the number of A records resulting from an "a:"-induced lookup, and no such limit must be imposed. ! "default-modifier-obsolete(2)": The "default=" modifier used in very old spec drafts must be ignored by RFC 4408 implementations. --- 2007.01 (2007-01-14 05:19) ! Added test cases: ! "nospftxttimeout": If no SPF-type record is present and the TXT lookup times out, the result must either be "None" (preferred) or "TempError". ! "exp-multiple-txt", "exp-syntax-error": Multiple explanation string TXT records and syntax errors in explanation strings must be ignored (i.e., specifically "PermError" must NOT be returned). ! "exp-empty-domain": "exp=" with an empty domain-spec is to be tolerated, i.e., ignored, too. (This is under debate.) ! "exp-twice", "redirect-twice": Added. Multiple "exp=" or "redirect=" modifiers are prohibited. * "Macro expansion rules" scenario: Fixed a bug that caused TXT-only implementations to fail several tests incorrectly due to a real TXT record blocking the automatic synthesis of TXT records from the corresponding SPF-type records. --- 2006.11 (initial release) (2006-11-27 21:27) # $Id$ # vim:tw=79 sts=2 sw=2 golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/rfc7208-tests.LICENSE000066400000000000000000000030271355241314300252010ustar00rootroot00000000000000The RFC 7208 test-suite (rfc7208-tests.yml) is (C) 2006-2008 Stuart D Gathman 2007-2008 Julian Mehnle 2014 Scott Kitterman All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/rfc7208-tests.yml000066400000000000000000002336661355241314300247360ustar00rootroot00000000000000# This is the openspf.org test suite (release 2014.04) based on RFC 7208. # http://www.openspf.org/Test_Suite # # $Id$ # vim:sw=2 sts=2 et # # See rfc7208-tests.CHANGES for a changelog. # # Contributors: # Stuart D Gathman 90% of the tests # Julian Mehnle some tests, proofread YAML syntax, formal schema # Frank Ellermann # Scott Kitterman # Wayne Schlitt # Craig Whitmore # Norman Maurer # Mark Shewmaker # Philip Gladstone # # For RFC 4408, the test suite was designed for use with SPF (type 99) and TXT # implementations. In RFC 7208, use of type SPF has been removed. # # The "Selecting records" test section is the only one concerned with weeding # out (incorrect) queries for type SPF of any kind or proper response to # duplicate or conflicting records. Other sections rely on auto-magic # duplication of SPF to TXT records (by test suite drivers) to test all # implementation types with one specification. # # All new tests should use Documentation IPs for both IP4 and IP6. I was # stupid to use 1.2.3.4 - that is a real global IP (although it doesn't ping). # --- description: Initial processing tests: toolonglabel: description: >- DNS labels limited to 63 chars. comment: >- For initial processing, a long label results in None, not TempError spec: 4.3/1 helo: mail.example.net host: 1.2.3.5 mailfrom: lyme.eater@A123456789012345678901234567890123456789012345678901234567890123.example.com result: none longlabel: description: >- DNS labels limited to 63 chars. spec: 4.3/1 helo: mail.example.net host: 1.2.3.5 mailfrom: lyme.eater@A12345678901234567890123456789012345678901234567890123456789012.example.com result: fail emptylabel: spec: 4.3/1 helo: mail.example.net host: 1.2.3.5 mailfrom: lyme.eater@A...example.com result: none helo-not-fqdn: spec: 4.3/1 helo: A2345678 host: 1.2.3.5 mailfrom: "" result: none helo-domain-literal: spec: 4.3/1 helo: "[1.2.3.5]" host: 1.2.3.5 mailfrom: "" result: none nolocalpart: spec: 4.3/2 helo: mail.example.net host: 1.2.3.4 mailfrom: '@example.net' result: fail explanation: postmaster domain-literal: spec: 4.3/1 helo: OEMCOMPUTER host: 1.2.3.5 mailfrom: "foo@[1.2.3.5]" result: none non-ascii-policy: description: >- SPF policies are restricted to 7-bit ascii. spec: 3.1/1 helo: hosed host: 1.2.3.4 mailfrom: "foobar@hosed.example.com" result: permerror skip: We don't enforce 7-bit ascii. non-ascii-mech: description: >- SPF policies are restricted to 7-bit ascii. comment: >- Checking a possibly different code path for non-ascii chars. spec: 3.1/1 helo: hosed host: 1.2.3.4 mailfrom: "foobar@hosed2.example.com" result: permerror skip: We don't enforce 7-bit ascii. non-ascii-result: description: >- SPF policies are restricted to 7-bit ascii. comment: >- Checking yet another code path for non-ascii chars. spec: 3.1/1 helo: hosed host: 1.2.3.4 mailfrom: "foobar@hosed3.example.com" result: permerror non-ascii-non-spf: description: >- Non-ascii content in non-SPF related records. comment: >- Non-SPF related TXT records are none of our business. spec: 4.5/1 helo: hosed host: 1.2.3.4 mailfrom: "foobar@nothosed.example.com" result: fail explanation: DEFAULT control-char-policy: description: >- Mechanisms are separated by spaces only, not any control char. spec: 4.6.1/2 helo: hosed host: 192.0.2.3 mailfrom: "foobar@ctrl.example.com" result: permerror skip: We fail instead of permerror because we don't enforce the charset. two-spaces: description: >- ABNF for term separation is one or more spaces, not just one. spec: 4.6.1 helo: hosed host: 1.2.3.4 mailfrom: "actually@fine.example.com" result: fail trailing-space: description: >- ABNF for record does allow trailing spaces. comment: >- record = version terms *SP spec: 4.5/2 helo: hosed host: 192.0.2.5 mailfrom: "silly@trail.example.com" result: fail null-text: description: >- Multiple strings are glued together with no separator. comment: >- Note that null text (no strings) is illegal, but SPF should not crash. spec: 3.3 helo: hosed host: 192.0.2.5 mailfrom: "silly@null.example.com" result: pass zonedata: example.com: - TIMEOUT: true example.net: - SPF: v=spf1 -all exp=exp.example.net a.example.net: - SPF: v=spf1 -all exp=exp.example.net exp.example.net: - TXT: '%{l}' a12345678901234567890123456789012345678901234567890123456789012.example.com: - SPF: v=spf1 -all hosed.example.com: - SPF: "v=spf1 a:\xEF\xBB\xBFgarbage.example.net -all" hosed2.example.com: - SPF: "v=spf1 \x80a:example.net -all" hosed3.example.com: - SPF: "v=spf1 a:example.net \x96all" nothosed.example.com: - SPF: "v=spf1 a:example.net -all" - SPF: "\x96" ctrl.example.com: - SPF: "v=spf1 a:ctrl.example.com\x0dptr -all" - A: 192.0.2.3 fine.example.com: - SPF: "v=spf1 a -all" trail.example.com: - SPF: "v=spf1 a -all " null.example.com: - SPF: [ "v=spf1 ip4:", "192.0.2.5 -all" ] - SPF: [ ] --- description: Record lookup tests: both: spec: 4.4/1 helo: mail.example.net host: 1.2.3.4 mailfrom: foo@both.example.net result: fail txtonly: description: Result is none if checking SPF records only (which you should not be doing). spec: 4.4/1 helo: mail.example.net host: 1.2.3.4 mailfrom: foo@txtonly.example.net result: fail spfonly: description: Result is none if checking TXT records only. spec: 4.4/1 helo: mail.example.net host: 1.2.3.4 mailfrom: foo@spfonly.example.net result: none spftimeout: description: >- TXT record present, but SPF lookup times out. Result is temperror if checking SPF records only. Fortunately, we don't do type SPF anymore. comment: >- This actually happens for a popular braindead DNS server. spec: 4.4/1 helo: mail.example.net host: 1.2.3.4 mailfrom: foo@spftimeout.example.net result: fail skip: We don't use SPF records, it's ok to temperror here. txttimeout: description: >- SPF record present, but TXT lookup times out. If only TXT records are checked, result is temperror. spec: 4.4/1 helo: mail.example.net host: 1.2.3.4 mailfrom: foo@txttimeout.example.net result: temperror nospftxttimeout: description: >- No SPF record present, and TXT lookup times out. If only TXT records are checked, result is temperror. comment: >- Because TXT records is where v=spf1 records will likely be, returning temperror will try again later. A timeout due to a braindead server is unlikely in the case of TXT, as opposed to the newer SPF RR. spec: 4.4/1 helo: mail.example.net host: 1.2.3.4 mailfrom: foo@nospftxttimeout.example.net result: temperror alltimeout: description: Both TXT and SPF queries time out spec: 4.4/2 helo: mail.example.net host: 1.2.3.4 mailfrom: foo@alltimeout.example.net result: temperror zonedata: both.example.net: - TXT: v=spf1 -all - SPF: v=spf1 -all txtonly.example.net: - TXT: v=spf1 -all spfonly.example.net: - SPF: v=spf1 -all - TXT: NONE spftimeout.example.net: - TXT: v=spf1 -all - TIMEOUT: true txttimeout.example.net: - SPF: v=spf1 -all - TXT: NONE - TIMEOUT: true nospftxttimeout.example.net: - SPF: "v=spf3 !a:yahoo.com -all" - TXT: NONE - TIMEOUT: true alltimeout.example.net: - TIMEOUT: true --- description: Selecting records tests: nospace1: description: >- Version must be terminated by space or end of record. TXT pieces are joined without intervening spaces. spec: 4.5/4 helo: mail.example1.com host: 1.2.3.4 mailfrom: foo@example2.com result: none empty: description: Empty SPF record. spec: 4.5/4 helo: mail1.example1.com host: 1.2.3.4 mailfrom: foo@example1.com result: neutral nospace2: spec: 4.5/4 helo: mail.example1.com host: 1.2.3.4 mailfrom: foo@example3.com result: pass spfoverride: description: >- SPF records no longer used. spec: 4.5/5 helo: mail.example1.com host: 1.2.3.4 mailfrom: foo@example4.com result: fail multitxt1: description: >- Implementations should give permerror/unknown because of the conflicting TXT records. spec: 4.5/5 helo: mail.example1.com host: 1.2.3.4 mailfrom: foo@example5.com result: permerror multitxt2: description: >- Multiple records is a permerror, v=spf1 is case insensitive spec: 4.5/6 helo: mail.example1.com host: 1.2.3.4 mailfrom: foo@example6.com result: permerror multispf1: description: >- Multiple records is a permerror, even when they are identical. However, this situation cannot be reliably reproduced with live DNS since cache and resolvers are allowed to combine identical records. spec: 4.5/6 helo: mail.example1.com host: 1.2.3.4 mailfrom: foo@example7.com result: [permerror, fail] multispf2: description: >- Ignoring SPF-type records will give pass because there is a (single) TXT record. spec: 4.5/6 helo: mail.example1.com host: 1.2.3.4 mailfrom: foo@example8.com result: pass nospf: spec: 4.5/7 helo: mail.example1.com host: 1.2.3.4 mailfrom: foo@mail.example1.com result: none case-insensitive: description: >- v=spf1 is case insensitive spec: 4.5/6 helo: mail.example1.com host: 1.2.3.4 mailfrom: foo@example9.com result: softfail zonedata: example3.com: - SPF: v=spf10 - SPF: v=spf1 mx - MX: [0, mail.example1.com] example1.com: - SPF: v=spf1 example2.com: - SPF: ['v=spf1', 'mx'] mail.example1.com: - A: 1.2.3.4 example4.com: - SPF: v=spf1 +all - TXT: v=spf1 -all example5.com: - SPF: v=spf1 +all - TXT: v=spf1 -all - TXT: v=spf1 +all example6.com: - SPF: v=spf1 -all - SPF: V=sPf1 +all example7.com: - SPF: v=spf1 -all - SPF: v=spf1 -all example8.com: - SPF: V=spf1 -all - SPF: v=spf1 -all - TXT: v=spf1 +all example9.com: - SPF: v=SpF1 ~all --- description: Record evaluation tests: detect-errors-anywhere: description: Any syntax errors anywhere in the record MUST be detected. spec: 4.6 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@t1.example.com result: permerror skip: We don't catch errors after a match. modifier-charset-good: description: name = ALPHA *( ALPHA / DIGIT / "-" / "_" / "." ) spec: 4.6.1/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@t2.example.com result: pass skip: We don't enforce the domain charset. modifier-charset-bad1: description: >- '=' character immediately after the name and before any ":" or "/" spec: 4.6.1/4 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@t3.example.com result: permerror modifier-charset-bad2: description: >- '=' character immediately after the name and before any ":" or "/" spec: 4.6.1/4 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@t4.example.com result: permerror redirect-after-mechanisms1: description: >- The "redirect" modifier has an effect after all the mechanisms. comment: >- The redirect in this example would violate processing limits, except that it is never used because of the all mechanism. spec: 4.6.3 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@t5.example.com result: softfail redirect-after-mechanisms2: description: >- The "redirect" modifier has an effect after all the mechanisms. spec: 4.6.3 helo: mail.example.com host: 1.2.3.5 mailfrom: foo@t6.example.com result: fail skip: Not worth the complexity of erroring on this. default-result: description: Default result is neutral. spec: 4.7/1 helo: mail.example.com host: 1.2.3.5 mailfrom: foo@t7.example.com result: neutral redirect-is-modifier: description: |- Invalid mechanism. Redirect is a modifier. spec: 4.6.1/4 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@t8.example.com result: permerror skip: We don't catch errors after a match. invalid-domain: description: >- Domain-spec must end in macro-expand or valid toplabel. spec: 7.1/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@t9.example.com result: permerror skip: We don't enforce TLD structure. invalid-domain-empty-label: description: >- target-name that is a valid domain-spec per RFC 4408 and RFC 7208 but an invalid domain name per RFC 1035 (empty label) should be treated as non-existent. comment: >- An empty domain label, i.e. two successive dots, in a mechanism target-name is valid domain-spec syntax (perhaps formed from a macro expansion), even though a DNS query cannot be composed from it. The spec being unclear about it, this could either be considered a syntax error, or, by analogy to 4.3/1 and 5/10/3, the mechanism could be treated as a no-match. RFC 7208 failed to agree on which result to use, and declares the situation undefined. The preferred test result is therefore a matter of opinion. spec: 4.3/1, 4.8/5, 5/10/3 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@t10.example.com result: [fail, permerror] invalid-domain-long: description: >- target-name that is a valid domain-spec per RFC 4408 and RFC 7208 but an invalid domain name per RFC 1035 (long label) must be treated as non-existent. comment: >- A domain label longer than 63 characters in a mechanism target-name is valid domain-spec syntax (perhaps formed from a macro expansion), even though a DNS query cannot be composed from it. The spec being unclear about it, this could either be considered a syntax error, or, by analogy to 4.3/1 and 5/10/3, the mechanism could be treated as a no-match. RFC 7208 failed to agree on which result to use, and declares the situation undefined. The preferred test result is therefore a matter of opinion. spec: 4.3/1, 4.8/5, 5/10/3 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@t11.example.com result: [fail,permerror] invalid-domain-long-via-macro: description: >- target-name that is a valid domain-spec per RFC 4408 and RFC 7208 but an invalid domain name per RFC 1035 (long label) must be treated as non-existent. comment: >- A domain label longer than 63 characters that results from macro expansion in a mechanism target-name is valid domain-spec syntax (and is not even subject to syntax checking after macro expansion), even though a DNS query cannot be composed from it. The spec being unclear about it, this could either be considered a syntax error, or, by analogy to 4.3/1 and 5/10/3, the mechanism could be treated as a no-match. RFC 7208 failed to agree on which result to use, and declares the situation undefined. The preferred test result is therefore a matter of opinion. spec: 4.3/1, 4.8/5, 5/10/3 helo: "%%%%%%%%%%%%%%%%%%%%%%" host: 1.2.3.4 mailfrom: foo@t12.example.com result: [fail,permerror] zonedata: mail.example.com: - A: 1.2.3.4 t1.example.com: - SPF: v=spf1 ip4:1.2.3.4 -all moo t2.example.com: - SPF: v=spf1 moo.cow-far_out=man:dog/cat ip4:1.2.3.4 -all t3.example.com: - SPF: v=spf1 moo.cow/far_out=man:dog/cat ip4:1.2.3.4 -all t4.example.com: - SPF: v=spf1 moo.cow:far_out=man:dog/cat ip4:1.2.3.4 -all t5.example.com: - SPF: v=spf1 redirect=t5.example.com ~all t6.example.com: - SPF: v=spf1 ip4:1.2.3.4 redirect=t2.example.com t7.example.com: - SPF: v=spf1 ip4:1.2.3.4 t8.example.com: - SPF: v=spf1 ip4:1.2.3.4 redirect:t2.example.com t9.example.com: - SPF: v=spf1 a:foo-bar -all t10.example.com: - SPF: v=spf1 a:mail.example...com -all t11.example.com: - SPF: v=spf1 a:a123456789012345678901234567890123456789012345678901234567890123.example.com -all t12.example.com: - SPF: v=spf1 a:%{H}.bar -all --- description: ALL mechanism syntax tests: all-dot: description: | all = "all" comment: |- At least one implementation got this wrong spec: 5.1/1 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e1.example.com result: permerror all-arg: description: | all = "all" comment: |- At least one implementation got this wrong spec: 5.1/1 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e2.example.com result: permerror all-cidr: description: | all = "all" spec: 5.1/1 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e3.example.com result: permerror all-neutral: description: | all = "all" spec: 5.1/1 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e4.example.com result: neutral all-double: description: | all = "all" spec: 5.1/1 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e5.example.com result: pass zonedata: mail.example.com: - A: 1.2.3.4 e1.example.com: - SPF: v=spf1 -all. e2.example.com: - SPF: v=spf1 -all:foobar e3.example.com: - SPF: v=spf1 -all/8 e4.example.com: - SPF: v=spf1 ?all e5.example.com: - SPF: v=spf1 all -all --- description: PTR mechanism syntax tests: ptr-cidr: description: |- PTR = "ptr" [ ":" domain-spec ] spec: 5.5/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e1.example.com result: permerror ptr-match-target: description: >- Check all validated domain names to see if they end in the domain. spec: 5.5/5 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e2.example.com result: pass ptr-match-implicit: description: >- Check all validated domain names to see if they end in the domain. spec: 5.5/5 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e3.example.com result: pass ptr-nomatch-invalid: description: >- Check all validated domain names to see if they end in the domain. comment: >- This PTR record does not validate spec: 5.5/5 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e4.example.com result: fail ptr-match-ip6: description: >- Check all validated domain names to see if they end in the domain. spec: 5.5/5 helo: mail.example.com host: CAFE:BABE::1 mailfrom: foo@e3.example.com result: pass ptr-empty-domain: description: >- domain-spec cannot be empty. spec: 5.5/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e5.example.com result: permerror ptr-case-change: description: >- arpa domain is case insensitive. comment: >- Some DNS servers have random case in the domain part of returned answers, especially for PTR records. For example, a query for 1.2.6.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.E.F.0.0.4.F.1.1.1.0.1.0.A.2.ip6.arpa may return 1.2.6.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.E.F.0.0.4.F.1.1.1.0.1.0.a.2.ip6.arpa spec: 5.5/2 helo: mail.example.com host: 2001:db8::1 mailfrom: bar@e6.example.com result: pass ptr-cname-loop: description: >- a PTR with CNAME loop and inconsistent case in domain. comment: >- RFC 1034 3.6.2/11 says, CNAME chains should be followed and CNAME loops signalled as an error. RFC 7208 5.5/7 says, If a DNS error occurs while doing an A RR lookup, then that domain name is skipped and the search continues. spec: 5.5/7 helo: loop.example.com host: 192.0.2.4 mailfrom: postmaster@loop.example.com result: neutral zonedata: mail.example.com: - A: 1.2.3.4 - AAAA: 2001:db8::1 e1.example.com: - SPF: v=spf1 ptr/0 -all e2.example.com: - SPF: v=spf1 ptr:example.com -all 4.3.2.1.in-addr.arpa: - PTR: e3.example.com - PTR: e4.example.com - PTR: mail.example.com 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.E.B.A.B.E.F.A.C.ip6.arpa: - PTR: e3.example.com 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.D.0.1.0.0.2.ip6.arpa: - PTR: mail.Example.com e3.example.com: - SPF: v=spf1 ptr -all - A: 1.2.3.4 - AAAA: CAFE:BABE::1 e4.example.com: - SPF: v=spf1 ptr -all e5.example.com: - SPF: "v=spf1 ptr:" e6.example.com: - SPF: "v=spf1 ptr:example.Com -all" loop.example.com: - SPF: "v=spf1 ptr" 4.2.0.192.in-addr.arpa: - PTR: "loop4.example.com." loop4.example.com: - CNAME: "CNAME.example.com." cname.example.com: - CNAME: "CNAME.example.com." --- description: A mechanism syntax tests: a-cidr6: description: | A = "a" [ ":" domain-spec ] [ dual-cidr-length ] dual-cidr-length = [ ip4-cidr-length ] [ "/" ip6-cidr-length ] spec: 5.3/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e6.example.com result: fail a-bad-cidr4: description: | A = "a" [ ":" domain-spec ] [ dual-cidr-length ] dual-cidr-length = [ ip4-cidr-length ] [ "/" ip6-cidr-length ] spec: 5.3/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e6a.example.com result: permerror a-bad-cidr6: description: | A = "a" [ ":" domain-spec ] [ dual-cidr-length ] dual-cidr-length = [ ip4-cidr-length ] [ "/" ip6-cidr-length ] spec: 5.3/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e7.example.com result: permerror a-dual-cidr-ip4-match: description: | A = "a" [ ":" domain-spec ] [ dual-cidr-length ] dual-cidr-length = [ ip4-cidr-length ] [ "/" ip6-cidr-length ] spec: 5.3/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e8.example.com result: pass a-dual-cidr-ip4-err: description: | A = "a" [ ":" domain-spec ] [ dual-cidr-length ] dual-cidr-length = [ ip4-cidr-length ] [ "/" ip6-cidr-length ] spec: 5.3/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e8e.example.com result: permerror a-dual-cidr-ip6-match: description: | A = "a" [ ":" domain-spec ] [ dual-cidr-length ] dual-cidr-length = [ ip4-cidr-length ] [ "/" ip6-cidr-length ] spec: 5.3/2 helo: mail.example.com host: 2001:db8:1234::cafe:babe mailfrom: foo@e8.example.com result: pass a-dual-cidr-ip4-default: description: | A = "a" [ ":" domain-spec ] [ dual-cidr-length ] dual-cidr-length = [ ip4-cidr-length ] [ "/" ip6-cidr-length ] spec: 5.3/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e8b.example.com result: fail a-dual-cidr-ip6-default: description: | A = "a" [ ":" domain-spec ] [ dual-cidr-length ] dual-cidr-length = [ ip4-cidr-length ] [ "/" ip6-cidr-length ] spec: 5.3/2 helo: mail.example.com host: 2001:db8:1234::cafe:babe mailfrom: foo@e8a.example.com result: fail a-multi-ip1: description: >- A matches any returned IP. spec: 5.3/3 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e10.example.com result: pass a-multi-ip2: description: >- A matches any returned IP. spec: 5.3/3 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e10.example.com result: pass a-bad-domain: description: >- domain-spec must pass basic syntax checks; a ':' may appear in domain-spec, but not in top-label spec: 7.1/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e9.example.com result: permerror skip: We don't enforce domain charset. a-nxdomain: description: >- If no ips are returned, A mechanism does not match, even with /0. spec: 5.3/3 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e1.example.com result: fail a-cidr4-0: description: >- Matches if any A records are present in DNS. spec: 5.3/3 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e2.example.com result: pass a-cidr4-0-ip6: description: >- Matches if any A records are present in DNS. spec: 5.3/3 helo: mail.example.com host: 1234::1 mailfrom: foo@e2.example.com result: fail a-cidr6-0-ip4: description: >- Would match if any AAAA records are present in DNS, but not for an IP4 connection. spec: 5.3/3 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e2a.example.com result: fail a-cidr6-0-ip4mapped: description: >- Would match if any AAAA records are present in DNS, but not for an IP4 connection. spec: 5.3/3 helo: mail.example.com host: ::FFFF:1.2.3.4 mailfrom: foo@e2a.example.com result: fail a-cidr6-0-ip6: description: >- Matches if any AAAA records are present in DNS. spec: 5.3/3 helo: mail.example.com host: 1234::1 mailfrom: foo@e2a.example.com result: pass a-ip6-dualstack: description: >- Simple IP6 Address match with dual stack. spec: 5.3/3 helo: mail.example.com host: 1234::1 mailfrom: foo@ipv6.example.com result: pass a-cidr6-0-nxdomain: description: >- No match if no AAAA records are present in DNS. spec: 5.3/3 helo: mail.example.com host: 1234::1 mailfrom: foo@e2b.example.com result: fail a-null: description: >- Null octets not allowed in toplabel spec: 7.1/2 helo: mail.example.com host: 1.2.3.5 mailfrom: foo@e3.example.com result: permerror skip: We don't enforce charset. a-numeric: description: >- toplabel may not be all numeric comment: >- A common publishing mistake is using ip4 addresses with A mechanism. This should receive special diagnostic attention in the permerror. spec: 7.1/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e4.example.com result: permerror skip: We don't enforce domain structure. a-numeric-toplabel: description: >- toplabel may not be all numeric spec: 7.1/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e5.example.com result: permerror skip: We don't enforce TLD structure. a-dash-in-toplabel: description: >- toplabel may contain dashes comment: >- Going from the "toplabel" grammar definition, an implementation using regular expressions in incrementally parsing SPF records might erroneously try to match a TLD such as ".xn--zckzah" (cf. IDN TLDs!) to '( *alphanum ALPHA *alphanum )' first before trying the alternative '( 1*alphanum "-" *( alphanum / "-" ) alphanum )', essentially causing a non-greedy, and thus, incomplete match. Make sure a greedy match is performed! spec: 7.1/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e14.example.com result: pass a-bad-toplabel: description: >- toplabel may not begin with a dash spec: 7.1/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e12.example.com result: permerror skip: We don't enforce TLD structure. a-only-toplabel: description: >- domain-spec may not consist of only a toplabel. spec: 7.1/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e5a.example.com result: permerror skip: We don't enforce TLD structure. a-only-toplabel-trailing-dot: description: >- domain-spec may not consist of only a toplabel. comment: >- "A trailing dot doesn't help." spec: 7.1/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e5b.example.com result: permerror skip: We don't enforce TLD structure. a-colon-domain: description: >- domain-spec may contain any visible char except % spec: 7.1/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e11.example.com result: pass skip: Allowing / in domain names is not worth the complexity a-colon-domain-ip4mapped: description: >- domain-spec may contain any visible char except % spec: 7.1/2 helo: mail.example.com host: ::FFFF:1.2.3.4 mailfrom: foo@e11.example.com result: pass skip: Allowing / in domain names is not worth the complexity a-empty-domain: description: >- domain-spec cannot be empty. spec: 5.3/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e13.example.com result: permerror skip: Not worth the complexity of erroring on this. zonedata: mail.example.com: - A: 1.2.3.4 e1.example.com: - SPF: v=spf1 a/0 -all e2.example.com: - A: 1.1.1.1 - AAAA: 1234::2 - SPF: v=spf1 a/0 -all e2a.example.com: - AAAA: 1234::1 - SPF: v=spf1 a//0 -all e2b.example.com: - A: 1.1.1.1 - SPF: v=spf1 a//0 -all ipv6.example.com: - AAAA: 1234::1 - A: 1.1.1.1 - SPF: v=spf1 a -all e3.example.com: - SPF: "v=spf1 a:foo.example.com\0" e4.example.com: - SPF: v=spf1 a:111.222.33.44 e5.example.com: - SPF: v=spf1 a:abc.123 e5a.example.com: - SPF: v=spf1 a:museum e5b.example.com: - SPF: v=spf1 a:museum. e6.example.com: - SPF: v=spf1 a//33 -all e6a.example.com: - SPF: v=spf1 a/33 -all e7.example.com: - SPF: v=spf1 a//129 -all e8.example.com: - A: 1.2.3.5 - AAAA: 2001:db8:1234::dead:beef - SPF: v=spf1 a/24//64 -all e8e.example.com: - A: 1.2.3.5 - AAAA: 2001:db8:1234::dead:beef - SPF: v=spf1 a/24/64 -all e8a.example.com: - A: 1.2.3.5 - AAAA: 2001:db8:1234::dead:beef - SPF: v=spf1 a/24 -all e8b.example.com: - A: 1.2.3.5 - AAAA: 2001:db8:1234::dead:beef - SPF: v=spf1 a//64 -all e9.example.com: - SPF: v=spf1 a:example.com:8080 e10.example.com: - SPF: v=spf1 a:foo.example.com/24 foo.example.com: - A: 1.1.1.1 - A: 1.2.3.5 e11.example.com: - SPF: v=spf1 a:foo:bar/baz.example.com foo:bar/baz.example.com: - A: 1.2.3.4 e12.example.com: - SPF: v=spf1 a:example.-com e13.example.com: - SPF: "v=spf1 a:" e14.example.com: - SPF: "v=spf1 a:foo.example.xn--zckzah -all" foo.example.xn--zckzah: - A: 1.2.3.4 --- description: Include mechanism semantics and syntax tests: include-fail: description: >- recursive check_host() result of fail causes include to not match. spec: 5.2/9 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e1.example.com result: softfail include-softfail: description: >- recursive check_host() result of softfail causes include to not match. spec: 5.2/9 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e2.example.com result: pass include-neutral: description: >- recursive check_host() result of neutral causes include to not match. spec: 5.2/9 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e3.example.com result: fail include-temperror: description: >- recursive check_host() result of temperror causes include to temperror spec: 5.2/9 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e4.example.com result: temperror include-permerror: description: >- recursive check_host() result of permerror causes include to permerror spec: 5.2/9 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e5.example.com result: permerror include-syntax-error: description: >- include = "include" ":" domain-spec spec: 5.2/1 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e6.example.com result: permerror include-cidr: description: >- include = "include" ":" domain-spec spec: 5.2/1 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e9.example.com result: permerror include-none: description: >- recursive check_host() result of none causes include to permerror spec: 5.2/9 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e7.example.com result: permerror include-empty-domain: description: >- domain-spec cannot be empty. spec: 5.2/1 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e8.example.com result: permerror zonedata: mail.example.com: - A: 1.2.3.4 ip5.example.com: - SPF: v=spf1 ip4:1.2.3.5 -all ip6.example.com: - SPF: v=spf1 ip4:1.2.3.6 ~all ip7.example.com: - SPF: v=spf1 ip4:1.2.3.7 ?all ip8.example.com: - TIMEOUT: true erehwon.example.com: - TXT: v=spfl am not an SPF record e1.example.com: - SPF: v=spf1 include:ip5.example.com ~all e2.example.com: - SPF: v=spf1 include:ip6.example.com all e3.example.com: - SPF: v=spf1 include:ip7.example.com -all e4.example.com: - SPF: v=spf1 include:ip8.example.com -all e5.example.com: - SPF: v=spf1 include:e6.example.com -all e6.example.com: - SPF: v=spf1 include +all e7.example.com: - SPF: v=spf1 include:erehwon.example.com -all e8.example.com: - SPF: "v=spf1 include: -all" e9.example.com: - SPF: "v=spf1 include:ip5.example.com/24 -all" --- description: MX mechanism syntax tests: mx-cidr6: description: | MX = "mx" [ ":" domain-spec ] [ dual-cidr-length ] dual-cidr-length = [ ip4-cidr-length ] [ "/" ip6-cidr-length ] spec: 5.4/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e6.example.com result: fail mx-bad-cidr4: description: | MX = "mx" [ ":" domain-spec ] [ dual-cidr-length ] dual-cidr-length = [ ip4-cidr-length ] [ "/" ip6-cidr-length ] spec: 5.4/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e6a.example.com result: permerror mx-bad-cidr6: description: | MX = "mx" [ ":" domain-spec ] [ dual-cidr-length ] dual-cidr-length = [ ip4-cidr-length ] [ "/" ip6-cidr-length ] spec: 5.4/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e7.example.com result: permerror mx-multi-ip1: description: >- MX matches any returned IP. spec: 5.4/3 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e10.example.com result: pass mx-multi-ip2: description: >- MX matches any returned IP. spec: 5.4/3 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e10.example.com result: pass mx-bad-domain: description: >- domain-spec must pass basic syntax checks comment: >- A ':' may appear in domain-spec, but not in top-label. spec: 7.1/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e9.example.com result: permerror skip: We don't enforce domain syntax. mx-nxdomain: description: >- If no ips are returned, MX mechanism does not match, even with /0. spec: 5.4/3 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e1.example.com result: fail mx-cidr4-0: description: >- Matches if any A records for any MX records are present in DNS. spec: 5.4/3 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e2.example.com result: pass mx-cidr4-0-ip6: description: >- cidr4 doesn't apply to IP6 connections. comment: >- The IP6 CIDR starts with a double slash. spec: 5.4/3 helo: mail.example.com host: 1234::1 mailfrom: foo@e2.example.com result: fail mx-cidr6-0-ip4: description: >- Would match if any AAAA records for MX records are present in DNS, but not for an IP4 connection. spec: 5.4/3 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e2a.example.com result: fail mx-cidr6-0-ip4mapped: description: >- Would match if any AAAA records for MX records are present in DNS, but not for an IP4 connection. spec: 5.4/3 helo: mail.example.com host: ::FFFF:1.2.3.4 mailfrom: foo@e2a.example.com result: fail mx-cidr6-0-ip6: description: >- Matches if any AAAA records for any MX records are present in DNS. spec: 5.3/3 helo: mail.example.com host: 1234::1 mailfrom: foo@e2a.example.com result: pass mx-cidr6-0-nxdomain: description: >- No match if no AAAA records for any MX records are present in DNS. spec: 5.4/3 helo: mail.example.com host: 1234::1 mailfrom: foo@e2b.example.com result: fail mx-null: description: >- Null not allowed in top-label. spec: 7.1/2 helo: mail.example.com host: 1.2.3.5 mailfrom: foo@e3.example.com result: permerror skip: We don't enforce charset. mx-numeric-top-label: description: >- Top-label may not be all numeric spec: 7.1/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e5.example.com result: permerror skip: We don't validate top-level domains. mx-colon-domain: description: >- Domain-spec may contain any visible char except % spec: 7.1/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e11.example.com result: pass skip: Allowing / in domain names is not worth the complexity mx-colon-domain-ip4mapped: description: >- Domain-spec may contain any visible char except % spec: 7.1/2 helo: mail.example.com host: ::FFFF:1.2.3.4 mailfrom: foo@e11.example.com result: pass skip: Allowing / in domain names is not worth the complexity mx-bad-toplab: description: >- Toplabel may not begin with - spec: 7.1/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e12.example.com result: permerror skip: We don't enforce TLD structure. mx-empty: description: >- test null MX comment: >- Some implementations have had trouble with null MX spec: 5.4/3 helo: mail.example.com host: 1.2.3.4 mailfrom: "" result: neutral mx-implicit: description: >- If the target name has no MX records, check_host() MUST NOT pretend the target is its single MX, and MUST NOT default to an A lookup on the target-name directly. spec: 5.4/4 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e4.example.com result: neutral mx-empty-domain: description: >- domain-spec cannot be empty. spec: 5.2/1 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e13.example.com result: permerror skip: Not worth the complexity of erroring on this. zonedata: mail.example.com: - A: 1.2.3.4 - MX: [0, ""] - SPF: v=spf1 mx e1.example.com: - SPF: v=spf1 mx/0 -all - MX: [0, e1.example.com] e2.example.com: - A: 1.1.1.1 - AAAA: 1234::2 - MX: [0, e2.example.com] - SPF: v=spf1 mx/0 -all e2a.example.com: - AAAA: 1234::1 - MX: [0, e2a.example.com] - SPF: v=spf1 mx//0 -all e2b.example.com: - A: 1.1.1.1 - MX: [0, e2b.example.com] - SPF: v=spf1 mx//0 -all e3.example.com: - SPF: "v=spf1 mx:foo.example.com\0" e4.example.com: - SPF: v=spf1 mx - A: 1.2.3.4 e5.example.com: - SPF: v=spf1 mx:abc.123 e6.example.com: - SPF: v=spf1 mx//33 -all e6a.example.com: - SPF: v=spf1 mx/33 -all e7.example.com: - SPF: v=spf1 mx//129 -all e9.example.com: - SPF: v=spf1 mx:example.com:8080 e10.example.com: - SPF: v=spf1 mx:foo.example.com/24 foo.example.com: - MX: [0, foo1.example.com] foo1.example.com: - A: 1.1.1.1 - A: 1.2.3.5 e11.example.com: - SPF: v=spf1 mx:foo:bar/baz.example.com foo:bar/baz.example.com: - MX: [0, "foo:bar/baz.example.com"] - A: 1.2.3.4 e12.example.com: - SPF: v=spf1 mx:example.-com e13.example.com: - SPF: "v=spf1 mx: -all" --- description: EXISTS mechanism syntax tests: exists-empty-domain: description: >- domain-spec cannot be empty. spec: 5.7/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e1.example.com result: permerror exists-implicit: description: >- exists = "exists" ":" domain-spec spec: 5.7/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e2.example.com result: permerror exists-cidr: description: >- exists = "exists" ":" domain-spec spec: 5.7/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e3.example.com result: permerror exists-ip4: description: >- mechanism matches if any DNS A RR exists spec: 5.7/3 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e4.example.com result: pass exists-ip6: description: >- The lookup type is A even when the connection is ip6 spec: 5.7/3 helo: mail.example.com host: CAFE:BABE::3 mailfrom: foo@e4.example.com result: pass exists-ip6only: description: >- The lookup type is A even when the connection is ip6 spec: 5.7/3 helo: mail.example.com host: CAFE:BABE::3 mailfrom: foo@e5.example.com result: fail exists-dnserr: description: >- Result for DNS error clarified in RFC7208: MTAs or other processors SHOULD impose a limit on the maximum amount of elapsed time to evaluate check_host(). Such a limit SHOULD allow at least 20 seconds. If such a limit is exceeded, the result of authorization SHOULD be "temperror". spec: 5/8 helo: mail.example.com host: CAFE:BABE::3 mailfrom: foo@e6.example.com result: temperror zonedata: mail.example.com: - A: 1.2.3.4 mail6.example.com: - AAAA: CAFE:BABE::4 err.example.com: - TIMEOUT: true e1.example.com: - SPF: "v=spf1 exists:" e2.example.com: - SPF: "v=spf1 exists" e3.example.com: - SPF: "v=spf1 exists:mail.example.com/24" e4.example.com: - SPF: "v=spf1 exists:mail.example.com" e5.example.com: - SPF: "v=spf1 exists:mail6.example.com -all" e6.example.com: - SPF: "v=spf1 exists:err.example.com -all" --- description: IP4 mechanism syntax tests: cidr4-0: description: >- ip4-cidr-length = "/" 1*DIGIT spec: 5.6/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e1.example.com result: pass cidr4-32: description: >- ip4-cidr-length = "/" 1*DIGIT spec: 5.6/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e2.example.com result: pass cidr4-33: description: >- Invalid CIDR should get permerror. comment: >- The RFC4408 was silent on ip4 CIDR > 32 or ip6 CIDR > 128, but RFC7208 is explicit. Invalid CIDR is prohibited. spec: 5.6/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e3.example.com result: permerror cidr4-032: description: >- Invalid CIDR should get permerror. comment: >- Leading zeros are not explicitly prohibited by the RFC. However, since the RFC explicity prohibits leading zeros in ip4-network, our interpretation is that CIDR should be also. spec: 5.6/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e4.example.com result: permerror skip: It's not clear this is problematic. bare-ip4: description: >- IP4 = "ip4" ":" ip4-network [ ip4-cidr-length ] spec: 5.6/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e5.example.com result: permerror bad-ip4-port: description: >- IP4 = "ip4" ":" ip4-network [ ip4-cidr-length ] comment: >- This has actually been published in SPF records. spec: 5.6/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e8.example.com result: permerror bad-ip4-short: description: >- It is not permitted to omit parts of the IP address instead of using CIDR notations. spec: 5.6/4 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e9.example.com result: permerror ip4-dual-cidr: description: >- dual-cidr-length not permitted on ip4 spec: 5.6/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e6.example.com result: permerror ip4-mapped-ip6: description: >- IP4 mapped IP6 connections MUST be treated as IP4 spec: 5/9/2 helo: mail.example.com host: ::FFFF:1.2.3.4 mailfrom: foo@e7.example.com result: fail zonedata: mail.example.com: - A: 1.2.3.4 e1.example.com: - SPF: v=spf1 ip4:1.1.1.1/0 -all e2.example.com: - SPF: v=spf1 ip4:1.2.3.4/32 -all e3.example.com: - SPF: v=spf1 ip4:1.2.3.4/33 -all e4.example.com: - SPF: v=spf1 ip4:1.2.3.4/032 -all e5.example.com: - SPF: v=spf1 ip4 e6.example.com: - SPF: v=spf1 ip4:1.2.3.4//32 e7.example.com: - SPF: v=spf1 -ip4:1.2.3.4 ip6:::FFFF:1.2.3.4 e8.example.com: - SPF: v=spf1 ip4:1.2.3.4:8080 e9.example.com: - SPF: v=spf1 ip4:1.2.3 --- description: IP6 mechanism syntax comment: >- IP4 only implementations may skip tests where host is not IP4 tests: bare-ip6: description: >- IP6 = "ip6" ":" ip6-network [ ip6-cidr-length ] spec: 5.6/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e1.example.com result: permerror skip: There's an early match. cidr6-0-ip4: description: >- IP4 connections do not match ip6. comment: >- There was controversy over IPv4 mapped connections. RFC7208 clearly states IPv4 mapped addresses only match ip4: mechanisms. spec: 5/9/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e2.example.com result: neutral cidr6-ip4: description: >- Even if the SMTP connection is via IPv6, an IPv4-mapped IPv6 IP address (see RFC 3513, Section 2.5.5) MUST still be considered an IPv4 address. comment: >- There was controversy over ip4 mapped connections. RFC7208 clearly requires such connections to be considered as ip4 only. spec: 5/9/2 helo: mail.example.com host: ::FFFF:1.2.3.4 mailfrom: foo@e2.example.com result: neutral cidr6-0: description: >- Match any IP6 spec: 5/8 helo: mail.example.com host: DEAF:BABE::CAB:FEE mailfrom: foo@e2.example.com result: pass cidr6-129: description: >- Invalid CIDR comment: >- IP4 only implementations MUST fully syntax check all mechanisms, even if they otherwise ignore them. spec: 5.6/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e3.example.com result: permerror cidr6-bad: description: >- dual-cidr syntax not used for ip6 comment: >- IP4 only implementations MUST fully syntax check all mechanisms, even if they otherwise ignore them. spec: 5.6/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e4.example.com result: permerror cidr6-33: description: >- make sure ip4 cidr restriction are not used for ip6 spec: 5.6/2 helo: mail.example.com host: "CAFE:BABE:8000::" mailfrom: foo@e5.example.com result: pass cidr6-33-ip4: description: >- make sure ip4 cidr restriction are not used for ip6 spec: 5.6/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e5.example.com result: neutral ip6-bad1: description: >- spec: 5.6/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e6.example.com result: permerror zonedata: mail.example.com: - A: 1.2.3.4 e1.example.com: - SPF: v=spf1 -all ip6 e2.example.com: - SPF: v=spf1 ip6:::1.1.1.1/0 e3.example.com: - SPF: v=spf1 ip6:::1.1.1.1/129 e4.example.com: - SPF: v=spf1 ip6:::1.1.1.1//33 e5.example.com: - SPF: v=spf1 ip6:Cafe:Babe:8000::/33 e6.example.com: - SPF: v=spf1 ip6::CAFE::BABE --- description: Semantics of exp and other modifiers comment: >- Implementing exp= is optional. If not implemented, the test driver should not check the explanation field. tests: redirect-none: description: >- If no SPF record is found, or if the target-name is malformed, the result is a "PermError" rather than "None". spec: 6.1/4 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e10.example.com result: permerror redirect-cancels-exp: description: >- when executing "redirect", exp= from the original domain MUST NOT be used. spec: 6.2/13 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e1.example.com result: fail explanation: DEFAULT redirect-syntax-error: description: | redirect = "redirect" "=" domain-spec comment: >- A literal application of the grammar causes modifier syntax errors (except for macro syntax) to become unknown-modifier. modifier = explanation | redirect | unknown-modifier However, it is generally agreed, with precedent in other RFCs, that unknown-modifier should not be "greedy", and should not match known modifier names. There should have been explicit prose to this effect, and some has been proposed as an erratum. spec: 6.1/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e17.example.com result: permerror skip: We don't enforce charset within the redirect. include-ignores-exp: description: >- when executing "include", exp= from the target domain MUST NOT be used. spec: 6.2/13 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e7.example.com result: fail explanation: Correct! redirect-cancels-prior-exp: description: >- when executing "redirect", exp= from the original domain MUST NOT be used. spec: 6.2/13 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e3.example.com result: fail explanation: See me. invalid-modifier: description: | unknown-modifier = name "=" macro-string name = ALPHA *( ALPHA / DIGIT / "-" / "_" / "." ) comment: >- Unknown modifier name must begin with alpha. spec: A/3 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e5.example.com result: permerror empty-modifier-name: description: | name = ALPHA *( ALPHA / DIGIT / "-" / "_" / "." ) comment: >- Unknown modifier name must not be empty. spec: A/3 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e6.example.com result: permerror dorky-sentinel: description: >- An implementation that uses a legal expansion as a sentinel. We cannot check them all, but we can check this one. comment: >- Spaces are allowed in local-part. spec: 7.1/6 helo: mail.example.com host: 1.2.3.4 mailfrom: "Macro Error@e8.example.com" result: fail explanation: Macro Error in implementation exp-multiple-txt: description: | Ignore exp if multiple TXT records. comment: >- If domain-spec is empty, or there are any DNS processing errors (any RCODE other than 0), or if no records are returned, or if more than one record is returned, or if there are syntax errors in the explanation string, then proceed as if no exp modifier was given. spec: 6.2/4 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e11.example.com result: fail explanation: DEFAULT exp-no-txt: description: | Ignore exp if no TXT records. comment: >- If domain-spec is empty, or there are any DNS processing errors (any RCODE other than 0), or if no records are returned, or if more than one record is returned, or if there are syntax errors in the explanation string, then proceed as if no exp modifier was given. spec: 6.2/4 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e22.example.com result: fail explanation: DEFAULT exp-dns-error: description: | Ignore exp if DNS error. comment: >- If domain-spec is empty, or there are any DNS processing errors (any RCODE other than 0), or if no records are returned, or if more than one record is returned, or if there are syntax errors in the explanation string, then proceed as if no exp modifier was given. spec: 6.2/4 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e21.example.com result: fail explanation: DEFAULT exp-empty-domain: description: | PermError if exp= domain-spec is empty. comment: >- Section 6.2/4 says, "If domain-spec is empty, or there are any DNS processing errors (any RCODE other than 0), or if no records are returned, or if more than one record is returned, or if there are syntax errors in the explanation string, then proceed as if no exp modifier was given." However, "if domain-spec is empty" conflicts with the grammar given for the exp modifier. This was reported as an erratum, and the solution chosen was to report explicit "exp=" as PermError, but ignore problems due to macro expansion, DNS, or invalid explanation string. spec: 6.2/4 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e12.example.com result: permerror skip: We ignore exp, and is harmless. explanation-syntax-error: description: | Ignore exp if the explanation string has a syntax error. comment: >- If domain-spec is empty, or there are any DNS processing errors (any RCODE other than 0), or if no records are returned, or if more than one record is returned, or if there are syntax errors in the explanation string, then proceed as if no exp modifier was given. spec: 6.2/4 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e13.example.com result: fail explanation: DEFAULT exp-syntax-error: description: | explanation = "exp" "=" domain-spec comment: >- A literal application of the grammar causes modifier syntax errors (except for macro syntax) to become unknown-modifier. modifier = explanation | redirect | unknown-modifier However, it is generally agreed, with precedent in other RFCs, that unknown-modifier should not be "greedy", and should not match known modifier names. There should have been explicit prose to this effect, and some has been proposed as an erratum. spec: 6.2/1 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e16.example.com result: permerror skip: We don't enforce exp values. exp-twice: description: | exp= appears twice. comment: >- These two modifiers (exp,redirect) MUST NOT appear in a record more than once each. If they do, then check_host() exits with a result of "PermError". spec: 6/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e14.example.com result: permerror skip: We ignore exp, and is harmless. redirect-empty-domain: description: | redirect = "redirect" "=" domain-spec comment: >- Unlike for exp, there is no instruction to override the permerror for an empty domain-spec (which is invalid syntax). spec: 6.2/4 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e18.example.com result: permerror skip: There's an early match. redirect-twice: description: | redirect= appears twice. comment: >- These two modifiers (exp,redirect) MUST NOT appear in a record more than once each. If they do, then check_host() exits with a result of "PermError". spec: 6/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e15.example.com result: permerror unknown-modifier-syntax: description: | unknown-modifier = name "=" macro-string comment: >- Unknown modifiers must have valid macro syntax. spec: A/3 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e9.example.com result: permerror skip: There's an early match. default-modifier-obsolete: description: | Unknown modifiers do not modify the RFC SPF result. comment: >- Some implementations may have a leftover default= modifier from earlier drafts. spec: 6/3 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e19.example.com result: neutral skip: Not worth the complexity of erroring on this. default-modifier-obsolete2: description: | Unknown modifiers do not modify the RFC SPF result. comment: >- Some implementations may have a leftover default= modifier from earlier drafts. spec: 6/3 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e20.example.com result: neutral skip: Not worth the complexity of erroring on this. non-ascii-exp: description: >- SPF explanation text is restricted to 7-bit ascii. comment: >- Checking a possibly different code path for non-ascii chars. spec: 6.2/5 helo: hosed host: 1.2.3.4 mailfrom: "foobar@nonascii.example.com" result: fail explanation: DEFAULT two-exp-records: description: >- Must ignore exp= if DNS returns more than one TXT record. spec: 6.2/4 helo: hosed host: 1.2.3.4 mailfrom: "foobar@tworecs.example.com" result: fail explanation: DEFAULT exp-void: description: | exp=nxdomain.tld comment: >- Non-existent exp= domains MUST NOT count against the void lookup limit. Implementations should lookup any exp record at most once after computing the result. spec: 4.6.4/1, 6/2 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e23.example.com result: fail redirect-implicit: description: | redirect changes implicit domain spec: 6.1/4 helo: e24.example.com host: 192.0.2.2 mailfrom: bar@e24.example.com result: pass zonedata: mail.example.com: - A: 1.2.3.4 e1.example.com: - SPF: v=spf1 exp=exp1.example.com redirect=e2.example.com e2.example.com: - SPF: v=spf1 -all e3.example.com: - SPF: v=spf1 exp=exp1.example.com redirect=e4.example.com e4.example.com: - SPF: v=spf1 -all exp=exp2.example.com exp1.example.com: - TXT: No-see-um exp2.example.com: - TXT: See me. exp3.example.com: - TXT: Correct! exp4.example.com: - TXT: "%{l} in implementation" e5.example.com: - SPF: v=spf1 1up=foo e6.example.com: - SPF: v=spf1 =all e7.example.com: - SPF: v=spf1 include:e3.example.com -all exp=exp3.example.com e8.example.com: - SPF: v=spf1 -all exp=exp4.example.com e9.example.com: - SPF: v=spf1 -all foo=%abc e10.example.com: - SPF: v=spf1 redirect=erehwon.example.com e11.example.com: - SPF: v=spf1 -all exp=e11msg.example.com e11msg.example.com: - TXT: Answer a fool according to his folly. - TXT: Do not answer a fool according to his folly. e12.example.com: - SPF: v=spf1 exp= -all e13.example.com: - SPF: v=spf1 exp=e13msg.example.com -all e13msg.example.com: - TXT: The %{x}-files. e14.example.com: - SPF: v=spf1 exp=e13msg.example.com -all exp=e11msg.example.com e15.example.com: - SPF: v=spf1 redirect=e12.example.com -all redirect=e12.example.com e16.example.com: - SPF: v=spf1 exp=-all e17.example.com: - SPF: v=spf1 redirect=-all ?all e18.example.com: - SPF: v=spf1 ?all redirect= e19.example.com: - SPF: v=spf1 default=pass e20.example.com: - SPF: "v=spf1 default=+" e21.example.com: - SPF: v=spf1 exp=e21msg.example.com -all e21msg.example.com: - TIMEOUT: true e22.example.com: - SPF: v=spf1 exp=mail.example.com -all nonascii.example.com: - SPF: v=spf1 exp=badexp.example.com -all badexp.example.com: - TXT: "\xEF\xBB\xBFExplanation" tworecs.example.com: - SPF: v=spf1 exp=twoexp.example.com -all twoexp.example.com: - TXT: "one" - TXT: "two" e23.example.com: - SPF: v=spf1 a:erehwon.example.com a:foobar.com exp=nxdomain.com -all e24.example.com: - SPF: v=spf1 redirect=testimplicit.example.com - A: 192.0.2.1 testimplicit.example.com: - SPF: v=spf1 a -all - A: 192.0.2.2 --- description: Macro expansion rules tests: trailing-dot-domain: spec: 7.1/16 description: >- trailing dot is ignored for domains helo: msgbas2x.cos.example.com host: 192.168.218.40 mailfrom: test@example.com result: pass trailing-dot-exp: spec: 7.1 description: >- trailing dot is not removed from explanation comment: >- A simple way for an implementation to ignore trailing dots on domains is to remove it when present. But be careful not to remove it for explanation text. helo: msgbas2x.cos.example.com host: 192.168.218.40 mailfrom: test@exp.example.com result: fail explanation: This is a test. exp-only-macro-char: spec: 7.1/8 description: >- The following macro letters are allowed only in "exp" text: c, r, t helo: msgbas2x.cos.example.com host: 192.168.218.40 mailfrom: test@e2.example.com result: permerror skip: We ignore exp, and is harmless. invalid-macro-char: spec: 7.1/9 description: >- A '%' character not followed by a '{', '%', '-', or '_' character is a syntax error. helo: msgbas2x.cos.example.com host: 192.168.218.40 mailfrom: test@e1.example.com result: permerror invalid-embedded-macro-char: spec: 7.1/9 description: >- A '%' character not followed by a '{', '%', '-', or '_' character is a syntax error. helo: msgbas2x.cos.example.com host: 192.168.218.40 mailfrom: test@e1e.example.com result: permerror invalid-trailing-macro-char: spec: 7.1/9 description: >- A '%' character not followed by a '{', '%', '-', or '_' character is a syntax error. helo: msgbas2x.cos.example.com host: 192.168.218.40 mailfrom: test@e1t.example.com result: permerror macro-mania-in-domain: description: >- macro-encoded percents (%%), spaces (%_), and URL-percent-encoded spaces (%-) spec: 7.1/3, 7.1/4 helo: mail.example.com host: 1.2.3.4 mailfrom: test@e1a.example.com result: pass exp-txt-macro-char: spec: 7.1/20 description: >- For IPv4 addresses, both the "i" and "c" macros expand to the standard dotted-quad format. helo: msgbas2x.cos.example.com host: 192.168.218.40 mailfrom: test@e3.example.com result: fail explanation: Connections from 192.168.218.40 not authorized. domain-name-truncation: spec: 7.1/25 description: >- When the result of macro expansion is used in a domain name query, if the expanded domain name exceeds 253 characters, the left side is truncated to fit, by removing successive domain labels until the total length does not exceed 253 characters. helo: msgbas2x.cos.example.com host: 192.168.218.40 mailfrom: test@somewhat.long.exp.example.com result: fail explanation: Congratulations! That was tricky. v-macro-ip4: spec: 7.1/6 description: |- v = the string "in-addr" if is ipv4, or "ip6" if is ipv6 helo: msgbas2x.cos.example.com host: 192.168.218.40 mailfrom: test@e4.example.com result: fail explanation: 192.168.218.40 is queried as 40.218.168.192.in-addr.arpa v-macro-ip6: spec: 7.1/6 description: |- v = the string "in-addr" if is ipv4, or "ip6" if is ipv6 helo: msgbas2x.cos.example.com host: CAFE:BABE::1 mailfrom: test@e4.example.com result: fail explanation: cafe:babe::1 is queried as 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.E.B.A.B.E.F.A.C.ip6.arpa undef-macro: spec: 7.1/6 description: >- Allowed macros chars are 'slodipvh' plus 'crt' in explanation. helo: msgbas2x.cos.example.com host: CAFE:BABE::192.168.218.40 mailfrom: test@e5.example.com result: permerror p-macro-ip4-novalid: spec: 7.1/22 description: |- p = the validated domain name of comment: >- The PTR in this example does not validate. helo: msgbas2x.cos.example.com host: 192.168.218.40 mailfrom: test@e6.example.com result: fail explanation: connect from unknown p-macro-ip4-valid: spec: 7.1/22 description: |- p = the validated domain name of comment: >- If a subdomain of the is present, it SHOULD be used. helo: msgbas2x.cos.example.com host: 192.168.218.41 mailfrom: test@e6.example.com result: fail explanation: connect from mx.example.com p-macro-ip6-novalid: spec: 7.1/22 description: |- p = the validated domain name of comment: >- The PTR in this example does not validate. helo: msgbas2x.cos.example.com host: CAFE:BABE::1 mailfrom: test@e6.example.com result: fail explanation: connect from unknown p-macro-ip6-valid: spec: 7.1/22 description: |- p = the validated domain name of comment: >- If a subdomain of the is present, it SHOULD be used. helo: msgbas2x.cos.example.com host: CAFE:BABE::3 mailfrom: test@e6.example.com result: fail explanation: connect from mx.example.com p-macro-multiple: spec: 7.1/22 description: |- p = the validated domain name of comment: >- If a subdomain of the is present, it SHOULD be used. helo: msgbas2x.cos.example.com host: 192.168.218.42 mailfrom: test@e7.example.com result: [pass, softfail] skip: p macro is not supported upper-macro: spec: 7.1/26 description: >- Uppercased macros expand exactly as their lowercased equivalents, and are then URL escaped. All chars not in the unreserved set MUST be escaped. comment: | unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" helo: msgbas2x.cos.example.com host: 192.168.218.42 mailfrom: ~jack&jill=up-a_b3.c@e8.example.com result: fail explanation: http://example.com/why.html?l=~jack%26jill%3Dup-a_b3.c hello-macro: spec: 7.1/6 description: |- h = HELO/EHLO domain helo: msgbas2x.cos.example.com host: 192.168.218.40 mailfrom: test@e9.example.com result: pass skip: We don't have a HELO-explicit mode. invalid-hello-macro: spec: 7.1/2 description: |- h = HELO/EHLO domain, but HELO is invalid comment: >- Domain-spec must end in either a macro, or a valid toplabel. It is not correct to check syntax after macro expansion. helo: "JUMPIN' JUPITER" host: 192.168.218.40 mailfrom: test@e9.example.com result: fail hello-domain-literal: spec: 7.1/2 description: |- h = HELO/EHLO domain, but HELO is a domain literal comment: >- Domain-spec must end in either a macro, or a valid toplabel. It is not correct to check syntax after macro expansion. helo: "[192.168.218.40]" host: 192.168.218.40 mailfrom: test@e9.example.com result: fail require-valid-helo: spec: 7.1/6 description: >- Example of requiring valid helo in sender policy. This is a complex policy testing several points at once. helo: OEMCOMPUTER host: 1.2.3.4 mailfrom: test@e10.example.com result: fail macro-reverse-split-on-dash: spec: 7.1/15, 7.1/16, 7.1/17, 7.1/18 description: >- Macro value transformation (splitting on arbitrary characters, reversal, number of right-hand parts to use) helo: mail.example.com host: 1.2.3.4 mailfrom: philip-gladstone-test@e11.example.com result: pass macro-multiple-delimiters: spec: 7.1/15, 7.1/16 description: |- Multiple delimiters may be specified in a macro expression. macro-expand = ( "%{" macro-letter transformers *delimiter "}" ) / "%%" / "%_" / "%-" helo: mail.example.com host: 1.2.3.4 mailfrom: foo-bar+zip+quux@e12.example.com result: pass zonedata: example.com.d.spf.example.com: - SPF: v=spf1 redirect=a.spf.example.com a.spf.example.com: - SPF: v=spf1 include:o.spf.example.com. ~all o.spf.example.com: - SPF: v=spf1 ip4:192.168.218.40 msgbas2x.cos.example.com: - A: 192.168.218.40 example.com: - A: 192.168.90.76 - SPF: v=spf1 redirect=%{d}.d.spf.example.com. exp.example.com: - SPF: v=spf1 exp=msg.example.com. -all msg.example.com: - TXT: This is a test. e1.example.com: - SPF: v=spf1 -exists:%(ir).sbl.example.com ?all e1e.example.com: - SPF: v=spf1 exists:foo%(ir).sbl.example.com ?all e1t.example.com: - SPF: v=spf1 exists:foo%.sbl.example.com ?all e1a.example.com: - SPF: "v=spf1 a:macro%%percent%_%_space%-url-space.example.com -all" "macro%percent space%20url-space.example.com": - A: 1.2.3.4 e2.example.com: - SPF: v=spf1 -all exp=%{r}.example.com e3.example.com: - SPF: v=spf1 -all exp=%{ir}.example.com 40.218.168.192.example.com: - TXT: Connections from %{c} not authorized. somewhat.long.exp.example.com: - SPF: v=spf1 -all exp=foobar.%{o}.%{o}.%{o}.%{o}.%{o}.%{o}.%{o}.%{o}.example.com somewhat.long.exp.example.com.somewhat.long.exp.example.com.somewhat.long.exp.example.com.somewhat.long.exp.example.com.somewhat.long.exp.example.com.somewhat.long.exp.example.com.somewhat.long.exp.example.com.somewhat.long.exp.example.com.example.com: - TXT: Congratulations! That was tricky. e4.example.com: - SPF: v=spf1 -all exp=e4msg.example.com e4msg.example.com: - TXT: "%{c} is queried as %{ir}.%{v}.arpa" e5.example.com: - SPF: v=spf1 a:%{a}.example.com -all e6.example.com: - SPF: v=spf1 -all exp=e6msg.example.com e6msg.example.com: - TXT: "connect from %{p}" mx.example.com: - A: 192.168.218.41 - A: 192.168.218.42 - AAAA: CAFE:BABE::2 - AAAA: CAFE:BABE::3 40.218.168.192.in-addr.arpa: - PTR: mx.example.com 41.218.168.192.in-addr.arpa: - PTR: mx.example.com 42.218.168.192.in-addr.arpa: - PTR: mx.example.com - PTR: mx.e7.example.com 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.E.B.A.B.E.F.A.C.ip6.arpa: - PTR: mx.example.com 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.E.B.A.B.E.F.A.C.ip6.arpa: - PTR: mx.example.com mx.e7.example.com: - A: 192.168.218.42 mx.e7.example.com.should.example.com: - A: 127.0.0.2 mx.example.com.ok.example.com: - A: 127.0.0.2 e7.example.com: - SPF: v=spf1 exists:%{p}.should.example.com ~exists:%{p}.ok.example.com e8.example.com: - SPF: v=spf1 -all exp=msg8.%{D2} msg8.example.com: - TXT: "http://example.com/why.html?l=%{L}" e9.example.com: - SPF: v=spf1 a:%{H} -all e10.example.com: - SPF: v=spf1 -include:_spfh.%{d2} ip4:1.2.3.0/24 -all _spfh.example.com: - SPF: v=spf1 -a:%{h} +all e11.example.com: - SPF: v=spf1 exists:%{i}.%{l2r-}.user.%{d2} 1.2.3.4.gladstone.philip.user.example.com: - A: 127.0.0.2 e12.example.com: - SPF: v=spf1 exists:%{l2r+-}.user.%{d2} bar.foo.user.example.com: - A: 127.0.0.2 --- description: Processing limits tests: redirect-loop: description: >- SPF implementations MUST limit the number of mechanisms and modifiers that do DNS lookups to at most 10 per SPF check. spec: 4.6.4/1 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e1.example.com result: permerror include-loop: description: >- SPF implementations MUST limit the number of mechanisms and modifiers that do DNS lookups to at most 10 per SPF check. spec: 4.6.4/1 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e2.example.com result: permerror mx-limit: description: >- there MUST be a limit of no more than 10 MX looked up and checked. comment: >- The required result for this test was the subject of much controversy with RFC4408. For RFC7208 the ambiguity was resolved in favor of producing a permerror result. spec: 4.6.4/2 helo: mail.example.com host: 1.2.3.5 mailfrom: foo@e4.example.com result: permerror ptr-limit: description: >- there MUST be a limit of no more than 10 PTR looked up and checked. comment: >- The result of this test cannot be permerror not only because the RFC does not specify it, but because the sender has no control over the PTR records of spammers. The preferred result reflects evaluating the 10 allowed PTR records in the order returned by the test data. If testing with live DNS, the PTR order may be random, and a pass result would still be compliant. The SPF result is effectively randomized. spec: 4.6.4/3 helo: mail.example.com host: 1.2.3.5 mailfrom: foo@e5.example.com result: [neutral, pass] false-a-limit: description: >- unlike MX, PTR, there is no RR limit for A comment: >- There seems to be a tendency for developers to want to limit A RRs in addition to MX and PTR. These are IPs, not usable for 3rd party DoS attacks, and hence need no low limit. spec: 4.6.4 helo: mail.example.com host: 1.2.3.12 mailfrom: foo@e10.example.com result: pass mech-at-limit: description: >- SPF implementations MUST limit the number of mechanisms and modifiers that do DNS lookups to at most 10 per SPF check. spec: 4.6.4/1 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e6.example.com result: pass skip: This is a legitimate fail because we don't do caching. mech-over-limit: description: >- SPF implementations MUST limit the number of mechanisms and modifiers that do DNS lookups to at most 10 per SPF check. comment: >- We do not check whether an implementation counts mechanisms before or after evaluation. The RFC is not clear on this. spec: 4.6.4/1 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e7.example.com result: permerror include-at-limit: description: >- SPF implementations MUST limit the number of mechanisms and modifiers that do DNS lookups to at most 10 per SPF check. comment: >- The part of the RFC that talks about MAY parse the entire record first (4.6) is specific to syntax errors. In RFC7208, processing limits are part of syntax checking (4.6). spec: 4.6.4/1 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e8.example.com result: pass include-over-limit: description: >- SPF implementations MUST limit the number of mechanisms and modifiers that do DNS lookups to at most 10 per SPF check. spec: 4.6.4/1 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e9.example.com result: permerror void-at-limit: description: >- SPF implementations SHOULD limit "void lookups" to two. An implementation MAY choose to make such a limit configurable. In this case, a default of two is RECOMMENDED. comment: >- This is a new check in RFC7208, but it's been implemented in Mail::SPF for years with no issues. spec: 4.6.4/7 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e12.example.com result: neutral void-over-limit: description: >- SPF implementations SHOULD limit "void lookups" to two. An implementation MAY choose to make such a limit configurable. In this case, a default of two is RECOMMENDED. spec: 4.6.4/7 helo: mail.example.com host: 1.2.3.4 mailfrom: foo@e11.example.com result: permerror skip: We don't limit this separately from the total 10 limit. zonedata: mail.example.com: - A: 1.2.3.4 e1.example.com: - SPF: v=spf1 ip4:1.1.1.1 redirect=e1.example.com - A: 1.2.3.6 e2.example.com: - SPF: v=spf1 include:e3.example.com - A: 1.2.3.7 e3.example.com: - SPF: v=spf1 include:e2.example.com - A: 1.2.3.8 e4.example.com: - SPF: v=spf1 mx - MX: [0, mail.example.com] - MX: [1, mail.example.com] - MX: [2, mail.example.com] - MX: [3, mail.example.com] - MX: [4, mail.example.com] - MX: [5, mail.example.com] - MX: [6, mail.example.com] - MX: [7, mail.example.com] - MX: [8, mail.example.com] - MX: [9, mail.example.com] - MX: [10, e4.example.com] - A: 1.2.3.5 e5.example.com: - SPF: v=spf1 ptr - A: 1.2.3.5 5.3.2.1.in-addr.arpa: - PTR: e1.example.com. - PTR: e2.example.com. - PTR: e3.example.com. - PTR: e4.example.com. - PTR: example.com. - PTR: e6.example.com. - PTR: e7.example.com. - PTR: e8.example.com. - PTR: e9.example.com. - PTR: e10.example.com. - PTR: e5.example.com. e6.example.com: - SPF: v=spf1 a mx a mx a mx a mx a ptr ip4:1.2.3.4 -all - A: 1.2.3.8 - MX: [10, e6.example.com] e7.example.com: - SPF: v=spf1 a mx a mx a mx a mx a ptr a ip4:1.2.3.4 -all - A: 1.2.3.20 e8.example.com: - SPF: v=spf1 a include:inc.example.com ip4:1.2.3.4 mx -all - A: 1.2.3.4 inc.example.com: - SPF: v=spf1 a a a a a a a a - A: 1.2.3.10 e9.example.com: - SPF: v=spf1 a include:inc.example.com a ip4:1.2.3.4 -all - A: 1.2.3.21 e10.example.com: - SPF: v=spf1 a -all - A: 1.2.3.1 - A: 1.2.3.2 - A: 1.2.3.3 - A: 1.2.3.4 - A: 1.2.3.5 - A: 1.2.3.6 - A: 1.2.3.7 - A: 1.2.3.8 - A: 1.2.3.9 - A: 1.2.3.10 - A: 1.2.3.11 - A: 1.2.3.12 e11.example.com: - TXT: v=spf1 a:err.example.com a:err1.example.com a:err2.example.com ?all e12.example.com: - TXT: v=spf1 a:err.example.com a:err1.example.com ?all --- description: Test cases from implementation bugs tests: bytes-bug: description: >- Bytes vs str bug from pyspf. comment: >- Pyspf failed with strict=2 only. Other implementations may ignore the strict parameter. spec: 5.4/4 helo: example.org host: 2001:db8:ff0:100::2 mailfrom: test@example.org result: pass strict: 2 zonedata: example.org: - SPF: "v=spf1 mx redirect=_spf.example.com" - MX: [10,smtp.example.org] - MX: [10,smtp1.example.com] smtp.example.org: - A: 198.51.100.2 - AAAA: 2001:db8:ff0:100::3 smtp1.example.com: - A: 192.0.2.26 - AAAA: 2001:db8:ff0:200::2 2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0.0.F.F.0.8.B.D.0.1.0.0.2.ip6.arpa: - PTR: smtp6-v.fe.example.org smtp6-v.fe.example.org: - AAAA: 2001:db8:ff0:100::2 _spf.example.com: - SPF: "v=spf1 ptr:fe.example.org ptr:sgp.example.com exp=_expspf.example.org -all" _expspf.example.org: - TXT: "Sender domain not allowed from this host. Please see http://www.openspf.org/Why?s=mfrom&id=%{S}&ip=%{C}&r=%{R}" golang-blitiri-go-spf-0.0+git20191018.0.a683815/testdata/simple-tests.yml000066400000000000000000000015031355241314300251130ustar00rootroot00000000000000# Simple tests, used for debugging the testing infrastructure. --- description: Simple successes tests: test1: description: Straightforward sucesss helo: example.net mailfrom: "foobar@example.net" host: 1.2.3.4 result: pass test2: description: HELO is set, but expected to be ignored helo: blargh mailfrom: "foobar@example.net" host: 1.2.3.4 result: pass zonedata: example.net: - SPF: v=spf1 +all --- description: Simple failures tests: test1: description: Straightforward failure helo: example.net mailfrom: "foobar@example.net" host: 1.2.3.4 result: fail test2: description: HELO is set, but expected to be ignored helo: blargh mailfrom: "foobar@example.net" host: 1.2.3.4 result: fail zonedata: example.net: - SPF: v=spf1 -all golang-blitiri-go-spf-0.0+git20191018.0.a683815/yml_test.go000066400000000000000000000160731355241314300223250ustar00rootroot00000000000000package spf import ( "flag" "fmt" "io" "net" "os" "strings" "testing" "gopkg.in/yaml.v2" ) var ( ymlSingle = flag.String("yml_single", "", "run only the test with this name") ymlSkipMarked = flag.Bool("yml_skip_marked", true, "skip tests marked with the 'skip' value") ) ////////////////////////////////////////////////////// // YAML test suite parsing. // type Suite struct { Description string Tests map[string]Test ZoneData map[string][]Record `yaml:"zonedata"` } type Test struct { Description string Comment string Spec stringSlice Helo string Host string MailFrom string `yaml:"mailfrom"` Result stringSlice Explanation string Skip string } // Only one of these will be set. type Record struct { A stringSlice `yaml:"A"` AAAA stringSlice `yaml:"AAAA"` MX *MX `yaml:"MX"` SPF stringSlice `yaml:"SPF"` TXT stringSlice `yaml:"TXT"` PTR stringSlice `yaml:"PTR"` CNAME stringSlice `yaml:"CNAME"` TIMEOUT bool `yaml:"TIMEOUT"` } func (r Record) String() string { if len(r.A) > 0 { return fmt.Sprintf("A: %v", r.A) } if len(r.AAAA) > 0 { return fmt.Sprintf("AAAA: %v", r.AAAA) } if r.MX != nil { return fmt.Sprintf("MX: %v", *r.MX) } if len(r.SPF) > 0 { return fmt.Sprintf("SPF: %v", r.SPF) } if len(r.TXT) > 0 { return fmt.Sprintf("TXT: %v", r.TXT) } if len(r.PTR) > 0 { return fmt.Sprintf("PTR: %v", r.PTR) } if len(r.CNAME) > 0 { return fmt.Sprintf("CNAME: %v", r.CNAME) } if r.TIMEOUT { return "TIMEOUT" } return fmt.Sprintf("") } // String slice with a custom yaml unmarshaller, because the yaml parser can't // handle single-element entries. // https://github.com/go-yaml/yaml/issues/100 type stringSlice []string func (sl *stringSlice) UnmarshalYAML(unmarshal func(interface{}) error) error { // Try a slice first, and if it works, return it. slice := []string{} if err := unmarshal(&slice); err == nil { *sl = slice return nil } // Get a single string, and append it. single := "" if err := unmarshal(&single); err != nil { return err } *sl = []string{single} return nil } // MX is encoded as: // MX: [0, mail.example.com] // so we have a custom decoder to handle the multi-typed list. type MX struct { Prio uint16 Host string } func (mx *MX) UnmarshalYAML(unmarshal func(interface{}) error) error { seq := []interface{}{} if err := unmarshal(&seq); err != nil { return err } mx.Prio = uint16(seq[0].(int)) mx.Host = seq[1].(string) return nil } ////////////////////////////////////////////////////// // Test runners. // func testRFC(t *testing.T, fname string) { input, err := os.Open(fname) if err != nil { t.Fatal(err) } suites := []Suite{} dec := yaml.NewDecoder(input) for { s := Suite{} err = dec.Decode(&s) if err == io.EOF { break } if err != nil { t.Fatal(err) } suites = append(suites, s) } trace = t.Logf for _, suite := range suites { t.Logf("suite: %v", suite.Description) // Set up zone for the suite based on zonedata. dns = NewDNS() for domain, records := range suite.ZoneData { t.Logf(" domain %v", domain) for _, record := range records { t.Logf(" %v", record) if record.TIMEOUT { err := &net.DNSError{ Err: "test timeout error", IsTimeout: true, } dns.errors[domain] = err } for _, s := range record.A { dns.ip[domain] = append(dns.ip[domain], net.ParseIP(s)) } for _, s := range record.AAAA { dns.ip[domain] = append(dns.ip[domain], net.ParseIP(s)) } for _, s := range record.TXT { dns.txt[domain] = append(dns.txt[domain], s) } if record.MX != nil { dns.mx[domain] = append(dns.mx[domain], &net.MX{record.MX.Host, record.MX.Prio}) } for _, s := range record.PTR { // domain in this case is of the form: // 4.3.2.1.in-addr.arpa // 1.0.0.0.0.[...].0.0.E.B.A.B.E.F.A.C.ip6.arpa // We need to extract the normal string representation for // them, and add the record to dns.addr[ip.String()]. // Enforce that the record is fully qualified, that's what // we expect to see in practice. if !strings.HasSuffix(s, ".") { s += "." } ip := reverseDNS(t, domain).String() dns.addr[ip] = append(dns.addr[ip], s) } // TODO: CNAME } // The test suite is not well done: some tests use SPF instead of // TXT because they are old, and others expect the lookup to try // TXT first and SPF later, even though that's forbidden by the // standard. // To try to minimize changes to the suite, we work around this by // only adding records from SPF if there is no TXT already. // We need to do this in a separate step because order of // appearance is not guaranteed. if len(dns.txt[domain]) == 0 { for _, record := range records { if len(record.SPF) > 0 { // The test suite expect a single-line SPF record to be // concatenated without spaces. dns.txt[domain] = append(dns.txt[domain], strings.Join(record.SPF, "")) } } } } // Run each test. for name, test := range suite.Tests { if *ymlSingle != "" && *ymlSingle != name { continue } if test.Skip != "" && *ymlSkipMarked { continue } t.Logf(" test %s", name) ip := net.ParseIP(test.Host) t.Logf(" checkhost %v %v", ip, test.MailFrom) res, err := CheckHostWithSender( net.ParseIP(test.Host), test.Helo, test.MailFrom) if !resultIn(res, test.Result) { t.Errorf(" failed: expected %v, got %v (%v) [%v]", test.Result, res, err, name) } else { t.Logf(" success: %v, %v [%v]", res, err, name) } } } } func resultIn(got Result, exp []string) bool { for _, e := range exp { if e == string(got) { return true } } return false } // Take a reverse-dns host name of the form: // 4.3.2.1.in-addr.arpa // 1.0.0.0.0.[...].0.0.E.B.A.B.E.F.A.C.ip6.arpa // and returns the corresponding ip. func reverseDNS(t *testing.T, r string) net.IP { s := "" if strings.HasSuffix(r, ".in-addr.arpa") { // Strip suffix. r := r[:len(r)-len(".in-addr.arpa")] // Break down in pieces, and construct the ipv4 string backwards. pieces := strings.Split(r, ".") for i := 0; i < len(pieces); i++ { s += pieces[len(pieces)-1-i] + "." } s = s[:len(s)-1] } else if strings.HasSuffix(r, ".ip6.arpa") { // Strip suffix. r := r[:len(r)-len(".ip6.arpa")] // Break down in pieces, and construct the ipv6 string backwards. pieces := strings.Split(r, ".") for i := 0; i < len(pieces); i++ { s += pieces[len(pieces)-1-i] if i%4 == 3 { s += ":" } } s = s[:len(s)-1] } else { t.Fatalf("invalid reverse dns %q: invalid suffix", r) } ip := net.ParseIP(s) if ip == nil { t.Fatalf("invalid reverse dns %q: bad ip %q", r, s) } return ip } func TestSimple(t *testing.T) { testRFC(t, "testdata/simple-tests.yml") } func TestRFC4408(t *testing.T) { testRFC(t, "testdata/rfc4408-tests.yml") } func TestRFC7208(t *testing.T) { testRFC(t, "testdata/rfc7208-tests.yml") } func TestPySPF(t *testing.T) { testRFC(t, "testdata/pyspf-tests.yml") }