Skip to content

Commit 9405a27

Browse files
authored
feat: align with IETF draft-mozleywilliams-dnsop-dnsaid-01 (v0.8.0)
Align dns-aid-core with the renamed IETF draft (v01) and address reviewer feedback on missing SVCB features and DANE coverage. - Add SVCB AliasMode (priority 0) handling in discoverer - Extract ipv4hint/ipv6hint from SVCB params (SvcParamKey 4, 6) - Dynamic DANE verification notes with DNSSEC coupling warning - Rename BANDAID → DNS-AID across all source, tests, docs, metadata - Fix bap SvcParamKey from key65003 to key65010 per draft example - Update draft reference from bandaid-02 to dnsaid-01 - Add DNSSEC/DANE security section to README - Bump version to 0.8.0 BREAKING CHANGE: bap SvcParamKey changed from key65003 to key65010. Existing DNS records using key65003 for bap must be re-published. TXT record prefix changed from bandaid_ to dnsaid_. Signed-off-by: Igor Racic <iracic82@gmail.com>
1 parent 89d3e71 commit 9405a27

36 files changed

+335
-198
lines changed

CHANGELOG.md

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,18 @@ All notable changes to DNS-AID will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [0.8.0] - 2026-02-21
9+
10+
### Added
11+
- **SVCB AliasMode handling** — Discoverer follows SVCB priority-0 (AliasMode) records to resolve the canonical ServiceMode target, per RFC 9460 and IETF draft Section 4.4.2
12+
- **SVCB ipv4hint/ipv6hint extraction** — Discoverer reads SvcParamKey 4 (ipv4hint) and 6 (ipv6hint) from SVCB records to reduce follow-up A/AAAA queries, per IETF draft Section 4.4.2
13+
- **DANE dynamic verification notes**`verify()` now returns context-aware `dane_note` messages: advisory-only vs full certificate matching, with DNSSEC coupling warning when DANE is present but DNSSEC is not validated
14+
- **DANE/DNSSEC security documentation** — README now includes "Security: DNSSEC and DANE" section with TLSA 3 1 1 recommendation, security score table, and verification code examples
15+
16+
### Changed
17+
- **BANDAID → DNS-AID rename** — All references to "BANDAID" and `bandaid_` updated to "DNS-AID" and `dnsaid_` across source, tests, docs, and metadata files. IETF draft reference updated from `draft-mozleywilliams-dnsop-bandaid-02` to `draft-mozleywilliams-dnsop-dnsaid-01`
18+
- **`bap` SvcParamKey number** — Changed from `key65003` to `key65010` to match IETF draft Section 4.4.3 example. **Breaking:** existing DNS records with `key65003` for bap will need re-publishing
19+
820
## [0.7.3] - 2026-02-19
921

1022
### Added
@@ -138,7 +150,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
138150
- **Experimental Models Documentation** — Marked `agent_metadata` and `capability_model` modules as experimental with status docstrings
139151

140152
### Fixed
141-
- **Route53 SVCB custom params** — Route53 rejects private-use SvcParamKeys (`key65001``key65006`). The Route53 backend now demotes custom BANDAID params to TXT records with `bandaid_` prefix, keeping the publish working without data loss
153+
- **Route53 SVCB custom params** — Route53 rejects private-use SvcParamKeys (`key65001``key65006`). The Route53 backend now demotes custom DNS-AID params to TXT records with `dnsaid_` prefix, keeping the publish working without data loss
142154
- **Cloudflare SVCB custom params** — Same demotion applied to the Cloudflare backend
143155
- **CLI `--backend` help text** — Now lists all five backends (route53, cloudflare, infoblox, ddns, mock) instead of just "route53, mock"
144156
- **SECURITY.md contact** — Updated from placeholder LF mailing list to interim maintainer email
@@ -217,7 +229,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
217229
## [0.4.8] - 2026-01-27
218230

219231
### Added
220-
- **BANDAID Custom SVCB Parameters (IETF Draft Alignment)**
232+
- **DNS-AID Custom SVCB Parameters (IETF Draft Alignment)**
221233
- `cap` — URI to capability document (HTTPS endpoint for rich capability metadata)
222234
- `cap-sha256` — Base64url-encoded SHA-256 digest of capability descriptor for integrity checks
223235
- `bap` — Supported bulk agent protocols with versioning (e.g., `mcp/1,a2a/1`)
@@ -226,7 +238,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
226238
- New `AgentRecord` fields: `cap_uri`, `cap_sha256`, `bap`, `policy_uri`, `realm`
227239
- Updated `to_svcb_params()` to include custom params when present (backwards compatible)
228240
- CLI options: `--cap-uri`, `--cap-sha256`, `--bap`, `--policy-uri`, `--realm`
229-
- MCP server: publish and discover tools support all BANDAID custom params
241+
- MCP server: publish and discover tools support all DNS-AID custom params
230242
- Discovery priority: SVCB `cap` URI → fetch capability document → TXT fallback
231243

