binsec.fail

Documented broken configurations for testing security checkers

This domain serves deliberately wrong configurations used to test security checkers. The sections below describe each published configuration, the records or endpoints involved and the behaviour a correct checker must show.

DNS 12 cases

Deliberately unusual DNS records used to exercise SPF, DMARC, MX and delegation handling of our own checkers. Each hostname below has one specific flaw or edge case.

Hostname: binsec.fail

binsec.fail. 86400 IN TXT "v=spf1 -all"

What it tests

The apex publishes a minimal SPF record with a single "all" mechanism and a fail qualifier. No host is authorised to send mail for the domain.

Expected behaviour

A valid, complete SPF record: any HELO or MAIL-FROM check against binsec.fail must result in "fail". A checker must not report warnings about missing mechanisms here.

References: RFC 7208, section 5.1

Hostname: invalid.spf.binsec.fail

invalid.spf.binsec.fail. 86400 IN TXT "v=spf1 a:%{x} -all"

What it tests

The record uses the macro %{x}, which is not defined by RFC 7208. A macro expansion in the record must therefore fail.

Expected behaviour

The parser must detect the invalid macro and treat the whole record as invalid (SPF PermError). It must not attempt a literal DNS lookup for "%{x}".

References: RFC 7208, section 7

Hostname: macro.spf.binsec.fail

macro.spf.binsec.fail. 86400 IN TXT "v=spf1 a:%{d} -all"

What it tests

The record uses the valid macro %{d}, which expands to the checked domain before the mechanism is evaluated.

Expected behaviour

The checker must expand the macro before evaluation and then look up the expanded name. macro.spf.binsec.fail has no address records, so the "a" mechanism must not match and the result must be "fail" via the trailing "-all". Checkers without macro support must at least not crash on the record.

References: RFC 7208, section 7

Hostname: loop.spf.binsec.fail

loop.spf.binsec.fail. 86400 IN TXT "v=spf1 include:loop.spf.binsec.fail -all"

What it tests

The record includes itself via the include mechanism, producing a circular reference.

Expected behaviour

A circular include must be detected (visited set or recursion limit) and reported as a permanent error. The checker must not recurse until it hangs or exhausts its query budget silently.

References: RFC 7208, section 5.2

Hostname: mx.spf.binsec.fail

mx.spf.binsec.fail. 86400 IN TXT "v=spf1 mx:manymx.binsec.fail"

What it tests

The record uses "mx:" with an explicit domain pointing at the eleven-Mail-Exchange host manymx and omits a trailing "all" mechanism.

Expected behaviour

The mx mechanism must expand to A/AAAA lookups of all eleven MX targets of manymx.binsec.fail. Because the record has no "all" mechanism, a non-matching sender must evaluate to neutral, not to "fail".

References: RFC 7208, sections 5.4 and 5.1

Hostname: noversion.spf.binsec.fail

noversion.spf.binsec.fail. 86400 IN TXT "-all"

What it tests

The TXT record contains only "-all" without the required "v=spf1 " prefix, so it is not an SPF record at all.

Expected behaviour

Only TXT records starting with "v=spf1" are SPF records. The record must be ignored and the domain must evaluate as having no SPF record ("none").

References: RFC 7208, section 3

Hostname: _dmarc.binsec.fail

_dmarc.binsec.fail. 86400 IN TXT "v=DMARC1; p=reject"

What it tests

A DMARC record carrying only the mandatory tags v and p.

Expected behaviour

The record is valid with policy p=reject and the RFC defaults applied (pct=100, no aggregate or forensic reporting, subdomain policy follows p).

References: RFC 7489, section 6.3

Hostname: _dmarc.noversion.dmarc.binsec.fail

_dmarc.noversion.dmarc.binsec.fail. 86400 IN TXT "p=reject"

What it tests

The record at the DMARC location carries a policy but is missing the mandatory v=DMARC1 tag.

Expected behaviour

A DMARC record without a valid v tag must be ignored entirely, so noversion.dmarc.binsec.fail has no DMARC policy.

References: RFC 7489, section 6.3

Hostname: _dmarc.spf-in-dmarc.dmarc.binsec.fail

_dmarc.spf-in-dmarc.dmarc.binsec.fail. 86400 IN TXT "v=spf1 -all"

