Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions .github/workflows/verify-v2.yml
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,10 @@ jobs:
- name: Render IETF XML without network references
run: |
python -m tools.render_draft --check
xml2rfc --no-network --text draft/draft-acosta-crypto-agility-manifest-02.xml --out build/results/draft-acosta-crypto-agility-manifest-02.txt
cmp build/results/draft-acosta-crypto-agility-manifest-02.txt draft/draft-acosta-crypto-agility-manifest-02.txt
xml2rfc --no-network --html draft/draft-acosta-crypto-agility-manifest-02.xml --out build/results/draft-acosta-crypto-agility-manifest-02.html
node_modules/.bin/idnits --mode submission --offline --output json draft/draft-acosta-crypto-agility-manifest-02.xml > build/results/idnits.json
xml2rfc --no-network --text draft/draft-acosta-crypto-agility-manifest-03.xml --out build/results/draft-acosta-crypto-agility-manifest-03.txt
cmp build/results/draft-acosta-crypto-agility-manifest-03.txt draft/draft-acosta-crypto-agility-manifest-03.txt
xml2rfc --no-network --html draft/draft-acosta-crypto-agility-manifest-03.xml --out build/results/draft-acosta-crypto-agility-manifest-03.html
node_modules/.bin/idnits --mode submission --offline --output json draft/draft-acosta-crypto-agility-manifest-03.xml > build/results/idnits.json
python -c 'import json; d=json.load(open("build/results/idnits.json")); assert d["result"]=="pass" and not any(d["nitsBySeverity"].values())'
- name: Retain exact-commit validation evidence
if: always()
Expand Down
4 changes: 2 additions & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Contributing

This is an individual proposal, not an IETF standard. Preserve supported input compatibility and reject unsupported contract versions explicitly. The authoritative specification is `draft/draft-acosta-crypto-agility-manifest-02.xml`; its embedded normative schema must equal `schema/crypto-agility-v2.schema.json`. Update both in the same PR. Generate the Markdown rendering with `python -m tools.render_draft`.
This is an individual proposal, not an IETF standard. Preserve supported input compatibility and reject unsupported contract versions explicitly. The authoritative specification is `draft/draft-acosta-crypto-agility-manifest-03.xml`; its embedded normative schema must equal `schema/crypto-agility-v2.schema.json`. Update both in the same PR. Generate the Markdown rendering with `python -m tools.render_draft`.

Keep the core to discovery and evidence references. Reuse existing cryptographic protocols. Distinguish declarations, authenticated assertions and independently verified runtime behavior. Cite primary sources and separate normative dependencies from background. Do not use em dashes or claim validation without evidence.

Expand All @@ -11,7 +11,7 @@ Install the pinned dependencies from `requirements.txt`, then run:
```sh
python -m unittest discover -s tests -v
python -m tools.render_draft --check
xml2rfc --text draft/draft-acosta-crypto-agility-manifest-02.xml --out /tmp/crypto-agility-02.txt
xml2rfc --text draft/draft-acosta-crypto-agility-manifest-03.xml --out /tmp/crypto-agility-03.txt
```

Run the independent consumer and live TLS checks required by CI. Required tests must fail when their dependency or capability is absent, not silently skip. Submission also requires review of current IETF author guidance, author contact, revision availability, idnits output and any active submission deadline. Submission status must reflect an observed Datatracker result. Authorize the submission explicitly, complete the current checks, and preserve the submission receipt; never infer publication from local rendering or upload preparation.
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ A discoverable JSON contract for declared cryptographic capabilities, migration

## Current contract

The [authoritative RFCXML](draft/draft-acosta-crypto-agility-manifest-02.xml), [readable specification](draft/draft-acosta-crypto-agility-manifest-02.md), [JSON Schema](schema/crypto-agility-v2.schema.json), [minimal example](examples/minimal-v2.json) and [complete example](examples/crypto-agility-v2.json) define the contract with `version: 2`. The Internet-Draft revision suffix and the JSON contract version are separate identifiers. Consumers reject unsupported versions; the [qScan adapter](docs/qscan-integration.md) explicitly handles supported input with `version: 1` without treating source declarations as runtime evidence.
The [authoritative RFCXML](draft/draft-acosta-crypto-agility-manifest-03.xml), [readable specification](draft/draft-acosta-crypto-agility-manifest-03.md), [JSON Schema](schema/crypto-agility-v2.schema.json), [minimal example](examples/minimal-v2.json) and [complete example](examples/crypto-agility-v2.json) define the contract with `version: 2`. The Internet-Draft revision suffix and the JSON contract version are separate identifiers. Consumers reject unsupported versions; the [qScan adapter](docs/qscan-integration.md) explicitly handles supported input with `version: 1` without treating source declarations as runtime evidence.

A manifest identifies one independently authorized subject. It contains generation and expiry timestamps, declared endpoint profiles, observations and migration records, with optional evidence, policies and exceptions. Evidence is bound to its exact bytes and subject. Declarations, authenticated collector statements and independent measurements are distinct assurance levels. Key establishment and authentication are assessed separately. The contract grants no authority to change a system.