232244
- **Capability Document Fetcher** (`src/dns_aid/core/cap_fetcher.py`)
@@ -270,7 +282,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
270282
- Works with BIND9, Windows DNS, PowerDNS, Knot DNS, and any RFC 2136 compliant server
271283
- TSIG authentication support with multiple algorithms (hmac-sha256, sha384, sha512, sha224, md5)
272284
- Key file loading support (BIND key file format)
273-
- Full BANDAID compliance with ServiceMode SVCB records
285+
- Full DNS-AID compliance with ServiceMode SVCB records
274286
- Docker-based BIND9 integration tests
275287
- Documentation and examples for on-premise DNS deployments
276288

@@ -324,7 +336,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
324336
- **Cloudflare DNS Backend**
325337
- New `CloudflareBackend` for Cloudflare DNS API v4
326338
- Free tier support - ideal for demos and workshops
327-
- Full BANDAID compliance with ServiceMode SVCB records
339+
- Full DNS-AID compliance with ServiceMode SVCB records
328340
- Zone auto-discovery from domain name
329341
- 32 unit tests with mocked API responses
330342

@@ -336,7 +348,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
336348
## [0.2.0] - 2026-01-13
337349

338350
### Added
339-
- **BANDAID Compliance**
351+
- **DNS-AID Compliance**
340352
- Added `mandatory="alpn,port"` parameter to SVCB records per IETF draft
341353
- Ensures proper agent discovery signaling
342354

@@ -445,11 +457,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
445457

446458
## References
447459

