Skip to content

Commit 7e5e38d

Browse files
authored
fix: move SVCB key numbers to RFC 9460 Private Use range (v0.9.0) (#38)
All custom SvcParamKeys migrated from the Expert Review range (65001-65010) to the Private Use range (65280-65534) per RFC 9460 Section 14.3: cap=key65400, cap-sha256=key65401, bap=key65402, policy=key65403, realm=key65404, sig=key65405 The old numbers (65001-65010) required IANA registration. The new numbers (65400-65405) are in the Private Use range and free to use. Verified end-to-end against live Route53 and NIOS backends. BREAKING CHANGE: Existing DNS records using old key numbers will need re-publishing. Signed-off-by: Igor Racic <iracic82@gmail.com>
1 parent aad088f commit 7e5e38d

20 files changed

+88
-83
lines changed

CHANGELOG.md

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ 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.9.0] - 2026-02-24
9+
10+
### Changed
11+
- **SVCB key numbers moved to RFC 9460 Private Use range** — All custom SvcParamKeys migrated from the Expert Review range (65001–65010) to the Private Use range (65280–65534) per RFC 9460 Section 14.3. New mapping: cap=key65400, cap-sha256=key65401, bap=key65402, policy=key65403, realm=key65404, sig=key65405. **Breaking:** existing DNS records using the old key numbers will need re-publishing.
12+
813
## [0.8.0] - 2026-02-21
914

1015
### Added
@@ -15,7 +20,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1520