What it tests

The TXT record below _dmarc is a syntactically correct SPF record placed at the DMARC position.

Expected behaviour

The record is not DMARC and must be ignored; a checker must not parse every TXT record at _dmarc as a DMARC policy.

References: RFC 7489, section 6.4

Hostname: manymx.binsec.fail

manymx.binsec.fail. 86400 IN MX 10 l<N>.manymx.binsec.fail.  (l1 .. l11)
l<N>.manymx.binsec.fail. 86400 IN AAAA ::1  (l1 .. l11)

What it tests

The host carries eleven MX records, all with preference 10, and the eleven targets only have AAAA records pointing at ::1.

Expected behaviour

Equal-preference MX records allow the sender to pick any target. A checker must cope with more than ten MX records and must resolve the targets over AAAA only, since the targets have no A records.

References: RFC 5321, section 5.1

Hostname: dns.binsec.fail

dns.binsec.fail. 86400 IN NS ns.binsec.fail.
dns.binsec.fail. 86400 IN TXT "DNS test domain"
web.dns.binsec.fail. 86400 IN AAAA 2a07:a1c1:1:1:53:fa11:a:1
backdoor.dns.binsec.fail. 86400 IN A 127.0.0.1
backdoor.dns.binsec.fail. 86400 IN AAAA ::1

What it tests

A subdomain delegated to ns.binsec.fail with its own zone: an SOA, a descriptive TXT, web as AAAA and backdoor as A 127.0.0.1 / AAAA ::1.

Expected behaviour

Exercises resolution across the referral and zone transfer (AXFR) against our own authoritative server. The backdoor name answers with loopback addresses, which is a good place to verify that a checker does not silently drop loopback targets.

References: RFC 1034, section 4.3.2

Hostname: _acme-challenge.test.binsec.fail

_acme-challenge.test.binsec.fail. 86400 IN CNAME test.binsec.fail.validation.binsec.services.

What it tests

The ACME challenge name is a CNAME to the validation domain of an external ACME service.

Expected behaviour

A CA following the CNAME authorisation method must chase the CNAME and request the TXT record at the target domain instead of demanding the TXT at the challenge name itself.

References: RFC 8555, section 8.4

DNSSEC 5 cases

A signed zone tree under dns.binsec.fail with deliberately broken signatures. The test zones are signed offline with static RRSIG validity windows, so every verdict below stays reproducible without key maintenance; the expired-signature case is the one exception where the window has intentionally lapsed. The binsec.fail apex itself is live-signed and re-signs on its own. Each case names the exact query type a validating checker must evaluate.

Hostname: binsec.fail

binsec.fail. 86400 IN DNSKEY 257 3 13 Ushn02xBklaNrJcvLw7o4GZJ4dTX/VrSygCJ3gz1iVl59S4yC4i8hXbz REEn4uxNHcEOjlsm4Wjf6AVrssm9lA==
; parent-side DS at the registry: binsec.fail. 3600 IN DS 23892 13 2 2E56B017AE6B85DCCF9DD03F26F10000B45ECA1D830F1AE7FA99ACA1 283D224F

What it tests

The apex zone is live-signed with a single ECDSAP256SHA256 zone-signing key (algorithm 13, key tag 23892) and uses NSEC for authenticated denial. The .fail registry publishes the DS record for the zone; the parent zones publish signed DS records for every signed test zone below dns.binsec.fail.

Expected behaviour

Every record type at binsec.fail must validate as SECURE over a complete chain: root, .fail TLD, binsec.fail. The checker must match the registry DS (key tag 23892, algorithm 13, SHA-256 digest 2E56...283D224F) against the published DNSKEY and must report no findings on the NSEC, TTLs or signature lifetimes used here.

References: RFC 4034, section 5, RFC 5155, section 7

Hostname: missing.dnssec.dns.binsec.fail

missing.dnssec.dns.binsec.fail. 3600 IN TXT "RRSIG stripped -> BOGUS"
; no RRSIG below this RRset, by design

What it tests

The zone dnssec.dns.binsec.fail is fully signed and secured by a DS record at its parent, but the TXT RRset of this name was stripped of its RRSIG before deployment and is served unsigned.

