xoonya 3.0.1 → 3.1.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/.env.example +8 -0
- package/README.md +107 -1
- package/RELEASE_NOTES.md +12 -9
- package/SERVICE_CONTRACT.md +12 -0
- package/START_HERE.md +9 -0
- package/XOONYA_NATIVE_PROOF_FORMAT.md +52 -9
- package/index.js +12 -3
- package/lib/adapter_certification_contract.js +90 -0
- package/lib/authority_binding_lifecycle_contract.js +182 -0
- package/lib/crypto_agility_matrix.js +125 -0
- package/lib/machine_identity_registry_contract.js +199 -0
- package/lib/offline_verifiability_recovery_contract.js +155 -0
- package/lib/operational_receipt_contract.js +165 -0
- package/lib/public_surface_policy_contract.js +111 -0
- package/lib/signed_audit_provenance_contract.js +93 -0
- package/lib/trust_portability_boundary_contract.js +66 -0
- package/package.json +5 -2
- package/proof_sdk.js +327 -31
- package/reference/python/__pycache__/xnya_reference.cpython-314.pyc +0 -0
- package/scripts/verify_control_plane_contracts.js +34 -0
- package/scripts/verify_control_plane_routes.js +70 -0
- package/scripts/verify_forgery_resistance.js +281 -0
- package/scripts/verify_service.js +98 -0
- package/server.js +242 -16
package/.env.example
CHANGED
|
@@ -1,2 +1,10 @@
|
|
|
1
1
|
XOONYA_HOST=127.0.0.1
|
|
2
2
|
XOONYA_PORT=4310
|
|
3
|
+
# Set to 1 to make every proof-bundle verification strict: only cryptographically verified
|
|
4
|
+
# (native signed / native hybrid) results are valid; digest and structural results are rejected.
|
|
5
|
+
# XOONYA_STRICT_VERIFY=1
|
|
6
|
+
# Whether POST /v1/receipts/emit, /v1/proof-bundles/build, and the proof-center run routes may
|
|
7
|
+
# receive private key material (private_key_pem, classical_private_key_pem, pq_private_key_pem).
|
|
8
|
+
# Unset = accepted locally, rejected when RENDER is set. Set to false on any shared deployment
|
|
9
|
+
# and sign locally with the xoonya SDK or CLI instead.
|
|
10
|
+
# XOONYA_ACCEPT_PRIVATE_KEY_MATERIAL=false
|
package/README.md
CHANGED
|
@@ -14,6 +14,29 @@ This repo is the proof-side half of the final two-repo public stack. It focuses
|
|
|
14
14
|
|
|
15
15
|
The 10-phase public program is now complete. `xoonya` is in terminal closeout posture rather than active milestone build posture.
|
|
16
16
|
|
|
17
|
+
## Public Discovery
|
|
18
|
+
|
|
19
|
+
The broader stack now has a canonical human front door and a canonical machine doorway:
|
|
20
|
+
|
|
21
|
+
- https://www.naxytra.com/agents
|
|
22
|
+
- https://www.naxytra.com/v1/agent-discovery-index
|
|
23
|
+
- https://www.naxytra.com/v1/agent-discovery-index/summary
|
|
24
|
+
- https://www.naxytra.com/.well-known/agent.json
|
|
25
|
+
|
|
26
|
+
Use the human page when you want the shortest adoption landing page, and use the machine endpoints when a registry, crawler, or agent needs a stable public discovery surface.
|
|
27
|
+
|
|
28
|
+
The shared control-plane contract documents are:
|
|
29
|
+
|
|
30
|
+
- [OPERATIONAL_RECEIPT_CONTRACT.md](C:/Users/Yoga/Desktop/workspace/vscode_workspace_naxytra/naxytra/docs/architecture/OPERATIONAL_RECEIPT_CONTRACT.md)
|
|
31
|
+
- [MACHINE_IDENTITY_REGISTRY_CONTRACT.md](C:/Users/Yoga/Desktop/workspace/vscode_workspace_naxytra/naxytra/docs/architecture/MACHINE_IDENTITY_REGISTRY_CONTRACT.md)
|
|
32
|
+
- [CRYPTO_AGILITY_MATRIX.md](C:/Users/Yoga/Desktop/workspace/vscode_workspace_naxytra/naxytra/docs/architecture/CRYPTO_AGILITY_MATRIX.md)
|
|
33
|
+
- [AUTHORITY_BINDING_LIFECYCLE_CONTRACT.md](C:/Users/Yoga/Desktop/workspace/vscode_workspace_naxytra/naxytra/docs/architecture/AUTHORITY_BINDING_LIFECYCLE_CONTRACT.md)
|
|
34
|
+
- [PUBLIC_SURFACE_POLICY_CONTRACT.md](C:/Users/Yoga/Desktop/workspace/vscode_workspace_naxytra/naxytra/docs/architecture/PUBLIC_SURFACE_POLICY_CONTRACT.md)
|
|
35
|
+
- [OFFLINE_VERIFIABILITY_AND_RECOVERY_CONTRACT.md](C:/Users/Yoga/Desktop/workspace/vscode_workspace_naxytra/naxytra/docs/architecture/OFFLINE_VERIFIABILITY_AND_RECOVERY_CONTRACT.md)
|
|
36
|
+
- [ADAPTER_CERTIFICATION_CONTRACT.md](C:/Users/Yoga/Desktop/workspace/vscode_workspace_naxytra/naxytra/docs/architecture/ADAPTER_CERTIFICATION_CONTRACT.md)
|
|
37
|
+
- [TRUST_PORTABILITY_BOUNDARY_CONTRACT.md](C:/Users/Yoga/Desktop/workspace/vscode_workspace_naxytra/naxytra/docs/architecture/TRUST_PORTABILITY_BOUNDARY_CONTRACT.md)
|
|
38
|
+
- [SIGNED_AUDIT_PROVENANCE_CONTRACT.md](C:/Users/Yoga/Desktop/workspace/vscode_workspace_naxytra/naxytra/docs/architecture/SIGNED_AUDIT_PROVENANCE_CONTRACT.md)
|
|
39
|
+
|
|
17
40
|
## Public Boundary
|
|
18
41
|
|
|
19
42
|
The public adoption story is intentionally narrow:
|
|
@@ -46,6 +69,7 @@ The shortest public proof loop is:
|
|
|
46
69
|
The frozen proof-side fact model for `3.0.0` closeout is documented in:
|
|
47
70
|
|
|
48
71
|
- [XOONYA_PROOF_TRUTH_MODEL.md](C:/Users/Yoga/Desktop/workspace/vscode_workspace_naxytra/naxytra/xoonya/XOONYA_PROOF_TRUTH_MODEL.md)
|
|
72
|
+
- [OPERATIONAL_RECEIPT_CONTRACT.md](C:/Users/Yoga/Desktop/workspace/vscode_workspace_naxytra/naxytra/docs/architecture/OPERATIONAL_RECEIPT_CONTRACT.md)
|
|
49
73
|
|
|
50
74
|
Machine-readable proof-truth surfaces:
|
|
51
75
|
|
|
@@ -97,6 +121,9 @@ If you want the broadest machine-readable census for these already-core proof la
|
|
|
97
121
|
- `GET /v1/artifact-distribution`
|
|
98
122
|
- `GET /v1/shared-signals`
|
|
99
123
|
- `GET /v1/feature-control`
|
|
124
|
+
- `GET /v1/adapter-certification`
|
|
125
|
+
- `GET /v1/trust-portability-boundary`
|
|
126
|
+
- `GET /v1/signed-audit-provenance`
|
|
100
127
|
|
|
101
128
|
## One-Line After Install
|
|
102
129
|
|
|
@@ -116,6 +143,54 @@ If you want the shortest machine-readable discovery path, inspect:
|
|
|
116
143
|
- `GET /v1/proof-bridge`
|
|
117
144
|
- `GET /v1/telemetry`
|
|
118
145
|
- `GET /v1/provenance`
|
|
146
|
+
- `GET /v1/adapter-certification`
|
|
147
|
+
- `GET /v1/trust-portability-boundary`
|
|
148
|
+
- `GET /v1/signed-audit-provenance`
|
|
149
|
+
|
|
150
|
+
If you are working on shared evidence, inspect the operational receipt contract pack:
|
|
151
|
+
|
|
152
|
+
- `buildOperationalReceiptContractPack()`
|
|
153
|
+
- `summarizeOperationalReceiptContractPack()`
|
|
154
|
+
|
|
155
|
+
If you are working on machine identity, inspect the registry contract pack:
|
|
156
|
+
|
|
157
|
+
- `buildMachineIdentityRegistryContractPack()`
|
|
158
|
+
- `summarizeMachineIdentityRegistryContractPack()`
|
|
159
|
+
|
|
160
|
+
If you are working on crypto agility, inspect the matrix pack:
|
|
161
|
+
|
|
162
|
+
- `buildCryptoAgilityMatrixPack()`
|
|
163
|
+
- `summarizeCryptoAgilityMatrixPack()`
|
|
164
|
+
|
|
165
|
+
If you are working on binding lifecycle, inspect the lifecycle pack:
|
|
166
|
+
|
|
167
|
+
- `buildAuthorityBindingLifecycleContractPack()`
|
|
168
|
+
- `summarizeAuthorityBindingLifecycleContractPack()`
|
|
169
|
+
|
|
170
|
+
If you are working on public route policy, inspect the surface policy pack:
|
|
171
|
+
|
|
172
|
+
- `buildPublicSurfacePolicyContractPack()`
|
|
173
|
+
- `summarizePublicSurfacePolicyContractPack()`
|
|
174
|
+
|
|
175
|
+
If you are working on offline recovery, inspect the recovery pack:
|
|
176
|
+
|
|
177
|
+
- `buildOfflineVerifiabilityRecoveryContractPack()`
|
|
178
|
+
- `summarizeOfflineVerifiabilityRecoveryContractPack()`
|
|
179
|
+
|
|
180
|
+
If you are working on adapter certification, inspect the certification pack:
|
|
181
|
+
|
|
182
|
+
- `buildAdapterCertificationContractPack()`
|
|
183
|
+
- `summarizeAdapterCertificationContractPack()`
|
|
184
|
+
|
|
185
|
+
If you are working on trust portability boundaries, inspect the boundary pack:
|
|
186
|
+
|
|
187
|
+
- `buildTrustPortabilityBoundaryContractPack()`
|
|
188
|
+
- `summarizeTrustPortabilityBoundaryContractPack()`
|
|
189
|
+
|
|
190
|
+
If you are working on signed audit and provenance, inspect the audit/provenance pack:
|
|
191
|
+
|
|
192
|
+
- `buildSignedAuditProvenanceContractPack()`
|
|
193
|
+
- `summarizeSignedAuditProvenanceContractPack()`
|
|
119
194
|
|
|
120
195
|
## Start Here
|
|
121
196
|
|
|
@@ -302,6 +377,8 @@ Current built-in methods:
|
|
|
302
377
|
|
|
303
378
|
`algorithm: "none"` is not a registered verification method and does not verify. External proof methods are first-class registry entries, but xoonya does not pretend to replace their own cryptographic verifier stacks. The proof core checks the canonical receipt, method registration, and method boundary; issuer-specific validation stays with the relevant JWT, DID/VC, SD-JWT VC, signed-envelope, or partner verifier.
|
|
304
379
|
|
|
380
|
+
Every verify result now says which of these happened through `verification_class` and `cryptographically_verified` (see "Verification Classes" below). Native signed and hybrid proofs bind `public_key_ref` to the key carried in the proof, not to the identity string; pass `trusted_public_key_refs` or `expected_public_key_ref` to bind an identity to its keys, and `strict: true` to refuse anything that was not cryptographically verified.
|
|
381
|
+
|
|
305
382
|
### xoonya Native Proof Format
|
|
306
383
|
|
|
307
384
|
xoonya Native is the optional native proof/result/attestation format direction for machine proof. It is not a replacement for JWT, OAuth, OIDC, DID/VC, or SD-JWT VC. Those remain interoperability lanes.
|
|
@@ -390,6 +467,14 @@ Environment example:
|
|
|
390
467
|
|
|
391
468
|
- [`.env.example`](C:/Users/Yoga/Desktop/workspace/vscode_workspace_naxytra/naxytra/xoonya/.env.example)
|
|
392
469
|
|
|
470
|
+
Service environment variables:
|
|
471
|
+
|
|
472
|
+
- `XOONYA_HOST`, `XOONYA_PORT` (or `PORT`): bind address and port.
|
|
473
|
+
- `XOONYA_STRICT_VERIFY=1`: make every proof-bundle verification strict (only `cryptographic` results are `valid`).
|
|
474
|
+
- `XOONYA_ACCEPT_PRIVATE_KEY_MATERIAL`: `true` or `false`. When `false`, or when it is unset and `RENDER` is set (hosted deployments), `POST /v1/receipts/emit`, `POST /v1/proof-bundles/build`, and the proof-center run routes reject any body containing a field matching `/private_key/i` with `400 private_key_material_not_accepted`. Sign locally with the SDK (`emitReceipt`, `buildProofBundle`) or the `xoonya` CLI and submit the signed receipt or bundle instead. Local runs without `RENDER` keep accepting private key material so the existing verifiers pass.
|
|
475
|
+
|
|
476
|
+
Request bodies are capped at 1 MiB by byte count (a larger declared `content-length` is rejected before the body is read). `OPTIONS` returns `204` with an `allow` header, `HEAD` mirrors `GET` without a body, malformed percent-encoding in a path returns `400 invalid_path_encoding`, and unexpected handler failures return a generic `500 internal_error` with the stack logged server-side only.
|
|
477
|
+
|
|
393
478
|
## Service Routes
|
|
394
479
|
|
|
395
480
|
Primary proof-model routes:
|
|
@@ -645,6 +730,7 @@ Local verification commands:
|
|
|
645
730
|
- `npm run verify:examples`
|
|
646
731
|
- `npm run verify:service`
|
|
647
732
|
- `npm run verify:tooling`
|
|
733
|
+
- `npm run verify:forgery-resistance`
|
|
648
734
|
- `npm run verify:all`
|
|
649
735
|
|
|
650
736
|
The current verification covers:
|
|
@@ -659,6 +745,26 @@ The current verification covers:
|
|
|
659
745
|
- published adversarial vectors
|
|
660
746
|
- package quickstart flow
|
|
661
747
|
- service routes for both the primary proof model and the legacy compatibility layer
|
|
748
|
+
- forgery resistance: key substitution with and without a trust root, strict-mode rejection of digest and structural results, hybrid PQ tampering and wrong-pin rejection, and result determinism
|
|
749
|
+
|
|
750
|
+
### Verification Classes
|
|
751
|
+
|
|
752
|
+
`verifyProofBundle(bundle, options)` and `POST /v1/proof-bundles/verify` (`{ "bundle": ..., "options": ... }`) return `verification_class`, `cryptographically_verified`, `strict`, and `trust_root_applied` next to `valid`:
|
|
753
|
+
|
|
754
|
+
| `verification_class` | Methods | `cryptographically_verified` | Strict mode |
|
|
755
|
+
| --- | --- | --- | --- |
|
|
756
|
+
| `cryptographic` | `xoonya-native-signed-v1`, `xoonya-native-hybrid-v1` | `true` when valid | accepted |
|
|
757
|
+
| `digest` | `xoonya-native-sha256-v1`, `legacy-opreturn-v1` | `false` | rejected: `digest_only_not_cryptographically_verified` |
|
|
758
|
+
| `anchored_binding` | `xoonya-native-anchored-v1` | `false` | rejected: `digest_only_not_cryptographically_verified` |
|
|
759
|
+
| `structural` | `detached-assertion-v1`, `jwt-assertion-v1`, `did-vc-v1`, `sd-jwt-vc-v1`, `signed-envelope-v1`, `partner-proof-envelope-v1` | `false` | rejected: `external_verification_required` |
|
|
760
|
+
|
|
761
|
+
Default `valid` semantics are unchanged. Options:
|
|
762
|
+
|
|
763
|
+
- `strict: true` (or env `XOONYA_STRICT_VERIFY=1`): only `cryptographic` results are `valid`.
|
|
764
|
+
- `expected_public_key_ref`, `expected_classical_public_key_ref`, `expected_pq_public_key_ref`, `expected_hybrid_public_key_ref`: pin the exact key refs a native proof must carry.
|
|
765
|
+
- `trusted_public_key_refs`: `{ "<identity_ref>": "<ref>" | ["<ref>", ...] | { "classical": ..., "pq": ..., "hybrid": ... } }`. Native signed proofs fail with `native_public_key_not_trusted` and native hybrid proofs with `native_hybrid_public_key_not_trusted` when the signing key is not pinned for that identity. Any trust-root option sets `trust_root_applied: true` and fails closed for identities that are not listed.
|
|
766
|
+
|
|
767
|
+
Without a trust root, a native signed proof only proves that the carried key signed the receipt; `identity_ref` and `agent_identity` are not bound to that key by xoonya. `npm run verify:forgery-resistance` pins this behavior.
|
|
662
768
|
|
|
663
769
|
Public conformance command:
|
|
664
770
|
|
|
@@ -730,4 +836,4 @@ The proof-side readiness layer now also makes promotion posture explicit without
|
|
|
730
836
|
- production-default-ready means certification, maturity, bundled posture, and selection posture all line up
|
|
731
837
|
- blockers are returned as data instead of being left implicit
|
|
732
838
|
- promotion workflow summaries now show the next proof-side transition and the current recommendation without introducing approval state
|
|
733
|
-
|
|
839
|
+
|
package/RELEASE_NOTES.md
CHANGED
|
@@ -1,15 +1,18 @@
|
|
|
1
|
-
|
|
1
|
+
## 3.1.1
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
`xoonya` 3.1.1 is the verification-honesty and service-hardening patch on the synchronized control-plane and evidence-line release for the live proof, verification, continuity, governance, replay, and public first-contact line.
|
|
4
|
+
|
|
5
|
+
This release keeps every frozen proof truth model, public contract, proof, release, and gate surface intact while making verify results say exactly what was checked, letting verifiers pin identities to keys, and hardening the HTTP service against oversized bodies, malformed paths, leaked error details, and private key material submitted over the wire.
|
|
4
6
|
|
|
5
7
|
Highlights:
|
|
6
8
|
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
9
|
+
- adds `verification_class` (`cryptographic`, `digest`, `anchored_binding`, `structural`), `cryptographically_verified`, `strict`, and `trust_root_applied` to every `verifyProofBundle` and `POST /v1/proof-bundles/verify` result without changing default `valid` semantics
|
|
10
|
+
- adds strict verification (`options.strict`, `XOONYA_STRICT_VERIFY=1`) with the deterministic rejection codes `digest_only_not_cryptographically_verified` and `external_verification_required`
|
|
11
|
+
- adds verifier-supplied trust roots (`trusted_public_key_refs`, `expected_public_key_ref`, `expected_pq_public_key_ref`, and related lane pins) with the deterministic rejection codes `native_public_key_not_trusted` and `native_hybrid_public_key_not_trusted`, and documents that native `public_key_ref` is self-bound to the carried key while identity binding requires a trust root
|
|
12
|
+
- caches the native hybrid runtime-support probe per suite pair so sign and verify no longer regenerate classical and PQ key pairs on every call
|
|
13
|
+
- hardens `server.js`: byte-counted 1 MiB body limit with a `content-length` precheck, `OPTIONS` and `HEAD` handling, `400 invalid_path_encoding` for malformed percent-encoding, generic `500 internal_error` with server-side stack logging, request and header timeouts, `x-content-type-options: nosniff`, `cache-control: no-store` on non-GET responses, and `uncaughtException` / `unhandledRejection` handlers
|
|
14
|
+
- adds `XOONYA_ACCEPT_PRIVATE_KEY_MATERIAL`; when `false`, or unset on Render, emit, build, and proof-center run routes reject bodies carrying `/private_key/i` fields with `400 private_key_material_not_accepted` and point to local SDK/CLI signing
|
|
15
|
+
- adds `npm run verify:forgery-resistance` (key substitution with and without a trust root, strict-mode rejection of digest and structural results, hybrid PQ tampering and wrong-pin rejection, result determinism) to `verify:all`, plus strict-mode, hardening, and private-key-policy checks in `verify:service`
|
|
16
|
+
- marks the `dilithium`, `falcon`, and `sphincs-plus` registry entries as `deprecated_placeholder` aliases pointing at the implemented `ml-dsa-65` and `slh-dsa-sha2-128f` suites, and labels native identity prefixes `05`-`07` as legacy placeholders
|
|
13
17
|
- keeps `RELEASE_NOTES.md` scoped to the current release so npm and GitHub release notes stay clean
|
|
14
18
|
- keeps the canonical `https://naxytra.com/xoonya` public product URL and single naxytra website positioning intact
|
|
15
|
-
- verifies the release candidate, full package verifier, umbrella pre-deploy gates, and clean-consumer release smoke before the synchronized stability patch
|
package/SERVICE_CONTRACT.md
CHANGED
|
@@ -50,6 +50,15 @@ Primary proof-model routes:
|
|
|
50
50
|
- `GET /v1/shared-signals/summary`
|
|
51
51
|
- `GET /v1/feature-control`
|
|
52
52
|
- `GET /v1/feature-control/summary`
|
|
53
|
+
- `GET /v1/adapter-certification`
|
|
54
|
+
- `GET /v1/adapter-certification/summary`
|
|
55
|
+
- `GET /v1/adapter-certification/:front_id`
|
|
56
|
+
- `GET /v1/trust-portability-boundary`
|
|
57
|
+
- `GET /v1/trust-portability-boundary/summary`
|
|
58
|
+
- `GET /v1/trust-portability-boundary/:axis_id`
|
|
59
|
+
- `GET /v1/signed-audit-provenance`
|
|
60
|
+
- `GET /v1/signed-audit-provenance/summary`
|
|
61
|
+
- `GET /v1/signed-audit-provenance/:surface_id`
|
|
53
62
|
- `GET /v1/integrations`
|
|
54
63
|
- `GET /v1/integrations/summary`
|
|
55
64
|
- `GET /v1/integrations/snapshot`
|
|
@@ -161,6 +170,9 @@ Interop note:
|
|
|
161
170
|
- `GET /v1/artifact-distribution` exposes OCI-style artifact distribution posture for proof bundles, handoff bundles, snapshots, and release artifacts
|
|
162
171
|
- `GET /v1/shared-signals` exposes OpenID Shared Signals and CAEP-aligned review, bridge, import, and trust event exchange posture
|
|
163
172
|
- `GET /v1/feature-control` exposes OpenFeature/OFREP-aligned rollout and review portability posture around role freeze, bridge, trust, and release gates
|
|
173
|
+
- `GET /v1/adapter-certification` exposes the front-specific adapter certification contract and its machine-readable compatibility states
|
|
174
|
+
- `GET /v1/trust-portability-boundary` exposes the bounded trust portability contract for identity, delegation, delivery, and settlement-linked followthrough
|
|
175
|
+
- `GET /v1/signed-audit-provenance` exposes the signed audit and provenance surface map for selected evidence-bearing proof and release lanes
|
|
164
176
|
|
|
165
177
|
## Final-Loop Verification
|
|
166
178
|
|
package/START_HERE.md
CHANGED
|
@@ -6,6 +6,12 @@ The phase program is now complete, so this file is the right starting point for
|
|
|
6
6
|
|
|
7
7
|
The product-side implementation, proof posture, and bounded hybrid verification work for the widened `3.0.0` finish line are now complete. The remaining step is the synchronized public `3.0.0` release cut, publish, deploy, and verification sequence documented in [NAXYTRA_3_0_0_RELEASE_CONTRACT.md](C:/Users/Yoga/Desktop/workspace/vscode_workspace_naxytra/naxytra/docs/release/NAXYTRA_3_0_0_RELEASE_CONTRACT.md) and [PUBLISH_PLAN.md](C:/Users/Yoga/Desktop/workspace/vscode_workspace_naxytra/naxytra/xoonya/PUBLISH_PLAN.md).
|
|
8
8
|
|
|
9
|
+
If you are arriving from the broader public discovery layer, the canonical entry points are:
|
|
10
|
+
|
|
11
|
+
- https://www.naxytra.com/agents
|
|
12
|
+
- https://www.naxytra.com/v1/agent-discovery-index
|
|
13
|
+
- https://www.naxytra.com/.well-known/agent.json
|
|
14
|
+
|
|
9
15
|
## 1. Understand The Role
|
|
10
16
|
|
|
11
17
|
`xoonya` is the proof-side half of the public stack.
|
|
@@ -100,6 +106,9 @@ For long-term product understanding, read:
|
|
|
100
106
|
- `GET /v1/artifact-distribution`
|
|
101
107
|
- `GET /v1/shared-signals`
|
|
102
108
|
- `GET /v1/feature-control`
|
|
109
|
+
- `GET /v1/adapter-certification`
|
|
110
|
+
- `GET /v1/trust-portability-boundary`
|
|
111
|
+
- `GET /v1/signed-audit-provenance`
|
|
103
112
|
- `GET /v1/major-rails`
|
|
104
113
|
- `GET /v1/treasury`
|
|
105
114
|
- `GET /v1/erc8004`
|
|
@@ -204,7 +204,9 @@ It is not the final signed native standard by itself.
|
|
|
204
204
|
|
|
205
205
|
Implemented.
|
|
206
206
|
|
|
207
|
-
This adds a native signature envelope
|
|
207
|
+
This adds a native signature envelope whose `public_key_ref` is self-bound to the public key material carried inside the proof (`public_key_ref == sha256(SPKI DER)` of that same key), and whose signature covers the receipt signing material, event commitment, `identity_ref`, and `public_key_ref`. The format declares its signature suite instead of hardcoding one global algorithm.
|
|
208
|
+
|
|
209
|
+
The verifier checks key self-binding and the signature, not identity ownership. `identity_ref` and `agent_identity` are free strings: any key can sign a proof that claims any identity, and that proof self-verifies. Identity binding therefore requires a trust root supplied by the verifier (`trusted_public_key_refs` or `expected_public_key_ref`, see "Verification Classes, Strict Mode, And Trust Roots" below). Without a trust root the result is `cryptographically_verified: true` with `trust_root_applied: false`, which means "this key signed this receipt", not "this identity signed this receipt".
|
|
208
210
|
|
|
209
211
|
Required signed-native fields:
|
|
210
212
|
|
|
@@ -220,14 +222,19 @@ Implemented suites:
|
|
|
220
222
|
- `secp256k1`
|
|
221
223
|
- `p256`
|
|
222
224
|
|
|
223
|
-
|
|
225
|
+
Implemented PQ suites (usable only inside `xoonya-native-hybrid-v1`):
|
|
226
|
+
|
|
227
|
+
- `ml-dsa-65` (FIPS 204)
|
|
228
|
+
- `slh-dsa-sha2-128f` (FIPS 205)
|
|
224
229
|
|
|
225
|
-
|
|
226
|
-
- `dilithium`
|
|
227
|
-
- `falcon`
|
|
228
|
-
- `sphincs-plus`
|
|
230
|
+
Declared suite registry entries that never verify:
|
|
229
231
|
|
|
230
|
-
|
|
232
|
+
- `webauthn-cose` (`maturity: planned`)
|
|
233
|
+
- `dilithium` (`status: deprecated_placeholder`, `deprecated_alias_of: ml-dsa-65`)
|
|
234
|
+
- `falcon` (`status: deprecated_placeholder`, no registered successor yet)
|
|
235
|
+
- `sphincs-plus` (`status: deprecated_placeholder`, `deprecated_alias_of: slh-dsa-sha2-128f`)
|
|
236
|
+
|
|
237
|
+
The three `deprecated_placeholder` entries are legacy pre-standard names kept only so existing registry consumers keep resolving them; new material must use the ML-DSA/SLH-DSA identifiers. The atom commits to proof material; it does not validate these suites directly. Only suites with implemented validators should be described as verified.
|
|
231
238
|
|
|
232
239
|
### `xoonya-native-anchored-v1`
|
|
233
240
|
|
|
@@ -353,8 +360,44 @@ Current adversarial expectations include:
|
|
|
353
360
|
- tampered PQ signature rejects as `native_hybrid_pq_signature_invalid`
|
|
354
361
|
- key-binding mismatches reject as `native_hybrid_public_key_ref_mismatch`
|
|
355
362
|
- downgrade attempts through external assertion methods reject as `signature_method_mismatch`
|
|
363
|
+
- a valid dual signature from keys the verifier has not pinned for that `identity_ref` rejects as `native_hybrid_public_key_not_trusted` when a trust root is supplied
|
|
364
|
+
|
|
365
|
+
This keeps the boundary honest: xoonya now verifies the hybrid lane where the runtime and vectors are real, and refuses to overclaim beyond that runtime-supported registry. The runtime-support probe for each suite pair runs once per process and is cached afterwards.
|
|
366
|
+
|
|
367
|
+
## Verification Classes, Strict Mode, And Trust Roots
|
|
368
|
+
|
|
369
|
+
Every result from `verifyProofBundle(bundle, options)` and `POST /v1/proof-bundles/verify` carries four extra fields:
|
|
370
|
+
|
|
371
|
+
- `verification_class`: one of `cryptographic`, `digest`, `anchored_binding`, `structural`
|
|
372
|
+
- `cryptographically_verified`: `true` only when a native signature was actually checked and the result is valid
|
|
373
|
+
- `strict`: whether strict mode was active for that call
|
|
374
|
+
- `trust_root_applied`: whether a verifier-supplied trust root constrained the accepted keys
|
|
375
|
+
|
|
376
|
+
Classes by method:
|
|
377
|
+
|
|
378
|
+
| Class | Methods | What was checked |
|
|
379
|
+
| --- | --- | --- |
|
|
380
|
+
| `cryptographic` | `xoonya-native-signed-v1`, `xoonya-native-hybrid-v1` | key self-binding plus a real classical and/or PQ signature over the signing material |
|
|
381
|
+
| `digest` | `xoonya-native-sha256-v1`, `legacy-opreturn-v1` | an unkeyed deterministic digest; anyone can reproduce it, so it proves integrity and replayability, not authorship |
|
|
382
|
+
| `anchored_binding` | `xoonya-native-anchored-v1` | an unkeyed digest binding to declared anchor refs; anchor truth and authorship stay external |
|
|
383
|
+
| `structural` | `detached-assertion-v1`, `jwt-assertion-v1`, `did-vc-v1`, `sd-jwt-vc-v1`, `signed-envelope-v1`, `partner-proof-envelope-v1` | envelope shape, method registration, and canonical receipt binding only; the external signature must be verified by the external stack |
|
|
384
|
+
|
|
385
|
+
`valid` keeps its historical meaning by default: a well-formed digest, anchored, or structural bundle is still `valid: true`, it just also says `cryptographically_verified: false`.
|
|
386
|
+
|
|
387
|
+
Strict mode (`options.strict === true`, or `XOONYA_STRICT_VERIFY=1` in the environment) only accepts the `cryptographic` class. Deterministic rejection codes:
|
|
388
|
+
|
|
389
|
+
- `digest_only_not_cryptographically_verified` for `digest` and `anchored_binding` results
|
|
390
|
+
- `external_verification_required` for `structural` results
|
|
391
|
+
|
|
392
|
+
Trust roots pin which keys may speak for an identity. Options:
|
|
393
|
+
|
|
394
|
+
- `expected_public_key_ref`: the proof's `public_key_ref` (native signed) or classical/hybrid ref (native hybrid) must equal this value
|
|
395
|
+
- `expected_classical_public_key_ref`, `expected_pq_public_key_ref`, `expected_hybrid_public_key_ref`: lane-specific pins for hybrid proofs
|
|
396
|
+
- `trusted_public_key_refs`: object keyed by `identity_ref` (falling back to `agent_identity`). Values are a ref string, an array of ref strings, or `{ classical, pq, hybrid }` where each lane is a string or array. A string or array pins the classical lane; use the object form to pin the PQ lane of a hybrid proof.
|
|
397
|
+
|
|
398
|
+
When any trust-root option is present, `trust_root_applied` is `true` and native verification fails closed: an identity missing from the map, a lane that cannot be satisfied by the proof (for example a PQ pin against a classical-only proof), or any ref outside the pinned set rejects with `native_public_key_not_trusted` (native signed) or `native_hybrid_public_key_not_trusted` (native hybrid). These checks run after the signature check, so a trust-root rejection always means "valid signature, untrusted key". Digest, anchored, and structural methods carry no key and are unaffected by trust roots; use strict mode to reject them.
|
|
356
399
|
|
|
357
|
-
|
|
400
|
+
The `scripts/verify_forgery_resistance.js` verifier (`npm run verify:forgery-resistance`) pins this behavior, including the documented key-substitution limitation without a trust root.
|
|
358
401
|
|
|
359
402
|
## Crypto And Identity Support Boundary
|
|
360
403
|
|
|
@@ -368,7 +411,7 @@ Cleanly supported above the atom:
|
|
|
368
411
|
- DID and DIDComm identity references
|
|
369
412
|
- JWT/JWS and signed envelope assertions
|
|
370
413
|
- DID/VC and SD-JWT VC evidence references
|
|
371
|
-
-
|
|
414
|
+
- ML-DSA (FIPS 204), SLH-DSA (FIPS 205), and future PQ signature public-key material; the legacy `dilithium`, `falcon`, and `sphincs-plus` registry names are deprecated placeholders that never verify
|
|
372
415
|
- HPKE, TLS, AES-GCM, or encrypted payload commitments
|
|
373
416
|
- ZK proof, circuit, verifier-key, and public-input commitments
|
|
374
417
|
|
package/index.js
CHANGED
|
@@ -5,9 +5,18 @@ module.exports = {
|
|
|
5
5
|
...require("./integrations/registry"),
|
|
6
6
|
...require("./lib/verification_service_pack"),
|
|
7
7
|
...require("./lib/trust_portability_pack"),
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
...require("./lib/proof_truth_contract"),
|
|
9
|
+
...require("./lib/operational_receipt_contract"),
|
|
10
|
+
...require("./lib/machine_identity_registry_contract"),
|
|
11
|
+
...require("./lib/crypto_agility_matrix"),
|
|
12
|
+
...require("./lib/authority_binding_lifecycle_contract"),
|
|
13
|
+
...require("./lib/public_surface_policy_contract"),
|
|
14
|
+
...require("./lib/offline_verifiability_recovery_contract"),
|
|
15
|
+
...require("./lib/adapter_certification_contract"),
|
|
16
|
+
...require("./lib/trust_portability_boundary_contract"),
|
|
17
|
+
...require("./lib/signed_audit_provenance_contract"),
|
|
18
|
+
...require("./lib/default_path_contract"),
|
|
19
|
+
...require("./lib/followthrough_truth_contract"),
|
|
11
20
|
...require("./lib/governance_disputes_summary"),
|
|
12
21
|
...require("./lib/release_pack"),
|
|
13
22
|
...require("./lib/release_manifest"),
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const packageJson = require("../package.json");
|
|
4
|
+
|
|
5
|
+
function buildAdapterCertificationContractPack() {
|
|
6
|
+
return {
|
|
7
|
+
ok: true,
|
|
8
|
+
product: packageJson.name,
|
|
9
|
+
category: "naxytra-adapter-certification-contract",
|
|
10
|
+
pack_version: "naxytra-adapter-certification-contract-v1",
|
|
11
|
+
doctrine: "xoonya_certifies_adapter_compatibility_for_proof_and_review_surfaces_without_leaking_proof_core_semantics",
|
|
12
|
+
model_state: "core_now",
|
|
13
|
+
core_claim: "adapter certification is the machine-readable gate for manifest, capability, health, idempotency, failure, proof, and front-specific compatibility claims",
|
|
14
|
+
certification_states: [
|
|
15
|
+
{ state: "pass", description: "the adapter satisfies the declared front contract without material constraints" },
|
|
16
|
+
{ state: "pass_with_constraints", description: "the adapter is usable but only within declared constraints" },
|
|
17
|
+
{ state: "needs_retest", description: "the adapter needs a fresh run against updated vectors or interface versions" },
|
|
18
|
+
{ state: "blocked", description: "the adapter cannot be certified until a required dependency or vector exists" },
|
|
19
|
+
{ state: "fail", description: "the adapter does not satisfy the declared front contract" }
|
|
20
|
+
],
|
|
21
|
+
certification_fronts: [
|
|
22
|
+
{ front_id: "protocol_front", required_tests: ["protocol negotiation", "surface discovery", "normalized request translation"], required_evidence: ["manifest", "protocol compatibility result", "failure mapping result"], claim_boundary: "only_claim_listed_protocol_front_compatibility" },
|
|
23
|
+
{ front_id: "execution_front", required_tests: ["task dispatch", "idempotency", "execution result normalization"], required_evidence: ["manifest", "task vector results", "proof-compatible output facts"], claim_boundary: "only_claim_listed_execution_front_compatibility" },
|
|
24
|
+
{ front_id: "payment_front", required_tests: ["quote to pay compatibility", "payment admission", "reversal or refund posture"], required_evidence: ["payment state result", "receipt compatibility result", "failure mapping result"], claim_boundary: "only_claim_listed_payment_front_compatibility" },
|
|
25
|
+
{ front_id: "settlement_front", required_tests: ["settlement target translation", "finality reference capture", "batch or direct settlement posture"], required_evidence: ["settlement reference", "finality state", "reconciliation evidence"], claim_boundary: "only_claim_listed_settlement_front_compatibility" },
|
|
26
|
+
{ front_id: "identity_trust_front", required_tests: ["identity schema compatibility", "registry linkage", "attestation or trust-state roundtrip"], required_evidence: ["identity record", "registry proof", "trust-state result"], claim_boundary: "only_claim_listed_identity_trust_front_compatibility" },
|
|
27
|
+
{ front_id: "proof_front", required_tests: ["receipt compatibility", "proof import or export compatibility", "verification hook compatibility"], required_evidence: ["proof contract result", "receipt result", "verification evidence"], claim_boundary: "only_claim_listed_proof_front_compatibility" },
|
|
28
|
+
{ front_id: "treasury_front", required_tests: ["destination routing", "balance model compatibility", "payout landing compatibility"], required_evidence: ["treasury route result", "account abstraction result", "operator review note"], claim_boundary: "only_claim_listed_treasury_front_compatibility" },
|
|
29
|
+
{ front_id: "operator_front", required_tests: ["review surface visibility", "promotion posture", "reporting export compatibility"], required_evidence: ["review summary", "promotion readiness result", "operator export"], claim_boundary: "only_claim_listed_operator_front_compatibility" }
|
|
30
|
+
],
|
|
31
|
+
harness_requirements: {
|
|
32
|
+
test_categories: [
|
|
33
|
+
"manifest_validity",
|
|
34
|
+
"interface_conformance",
|
|
35
|
+
"capability_declaration",
|
|
36
|
+
"health_reporting",
|
|
37
|
+
"failure_mapping",
|
|
38
|
+
"idempotency_behavior",
|
|
39
|
+
"proof_compatibility",
|
|
40
|
+
"front_specific_lifecycle_compatibility"
|
|
41
|
+
],
|
|
42
|
+
required_result_fields: [
|
|
43
|
+
"certification_state",
|
|
44
|
+
"interface_version",
|
|
45
|
+
"tested_fronts",
|
|
46
|
+
"tested_capabilities",
|
|
47
|
+
"failed_cases",
|
|
48
|
+
"warnings",
|
|
49
|
+
"evidence_refs"
|
|
50
|
+
]
|
|
51
|
+
},
|
|
52
|
+
linked_surfaces: {
|
|
53
|
+
proof_bridge_ref: "/v1/proof-bridge",
|
|
54
|
+
verification_services_ref: "/v1/proof-center/verification-services",
|
|
55
|
+
submission_bundle_review_ref: "/v1/proof-center/result-package-handoff/review/summary",
|
|
56
|
+
trust_portability_ref: "/v1/proof-center/trust-portability/summary",
|
|
57
|
+
integration_matrix_ref: "/v1/integration-matrix",
|
|
58
|
+
provenance_ref: "/v1/provenance"
|
|
59
|
+
},
|
|
60
|
+
claim_boundary: "claim_adapter_certification_as_front_specific_compatibility_and_review_gate_without_claiming_vendor_default_or_proof_core_truth"
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function summarizeAdapterCertificationContractPack() {
|
|
65
|
+
const pack = buildAdapterCertificationContractPack();
|
|
66
|
+
return {
|
|
67
|
+
ok: true,
|
|
68
|
+
product: pack.product,
|
|
69
|
+
category: pack.category,
|
|
70
|
+
summary_version: "naxytra-adapter-certification-contract-summary-v1",
|
|
71
|
+
pack_version: pack.pack_version,
|
|
72
|
+
model_state: pack.model_state,
|
|
73
|
+
certification_state_count: pack.certification_states.length,
|
|
74
|
+
certification_front_count: pack.certification_fronts.length,
|
|
75
|
+
required_test_category_count: pack.harness_requirements.test_categories.length,
|
|
76
|
+
linked_surfaces: pack.linked_surfaces
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function getAdapterCertificationFrontDetail(frontId) {
|
|
81
|
+
const normalized = String(frontId || "").trim().toLowerCase();
|
|
82
|
+
return (buildAdapterCertificationContractPack().certification_fronts || []).find((entry) => entry.front_id === normalized) || null;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
module.exports = {
|
|
86
|
+
buildAdapterCertificationContractPack,
|
|
87
|
+
summarizeAdapterCertificationContractPack,
|
|
88
|
+
getAdapterCertificationFrontDetail
|
|
89
|
+
};
|
|
90
|
+
|