1621
### Changed
1722
- **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
23+
- **`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 (further updated to `key65402` in v0.9.0)
1924

2025
## [0.7.3] - 2026-02-19
2126

@@ -150,15 +155,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
150155
- **Experimental Models Documentation** — Marked `agent_metadata` and `capability_model` modules as experimental with status docstrings
151156

152157
### Fixed
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
158+
- **Route53 SVCB custom params** — Route53 rejects private-use SvcParamKeys (`key65400``key65405`). The Route53 backend now demotes custom DNS-AID params to TXT records with `dnsaid_` prefix, keeping the publish working without data loss
154159
- **Cloudflare SVCB custom params** — Same demotion applied to the Cloudflare backend
155160
- **CLI `--backend` help text** — Now lists all five backends (route53, cloudflare, infoblox, ddns, mock) instead of just "route53, mock"
156161
- **SECURITY.md contact** — Updated from placeholder LF mailing list to interim maintainer email
157162
- **Bandit config** — Migrated from `.bandit` INI to `pyproject.toml` `[tool.bandit]` for newer bandit compatibility
158163
- **CLI ANSI escape codes** — Stripped Rich/Typer ANSI codes in test assertions for Python 3.13 compatibility
159164

160165
### Notes
161-
- BIND/DDNS backends natively support custom SVCB params (`key65001``key65006`) — no demotion needed
166+
- BIND/DDNS backends natively support custom SVCB params (`key65400``key65405`) — no demotion needed
162167
- DNSSEC enforcement defaults to `False` (backwards compatible)
163168
- DANE cert matching defaults to `False` (advisory TLSA existence check remains the default)
164169

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,7 @@ _booking._mcp._agents.example.com. SVCB 1 mcp.example.com. alpn="mcp" port=443 \
343343
| `policy` | URI to agent policy document |
344344
| `realm` | Multi-tenant scope identifier |
345345

346-
> **Note:** Route 53 and Cloudflare do not support private-use SVCB SvcParamKeys (`key65001``key65006`).
346+
> **Note:** Route 53 and Cloudflare do not support private-use SVCB SvcParamKeys (`key65400``key65405`).
347347
> DNS-AID automatically demotes these parameters to TXT records with a `dnsaid_` prefix (e.g.,
348348
> `dnsaid_realm=production`), preserving all metadata without data loss. BIND/DDNS (RFC 2136)
349349
> backends natively support custom SVCB params — no demotion needed.
@@ -793,7 +793,7 @@ Infoblox NIOS is the on-premise DDI platform with WAPI (Web API). DNS-AID create
793793

794794
#### NIOS DNS-AID Compliance
795795

796-
NIOS WAPI supports ServiceMode SVCB records (priority > 0) with full SVC parameters, including custom DNS-AID 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 `key65400``key65405`.
797797

798798
### DDNS Setup (RFC 2136)
799799

SECURITY.md

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ All outbound HTTP fetches (capability document retrieval, A2A agent card fetches
7070

7171
### Capability Document Integrity (cap_sha256)
7272

73-
When a `cap-sha256` (key65002) value is present in an SVCB record, DNS-AID verifies the integrity of the fetched capability document:
73+
When a `cap-sha256` (key65401) value is present in an SVCB record, DNS-AID verifies the integrity of the fetched capability document:
7474

7575
- The SHA-256 digest of the fetched document body is computed and base64url-encoded (unpadded).
7676
- The computed digest is compared to the `cap-sha256` value from DNS.
@@ -79,18 +79,18 @@ When a `cap-sha256` (key65002) value is present in an SVCB record, DNS-AID verif
7979

8080
### SVCB Custom Parameter Keys
8181

82-
DNS-AID uses SVCB SvcParamKeys in the **private-use range** (65001–65534) as defined by RFC 9460:
82+
DNS-AID uses SVCB SvcParamKeys in the **RFC 9460 Private Use range** (65280–65534):
8383

8484
| Key | Number | Purpose |
8585
| ------- | -------- | -------------------------------- |
86-
| cap | key65001 | Capability document URI |
87-
| cap-sha256 | key65002 | Capability document SHA-256 hash |
88-
| bap | key65010 | DNS-AID Application Protocols |
89-
| policy | key65004 | Policy document URI |
90-
| realm | key65005 | Administrative realm |
91-
| sig | key65006 | JWS signature |
92-
93-
These key numbers are in the private-use range pending IANA registration through the IETF draft process. The numeric form (`key65001`) is the default wire format; the string form (`cap`) can be enabled via the `DNS_AID_SVCB_STRING_KEYS` environment variable for human-readable debugging.
86+
| cap | key65400 | Capability document URI |
87+
| cap-sha256 | key65401 | Capability document SHA-256 hash |
88+
| bap | key65402 | DNS-AID Application Protocols |
89+
| policy | key65403 | Policy document URI |
90+
| realm | key65404 | Administrative realm |
91+
| sig | key65405 | JWS signature |
92+
93+
These key numbers are in the Private Use range pending IANA registration through the IETF draft process. The numeric form (`key65400`) is the default wire format; the string form (`cap`) can be enabled via the `DNS_AID_SVCB_STRING_KEYS` environment variable for human-readable debugging.
9494

9595
## Input Validation
9696

docs/api-reference.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -508,7 +508,7 @@ backend = InfobloxNIOSBackend(
508508
| `NIOS_WAPI_VERSION` | No | `2.13.7` | WAPI version |
509509
| `NIOS_VERIFY_SSL` | No | `false` | Verify TLS certificate |
510510

511-
**DNS-AID Compliance**: NIOS WAPI supports ServiceMode SVCB records (priority > 0) with full SVC parameters including custom DNS-AID keys (`key65001``key65006`). Fully compliant with the DNS-AID draft.
511+
**DNS-AID Compliance**: NIOS WAPI supports ServiceMode SVCB records (priority > 0) with full SVC parameters including custom DNS-AID keys (`key65400``key65405`). Fully compliant with the DNS-AID draft.
512512

513513
### DDNSBackend
514514

docs/demo-guide.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -727,7 +727,7 @@ Capabilities are resolved with the following priority, aligned with the DNS-AID
727727
│ Capability Resolution Priority │
728728
│ │
729729
│ 1. SVCB cap URI ──► GET /cap/{agent} ──► Capability JSON │
730-
│ (key65001) (fetch document) (authoritative) │
730+
│ (key65400) (fetch document) (authoritative) │
731731
│ │ │
732732
│ ▼ (fallback if cap URI absent or fetch fails) │
733733
│ 2. TXT Record ──► "capabilities=travel,booking" │

docs/getting-started.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ dns-aid delete \
380380

381381
### NIOS DNS-AID Compliance
382382

383-
NIOS WAPI supports ServiceMode SVCB records (priority > 0) with full SVC parameters, including custom DNS-AID keys natively via `key65001``key65006`. This makes it fully compliant with the DNS-AID draft.
383+
NIOS WAPI supports ServiceMode SVCB records (priority > 0) with full SVC parameters, including custom DNS-AID keys natively via `key65400``key65405`. This makes it fully compliant with the DNS-AID draft.
384384

385385
## DDNS Setup (RFC 2136)
386386

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
44

55
[project]
66
name = "dns-aid"
7-
version = "0.8.0"
7+
version = "0.9.0"
88
description = "DNS-based Agent Identification and Discovery - Reference Implementation"
99
readme = "README.md"
1010
license = "Apache-2.0"

src/dns_aid/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
# Alias for convenience
4747
delete = unpublish
4848

49-
__version__ = "0.8.0"
49+
__version__ = "0.9.0"
5050
__all__ = [
5151
# Core functions (Tier 0)
5252
"publish",

src/dns_aid/backends/cloudflare.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
logger = structlog.get_logger(__name__)
2626

2727
# Standard SVCB SvcParamKeys that managed DNS providers accept (RFC 9460).
28-
# Cloudflare rejects private-use keys (key65001–key65534) the same way
28+
# Cloudflare rejects private-use keys (key65280–key65534) the same way
2929
# Route53 does. Custom DNS-AID params are demoted to TXT automatically.
3030
_CLOUDFLARE_SVCB_KEYS = frozenset(
3131
{
@@ -354,7 +354,7 @@ async def publish_agent(self, agent: AgentRecord) -> list[str]:
354354
Publish an agent to DNS, demoting unsupported SVCB params to TXT.
355355
356356
Cloudflare only accepts standard RFC 9460 SvcParamKeys. Custom DNS-AID
357-
params (key65001–key65006) are automatically moved to the TXT record.
357+
params (key65400–key65405) are automatically moved to the TXT record.
358358
"""
359359
records: list[str] = []
360360
zone = agent.domain

src/dns_aid/backends/infoblox/nios.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,12 @@ class InfobloxNIOSBackend(DNSBackend):
5050
# NIOS only accepts registered SVC keys or keyNNNNN numeric keys.
5151
# Map draft custom names to private-use keyNNNNN aliases for compatibility.
5252
_CUSTOM_PARAM_TO_NUMERIC_KEY = {
53-
"cap": "key65001",
54-
"cap-sha256": "key65002",
55-
"bap": "key65010",
56-
"policy": "key65004",
57-
"realm": "key65005",
58-
"sig": "key65006",
53+
"cap": "key65400",
54+
"cap-sha256": "key65401",
55+
"bap": "key65402",
56+
"policy": "key65403",
57+
"realm": "key65404",
58+
"sig": "key65405",
5959
}
6060
_NUMERIC_KEY_TO_CUSTOM_PARAM = {
6161
value: key for key, value in _CUSTOM_PARAM_TO_NUMERIC_KEY.items()

0 commit comments

Comments
 (0)