@aicent/iqa 1.2.7 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +293 -247
- package/bin/iqa.mjs +59 -59
- package/examples/quickstart.mjs +1 -1
- package/package.json +9 -2
- package/src/ae128-vectors-v1.json +112 -0
- package/src/conformance.d.mts +29 -29
- package/src/conformance.mjs +181 -181
- package/src/envelope.d.mts +103 -0
- package/src/envelope.mjs +309 -0
- package/src/iqa-uri.d.mts +42 -42
- package/src/iqa-uri.mjs +169 -169
- package/src/vectors.json +25 -25
package/README.md
CHANGED
|
@@ -1,247 +1,293 @@
|
|
|
1
|
-
# @aicent/iqa
|
|
2
|
-
|
|
3
|
-
**IQA for JavaScript: `iqa://` subject-attestation addressing, `IQA_ROUTE`
|
|
4
|
-
derivation, action safety classes
|
|
5
|
-
prove an implementation is right.**
|
|
6
|
-
|
|
7
|
-
[
|
|
8
|
-
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
## Verify it in one command
|
|
12
|
-
|
|
13
|
-
```console
|
|
14
|
-
$ npx @aicent/iqa
|
|
15
|
-
[PASS] all 32 checks passed
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
```js
|
|
156
|
-
import {
|
|
157
|
-
|
|
158
|
-
const
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
|
210
|
-
|
|
211
|
-
|
|
|
212
|
-
|
|
|
213
|
-
|
|
|
214
|
-
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
1
|
+
# @aicent/iqa
|
|
2
|
+
|
|
3
|
+
**IQA for JavaScript: `iqa://` subject-attestation addressing, `IQA_ROUTE`
|
|
4
|
+
derivation, action safety classes, the AE-128 fixed attestation envelope -- and
|
|
5
|
+
the published conformance vectors that prove an implementation is right.**
|
|
6
|
+
|
|
7
|
+
[AICENT-009 sec. 10](https://iqa.org/AICENT-009/) - sec. 11 - stack v1.2.6 - zero dependencies - no build step
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Verify it in one command -- no trust required
|
|
12
|
+
|
|
13
|
+
```console
|
|
14
|
+
$ npx @aicent/iqa
|
|
15
|
+
[PASS] all 32 checks passed
|
|
16
|
+
|
|
17
|
+
$ node --test
|
|
18
|
+
# 19 test blocks, 0 fail -- including the AE-128 published vector,
|
|
19
|
+
# replayed byte for byte from the draft's documented parameters
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
That is the point of this package. A specification is worth exactly what an
|
|
23
|
+
independent implementation can reproduce from it, so instead of asking you to
|
|
24
|
+
believe a table of numbers, the vectors ship inside the package and replay
|
|
25
|
+
locally -- offline, no account, no network. `[PASS]` or it is not. Every vector file shipped here is listed in `vectors.manifest.json` with its byte count and SHA-256, produced by a generator rather than typed by hand - recompute the hash yourself if you prefer.
|
|
26
|
+
|
|
27
|
+
The vectors cover the `iqa://` grammar (AICENT-009 sec. 10.2), the **closed sets**
|
|
28
|
+
(`organ` and `action` -- the deliberate difference from `rttp`, whose verb set
|
|
29
|
+
is open), the sec. 11.3 action safety classes, the `IQA_ROUTE` derivation, **and**
|
|
30
|
+
the deterministic Ed25519 attestation envelope -- replayed by both
|
|
31
|
+
implementations. The AE-128 envelope (companion draft v0.3) ships with its own
|
|
32
|
+
published vector and full fail-closed matrix under `@aicent/iqa/envelope`.
|
|
33
|
+
|
|
34
|
+
### The other half -- Python, on PyPI
|
|
35
|
+
|
|
36
|
+
```console
|
|
37
|
+
$ pip install iqa-org
|
|
38
|
+
$ python -m iqa.selftest
|
|
39
|
+
[PASS] all 108 checks passed (3 skipped) # default install
|
|
40
|
+
|
|
41
|
+
$ pip install iqa-org[ed25519]
|
|
42
|
+
$ python -m iqa.selftest
|
|
43
|
+
[PASS] all 111 checks passed # with the optional Ed25519 backend
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Published as **`@aicent/iqa`** -- the bare `iqa` name is unregistered on npm but
|
|
47
|
+
blocked by its typosquatting protection, so the JavaScript side lives under
|
|
48
|
+
this project's organization, as `@aicent/rttp` already does. PyPI applies the
|
|
49
|
+
same class of guard: the Python package is therefore **`iqa-org`** (same name
|
|
50
|
+
as the Rust crate; the import stays `import iqa`). It ships a **byte-identical
|
|
51
|
+
copy** of this same vector set (three mirrors, one sha256) and replays it
|
|
52
|
+
offline, exactly as this one does: two registries, two languages, one
|
|
53
|
+
specification.
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Install
|
|
58
|
+
|
|
59
|
+
```console
|
|
60
|
+
npm install @aicent/iqa
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Node 18+. No dependencies, no build step, no transitive tree to audit: the
|
|
64
|
+
published `src/` is exactly what runs.
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Quickstart
|
|
69
|
+
|
|
70
|
+
```js
|
|
71
|
+
import { parse } from '@aicent/iqa';
|
|
72
|
+
|
|
73
|
+
const r = parse('iqa://3f9a1b2c.gateway.iqa');
|
|
74
|
+
|
|
75
|
+
r.subject // '3f9a1b2c' -- 8-hex routing short form of the AID
|
|
76
|
+
r.organ // 'gateway' -- closed set: forge | tss | gateway
|
|
77
|
+
r.action // null -- omitted = standing read (sec. 11.1)
|
|
78
|
+
r.action_safe // true -- sec. 11.3: omitted and verify are SAFE
|
|
79
|
+
r.canonical_uri // 'iqa://3f9a1b2c.gateway.iqa'
|
|
80
|
+
r.route_hex // '5c378581' <- pure computation, pinned by the vectors
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
The same lines ship as a runnable file:
|
|
84
|
+
|
|
85
|
+
```console
|
|
86
|
+
$ node examples/quickstart.mjs
|
|
87
|
+
5c378581
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Its expected output is the route fingerprint the published conformance vectors
|
|
91
|
+
pin for that address, so the example can be **checked** rather than believed.
|
|
92
|
+
|
|
93
|
+
Addressing is **DNS-free** (AICENT-009 sec. 12 #9): the route fingerprint is derived
|
|
94
|
+
from the authority by SHA-256, so no registry, resolver or network is
|
|
95
|
+
involved. A URI either yields its fields or throws -- there is no fallback, no
|
|
96
|
+
`iqas`, and no rewriting to `https`.
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## The two closed sets -- the deliberate difference from `rttp`
|
|
101
|
+
|
|
102
|
+
`rttp` accepts any well-formed action verb. **`iqa` does not.** AICENT-009 sec. 10.1
|
|
103
|
+
marks *both* segments "Closed set", and this package enforces exactly that:
|
|
104
|
+
|
|
105
|
+
```js
|
|
106
|
+
parse('iqa://3f9a1b2c.gateway.iqa/pulse') // throws -- 'pulse' is an rttp verb
|
|
107
|
+
parse('iqa://3f9a1b2c.forgery.iqa') // throws -- organ is forge|tss|gateway
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### The one rule that surprises people
|
|
111
|
+
|
|
112
|
+
**Malformed input is rejected, not normalised.** `iqa://.../AUDIT`,
|
|
113
|
+
`iqa://3F9A1B2C....` and `IQA://...` all throw: the canonical form is lowercase
|
|
114
|
+
US-ASCII (AICENT-009 sec. 10.3), a case variant is not a spelling difference, and
|
|
115
|
+
nothing is ever accepted because a check could not be performed.
|
|
116
|
+
|
|
117
|
+
### One honest quirk of the grammar
|
|
118
|
+
|
|
119
|
+
The ABNF is an ordered choice (`hash-subject / name-subject`), so a lowercase
|
|
120
|
+
hex string of a **non-hash length** (9 digits, say) is a *name subject*, not
|
|
121
|
+
an error. The grammar is the grammar; vector #8 pins the behaviour so every
|
|
122
|
+
implementation agrees on it.
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Action safety classes (AICENT-009 sec. 11.3)
|
|
127
|
+
|
|
128
|
+
| `action` | Class | `action_safe` |
|
|
129
|
+
|:---|:---|:---|
|
|
130
|
+
| *(omitted)* | SAFE -- standing read | `true` |
|
|
131
|
+
| `verify` | SAFE -- read-only comparison | `true` |
|
|
132
|
+
| `audit` | NOT SAFE -- can trigger Authority Ischemia | `false` |
|
|
133
|
+
| `attest` | NOT SAFE -- state transition | `false` |
|
|
134
|
+
| `revoke` | NOT SAFE -- state transition | `false` |
|
|
135
|
+
|
|
136
|
+
Per sec. 11.2, dereferencing an `iqa` URI MUST NOT transition any subject's
|
|
137
|
+
standing. Tooling built on this package MUST gate the three NOT-SAFE verbs
|
|
138
|
+
behind an explicit user action -- parsing one is not requesting one.
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## API -- main entry
|
|
143
|
+
|
|
144
|
+
| Export | What it does |
|
|
145
|
+
|:---|:---|
|
|
146
|
+
| `parse(uri)` | Validate, canonicalise, classify, derive. Throws `IqaUriError`. |
|
|
147
|
+
| `deriveRoute(authority)` | `Uint8Array(4)` = `SHA-256(ASCII(authority))[0:4]`. |
|
|
148
|
+
| `deriveRouteHex(authority)` | The same, as 8 lowercase hex characters. |
|
|
149
|
+
| `isValidAction(value)` | sec. 10.1 closed-set test. |
|
|
150
|
+
| `IqaUriError` | The only error type thrown. |
|
|
151
|
+
| `SCHEME`, `ORGANS`, `ACTIONS`, `STANDINGS`, `HASH_LENGTHS` | Constants. |
|
|
152
|
+
|
|
153
|
+
### AE-128 -- `@aicent/iqa/envelope`
|
|
154
|
+
|
|
155
|
+
```js
|
|
156
|
+
import { encode, verify, deriveIntentShard, vector1Frame, VECTOR_1_KEY } from '@aicent/iqa/envelope';
|
|
157
|
+
|
|
158
|
+
const frame = encode({
|
|
159
|
+
key: Buffer.from('the organ key material'),
|
|
160
|
+
intent_shard: deriveIntentShard('f3b2a1c4.pillar.example'),
|
|
161
|
+
organ: 'gateway', standing: 'radiant', // or 0x02
|
|
162
|
+
lease_expiry: 1798761600, nonce: 1,
|
|
163
|
+
});
|
|
164
|
+
frame.length // 128 -- one frame, one datagram
|
|
165
|
+
|
|
166
|
+
const { ok, reason, frame: parsed } = verify(frame, key, { now: 1798761600 - 1 });
|
|
167
|
+
// ok=true -- offline: no issuer contact, no key directory, no network call
|
|
168
|
+
parsed.standing_name // 'radiant'
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
Fixed offsets, HMAC-SHA256 over the whole frame with the attestation field
|
|
172
|
+
zeroed, standing closed set at offset 80, constant-time compare, zero-parser
|
|
173
|
+
verification. The published vector (`vector1Frame()`) reproduces byte for byte
|
|
174
|
+
against the draft's parameters -- and against the Python and Rust
|
|
175
|
+
implementations, field for field.
|
|
176
|
+
|
|
177
|
+
### The attestation envelope -- `@aicent/iqa/conformance`
|
|
178
|
+
|
|
179
|
+
The deterministic Ed25519 envelope (SPEC/IQA-URI-ATTEST-v1.2.6 sec. 5: domain
|
|
180
|
+
prefix `iqa-attest-v1`, `AID = SHA-256(pub)`, `ts`/`nonce` inside the
|
|
181
|
+
signature, 120-second freshness) is part of the shared vector set and is
|
|
182
|
+
replayed by this package's conformance run. `buildSigningInput` is exported
|
|
183
|
+
from `./conformance` for implementers of other languages.
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## The conformance vectors
|
|
188
|
+
|
|
189
|
+
```js
|
|
190
|
+
import { loadVectors, runConformance } from '@aicent/iqa/conformance';
|
|
191
|
+
|
|
192
|
+
const { checked, failures, passed } = runConformance(loadVectors());
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
Or from the command line:
|
|
196
|
+
|
|
197
|
+
```console
|
|
198
|
+
npx @aicent/iqa # replay the shipped vectors
|
|
199
|
+
npx @aicent/iqa --vectors ./new.json # replay a different vector set
|
|
200
|
+
npx @aicent/iqa --json # machine-readable output
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
In CI:
|
|
204
|
+
|
|
205
|
+
```yaml
|
|
206
|
+
- run: npx @aicent/iqa
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
| Group | Count | What it proves |
|
|
210
|
+
|:---|---:|:---|
|
|
211
|
+
| `positive_uris` | 8 | Accept, classify and derive -- sec. 10.3's own examples, the 256-bit form, the all-zero boundary, the name-subject fall-through |
|
|
212
|
+
| `negative_uris` | 18 | Reject -- uppercase anywhere, `iqas://`, userinfo, port, query, fragment, wrong authority shape, closed-set violations on both segments |
|
|
213
|
+
| `action_safety` | 5 | sec. 11.3 classes as data |
|
|
214
|
+
| `attest_envelope_vector` | 1 | Deterministic Ed25519 envelope, verified through `node:crypto` |
|
|
215
|
+
|
|
216
|
+
`vectors.json` is plain JSON and ships inside the package, also reachable as
|
|
217
|
+
the subpath export `@aicent/iqa/vectors.json`. Any language can read it; that
|
|
218
|
+
is what it is for.
|
|
219
|
+
|
|
220
|
+
### Why the checker lives in this package, and why that is still honest
|
|
221
|
+
|
|
222
|
+
`src/conformance.mjs` is written from AICENT-009 sec. 10 alone and **must never
|
|
223
|
+
import `src/iqa-uri.mjs`**. A conformance suite that reuses the code under
|
|
224
|
+
test only proves the code equals itself. The two files share no code -- one is
|
|
225
|
+
a streaming charset scanner, the other a single full-match grammar check -- so
|
|
226
|
+
the rule is checkable by reading them.
|
|
227
|
+
|
|
228
|
+
The vectors are **generated, not written**. `generated_by` in the JSON names
|
|
229
|
+
the generator, and the file says so itself: change the cases in the generator,
|
|
230
|
+
not the JSON. Hand-editing a conformance vector is how a specification quietly
|
|
231
|
+
starts agreeing with its own bugs.
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
## Scope -- what this package is not
|
|
236
|
+
|
|
237
|
+
| | |
|
|
238
|
+
|:---|:---|
|
|
239
|
+
| OK **Validation / canonicalisation** | Real, and specified (AICENT-009 sec. 10.2 / sec. 10.3). |
|
|
240
|
+
| OK **Closed-set enforcement** | Real, and specified (sec. 10.1). |
|
|
241
|
+
| OK **IQA_ROUTE derivation** | Real (SPEC sec. 3, decision D1). |
|
|
242
|
+
| OK **Action safety classes** | Real, and specified (sec. 11.3). |
|
|
243
|
+
| OK **Conformance vectors + independent replay** | Published and generated. |
|
|
244
|
+
| OK **AE-128 fixed envelope** | Real, and specified (companion draft v0.3, implemented to the byte). |
|
|
245
|
+
| NO **Dereferencing / resolver service** | Not here. The codec computes; *answering* a standing read is an Organ's job (AICENT-009-C sec. 3). |
|
|
246
|
+
| NO **Staking, tiers, vitality** | Operator economics and telemetry -- AICENT-009 narrative, no cryptographic object in this package. |
|
|
247
|
+
| NO **Post-quantum Lattice Guard** | AICENT-009 sec. 12 #11 schedules it for v1.4.0; no implementation exists. |
|
|
248
|
+
| NO **Revocation transport** | sec. 11.3 defines the verb; executing it is not the codec's job. |
|
|
249
|
+
| NO **Confidentiality** | Signing is not encryption. |
|
|
250
|
+
|
|
251
|
+
---
|
|
252
|
+
|
|
253
|
+
## Naming
|
|
254
|
+
|
|
255
|
+
| Ecosystem | Name | Status |
|
|
256
|
+
|:---|:---|:---|
|
|
257
|
+
| crates.io | **`iqa-org`** | **published** -- `1.3.1`, the first formal (non-pre-release) publication of the crate; Cargo selects it from a plain `iqa-org` requirement. The earlier `1.2.8-alpha` remains published and is not yanked. |
|
|
258
|
+
| PyPI | **`iqa-org`** | **published** -- the Python reference implementation; `pip install iqa-org` (bare `iqa` blocked by PyPI's typosquatting protection, same class of guard as npm) |
|
|
259
|
+
| npm | **`@aicent/iqa`** | the bare `iqa` name is unregistered but **blocked by npm's typosquatting protection** (too similar to existing short names) -- so this package is published under the organization this project controls, as `@aicent/rttp` already is. The package name itself is still just `iqa`. |
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
## Specification status
|
|
264
|
+
|
|
265
|
+
* **`iqa` URI scheme** -- submitted to IANA under RFC 7595, ticket **#1459963**:
|
|
266
|
+
the scheme **name is approved**; the CRI number is in expert review. It is
|
|
267
|
+
**not yet registered** -- as of 2026-10-04 the IANA "URI Schemes" registry
|
|
268
|
+
contains no `iqa` entry. Please describe it that way. (The sibling `rttp`
|
|
269
|
+
scheme **is** registered: Provisional, CRI 27.)
|
|
270
|
+
* **Internet-Draft (IETF)** -- under IETF review as the combined Individual
|
|
271
|
+
Submission Internet-Draft `draft-li-rttp-iqa-addressing` (revision -00,
|
|
272
|
+
16 pp., 2026-09-24, informational -- both schemes, one document):
|
|
273
|
+
https://datatracker.ietf.org/doc/draft-li-rttp-iqa-addressing/ .
|
|
274
|
+
An Internet-Draft is a working document -- it is not an IETF standard and
|
|
275
|
+
carries no IETF endorsement.
|
|
276
|
+
* **URI grammar** -- AICENT-009 sec. 10.2 (frozen; this package adds no syntax).
|
|
277
|
+
* **Dereference safety** -- AICENT-009 sec. 11 (closed sets and safety classes);
|
|
278
|
+
the four-state standing vocabulary is normative since v1.2.9, sec. 11.1.1.
|
|
279
|
+
* **Attestation envelope** -- `SPEC/IQA-URI-ATTEST-v1.2.6.md` sec. 5, a **draft**:
|
|
280
|
+
the format is implemented and vector-tested, but it is not yet a numbered
|
|
281
|
+
AICENT-009 section.
|
|
282
|
+
* **AE-128** -- companion draft v0.3 (`ae128-draft-v0.3.md`): implemented here
|
|
283
|
+
to the byte against the published vector. A roadmap artifact of the
|
|
284
|
+
specification line; it creates no IANA/ISE obligations.
|
|
285
|
+
|
|
286
|
+
Where this package and the specification disagree, **the specification wins
|
|
287
|
+
and this package is wrong.** Please report it.
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## License
|
|
292
|
+
|
|
293
|
+
Apache-2.0. See `LICENSE`.
|