448-
- [IETF draft-mozleywilliams-dnsop-bandaid-02](https://datatracker.ietf.org/doc/draft-mozleywilliams-dnsop-bandaid/)
460+
- [IETF draft-mozleywilliams-dnsop-dnsaid-01](https://datatracker.ietf.org/doc/draft-mozleywilliams-dnsop-dnsaid/)
449461
- [RFC 9460 - SVCB and HTTPS Resource Records](https://www.rfc-editor.org/rfc/rfc9460.html)
450462
- [RFC 4033-4035 - DNSSEC](https://www.rfc-editor.org/rfc/rfc4033.html)
451463

452-
[Unreleased]: https://github.com/infobloxopen/dns-aid-core/compare/v0.7.3...HEAD
464+
[Unreleased]: https://github.com/infobloxopen/dns-aid-core/compare/v0.8.0...HEAD
465+
[0.8.0]: https://github.com/infobloxopen/dns-aid-core/compare/v0.7.3...v0.8.0
453466
[0.7.3]: https://github.com/infobloxopen/dns-aid-core/compare/v0.7.2...v0.7.3
454467
[0.7.2]: https://github.com/infobloxopen/dns-aid-core/compare/v0.7.1...v0.7.2
455468
[0.7.1]: https://github.com/infobloxopen/dns-aid-core/compare/v0.7.0...v0.7.1

CITATION.cff

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,34 +8,34 @@ repository-code: "https://github.com/infobloxopen/dns-aid-core"
88
authors:
99
- name: "The DNS-AID Authors"
1010

11-
version: "0.7.3"
12-
date-released: "2026-02-19"
11+
version: "0.8.0"
12+
date-released: "2026-02-21"
1313

1414
keywords:
1515
- dns
1616
- agent-discovery
1717
- ietf
1818
- svcb
19-
- bandaid
19+
- dnsaid
2020
- ai-agents
2121
- mcp
2222
- a2a
2323

2424
references:
2525
- type: standard
26-
title: "BANDAID: Best-practice Approaches for Naming and Discovery of AI-Driven services"
26+
title: "DNS-AID: DNS-based Agent Identification and Discovery"
2727
authors:
2828
- family-names: Mozley
2929
given-names: Andrew
3030
- family-names: Williams
3131
given-names: Brandon
32-
url: "https://datatracker.ietf.org/doc/draft-mozleywilliams-dnsop-bandaid/"
32+
url: "https://datatracker.ietf.org/doc/draft-mozleywilliams-dnsop-dnsaid/"
3333
identifiers:
3434
- type: other
35-
value: "draft-mozleywilliams-dnsop-bandaid-02"
35+
value: "draft-mozleywilliams-dnsop-dnsaid-01"
3636
description: "IETF Internet-Draft"
3737
notes: >
38-
This software implements the BANDAID specification (draft-02):
38+
This software implements the DNS-AID specification (draft-01):
3939
SVCB/HTTPS record discovery, TXT capability records,
4040
underscored naming (_agent._protocol._agents.domain),
4141
custom SVCB parameters (cap, cap-sha256, bap, policy, realm),

README.md

Lines changed: 76 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
**DNS-based Agent Identification and Discovery**
1313

14-
Reference implementation for [IETF draft-mozleywilliams-dnsop-bandaid-02](https://datatracker.ietf.org/doc/draft-mozleywilliams-dnsop-bandaid/).
14+
Reference implementation for [IETF draft-mozleywilliams-dnsop-dnsaid-01](https://datatracker.ietf.org/doc/draft-mozleywilliams-dnsop-dnsaid/).
1515

1616
DNS-AID enables AI agents to discover each other via DNS, using the internet's existing naming infrastructure instead of centralized registries or hardcoded URLs.
1717

@@ -131,7 +131,7 @@ dns-aid publish \
131131
--capability chat \
132132
--capability code-review
133133

134-
# Publish with BANDAID custom SVCB parameters
134+
# Publish with DNS-AID custom SVCB parameters
135135
dns-aid publish \
136136
--name booking \
137137
--domain example.com \
@@ -326,7 +326,7 @@ _chat._a2a._agents.example.com. 3600 IN SVCB 1 chat.example.com. alpn="a2a" port
326326
_chat._a2a._agents.example.com. 3600 IN TXT "capabilities=chat,assistant" "version=1.0.0"
327327
```
328328

329-
**BANDAID Custom SVCB Parameters:** Per the IETF draft, SVCB records can carry additional custom parameters for richer agent metadata:
329+
**DNS-AID Custom SVCB Parameters:** Per the IETF draft, SVCB records can carry additional custom parameters for richer agent metadata:
330330

331331
```
332332
_booking._mcp._agents.example.com. SVCB 1 mcp.example.com. alpn="mcp" port=443 \
@@ -344,13 +344,13 @@ _booking._mcp._agents.example.com. SVCB 1 mcp.example.com. alpn="mcp" port=443 \
344344
| `realm` | Multi-tenant scope identifier |
345345

346346
> **Note:** Route 53 and Cloudflare do not support private-use SVCB SvcParamKeys (`key65001``key65006`).
347-
> DNS-AID automatically demotes these parameters to TXT records with a `bandaid_` prefix (e.g.,
348-
> `bandaid_realm=production`), preserving all metadata without data loss. BIND/DDNS (RFC 2136)
347+
> DNS-AID automatically demotes these parameters to TXT records with a `dnsaid_` prefix (e.g.,
348+
> `dnsaid_realm=production`), preserving all metadata without data loss. BIND/DDNS (RFC 2136)
349349
> backends natively support custom SVCB params — no demotion needed.
350350
351351
This allows any DNS client to discover agents without proprietary protocols or central registries.
352352

353-
### Discovery Flow (BANDAID Draft Aligned)
353+
### Discovery Flow (DNS-AID Draft Aligned)
354354

355355
```
356356
Agent A DNS Agent B
@@ -401,6 +401,66 @@ This allows any DNS client to discover agents without proprietary protocols or c
401401
**Capability Resolution Priority:** SVCB `cap` URI → capability document → TXT record fallback.
402402
Each discovered agent includes `endpoint_source` and `capability_source` showing which path was used.
403403

404+
## Security: DNSSEC and DANE
405+
406+
DNS-AID relies on DNSSEC and DANE for end-to-end trust, as specified in the [IETF draft](https://datatracker.ietf.org/doc/draft-mozleywilliams-dnsop-dnsaid/) Section 4.4.1.
407+
408+
### DNSSEC (Mandatory for Public Zones)
409+
410+
All DNS-AID discovery records **MUST** be signed with DNSSEC. Resolvers consuming DNS-AID data must treat unsigned or DNSSEC-bogus responses as failures.
411+
412+
```bash
413+
# Verify DNSSEC and security posture for an agent
414+
dns-aid verify _chat._a2a._agents.example.com
415+
```
416+
417+
### DANE/TLSA (Recommended)
418+
419+
Where DNS-AID endpoints rely on TLS, DANE TLSA records **SHOULD** be used to bind endpoint certificates to DNSSEC-validated names. This removes reliance on external PKI (certificate authorities) and provides cryptographic proof that the TLS certificate belongs to the intended agent endpoint.
420+
421+
**Recommended TLSA profile** (per IETF draft Section 5.2.3):
422+
423+
```
424+
_443._tcp.agent-svc.example.com. 1800 IN TLSA 3 1 1 (
425+
<SHA-256 hash of endpoint certificate SPKI>
426+
)
427+
```
428+
429+
| Field | Value | Meaning |
430+
|-------|-------|---------|
431+
| Usage | 3 | DANE-EE (end entity, no CA chain needed) |
432+
| Selector | 1 | SubjectPublicKeyInfo (public key only) |
433+
| Matching Type | 1 | SHA-256 digest |
434+
435+
**Full DANE certificate verification:**
436+
437+
```python
438+
# Advisory check (TLSA record exists?)
439+
result = await dns_aid.verify("_chat._a2a._agents.example.com")
440+
print(result.dane_valid) # True/False/None
441+
442+
# Full certificate matching (connect + compare cert against TLSA)
443+
result = await dns_aid.verify(
444+
"_chat._a2a._agents.example.com",
445+
verify_dane_cert=True
446+
)
447+
print(result.dane_note) # Detailed verification status
448+
```
449+
450+
> **Note:** DANE is only meaningful when DNSSEC is also validated. Without DNSSEC, an attacker could spoof both the TLSA record and the endpoint certificate.
451+
452+
### Security Score
453+
454+
The `verify` command returns a security score (0–100) based on:
455+
456+
| Check | Points | Requirement Level |
457+
|-------|--------|-------------------|
458+
| DNS record exists | 20 | Required |
459+
| SVCB record valid | 20 | Required |
460+
| DNSSEC validated | 30 | MUST (public zones) |
461+
| DANE/TLSA verified | 15 | SHOULD |
462+
| Endpoint reachable | 15 | Operational |
463+
404464
## Architecture
405465

406466
```
@@ -635,26 +695,26 @@ Infoblox UDDI (Universal DDI) is Infoblox's cloud-native DDI platform. DNS-AID s
635695
)
636696
```
637697

638-
#### Infoblox UDDI Limitations & BANDAID Compliance
698+
#### Infoblox UDDI Limitations & DNS-AID Compliance
639699

640700
> **⚠️ Important**: Infoblox UDDI SVCB records only support "alias mode" (priority 0) and do not
641701
> support SVC parameters (`alpn`, `port`, `mandatory`). This means **Infoblox UDDI is not fully
642-
> compliant with the [BANDAID draft](https://datatracker.ietf.org/doc/draft-mozleywilliams-dnsop-bandaid/)**.
702+
> compliant with the [DNS-AID draft](https://datatracker.ietf.org/doc/draft-mozleywilliams-dnsop-dnsaid/)**.
643703
>
644704
> The draft requires ServiceMode SVCB records (priority > 0) with mandatory `alpn` and `port`
645705
> parameters. Infoblox UDDI's limitation is a platform constraint, not a DNS-AID limitation.
646706
647-
| BANDAID Requirement | Route 53 | Cloudflare | DDNS (BIND) | Infoblox NIOS | Infoblox UDDI |
707+
| DNS-AID Requirement | Route 53 | Cloudflare | DDNS (BIND) | Infoblox NIOS | Infoblox UDDI |
648708
|---------------------|----------|------------|-------------|---------------|---------------|
649709
| ServiceMode (priority > 0) ||||||
650710
| `alpn` parameter ||||||
651711
| `port` parameter ||||||
652712
| `mandatory` key ||||||
653713
| Custom SVCB params (`cap`, `realm`, etc.) | ⚠️ TXT | ⚠️ TXT | ✅ Native | ✅ Native ||
654714

655-
**⚠️ TXT** = Custom BANDAID params auto-demoted to TXT records with `bandaid_` prefix (no data loss).
715+
**⚠️ TXT** = Custom DNS-AID params auto-demoted to TXT records with `dnsaid_` prefix (no data loss).
656716

657-
**For full BANDAID compliance with native custom SVCB params, use DDNS (BIND/RFC 2136) or Infoblox NIOS. Route 53 and Cloudflare support all standard SVCB params with automatic TXT demotion for custom params.**
717+
**For full DNS-AID compliance with native custom SVCB params, use DDNS (BIND/RFC 2136) or Infoblox NIOS. Route 53 and Cloudflare support all standard SVCB params with automatic TXT demotion for custom params.**
658718

659719
DNS-AID stores `alpn` and `port` in TXT records as a fallback for Infoblox UDDI, but this is
660720
a workaround and not standard-compliant for agent discovery.
@@ -671,7 +731,7 @@ async with InfobloxBloxOneBackend() as backend:
671731

672732
### Infoblox NIOS Setup (On-Prem)
673733

674-
Infoblox NIOS is the on-premise DDI platform with WAPI (Web API). DNS-AID creates SVCB and TXT records via WAPI v2.13.7+, with full ServiceMode SVCB support including custom BANDAID parameters.
734+
Infoblox NIOS is the on-premise DDI platform with WAPI (Web API). DNS-AID creates SVCB and TXT records via WAPI v2.13.7+, with full ServiceMode SVCB support including custom DNS-AID parameters.
675735

676736
#### Environment Variables
677737

@@ -731,9 +791,9 @@ Infoblox NIOS is the on-premise DDI platform with WAPI (Web API). DNS-AID create
731791
)
732792
```
733793

734-
#### NIOS BANDAID Compliance
794+
#### NIOS DNS-AID Compliance
735795

736-
NIOS WAPI supports ServiceMode SVCB records (priority > 0) with full SVC parameters, including custom BANDAID keys natively via `key65001``key65006`.
796+
NIOS WAPI supports ServiceMode SVCB records (priority > 0) with full SVC parameters, including custom DNS-AID keys natively via `key65001``key65006`.
737797

738798
### DDNS Setup (RFC 2136)
739799

@@ -800,7 +860,7 @@ DDNS (Dynamic DNS) is a universal backend that works with any DNS server support
800860
- **Universal**: Works with BIND, Windows DNS, PowerDNS, Knot, and any RFC 2136 server
801861
- **No vendor lock-in**: Standard protocol, no proprietary APIs
802862
- **On-premise friendly**: Perfect for enterprise internal DNS
803-
- **Full BANDAID compliance**: Supports ServiceMode SVCB with all standard parameters (custom BANDAID params auto-demoted to TXT)
863+
- **Full DNS-AID compliance**: Supports ServiceMode SVCB with all standard parameters (custom DNS-AID params auto-demoted to TXT)
804864

805865
### Cloudflare Setup
806866

@@ -868,7 +928,7 @@ Cloudflare DNS is ideal for demos, workshops, and quick prototyping thanks to it
868928
- **SVCB support**: Full RFC 9460 compliance with SVCB Type 64 records
869929
- **Global anycast**: Fast DNS resolution worldwide
870930
- **Simple API**: Well-documented REST API v4
871-
- **Full BANDAID compliance**: Supports ServiceMode SVCB with all standard parameters (custom BANDAID params auto-demoted to TXT)
931+
- **Full DNS-AID compliance**: Supports ServiceMode SVCB with all standard parameters (custom DNS-AID params auto-demoted to TXT)
872932

873933
## Why DNS-AID?
874934

SECURITY.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ DNS-AID uses SVCB SvcParamKeys in the **private-use range** (65001–65534) as d
8181
| ------- | -------- | -------------------------------- |
8282
| cap | key65001 | Capability document URI |
8383
| cap-sha256 | key65002 | Capability document SHA-256 hash |
84-
| bap | key65003 | BANDAID Agent Profile URI |
84+
| bap | key65010 | DNS-AID Agent Profile URI |
8585
| policy | key65004 | Policy document URI |
8686
| realm | key65005 | Administrative realm |
8787
| sig | key65006 | JWS signature |

SUPPORT.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
- [API Reference](docs/api-reference.md) — Python library, CLI, and MCP server reference
88
- [Framework Integrations](docs/integrations.md) — LangChain, AutoGen, Google ADK, OpenAI Agents
99
- [Demo Guide](docs/demo-guide.md) — runnable demos with Route 53, DDNS, Cloudflare
10-
- [IETF Draft](https://datatracker.ietf.org/doc/draft-mozleywilliams-dnsop-bandaid/) — the BANDAID specification
10+
- [IETF Draft](https://datatracker.ietf.org/doc/draft-mozleywilliams-dnsop-dnsaid/) — the DNS-AID specification
1111

1212
## Asking Questions
1313

0 commit comments

Comments
 (0)