@aicent/iqa 1.3.1 → 1.3.2
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 +19 -14
- package/package.json +1 -1
- package/src/ae128-vectors-v1.json +5 -3
- package/src/envelope.d.mts +1 -1
- package/src/envelope.mjs +2 -2
- package/src/vectors.json +26 -26
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
derivation, action safety classes, the AE-128 fixed attestation envelope -- and
|
|
5
5
|
the published conformance vectors that prove an implementation is right.**
|
|
6
6
|
|
|
7
|
-
[AICENT-009 sec. 10](https://iqa.org/
|
|
7
|
+
[AICENT-009 sec. 10](https://iqa.org/URI/) - sec. 11 - stack v1.2.6 - zero dependencies - no build step
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
@@ -28,7 +28,8 @@ The vectors cover the `iqa://` grammar (AICENT-009 sec. 10.2), the **closed sets
|
|
|
28
28
|
(`organ` and `action` -- the deliberate difference from `rttp`, whose verb set
|
|
29
29
|
is open), the sec. 11.3 action safety classes, the `IQA_ROUTE` derivation, **and**
|
|
30
30
|
the deterministic Ed25519 attestation envelope -- replayed by both
|
|
31
|
-
implementations. The AE-128 envelope (
|
|
31
|
+
implementations. The AE-128 envelope (normative layout: draft-02 sec. 7.2)
|
|
32
|
+
ships with its own
|
|
32
33
|
published vector and full fail-closed matrix under `@aicent/iqa/envelope`.
|
|
33
34
|
|
|
34
35
|
### The other half -- Python, on PyPI
|
|
@@ -241,7 +242,7 @@ starts agreeing with its own bugs.
|
|
|
241
242
|
| OK **IQA_ROUTE derivation** | Real (SPEC sec. 3, decision D1). |
|
|
242
243
|
| OK **Action safety classes** | Real, and specified (sec. 11.3). |
|
|
243
244
|
| OK **Conformance vectors + independent replay** | Published and generated. |
|
|
244
|
-
| OK **AE-128 fixed envelope** | Real, and specified (
|
|
245
|
+
| OK **AE-128 fixed envelope** | Real, and specified (draft-02 sec. 7.2, implemented to the byte). |
|
|
245
246
|
| NO **Dereferencing / resolver service** | Not here. The codec computes; *answering* a standing read is an Organ's job (AICENT-009-C sec. 3). |
|
|
246
247
|
| NO **Staking, tiers, vitality** | Operator economics and telemetry -- AICENT-009 narrative, no cryptographic object in this package. |
|
|
247
248
|
| NO **Post-quantum Lattice Guard** | AICENT-009 sec. 12 #11 schedules it for v1.4.0; no implementation exists. |
|
|
@@ -254,7 +255,7 @@ starts agreeing with its own bugs.
|
|
|
254
255
|
|
|
255
256
|
| Ecosystem | Name | Status |
|
|
256
257
|
|:---|:---|:---|
|
|
257
|
-
| crates.io | **`iqa-org`** | **published** -- `1.3.
|
|
258
|
+
| crates.io | **`iqa-org`** | **published** -- `1.3.2`; the first formal (non-pre-release) publication of the crate was `1.3.1`; Cargo selects it from a plain `iqa-org` requirement. The earlier `1.2.8-alpha` remains published and is not yanked. |
|
|
258
259
|
| 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
260
|
| 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,26 +263,30 @@ starts agreeing with its own bugs.
|
|
|
262
263
|
|
|
263
264
|
## Specification status
|
|
264
265
|
|
|
265
|
-
* **`iqa` URI scheme** --
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
scheme **is** registered: Provisional, CRI 27.)
|
|
266
|
+
* **`iqa` URI scheme** -- **registered**: IANA "URI Schemes" registry,
|
|
267
|
+
Provisional, **CRI 28** (2026-10-13), submitted under RFC 7595
|
|
268
|
+
(ticket **#1459963**). (The sibling `rttp` scheme is registered:
|
|
269
|
+
Provisional, CRI 27.)
|
|
270
270
|
* **Internet-Draft (IETF)** -- under IETF review as the combined Individual
|
|
271
|
-
Submission Internet-Draft `draft-li-rttp-iqa-addressing` (revision -
|
|
272
|
-
|
|
271
|
+
Submission Internet-Draft `draft-li-rttp-iqa-addressing` (revision -02,
|
|
272
|
+
40 pp., 2026-11-01, informational -- both schemes, one document):
|
|
273
273
|
https://datatracker.ietf.org/doc/draft-li-rttp-iqa-addressing/ .
|
|
274
|
+
TXT sha256 `02491c5a59d1e7471be04e8e0d4933dfc22ce19f9b054ead0aa449d6b4485044`.
|
|
274
275
|
An Internet-Draft is a working document -- it is not an IETF standard and
|
|
275
276
|
carries no IETF endorsement.
|
|
277
|
+
* **Conformance records** -- sealed runs and vector families:
|
|
278
|
+
https://iqa.org/conformance/ ; the published vector sets are pinned at
|
|
279
|
+
https://iqa.org/challenge/ .
|
|
276
280
|
* **URI grammar** -- AICENT-009 sec. 10.2 (frozen; this package adds no syntax).
|
|
277
281
|
* **Dereference safety** -- AICENT-009 sec. 11 (closed sets and safety classes);
|
|
278
282
|
the four-state standing vocabulary is normative since v1.2.9, sec. 11.1.1.
|
|
279
283
|
* **Attestation envelope** -- `SPEC/IQA-URI-ATTEST-v1.2.6.md` sec. 5, a **draft**:
|
|
280
284
|
the format is implemented and vector-tested, but it is not yet a numbered
|
|
281
285
|
AICENT-009 section.
|
|
282
|
-
* **AE-128** --
|
|
283
|
-
|
|
284
|
-
|
|
286
|
+
* **AE-128** -- normative layout: draft-li-rttp-iqa-addressing-02 sec. 7.2
|
|
287
|
+
(incorporated into the I-D; re-anchored 2026-11-09). The companion draft
|
|
288
|
+
v0.3 (`ae128-draft-v0.3.md`) remains the historical parameter sheet.
|
|
289
|
+
Implemented here to the byte against the published vector.
|
|
285
290
|
|
|
286
291
|
Where this package and the specification disagree, **the specification wins
|
|
287
292
|
and this package is wrong.** Please report it.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aicent/iqa",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.2",
|
|
4
4
|
"description": "IQA for JavaScript: iqa:// subject-attestation addressing, IQA_ROUTE derivation, action safety classes, the AE-128 fixed attestation envelope -- and the published conformance vectors that prove an implementation is right.",
|
|
5
5
|
"author": "IQA.ORG Organization",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema": "iqa-ae128-vectors/1",
|
|
3
|
-
"spec": "
|
|
3
|
+
"spec": "draft-li-rttp-iqa-addressing-02 sec. 7.2",
|
|
4
4
|
"generated_by": "SPEC/tools/ae128_vectors.py",
|
|
5
5
|
"generated_with": "python 3.14.2 on windows",
|
|
6
6
|
"how_to_reproduce": "change the cases in the generator, never the JSON",
|
|
@@ -48,7 +48,8 @@
|
|
|
48
48
|
{
|
|
49
49
|
"name": "flags 0x0001 (unassigned bit)",
|
|
50
50
|
"frame_hex": "4951414501010100000000006b36ec80557c8154d3780cb78cc5fa1bd72b331c4bd14b6ae7b00904986294a326a0f0255847184ff2c9185539d4863efb84596a4f52472d544553540000000000000001020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
|
51
|
-
"reject_reason": "flags"
|
|
51
|
+
"reject_reason": "flags",
|
|
52
|
+
"note": "WEAK: draft-02 sec. 7.2 (1) does not list the flags check; support = field row 'flags - unassigned; sent as 0x0000'. -03 will add flags to the MUST-reject list (owner decision 2026-11-09)"
|
|
52
53
|
},
|
|
53
54
|
{
|
|
54
55
|
"name": "standing 0x04 (outside the closed set)",
|
|
@@ -68,7 +69,8 @@
|
|
|
68
69
|
{
|
|
69
70
|
"name": "organ tag non-ASCII (0xFF)",
|
|
70
71
|
"frame_hex": "4951414501010000000000006b36ec80557c8154d3780cb78cc5fa1bd72b331c4bd14b6ae7b00904986294a326a0f0255847184ff2c9185539d4863efb84596aff52472d544553540000000000000001020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
|
71
|
-
"reject_reason": "organ"
|
|
72
|
+
"reject_reason": "organ",
|
|
73
|
+
"note": "WEAK: draft-02 sec. 7.2 (1) does not list the organ charset check; support = field row 'organ - exactly 8 octets of US-ASCII'. -03 will add it (owner decision 2026-11-09)"
|
|
72
74
|
}
|
|
73
75
|
],
|
|
74
76
|
"tampered_frames": [
|
package/src/envelope.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* AE-128 -- the fixed 128-byte attestation envelope (
|
|
2
|
+
* AE-128 -- the fixed 128-byte attestation envelope (layout: draft-02 sec. 7.2).
|
|
3
3
|
* Zero dependencies. Field names are snake_case on purpose: they match the
|
|
4
4
|
* Python implementation (iqa.envelope) and the published vector byte for byte.
|
|
5
5
|
*/
|
package/src/envelope.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
// AE-128 -- the fixed 128-byte attestation envelope (
|
|
1
|
+
// AE-128 -- the fixed 128-byte attestation envelope (layout: draft-02 sec. 7.2).
|
|
2
2
|
//
|
|
3
3
|
// Authority boundaries:
|
|
4
|
-
// Layout ..........
|
|
4
|
+
// Layout .......... draft-02 sec. 7.2 (normative layout)
|
|
5
5
|
// Canonical rule .. draft sec. 3 (HMAC over the full frame, attestation zeroed)
|
|
6
6
|
// Verification .... draft sec. 4 (fail-closed, constant-time compare)
|
|
7
7
|
// Standing codes .. AICENT-009 sec. 11.1.1 closed set (0x00..0x03)
|
package/src/vectors.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"spec": "IQA-URI-ATTEST-v1.2.6",
|
|
3
3
|
"applies_to": [
|
|
4
|
-
"
|
|
5
|
-
"
|
|
4
|
+
"draft-li-rttp-iqa-addressing-02 §§4.2, 5",
|
|
5
|
+
"AICENT-009 sec. 10-11 (attestation semantics; beyond -02)"
|
|
6
6
|
],
|
|
7
7
|
"generated_by": "SPEC/tools/iqa_conformance.py",
|
|
8
8
|
"note": "Generated file - do not edit by hand. Change the cases in iqa_conformance.py instead.",
|
|
@@ -135,108 +135,108 @@
|
|
|
135
135
|
"action_omitted": false,
|
|
136
136
|
"action_safe": true,
|
|
137
137
|
"route_hex": "acee0323",
|
|
138
|
-
"note": "note - 9 hex digits is not a hash length (8/32/64), so the subject parses as a name-subject per the ABNF ordered choice (
|
|
138
|
+
"note": "note - 9 hex digits is not a hash length (8/32/64), so the subject parses as a name-subject per the ABNF ordered choice (draft-02 §5.1)"
|
|
139
139
|
}
|
|
140
140
|
],
|
|
141
141
|
"negative_uris": [
|
|
142
142
|
{
|
|
143
143
|
"uri": "iqa://3f9a1b2c.gateway.iqa/AUDIT",
|
|
144
|
-
"reason": "uppercase action - lowercase only (
|
|
144
|
+
"reason": "uppercase action - lowercase only (draft-02 §4.2 + §5.1)"
|
|
145
145
|
},
|
|
146
146
|
{
|
|
147
147
|
"uri": "iqa://3F9A1B2C.gateway.iqa/audit",
|
|
148
|
-
"reason": "uppercase hex subject - lowercase only (
|
|
148
|
+
"reason": "uppercase hex subject - lowercase only (draft-02 §4.2 + §5.2)"
|
|
149
149
|
},
|
|
150
150
|
{
|
|
151
151
|
"uri": "IQA://3f9a1b2c.gateway.iqa/audit",
|
|
152
|
-
"reason": "uppercase scheme prefix - canonical form is lowercase (
|
|
152
|
+
"reason": "uppercase scheme prefix - canonical form is lowercase (draft-02 §4.2)"
|
|
153
153
|
},
|
|
154
154
|
{
|
|
155
155
|
"uri": "iqas://3f9a1b2c.gateway.iqa/audit",
|
|
156
|
-
"reason": "no iqas variant exists and no fallback is defined - fail closed (
|
|
156
|
+
"reason": "no iqas variant exists and no fallback is defined - fail closed (draft-02 §5.2)"
|
|
157
157
|
},
|
|
158
158
|
{
|
|
159
159
|
"uri": "iqa://subject@iqa.org",
|
|
160
|
-
"reason": "userinfo is not defined (
|
|
160
|
+
"reason": "userinfo is not defined (draft-02 §4.2)"
|
|
161
161
|
},
|
|
162
162
|
{
|
|
163
163
|
"uri": "iqa://iqa.org/RFC-009/",
|
|
164
|
-
"reason": "no organ, second path segment - this is an https matter (
|
|
164
|
+
"reason": "no organ, second path segment - this is an https matter (draft-02 §5.1)"
|
|
165
165
|
},
|
|
166
166
|
{
|
|
167
167
|
"uri": "iqa://3f9a1b2c.forgery.iqa",
|
|
168
|
-
"reason": "organ is a closed set (
|
|
168
|
+
"reason": "organ is a closed set (draft-02 §5.1)"
|
|
169
169
|
},
|
|
170
170
|
{
|
|
171
171
|
"uri": "iqa://3f9a1b2c.gateway.iqa/pulse",
|
|
172
|
-
"reason": "action is a closed set - 'pulse' is not one of the four verbs (
|
|
172
|
+
"reason": "action is a closed set - 'pulse' is not one of the four verbs (draft-02 §5.1)"
|
|
173
173
|
},
|
|
174
174
|
{
|
|
175
175
|
"uri": "iqa://3f9a1b2c.Gateway.iqa/verify",
|
|
176
|
-
"reason": "organ is case-sensitive within the closed set (
|
|
176
|
+
"reason": "organ is case-sensitive within the closed set (draft-02 §5.1 + §4.2)"
|
|
177
177
|
},
|
|
178
178
|
{
|
|
179
179
|
"uri": "iqa://3f9a1b2c.gateway.iqa/audit?x=1",
|
|
180
|
-
"reason": "query is not defined (
|
|
180
|
+
"reason": "query is not defined (draft-02 §4.2)"
|
|
181
181
|
},
|
|
182
182
|
{
|
|
183
183
|
"uri": "iqa://3f9a1b2c.gateway.iqa/audit#f",
|
|
184
|
-
"reason": "fragment is not defined (
|
|
184
|
+
"reason": "fragment is not defined (draft-02 §4.2)"
|
|
185
185
|
},
|
|
186
186
|
{
|
|
187
187
|
"uri": "iqa://3f9a1b2c.gateway.iqa:443/audit",
|
|
188
|
-
"reason": "port is not defined (
|
|
188
|
+
"reason": "port is not defined (draft-02 §4.2)"
|
|
189
189
|
},
|
|
190
190
|
{
|
|
191
191
|
"uri": "iqa://3f9a1b2c.gateway.iqa/a/b",
|
|
192
|
-
"reason": "second path segment - path is a single '/<action>' (
|
|
192
|
+
"reason": "second path segment - path is a single '/<action>' (draft-02 §5.1)"
|
|
193
193
|
},
|
|
194
194
|
{
|
|
195
195
|
"uri": "iqa://3f9a1b2c.gateway.iqa/",
|
|
196
|
-
"reason": "trailing '/' with empty action - the closed set has no empty verb (
|
|
196
|
+
"reason": "trailing '/' with empty action - the closed set has no empty verb (draft-02 §5.1)"
|
|
197
197
|
},
|
|
198
198
|
{
|
|
199
199
|
"uri": "iqa://a.b",
|
|
200
|
-
"reason": "authority has two segments, must be <subject>.<organ>.<root> (
|
|
200
|
+
"reason": "authority has two segments, must be <subject>.<organ>.<root> (draft-02 §5.1)"
|
|
201
201
|
},
|
|
202
202
|
{
|
|
203
203
|
"uri": "iqa://a.b.c.d/audit",
|
|
204
|
-
"reason": "authority has four segments, must be <subject>.<organ>.<root> (
|
|
204
|
+
"reason": "authority has four segments, must be <subject>.<organ>.<root> (draft-02 §5.1)"
|
|
205
205
|
},
|
|
206
206
|
{
|
|
207
207
|
"uri": "https://3f9a1b2c.gateway.iqa/audit",
|
|
208
|
-
"reason": "not an iqa scheme - there is no fallback (
|
|
208
|
+
"reason": "not an iqa scheme - there is no fallback (draft-02 §5.2 + §4.5.2)"
|
|
209
209
|
},
|
|
210
210
|
{
|
|
211
211
|
"uri": "iqa://3f9a1b2c.gateway.iqa/audit ",
|
|
212
|
-
"reason": "trailing whitespace"
|
|
212
|
+
"reason": "trailing whitespace (draft-02 §5.1)"
|
|
213
213
|
}
|
|
214
214
|
],
|
|
215
215
|
"action_safety": [
|
|
216
216
|
{
|
|
217
217
|
"action": null,
|
|
218
218
|
"safe": true,
|
|
219
|
-
"why": "omitted - standing read (
|
|
219
|
+
"why": "omitted - standing read (draft-02 §5.3/§5.4)"
|
|
220
220
|
},
|
|
221
221
|
{
|
|
222
222
|
"action": "verify",
|
|
223
223
|
"safe": true,
|
|
224
|
-
"why": "read-only comparison, no state written (
|
|
224
|
+
"why": "read-only comparison, no state written (draft-02 §5.4)"
|
|
225
225
|
},
|
|
226
226
|
{
|
|
227
227
|
"action": "audit",
|
|
228
228
|
"safe": false,
|
|
229
|
-
"why": "a failing measurement
|
|
229
|
+
"why": "a failing measurement may change standing (draft-02 §5.4)"
|
|
230
230
|
},
|
|
231
231
|
{
|
|
232
232
|
"action": "attest",
|
|
233
233
|
"safe": false,
|
|
234
|
-
"why": "state transition - Seal issuance (
|
|
234
|
+
"why": "state transition - Seal issuance (draft-02 §5.4)"
|
|
235
235
|
},
|
|
236
236
|
{
|
|
237
237
|
"action": "revoke",
|
|
238
238
|
"safe": false,
|
|
239
|
-
"why": "state transition - standing withdrawal (
|
|
239
|
+
"why": "state transition - standing withdrawal (draft-02 §5.4)"
|
|
240
240
|
}
|
|
241
241
|
],
|
|
242
242
|
"attest_envelope_vector": {
|