xoonya 2.6.0 → 2.8.0

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.
Files changed (36) hide show
  1. package/CROSS_RUNTIME_POSTURE.md +32 -2
  2. package/README.md +14 -1
  3. package/RELEASE_NOTES.md +25 -0
  4. package/SERVICE_CONTRACT.md +4 -0
  5. package/XNYA_CONFORMANCE_MARK.md +78 -0
  6. package/XNYA_REFERENCE_IMPLEMENTATIONS.md +157 -0
  7. package/XOONYA_NATIVE_PROOF_FORMAT.md +2 -0
  8. package/XOONYA_NATIVE_STANDARD_GOVERNANCE.md +4 -1
  9. package/bin/xoonya-release.js +19 -1
  10. package/bin/xoonya.js +1 -0
  11. package/lib/release_history.js +27 -0
  12. package/package.json +12 -2
  13. package/proof_sdk.js +605 -2
  14. package/reference/python/README.md +35 -0
  15. package/reference/python/requirements-optional.txt +1 -0
  16. package/reference/python/verify_vectors.py +209 -0
  17. package/reference/python/xnya_reference.py +810 -0
  18. package/reference/rust/Cargo.toml +11 -0
  19. package/reference/rust/README.md +28 -0
  20. package/reference/rust/src/lib.rs +87 -0
  21. package/scripts/registry_cli.js +157 -0
  22. package/scripts/verify_all.js +593 -0
  23. package/scripts/verify_examples.js +19 -0
  24. package/scripts/verify_external_proof_import_gate.js +84 -0
  25. package/scripts/verify_integrations.js +170 -0
  26. package/scripts/verify_native_hybrid_design_gate.js +108 -0
  27. package/scripts/verify_reference_promotion_gate.js +74 -0
  28. package/scripts/verify_reference_python.js +49 -0
  29. package/scripts/verify_reference_python_crypto.js +87 -0
  30. package/scripts/verify_reference_rust_scaffold.js +50 -0
  31. package/scripts/verify_release_candidate.js +106 -0
  32. package/scripts/verify_service.js +2849 -0
  33. package/scripts/verify_tooling.js +1251 -0
  34. package/scripts/verify_vectors.js +164 -0
  35. package/server.js +20 -0
  36. package/vectors/adversarial-vectors.json +27 -0