Expand Down Expand Up @@ -32,7 +32,7 @@ Install `requirements.txt` and `npm ci --ignore-scripts`, then follow [implement
```sh
python -m tools.verifier examples/crypto-agility-v2.json --now 2026-10-12T00:00:00Z
python -m tools.render_draft --check
xml2rfc --no-network --text draft/draft-acosta-crypto-agility-manifest-02.xml
xml2rfc --no-network --text draft/draft-acosta-crypto-agility-manifest-03.xml
```

The example intentionally reports fallback risks and exits 1. Read [runtime evidence](docs/runtime-evidence.md), [signed observations](docs/signed-observations.md), [collector integration](docs/observatory-integration.md), [consumer deployment](docs/consumer-deployment.md) and the [security review](docs/security-review.md) before relying on evidence. Production acceptance and its limits are in [implementation status](docs/implementation-status.md); submission status and requirements are in [IETF readiness](docs/ietf-readiness.md).
Expand Down
2 changes: 1 addition & 1 deletion docs/ietf-readiness.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Internet-Draft publication and readiness

The complete proposal is `draft-acosta-crypto-agility-manifest-02`. Consult the [Datatracker publication record](https://datatracker.ietf.org/doc/draft-acosta-crypto-agility-manifest/) for the accepted revision and submission state. Local source files, an upload or passing checks do not establish publication. This is an individual Informational proposal, not an IETF standard or endorsement.
The complete proposal is `draft-acosta-crypto-agility-manifest-03`. Consult the [Datatracker publication record](https://datatracker.ietf.org/doc/draft-acosta-crypto-agility-manifest/) for the accepted revision and submission state. Local source files, an upload or passing checks do not establish publication. This is an individual Informational proposal, not an IETF standard or endorsement.

## Submission materials

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# A Well-Known Crypto-Agility Manifest

`draft-acosta-crypto-agility-manifest-02` | individual Informational proposal | [publication status](https://datatracker.ietf.org/doc/draft-acosta-crypto-agility-manifest/)
`draft-acosta-crypto-agility-manifest-03` | individual Informational proposal | [publication status](https://datatracker.ietf.org/doc/draft-acosta-crypto-agility-manifest/)

Author: Leon Acosta, QuantaKrypto, [email protected]

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ Expires: 16 April 2027


A Well-Known Crypto-Agility Manifest
draft-acosta-crypto-agility-manifest-02
draft-acosta-crypto-agility-manifest-03

Abstract

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
<?xml version='1.0' encoding='utf-8'?>
<rfc ipr="trust200902" category="info" docName="draft-acosta-crypto-agility-manifest-02" version="3" consensus="false" tocInclude="true" sortRefs="true" symRefs="true">
<rfc ipr="trust200902" category="info" docName="draft-acosta-crypto-agility-manifest-03" version="3" consensus="false" tocInclude="true" sortRefs="true" symRefs="true">
<front>
<title abbrev="Crypto-Agility Manifest">A Well-Known Crypto-Agility Manifest</title>
<seriesInfo name="Internet-Draft" value="draft-acosta-crypto-agility-manifest-02" />
<seriesInfo name="Internet-Draft" value="draft-acosta-crypto-agility-manifest-03" />
<author fullname="Leon Acosta" initials="L." surname="Acosta">
<organization>QuantaKrypto</organization>
<address>
Expand Down
8 changes: 4 additions & 4 deletions tests/test_contract.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
ROOT=Path(__file__).resolve().parents[1]
SCHEMA=ROOT/"schema/crypto-agility-v2.schema.json"
EXAMPLE=ROOT/"examples/crypto-agility-v2.json"
XML=ROOT/"draft/draft-acosta-crypto-agility-manifest-02.xml"
MD=ROOT/"draft/draft-acosta-crypto-agility-manifest-02.md"
XML=ROOT/"draft/draft-acosta-crypto-agility-manifest-03.xml"
MD=ROOT/"draft/draft-acosta-crypto-agility-manifest-03.md"

class ContractTests(unittest.TestCase):
@classmethod
Expand All @@ -34,10 +34,10 @@ def test_rejects_invalid_digest(self):
self.assertTrue(list(self.validator.iter_errors(d)))
def test_xml_well_formed_and_named(self):
root=ET.parse(XML).getroot()
self.assertEqual(root.attrib["docName"],"draft-acosta-crypto-agility-manifest-02")
self.assertEqual(root.attrib["docName"],"draft-acosta-crypto-agility-manifest-03")
self.assertEqual(root.attrib["version"],"3")
def test_draft_markdown_mentions_same_revision(self):
self.assertIn("draft-acosta-crypto-agility-manifest-02",MD.read_text())
self.assertIn("draft-acosta-crypto-agility-manifest-03",MD.read_text())
def test_normative_schema_matches_standalone(self):
root=ET.parse(XML).getroot()
self.assertEqual(json.loads(root.find("back/section[@anchor='schema']/sourcecode").text),self.schema)
Expand Down
2 changes: 1 addition & 1 deletion tools/render_draft.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import xml.etree.ElementTree as ET

ROOT = Path(__file__).resolve().parents[1]
XML = ROOT / 'draft/draft-acosta-crypto-agility-manifest-02.xml'
XML = ROOT / 'draft/draft-acosta-crypto-agility-manifest-03.xml'
MARKDOWN = XML.with_suffix('.md')


Expand Down