Expected behaviour

A secured zone must sign every RRset. The validator must report BOGUS for the name because the positive answer carries no signature; it must not downgrade the answer to INSECURE just because the RRSIG is absent.

References: RFC 4035, section 2.2

Hostname: unknown-algo.dnssec.dns.binsec.fail

unknown-algo.dnssec.dns.binsec.fail. 3600 IN TXT "unknown algorithm -> BOGUS"
unknown-algo.dnssec.dns.binsec.fail. 3600 IN RRSIG TXT 254 5 3600 20370101000000 20200101000000 30256 dnssec.dns.binsec.fail. B148GfpsKzOQ/d6iwSi7L2is+xR/7mGcb9I0NHBsWis5mBJpJ9X/hO7TwOf0dDi1kDeREX7emrDnl26bO2hkUsWc6HB6B0jxAorpcXdXDqitOo6lW/008OzwZfehDOcgiwxAiDjGnKbk063khvSuHkVn7Fcjcqb3D9DYSGOvb/Y=

What it tests

The only RRSIG below this name declares algorithm number 254, which IANA has not assigned; the rest of the zone is signed with algorithm 8. The verifier therefore has no usable signature.

Expected behaviour

An RRSIG with an unsupported algorithm must count as no valid signature: the name must evaluate to BOGUS. A checker must not skip the unsigned-looking RRset as if the zone were unsigned, and must not crash on the unknown algorithm field.

References: RFC 4035, section 3.1

Hostname: expired.dnssec.dns.binsec.fail

expired.dnssec.dns.binsec.fail. 3600 IN SOA ns.binsec.fail. noc.binsec.systems. 2026102001 28800 7200 864000 300
expired.dnssec.dns.binsec.fail. 3600 IN RRSIG SOA 8 5 3600 20260201000000 20250101000000 8073 expired.dnssec.dns.binsec.fail. YVSt6HLjIBh1e6NpR6pM19jsdmWu8MS1ib1vuPNo4W/MyFa28OgbMGku0yeGcm+ok3JkpzRIAj0Z49re3ySfOI1AXfMB9g8Ala80Q0gi7LU/V073O+9SksKVryJSOb5WBHHtrXW8r7ozsw2j0kwkdZ1l8pw55UJMhOtqdr0BBHs=

What it tests

The zone is signed and secured by a DS at its parent, but every RRSIG uses a static validity window that ended in the past (its Signature Expiration field is in the past, see the record listing of this case).

Expected behaviour

The checker must report BOGUS with an expired-signature reason for any RRset in the zone. Because a secure delegation with a matching DS exists, falling back to INSECURE or to an unsigned answer is wrong.

References: RFC 4035, section 3.1

Hostname: web.bogus.dnssec.dns.binsec.fail

web.bogus.dnssec.dns.binsec.fail. 3600 IN AAAA ::1
web.bogus.dnssec.dns.binsec.fail. 3600 IN RRSIG AAAA 8 6 3600 20370101000000 20200101000000 23553 bogus.dnssec.dns.binsec.fail. A0TT9cX4IWeatIvG80WZ9Vh8yH+qhWG1bYLg3frS6Mg1PsY6wvI8UE+faUHBexlWc2zYZg+xWwDrV1mcFDPJgOr0nxk8xIZh74YWlawVk3S5ciAWxbvmWAjr4+r1Ntcp5wkG6hXnBUt9ekQMCzdlgB5ec2G20YL6V5Nmkes3Y2Y=

What it tests

The apex of bogus.dnssec.dns.binsec.fail validates SECURE and its DNSKEY RRset self-verifies, but one base64 character of the RRSIG below the AAAA record of web was altered after signing, so the cryptographic check of that signature must fail.

Expected behaviour

An AAAA lookup of web.bogus.dnssec.dns.binsec.fail must evaluate to BOGUS on signature verification, while the zone apex itself stays SECURE. A checker that only validates the DS chain and the apex, but not the RRset signatures one level down, misses this case entirely.

References: RFC 4033, section 3.2, RFC 4035, section 3.1

HTTP 12 cases