@@ -0,0 +1,164 @@
1
+ "use strict";
2
+
3
+ const assert = require("assert");
4
+ const fs = require("fs");
5
+ const path = require("path");
6
+ const sdk = require("..");
7
+
8
+ const conformanceVectors = JSON.parse(
9
+ fs.readFileSync(path.resolve(__dirname, "..", "vectors", "conformance-vectors.json"), "utf8")
10
+ );
11
+ const adversarialVectors = JSON.parse(
12
+ fs.readFileSync(path.resolve(__dirname, "..", "vectors", "adversarial-vectors.json"), "utf8")
13
+ );
14
+ const nativeAtomVectors = JSON.parse(
15
+ fs.readFileSync(path.resolve(__dirname, "..", "vectors", "native-atom-vectors.json"), "utf8")
16
+ );
17
+
18
+ function unique(values) {
19
+ return Array.from(new Set(values.filter(Boolean))).sort();
20
+ }
21
+
22
+ function runVectorVerification() {
23
+ assert.strictEqual(conformanceVectors.version, "proof-conformance-v1", "conformance vector version mismatch");
24
+ assert.strictEqual(adversarialVectors.version, "proof-adversarial-v1", "adversarial vector version mismatch");
25
+ assert.strictEqual(nativeAtomVectors.version, "xoonya-native-atom-vectors-v1", "native atom vector version mismatch");
26
+
27
+ const conformanceResults = [];
28
+ for (const vector of conformanceVectors.vectors) {
29
+ const eventCommitment = sdk.hashEvent(vector.event);
30
+ assert.strictEqual(eventCommitment, vector.expected.event_commitment, `${vector.id} event commitment mismatch`);
31
+
32
+ const receipt = sdk.emitReceipt(vector.event, vector.receipt_options || {});
33
+ assert.deepStrictEqual(receipt, vector.expected.receipt, `${vector.id} receipt mismatch`);
34
+
35
+ const bundle = sdk.buildProofBundle({
36
+ ceb: vector.event,
37
+ receipt,
38
+ anchors: Array.isArray(vector.anchors) ? vector.anchors : undefined
39
+ });
40
+ assert.strictEqual(bundle.version, vector.expected.proof_bundle_version, `${vector.id} proof bundle version mismatch`);
41
+ const verification = sdk.verifyProofBundle(bundle);
42
+ assert.strictEqual(verification.valid, true, `${vector.id} proof bundle should verify`);
43
+ conformanceResults.push({
44
+ id: vector.id,
45
+ verification_method: verification.verification_method,
46
+ verification_state: verification.verification_state
47
+ });
48
+ }
49
+
50
+ const adversarialResults = [];
51
+ for (const vector of adversarialVectors.vectors) {
52
+ if (vector.kind === "canonicalize_event_error") {
53
+ assert.throws(
54
+ () => sdk.canonicalizeEvent(vector.event),
55
+ (error) => error && error.message === vector.expected_reason,
56
+ `${vector.id} should throw expected reason`
57
+ );
58
+ adversarialResults.push({
59
+ id: vector.id,
60
+ kind: vector.kind,
61
+ reason: vector.expected_reason
62
+ });
63
+ continue;
64
+ }
65
+ if (vector.kind === "verify_bundle_reason") {
66
+ const result = sdk.verifyProofBundle(vector.bundle);
67
+ assert.strictEqual(result.valid, false, `${vector.id} should fail`);
68
+ assert.strictEqual(result.reason, vector.expected_reason, `${vector.id} failure reason mismatch`);
69
+ adversarialResults.push({
70
+ id: vector.id,
71
+ kind: vector.kind,
72
+ reason: result.reason
73
+ });
74
+ continue;
75
+ }
76
+ throw new Error(`${vector.id} has unsupported vector kind`);
77
+ }
78
+
79
+ const nativeAtomResults = [];
80
+ const nativeAtomPayload = Buffer.from(nativeAtomVectors.payload_ascii, "utf8");
81
+ for (const vector of nativeAtomVectors.vectors) {
82
+ const parsed = sdk.parseXoonyaNativeAtom(vector.atom_hex);
83
+ assert.strictEqual(parsed.atom_version, vector.atom_version, `${vector.id} atom version mismatch`);
84
+ assert.strictEqual(parsed.byte_length, vector.byte_length, `${vector.id} byte length mismatch`);
85
+ assert.strictEqual(parsed.agent_id, vector.agent_id, `${vector.id} agent id mismatch`);
86
+ assert.strictEqual(parsed.payload_hash_sha256, vector.payload_hash_sha256, `${vector.id} payload hash mismatch`);
87
+ const hasPayload = vector.payload_hash_sha256 !== "00".repeat(32);
88
+ const verification = sdk.verifyXoonyaNativeAtom(vector.atom_hex, {
89
+ identity_material_hex: nativeAtomVectors.identity_material_hex,
90
+ ...(hasPayload ? { payload_bytes: nativeAtomPayload } : {})
91
+ });
92
+ assert.strictEqual(verification.valid, true, `${vector.id} should verify`);
93
+ assert.strictEqual(verification.error_code, null, `${vector.id} should not have error code`);
94
+ nativeAtomResults.push({
95
+ id: vector.id,
96
+ atom_version: vector.atom_version,
97
+ byte_length: vector.byte_length
98
+ });
99
+ }
100
+
101
+ const nativeAtomAdversarialResults = [];
102
+ for (const vector of nativeAtomVectors.adversarial) {
103
+ const verification = sdk.verifyXoonyaNativeAtom(vector.atom_hex, {
104
+ identity_material_hex: vector.identity_material_hex || nativeAtomVectors.identity_material_hex,
105
+ ...(vector.payload_ascii ? { payload_bytes: Buffer.from(vector.payload_ascii, "utf8") } : {})
106
+ });
107
+ assert.strictEqual(verification.valid, false, `${vector.id} should fail`);
108
+ assert.strictEqual(verification.reason, vector.expected_reason, `${vector.id} failure reason mismatch`);
109
+ assert.strictEqual(verification.error_code, vector.expected_error_code, `${vector.id} error code mismatch`);
110
+ nativeAtomAdversarialResults.push({
111
+ id: vector.id,
112
+ reason: verification.reason,
113
+ error_code: verification.error_code
114
+ });
115
+ }
116
+
117
+ return {
118
+ ok: true,
119
+ product: "xoonya",
120
+ suite: "proof-conformance-and-adversarial-vectors",
121
+ conformance_version: conformanceVectors.version,
122
+ adversarial_version: adversarialVectors.version,
123
+ conformance_count: conformanceResults.length,
124
+ adversarial_count: adversarialResults.length,
125
+ native_atom_vector_count: nativeAtomResults.length,
126
+ native_atom_adversarial_count: nativeAtomAdversarialResults.length,
127
+ verification_methods: unique(conformanceResults.map((result) => result.verification_method)),
128
+ adversarial_reasons: unique(adversarialResults.map((result) => result.reason)),
129
+ native_atom_error_codes: unique(nativeAtomAdversarialResults.map((result) => result.error_code)),
130
+ conformance_results: conformanceResults,
131
+ adversarial_results: adversarialResults,
132
+ native_atom_results: nativeAtomResults,
133
+ native_atom_adversarial_results: nativeAtomAdversarialResults
134
+ };
135
+ }
136
+
137
+ function main() {
138
+ const json = process.argv.includes("--json");
139
+ const summary = runVectorVerification();
140
+ if (json) {
141
+ process.stdout.write(`${JSON.stringify(summary, null, 2)}\n`);
142
+ return;
143
+ }
144
+ process.stdout.write(
145
+ [
146
+ "xoonya verify:vectors passed",
147
+ `conformance vectors: ${summary.conformance_count}`,
148
+ `adversarial vectors: ${summary.adversarial_count}`,
149
+ `native atom vectors: ${summary.native_atom_vector_count}`,
150
+ `native atom adversarial vectors: ${summary.native_atom_adversarial_count}`,
151
+ `verification methods: ${summary.verification_methods.join(", ")}`,
152
+ `adversarial reasons: ${summary.adversarial_reasons.join(", ")}`,
153
+ `native atom error codes: ${summary.native_atom_error_codes.join(", ")}`
154
+ ].join("\n") + "\n"
155
+ );
156
+ }
157
+
158
+ if (require.main === module) {
159
+ main();
160
+ }
161
+
162
+ module.exports = {
163
+ runVectorVerification
164
+ };
package/server.js CHANGED
@@ -2386,6 +2386,26 @@ async function routeRequest(req, res) {
2386
2386
  return;
2387
2387
  }