One virtual host per verdict path of our HTTP header checker below *.http.binsec.fail: a reference profile, isolated header defects from missing HSTS max-age over weakened cross-origin values to deprecated headers, plus parser traps such as duplicated headers and meta-tag fallback. Pure mod_headers configuration, no application behind it.

Hostname: good.http.binsec.fail

Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
Content-Security-Policy: default-src 'self'; form-action 'none'; frame-ancestors 'none'; base-uri 'self'; upgrade-insecure-requests; require-trusted-types-for 'script'; report-uri https://reports.http.binsec.fail/csp
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
X-Permitted-Cross-Domain-Policies: none
Referrer-Policy: no-referrer
Cross-Origin-Resource-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin
Cache-Control: no-store, max-age=0

What it tests

All ten recommended headers with OWASP-recommended values; the CSP evaluates without findings.

Expected behaviour

The checker must report a clean result: every recommended header present with a recommended value and no findings for the CSP. Any finding on this host is a checker defect.

References: RFC 6797, section 6.1.1, RFC 9116, section 4

Hostname: bare.http.binsec.fail


            

What it tests

The vhost serves the fixture without a single security header.

Expected behaviour

All ten recommended headers must be reported as missing; the response must still be evaluated, not treated as an error.

References: OWASP Secure Headers Project

Hostname: weak-hsts.http.binsec.fail

Strict-Transport-Security: max-age=600; includeSubDomains
Content-Security-Policy: default-src 'self'; form-action 'none'; frame-ancestors 'none'; base-uri 'self'; upgrade-insecure-requests; require-trusted-types-for 'script'; report-uri https://reports.http.binsec.fail/csp
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
X-Permitted-Cross-Domain-Policies: none
Referrer-Policy: no-referrer
Cross-Origin-Resource-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin
Cache-Control: no-store, max-age=0

What it tests

Baseline profile except that HSTS carries max-age=600 and no preload flag.

Expected behaviour

The checker must flag the short max-age and the missing preload while leaving the nine untouched headers alone - a finding on any of them means the report is not isolated.

References: RFC 6797, section 6.1.1

Hostname: broken-hsts.http.binsec.fail

Strict-Transport-Security: includeSubDomains
Content-Security-Policy: default-src 'self'; form-action 'none'; frame-ancestors 'none'; base-uri 'self'; upgrade-insecure-requests; require-trusted-types-for 'script'; report-uri https://reports.http.binsec.fail/csp
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
X-Permitted-Cross-Domain-Policies: none
Referrer-Policy: no-referrer
Cross-Origin-Resource-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin
Cache-Control: no-store, max-age=0

What it tests

Baseline profile except that the HSTS value only carries includeSubDomains.

Expected behaviour

A syntactically valid header with no max-age directive must be reported as an error; the remaining baseline must stay clean.

References: RFC 6797, section 6.1

Hostname: csp-loose.http.binsec.fail

Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
Content-Security-Policy: default-src *; script-src 'unsafe-inline' 'unsafe-eval'
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
X-Permitted-Cross-Domain-Policies: none
Referrer-Policy: no-referrer
Cross-Origin-Resource-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin
Cache-Control: no-store, max-age=0

What it tests

Baseline profile except the CSP is default-src * with script-src 'unsafe-inline' 'unsafe-eval'; form-action and frame-ancestors are not set.

Expected behaviour

The checker must report the wildcard source and both unsafe keywords and flag the missing form-action and frame-ancestors directives; reading the CSP as mere present-or-absent is not enough here.

References: RFC 9116, section 4

Hostname: loose.http.binsec.fail

Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
Content-Security-Policy: default-src 'self'; form-action 'none'; frame-ancestors 'none'; base-uri 'self'; upgrade-insecure-requests; require-trusted-types-for 'script'; report-uri https://reports.http.binsec.fail/csp
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-Permitted-Cross-Domain-Policies: all
Referrer-Policy: strict-origin-when-cross-origin
Cross-Origin-Resource-Policy: cross-origin
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin-allow-popups
Cache-Control: private, max-age=86400

What it tests

X-Frame-Options SAMEORIGIN, X-Permitted-Cross-Domain-Policies all, Referrer-Policy strict-origin-when-cross-origin, CORP cross-origin, COOP same-origin-allow-popups and Cache-Control private with max-age, all where the stricter value is recommended.

Expected behaviour

Every weakened header must be reported at investigation level, not as missing and not as clean: this is the most common profile of real-world sites that did half the work.

References: RFC 7034, section 3, Fetch Standard, referrer policy and cross-origin paragraphs

Hostname: unsafe-co.http.binsec.fail

Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
Content-Security-Policy: default-src 'self'; form-action 'none'; frame-ancestors 'none'; base-uri 'self'; upgrade-insecure-requests; require-trusted-types-for 'script'; report-uri https://reports.http.binsec.fail/csp
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
X-Permitted-Cross-Domain-Policies: none
Referrer-Policy: unsafe-url
Cross-Origin-Resource-Policy: same-origin
Cross-Origin-Embedder-Policy: unsafe-none
Cross-Origin-Opener-Policy: unsafe-none
Cache-Control: no-store, max-age=0

What it tests

COEP and COOP set to unsafe-none and Referrer-Policy unsafe-url against an otherwise recommended baseline.

Expected behaviour

The three unsafe-* opt-outs must be reported as insecure rather than accepted as configured values.

References: Fetch Standard, cross-origin embedder and opener policies

Hostname: unknown-values.http.binsec.fail

Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
Content-Security-Policy: default-src 'self'; form-action 'none'; frame-ancestors 'none'; base-uri 'self'; upgrade-insecure-requests; require-trusted-types-for 'script'; report-uri https://reports.http.binsec.fail/csp
X-Frame-Options: ALLOW-ALL
X-Content-Type-Options: sniff
X-Permitted-Cross-Domain-Policies: everything
Referrer-Policy: paranoid
Cross-Origin-Resource-Policy: same-place
Cross-Origin-Embedder-Policy: avoid-corp
Cross-Origin-Opener-Policy: close-all
Cache-Control: no-store, max-age=0

What it tests

Each of seven headers carries a plausible but non-existent token such as X-Frame-Options ALLOW-ALL or Referrer-Policy paranoid.

Expected behaviour

All seven must be reported as errors with unknown value; silently treating an unparseable value as satisfied is a checker defect.

References: RFC 7034, section 3, RFC 9116, section 4

Hostname: cache-conflict.http.binsec.fail

Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
Content-Security-Policy: default-src 'self'; form-action 'none'; frame-ancestors 'none'; base-uri 'self'; upgrade-insecure-requests; require-trusted-types-for 'script'; report-uri https://reports.http.binsec.fail/csp
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
X-Permitted-Cross-Domain-Policies: none
Referrer-Policy: no-referrer
Cross-Origin-Resource-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin
Cache-Control: no-store, no-cache, max-age=0

What it tests

Cache-Control mixes no-store, no-cache and max-age=0.

Expected behaviour

The checker must resolve the contradiction the way the fetch cache does: no-store wins, no-cache is reported as ignored rather than as an independent finding.

References: RFC 9111, section 5.2

Hostname: deprecated.http.binsec.fail

Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
Content-Security-Policy: default-src 'self'; form-action 'none'; frame-ancestors 'none'; base-uri 'self'; upgrade-insecure-requests; require-trusted-types-for 'script'; report-uri https://reports.http.binsec.fail/csp
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
X-Permitted-Cross-Domain-Policies: none
Referrer-Policy: no-referrer
Cross-Origin-Resource-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin
Cache-Control: no-store, max-age=0
X-XSS-Protection: 1; mode=block
Expect-CT: max-age=0
Public-Key-Pins: max-age=1234; pin-sha256=Zm9vYmFy
Feature-Policy: geolocation 'none'
Pragma: no-cache

What it tests

X-XSS-Protection, Expect-CT, Public-Key-Pins, Feature-Policy and Pragma on top of the recommended baseline.

Expected behaviour

All five must be flagged as deprecated while the ten recommended headers stay clean; the deprecated values themselves must not parse into additional error findings.

References: OWASP Secure Headers Project

Hostname: duplicate.http.binsec.fail

Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
Strict-Transport-Security: max-age=86400
Content-Security-Policy: default-src 'self'; form-action 'none'; frame-ancestors 'none'; base-uri 'self'; upgrade-insecure-requests; require-trusted-types-for 'script'; report-uri https://reports.http.binsec.fail/csp
Content-Security-Policy: default-src 'unsafe-inline'
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
X-Permitted-Cross-Domain-Policies: none
Referrer-Policy: no-referrer
Cross-Origin-Resource-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin
Cache-Control: no-store, max-age=0