2388
2388
 
2389
+ if (req.method === 'GET' && url.pathname === '/v1/proof-center/native-conformance-mark') {
2390
+ sendJson(res, 200, proofSdk.buildXoonyaNativeConformanceMarkPack());
2391
+ return;
2392
+ }
2393
+
2394
+ if (req.method === 'GET' && url.pathname === '/v1/proof-center/native-conformance-mark/summary') {
2395
+ sendJson(res, 200, proofSdk.summarizeXoonyaNativeConformanceMarkPack());
2396
+ return;
2397
+ }
2398
+
2399
+ if (req.method === 'GET' && url.pathname === '/v1/proof-center/native-reference-implementations') {
2400
+ sendJson(res, 200, proofSdk.buildXoonyaNativeReferenceImplementationPack());
2401
+ return;
2402
+ }
2403
+
2404
+ if (req.method === 'GET' && url.pathname === '/v1/proof-center/native-reference-implementations/summary') {
2405
+ sendJson(res, 200, proofSdk.summarizeXoonyaNativeReferenceImplementationPack());
2406
+ return;
2407
+ }
2408
+
2389
2409
  if (req.method === 'GET' && url.pathname === '/v1/proof-center/native-payload-profile') {
2390
2410
  sendJson(res, 200, proofSdk.buildXoonyaNativePayloadProfilePack());
2391
2411
  return;
@@ -159,6 +159,33 @@
159
159
  },
160
160
  "expected_reason": "verification_method_unsupported"
161
161
  },
162
+ {
163
+ "id": "reject-native-hybrid-design-gated",
164
+ "kind": "verify_bundle_reason",
165
+ "bundle": {
166
+ "version": "proof-bundle/v1",
167
+ "ceb": {
168
+ "version": "canonical-event-bundle/v1",
169
+ "domain_id": "vectors.native",
170
+ "sequence": "7",
171
+ "actor_id": "agent-native",
172
+ "adapter_source": "vector-suite",
173
+ "event_type": "native.event",
174
+ "event_hash": "3434343434343434343434343434343434343434343434343434343434343434"
175
+ },
176
+ "receipt": {
177
+ "version": "receipt/v1",
178
+ "receipt_id": "7c4930d56110f0b9623f79025c7be4789e0c0a6155b2645b243ce4c126f53e96",
179
+ "agent_identity": "agent-native-signing",
180
+ "domain_id": "vectors.native",
181
+ "sequence": "7",
182
+ "event_commitment": "7361278f20b4d6c6f305ebfb490989b0faa3928823954d1852a7d7e78d92d8cd",
183
+ "algorithm": "xoonya-native-hybrid-v1",
184
+ "signature": "xoonya-native-hybrid-v1:design-gated-placeholder"
185
+ }
186
+ },
187
+ "expected_reason": "native_hybrid_design_gated"
188
+ },
162
189
  {
163
190
  "id": "reject-replayed-receipt-sequence",
164
191
  "kind": "verify_bundle_reason",