What it tests

HSTS and CSP each appear as two response header lines, the baseline value first; clients merge them comma-separated.

Expected behaviour

The checker must report both headers as sent multiple times, use the first value for evaluation and must not misread the merged value as one malformed header.

References: RFC 9110, section 5.5

Hostname: meta-only.http.binsec.fail


            

What it tests

The page carries all ten values as http-equiv meta tags plus a named referrer tag, and the server sends none of them as headers.

Expected behaviour

Meta tags must not satisfy the recommended-header checks: all ten must be reported missing, and the meta variants reported as having no effect over HTTP; for CSP the frame-ancestors, sandbox and reporting directives are the unavailable subset.

References: RFC 9116, section 3.4

DKIM 8 cases

Selector TXT records below dkim.dns.binsec.fail covering the classic parser states: a valid key, a positive control split over several character strings, and failure modes from broken base64 over missing or revoked keys to an unusable version tag, an unknown key type and a trap hidden in a second TXT record. The zone itself is unsigned; DKIM carries its own authentication in message signatures.

Hostname: valid._domainkey.dkim.dns.binsec.fail

valid._domainkey.dkim.dns.binsec.fail. 3600 IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDxPfsFZxOkHy1zuLvKDtFHJLiD+FexGMECj55mJIDS5tyL8ylYW7nLzljp0r6UrOwwTAyusnG7XXZgGbvAF7ecWwqK7FHkT7jYQ3oTW5ydbqUFfc3LaAJWjCEAleAKjRAJbYWsoAkP5doIlbbliMHgGc8VBzJCBylpyreZo4wrGQIDAQAB"

What it tests

Positive control: a complete DKIM1 record with an RSA key (1024-bit) as a single character string.

Expected behaviour

The checker must parse the record, base64-decode the public key and report a usable key with no findings. A checker that flags the short key length may report it as a note, not an error.

References: RFC 6376, section 3.6.1

Hostname: b64._domainkey.dkim.dns.binsec.fail

b64._domainkey.dkim.dns.binsec.fail. 3600 IN TXT "v=DKIM1; k=rsa; p=0i@not-base64!0i=="

What it tests

The p tag carries "0i@not-base64!0i==", which contains characters the base64 alphabet does not define.

Expected behaviour

Decoding must fail and the checker must report a malformed key for this selector. It must not report "no DKIM record" and must not silently drop the invalid characters to force a decode.

References: RFC 6376, section 3.6.1

Hostname: nop._domainkey.dkim.dns.binsec.fail

nop._domainkey.dkim.dns.binsec.fail. 3600 IN TXT "v=DKIM1; k=rsa;"

What it tests

The record declares version and key type but carries no p tag at all.

Expected behaviour

Per RFC 6376 a selector record with no p tag means there is no key: verification must treat the selector as having no usable key, which is distinct from a parse error: the record is syntactically fine but carries no key data.

References: RFC 6376, section 3.6.1

Hostname: revoked._domainkey.dkim.dns.binsec.fail

revoked._domainkey.dkim.dns.binsec.fail. 3600 IN TXT "v=DKIM1; k=rsa; p="

What it tests

The p tag is present but empty, the RFC-defined way to revoke a key while keeping the selector in DNS.

Expected behaviour

The checker must distinguish "revoked" from "no record": an empty p means key material existed and was withdrawn, so signatures from this selector must stop verifying without the record itself being invalid.

References: RFC 6376, section 3.6.1

Hostname: version._domainkey.dkim.dns.binsec.fail

version._domainkey.dkim.dns.binsec.fail. 3600 IN TXT "v=DKIM2; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDxPfsFZxOkHy1zuLvKDtFHJLiD+FexGMECj55mJIDS5tyL8ylYW7nLzljp0r6UrOwwTAyusnG7XXZgGbvAF7ecWwqK7FHkT7jYQ3oTW5ydbqUFfc3LaAJWjCEAleAKjRAJbYWsoAkP5doIlbbliMHgGc8VBzJCBylpyreZo4wrGQIDAQAB"

What it tests

The record carries v=DKIM2; the rest of the record is a perfectly valid RSA key.

Expected behaviour

A record whose v tag is present and not DKIM1 must not be used at all. The selector counts as having no usable key even though the p payload itself decodes fine.

References: RFC 6376, section 3.6.1

Hostname: algo._domainkey.dkim.dns.binsec.fail

algo._domainkey.dkim.dns.binsec.fail. 3600 IN TXT "v=DKIM1; k=foo; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDxPfsFZxOkHy1zuLvKDtFHJLiD+FexGMECj55mJIDS5tyL8ylYW7nLzljp0r6UrOwwTAyusnG7XXZgGbvAF7ecWwqK7FHkT7jYQ3oTW5ydbqUFfc3LaAJWjCEAleAKjRAJbYWsoAkP5doIlbbliMHgGc8VBzJCBylpyreZo4wrGQIDAQAB"

What it tests

The record declares k=foo with an otherwise valid RSA key blob.

Expected behaviour

An unsupported key type must be reported as such. The checker must not fall back to treating the blob as RSA just because it parses as one.

References: RFC 6376, section 3.6.1

Hostname: split._domainkey.dkim.dns.binsec.fail

split._domainkey.dkim.dns.binsec.fail. 3600 IN TXT "v=DKIM1; k=rsa;" " p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwNxMn8w0I4iForBb21ZOXWX1u9LtrpKM9UpSBwGvYHgWM3A60kLNVwmki+bFEzfvMKcDSymUhIVqTkB30nKi8LzOol9VOtxvkLyKwt5uyQAX6jerqL122dlHC8DCqoR1WF7rOVftd+l5NUoyAPGBLPTdO4/h" " k/rpixzeWOPfJEFF20M/NM4Yn0VMPh1wk0pzkKotxJtDXlDIsUsH3vpZvI+Fddy6i/keaWt2ceyhcP67ykdx+EElJcQ27El0a656vV8GEyh2caoNIFUfpVdfqUiehbsjmP3w9znk+iXjqvyG3jq/ZLFrEI7SmWYImKQB+6xB1RtThlXwUSGfOj1wgQIDAQAB"

What it tests

A single TXT record carries the key as three character strings, each below the 255-octet string limit, because the base64 blob is too long for one string.

Expected behaviour

The checker must concatenate the character strings in wire order before decoding; the result must parse and decode as a valid 2048-bit RSA key. Truncating at the first string or reordering strings breaks this case.

References: RFC 6376, section 3.6.2.2

Hostname: two._domainkey.dkim.dns.binsec.fail

two._domainkey.dkim.dns.binsec.fail. 3600 IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDxPfsFZxOkHy1zuLvKDtFHJLiD+FexGMECj55mJIDS5tyL8ylYW7nLzljp0r6UrOwwTAyusnG7XXZgGbvAF7ecWwqK7FHkT7jYQ3oTW5ydbqUFfc3LaAJWjCEAleAKjRAJbYWsoAkP5doIlbbliMHgGc8VBzJCBylpyreZo4wrGQIDAQAB"
two._domainkey.dkim.dns.binsec.fail. 3600 IN TXT "trailing-garbage"

What it tests

Two separate TXT records sit below the selector: a complete valid record and one carrying only "trailing-garbage". Concatenated across all records the key becomes ...IDAQABtrailing-garbage.

Expected behaviour

Concatenated across the RRset the key becomes ...IDAQABtrailing-garbage and must not decode. Note that RFC 6376 leaves multiple TXT records for one selector undefined, so an RFC-true checker may report an invalid key or an ambiguous record set - what it must not do is report a usable key by reading only the first TXT record.

References: RFC 6376, section 3.6.2.2

Company

binsec systems GmbH
Clemensstraße 6-8
60487 Frankfurt am Main
Germany

Legal notice

Director: Patrick Sauer, Florian Zavatzki
Registration: Frankfurt am Main, HRB 118471
Turnover Tax Identification No.: DE 328 921 182

© 2026 All rights reserved by binsec systems GmbH. Member of the binsec group GmbH.

© 2026 All rights reserved by binsec systems GmbH. Member of the binsec group GmbH.