@noeos/verification-engine 0.0.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 (184) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/LICENSE +201 -0
  3. package/NOTICE +11 -0
  4. package/README.md +7 -0
  5. package/dist/cjs/api/engine.js +271 -0
  6. package/dist/cjs/api/types.js +10 -0
  7. package/dist/cjs/chains/chain-builder.js +541 -0
  8. package/dist/cjs/chains/duplicate-detector.js +208 -0
  9. package/dist/cjs/chains/verify-chain.js +656 -0
  10. package/dist/cjs/contracts/generated.js +512 -0
  11. package/dist/cjs/contracts/schema-assets.js +6 -0
  12. package/dist/cjs/contracts/vector-assets.js +6 -0
  13. package/dist/cjs/domain/algorithm-id.js +5 -0
  14. package/dist/cjs/domain/byte-view.js +7 -0
  15. package/dist/cjs/domain/chain.js +3 -0
  16. package/dist/cjs/domain/diagnostic.js +6 -0
  17. package/dist/cjs/domain/digest.js +37 -0
  18. package/dist/cjs/domain/duplicate-policy.js +3 -0
  19. package/dist/cjs/domain/evidence.js +10 -0
  20. package/dist/cjs/domain/identifiers.js +52 -0
  21. package/dist/cjs/domain/json-value.js +3 -0
  22. package/dist/cjs/domain/limits.js +24 -0
  23. package/dist/cjs/domain/operation-result.js +19 -0
  24. package/dist/cjs/domain/position.js +16 -0
  25. package/dist/cjs/domain/protocol-version.js +5 -0
  26. package/dist/cjs/domain/rule.js +3 -0
  27. package/dist/cjs/domain/stream.js +3 -0
  28. package/dist/cjs/domain/version.js +16 -0
  29. package/dist/cjs/evidence/digest-evidence.js +22 -0
  30. package/dist/cjs/evidence/evidence-parser.js +288 -0
  31. package/dist/cjs/framing/frame-builders.js +124 -0
  32. package/dist/cjs/framing/frame-encoder.js +238 -0
  33. package/dist/cjs/framing/frame-parser.js +173 -0
  34. package/dist/cjs/framing/frame-types.js +3 -0
  35. package/dist/cjs/hashing/hash-adapter.js +90 -0
  36. package/dist/cjs/hashing/hash-frame.js +16 -0
  37. package/dist/cjs/index.js +16 -0
  38. package/dist/cjs/normalization/byte-sink.js +70 -0
  39. package/dist/cjs/normalization/jcs-profile.js +154 -0
  40. package/dist/cjs/normalization/normalize.js +56 -0
  41. package/dist/cjs/normalization/profile-registry.js +66 -0
  42. package/dist/cjs/normalization/profile.js +3 -0
  43. package/dist/cjs/normalization/raw-bytes-profile.js +27 -0
  44. package/dist/cjs/package.json +3 -0
  45. package/dist/cjs/profiles.js +9 -0
  46. package/dist/cjs/records/record-service.js +278 -0
  47. package/dist/cjs/rules/rule-set.js +211 -0
  48. package/dist/cjs/schemas.js +6 -0
  49. package/dist/cjs/validation/algorithm-validation.js +12 -0
  50. package/dist/cjs/validation/diagnostic-collector.js +159 -0
  51. package/dist/cjs/validation/digest-validation.js +48 -0
  52. package/dist/cjs/validation/identifier-validation.js +33 -0
  53. package/dist/cjs/validation/json-text-parser.js +297 -0
  54. package/dist/cjs/validation/json-value-validation.js +155 -0
  55. package/dist/cjs/validation/limit-validation.js +75 -0
  56. package/dist/cjs/validation/object-inspection.js +60 -0
  57. package/dist/cjs/validation/position-validation.js +13 -0
  58. package/dist/cjs/validation/result-helpers.js +9 -0
  59. package/dist/cjs/validation/utf8-validation.js +69 -0
  60. package/dist/cjs/validation/version-validation.js +31 -0
  61. package/dist/cjs/vectors.js +6 -0
  62. package/dist/esm/api/engine.js +266 -0
  63. package/dist/esm/api/types.js +4 -0
  64. package/dist/esm/chains/chain-builder.js +536 -0
  65. package/dist/esm/chains/duplicate-detector.js +204 -0
  66. package/dist/esm/chains/verify-chain.js +652 -0
  67. package/dist/esm/contracts/generated.js +509 -0
  68. package/dist/esm/contracts/schema-assets.js +2 -0
  69. package/dist/esm/contracts/vector-assets.js +2 -0
  70. package/dist/esm/domain/algorithm-id.js +2 -0
  71. package/dist/esm/domain/byte-view.js +4 -0
  72. package/dist/esm/domain/chain.js +2 -0
  73. package/dist/esm/domain/diagnostic.js +3 -0
  74. package/dist/esm/domain/digest.js +32 -0
  75. package/dist/esm/domain/duplicate-policy.js +2 -0
  76. package/dist/esm/domain/evidence.js +7 -0
  77. package/dist/esm/domain/identifiers.js +45 -0
  78. package/dist/esm/domain/json-value.js +2 -0
  79. package/dist/esm/domain/limits.js +21 -0
  80. package/dist/esm/domain/operation-result.js +15 -0
  81. package/dist/esm/domain/position.js +12 -0
  82. package/dist/esm/domain/protocol-version.js +2 -0
  83. package/dist/esm/domain/rule.js +2 -0
  84. package/dist/esm/domain/stream.js +2 -0
  85. package/dist/esm/domain/version.js +12 -0
  86. package/dist/esm/evidence/digest-evidence.js +19 -0
  87. package/dist/esm/evidence/evidence-parser.js +281 -0
  88. package/dist/esm/framing/frame-builders.js +114 -0
  89. package/dist/esm/framing/frame-encoder.js +234 -0
  90. package/dist/esm/framing/frame-parser.js +170 -0
  91. package/dist/esm/framing/frame-types.js +2 -0
  92. package/dist/esm/hashing/hash-adapter.js +84 -0
  93. package/dist/esm/hashing/hash-frame.js +12 -0
  94. package/dist/esm/index.js +5 -0
  95. package/dist/esm/normalization/byte-sink.js +66 -0
  96. package/dist/esm/normalization/jcs-profile.js +151 -0
  97. package/dist/esm/normalization/normalize.js +52 -0
  98. package/dist/esm/normalization/profile-registry.js +62 -0
  99. package/dist/esm/normalization/profile.js +2 -0
  100. package/dist/esm/normalization/raw-bytes-profile.js +24 -0
  101. package/dist/esm/profiles.js +6 -0
  102. package/dist/esm/records/record-service.js +270 -0
  103. package/dist/esm/rules/rule-set.js +206 -0
  104. package/dist/esm/schemas.js +2 -0
  105. package/dist/esm/validation/algorithm-validation.js +9 -0
  106. package/dist/esm/validation/diagnostic-collector.js +154 -0
  107. package/dist/esm/validation/digest-validation.js +43 -0
  108. package/dist/esm/validation/identifier-validation.js +27 -0
  109. package/dist/esm/validation/json-text-parser.js +294 -0
  110. package/dist/esm/validation/json-value-validation.js +152 -0
  111. package/dist/esm/validation/limit-validation.js +71 -0
  112. package/dist/esm/validation/object-inspection.js +54 -0
  113. package/dist/esm/validation/position-validation.js +10 -0
  114. package/dist/esm/validation/result-helpers.js +6 -0
  115. package/dist/esm/validation/utf8-validation.js +63 -0
  116. package/dist/esm/validation/version-validation.js +26 -0
  117. package/dist/esm/vectors.js +2 -0
  118. package/dist/types/api/engine.d.ts +8 -0
  119. package/dist/types/api/types.d.ts +124 -0
  120. package/dist/types/chains/chain-builder.d.ts +42 -0
  121. package/dist/types/chains/duplicate-detector.d.ts +18 -0
  122. package/dist/types/chains/verify-chain.d.ts +9 -0
  123. package/dist/types/contracts/generated.d.ts +442 -0
  124. package/dist/types/contracts/schema-assets.d.ts +2 -0
  125. package/dist/types/contracts/vector-assets.d.ts +2 -0
  126. package/dist/types/domain/algorithm-id.d.ts +4 -0
  127. package/dist/types/domain/byte-view.d.ts +1 -0
  128. package/dist/types/domain/chain.d.ts +43 -0
  129. package/dist/types/domain/diagnostic.d.ts +23 -0
  130. package/dist/types/domain/digest.d.ts +12 -0
  131. package/dist/types/domain/duplicate-policy.d.ts +26 -0
  132. package/dist/types/domain/evidence.d.ts +100 -0
  133. package/dist/types/domain/identifiers.d.ts +29 -0
  134. package/dist/types/domain/json-value.d.ts +6 -0
  135. package/dist/types/domain/limits.d.ts +13 -0
  136. package/dist/types/domain/operation-result.d.ts +12 -0
  137. package/dist/types/domain/position.d.ts +8 -0
  138. package/dist/types/domain/protocol-version.d.ts +2 -0
  139. package/dist/types/domain/rule.d.ts +34 -0
  140. package/dist/types/domain/stream.d.ts +5 -0
  141. package/dist/types/domain/version.d.ts +8 -0
  142. package/dist/types/evidence/digest-evidence.d.ts +4 -0
  143. package/dist/types/evidence/evidence-parser.d.ts +8 -0
  144. package/dist/types/framing/frame-builders.d.ts +40 -0
  145. package/dist/types/framing/frame-encoder.d.ts +6 -0
  146. package/dist/types/framing/frame-parser.d.ts +4 -0
  147. package/dist/types/framing/frame-types.d.ts +27 -0
  148. package/dist/types/hashing/hash-adapter.d.ts +12 -0
  149. package/dist/types/hashing/hash-frame.d.ts +6 -0
  150. package/dist/types/index.d.ts +8 -0
  151. package/dist/types/normalization/byte-sink.d.ts +19 -0
  152. package/dist/types/normalization/jcs-profile.d.ts +3 -0
  153. package/dist/types/normalization/normalize.d.ts +11 -0
  154. package/dist/types/normalization/profile-registry.d.ts +26 -0
  155. package/dist/types/normalization/profile.d.ts +22 -0
  156. package/dist/types/normalization/raw-bytes-profile.d.ts +2 -0
  157. package/dist/types/profiles.d.ts +8 -0
  158. package/dist/types/records/record-service.d.ts +38 -0
  159. package/dist/types/rules/rule-set.d.ts +13 -0
  160. package/dist/types/schemas.d.ts +2 -0
  161. package/dist/types/validation/algorithm-validation.d.ts +3 -0
  162. package/dist/types/validation/diagnostic-collector.d.ts +24 -0
  163. package/dist/types/validation/digest-validation.d.ts +6 -0
  164. package/dist/types/validation/identifier-validation.d.ts +6 -0
  165. package/dist/types/validation/json-text-parser.d.ts +4 -0
  166. package/dist/types/validation/json-value-validation.d.ts +4 -0
  167. package/dist/types/validation/limit-validation.d.ts +4 -0
  168. package/dist/types/validation/object-inspection.d.ts +11 -0
  169. package/dist/types/validation/position-validation.d.ts +3 -0
  170. package/dist/types/validation/result-helpers.d.ts +3 -0
  171. package/dist/types/validation/utf8-validation.d.ts +5 -0
  172. package/dist/types/validation/version-validation.d.ts +9 -0
  173. package/dist/types/vectors.d.ts +2 -0
  174. package/package.json +61 -0
  175. package/schemas/chain-summary.v1.schema.json +156 -0
  176. package/schemas/diagnostic.v1.schema.json +107 -0
  177. package/schemas/link-evidence.v1.schema.json +165 -0
  178. package/schemas/record-evidence.v1.schema.json +91 -0
  179. package/schemas/vector-set.v1.schema.json +52 -0
  180. package/vectors/evidence.json +26 -0
  181. package/vectors/framing.json +136 -0
  182. package/vectors/hashing.json +58 -0
  183. package/vectors/invalid.json +56 -0
  184. package/vectors/manifest.json +46 -0
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.jcsProfile = void 0;
5
+ const identifiers_js_1 = require("../domain/identifiers.js");
6
+ const version_js_1 = require("../domain/version.js");
7
+ const operation_result_js_1 = require("../domain/operation-result.js");
8
+ const json_value_validation_js_1 = require("../validation/json-value-validation.js");
9
+ const byte_sink_js_1 = require("./byte-sink.js");
10
+ const JCS_PROFILE_ID = identifiers_js_1.ProfileId.fromValidated("dev.noeos.jcs");
11
+ const JCS_PROFILE_VERSION = version_js_1.ProfileVersion.fromValidated("1.0.0");
12
+ const EMPTY = "";
13
+ exports.jcsProfile = Object.freeze({
14
+ id: JCS_PROFILE_ID,
15
+ version: JCS_PROFILE_VERSION,
16
+ inputKind: "json",
17
+ validate(input, limits) {
18
+ return (0, json_value_validation_js_1.validateJsonValue)(input, limits);
19
+ },
20
+ normalize(input, sink) {
21
+ writeValue(input, sink);
22
+ return (0, operation_result_js_1.success)(Object.freeze({ byteLength: sink.byteLength }));
23
+ },
24
+ });
25
+ function writeValue(value, sink) {
26
+ if (value === null) {
27
+ writeAscii("null", sink);
28
+ return;
29
+ }
30
+ if (typeof value === "boolean") {
31
+ writeAscii(value ? "true" : "false", sink);
32
+ return;
33
+ }
34
+ if (typeof value === "number") {
35
+ writeText(numberToJcs(value), sink);
36
+ return;
37
+ }
38
+ if (typeof value === "string") {
39
+ writeJsonString(value, sink);
40
+ return;
41
+ }
42
+ if (isJsonArray(value)) {
43
+ writeArray(value, sink);
44
+ return;
45
+ }
46
+ writeObject(value, sink);
47
+ }
48
+ function isJsonArray(value) {
49
+ return Array.isArray(value);
50
+ }
51
+ function writeArray(value, sink) {
52
+ writeAscii("[", sink);
53
+ for (let index = 0; index < value.length; index += 1) {
54
+ if (index > 0)
55
+ writeAscii(",", sink);
56
+ const item = value[index];
57
+ if (item === undefined)
58
+ throw new TypeError("invalid JSON array");
59
+ writeValue(item, sink);
60
+ }
61
+ writeAscii("]", sink);
62
+ }
63
+ function writeObject(value, sink) {
64
+ const keys = Object.keys(value).sort(compareUtf16);
65
+ writeAscii("{", sink);
66
+ let first = true;
67
+ for (const key of keys) {
68
+ if (!first)
69
+ writeAscii(",", sink);
70
+ first = false;
71
+ const item = value[key];
72
+ if (item === undefined)
73
+ throw new TypeError("invalid JSON object");
74
+ writeJsonString(key, sink);
75
+ writeAscii(":", sink);
76
+ writeValue(item, sink);
77
+ }
78
+ writeAscii("}", sink);
79
+ }
80
+ function writeJsonString(value, sink) {
81
+ let escaped = false;
82
+ for (let index = 0; index < value.length; index += 1) {
83
+ const codeUnit = value.charCodeAt(index);
84
+ if (codeUnit <= 0x1f || codeUnit === 0x22 || codeUnit === 0x5c) {
85
+ escaped = true;
86
+ break;
87
+ }
88
+ }
89
+ if (!escaped) {
90
+ writeAscii('"', sink);
91
+ writeText(value, sink);
92
+ writeAscii('"', sink);
93
+ return;
94
+ }
95
+ writeText(stringToJcs(value), sink);
96
+ }
97
+ function stringToJcs(value) {
98
+ let output = '"';
99
+ for (let index = 0; index < value.length; index += 1) {
100
+ const codeUnit = value.charCodeAt(index);
101
+ switch (codeUnit) {
102
+ case 0x08:
103
+ output += "\\b";
104
+ break;
105
+ case 0x09:
106
+ output += "\\t";
107
+ break;
108
+ case 0x0a:
109
+ output += "\\n";
110
+ break;
111
+ case 0x0c:
112
+ output += "\\f";
113
+ break;
114
+ case 0x0d:
115
+ output += "\\r";
116
+ break;
117
+ case 0x22:
118
+ output += '\\"';
119
+ break;
120
+ case 0x5c:
121
+ output += "\\\\";
122
+ break;
123
+ default:
124
+ if (codeUnit <= 0x1f)
125
+ output += `\\u${codeUnit.toString(16).padStart(4, "0")}`;
126
+ else
127
+ output += value.charAt(index);
128
+ }
129
+ }
130
+ return `${output}"`;
131
+ }
132
+ function numberToJcs(value) {
133
+ if (Object.is(value, -0))
134
+ return "0";
135
+ if (!Number.isFinite(value) || (Number.isInteger(value) && !Number.isSafeInteger(value))) {
136
+ throw new TypeError("invalid JSON number");
137
+ }
138
+ return JSON.stringify(value);
139
+ }
140
+ function writeText(value, sink) {
141
+ if (sink instanceof byte_sink_js_1.ByteArraySink)
142
+ sink.writeText(value);
143
+ else
144
+ sink.write(new TextEncoder().encode(value));
145
+ }
146
+ function writeAscii(value, sink) {
147
+ if (sink instanceof byte_sink_js_1.ByteArraySink)
148
+ sink.writeAscii(value);
149
+ else
150
+ sink.write(new TextEncoder().encode(value || EMPTY));
151
+ }
152
+ function compareUtf16(left, right) {
153
+ return left < right ? -1 : 1;
154
+ }
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.normalizeToBytes = normalizeToBytes;
5
+ exports.normalizeRegisteredToBytes = normalizeRegisteredToBytes;
6
+ const operation_result_js_1 = require("../domain/operation-result.js");
7
+ const byte_sink_js_1 = require("./byte-sink.js");
8
+ const diagnostic_collector_js_1 = require("../validation/diagnostic-collector.js");
9
+ function normalizeToBytes(profile, input, limits) {
10
+ const validated = profile.validate(input, limits);
11
+ if (!validated.ok)
12
+ return validated;
13
+ const sink = new byte_sink_js_1.ByteArraySink(limits.maxPayloadBytes, initialCapacity(input));
14
+ try {
15
+ const normalized = profile.normalize(validated.value, sink, limits);
16
+ if (!normalized.ok)
17
+ return normalized;
18
+ if (normalized.value.byteLength !== sink.byteLength)
19
+ return normalizationFailure(limits);
20
+ const bytes = sink.takeBytes();
21
+ return {
22
+ ok: true,
23
+ value: Object.freeze({ bytes, stats: normalized.value }),
24
+ diagnostics: normalized.diagnostics,
25
+ };
26
+ }
27
+ catch {
28
+ return normalizationFailure(limits);
29
+ }
30
+ }
31
+ function normalizeRegisteredToBytes(profile, input, limits) {
32
+ const sink = new byte_sink_js_1.ByteArraySink(limits.maxPayloadBytes, initialCapacity(input));
33
+ try {
34
+ const normalized = (profile.normalizeValidated ?? profile.normalize)(input, sink, limits);
35
+ if (!normalized.ok)
36
+ return normalized;
37
+ if (normalized.value.byteLength !== sink.byteLength)
38
+ return normalizationFailure(limits);
39
+ return {
40
+ ok: true,
41
+ value: Object.freeze({ bytes: sink.takeBytes(), stats: normalized.value }),
42
+ diagnostics: normalized.diagnostics,
43
+ };
44
+ }
45
+ catch {
46
+ return normalizationFailure(limits);
47
+ }
48
+ }
49
+ function normalizationFailure(limits) {
50
+ const collector = new diagnostic_collector_js_1.DiagnosticCollector(limits);
51
+ collector.addCode("NORMALIZATION_FAILED", "normalization");
52
+ return (0, operation_result_js_1.failure)(collector.finish());
53
+ }
54
+ function initialCapacity(input) {
55
+ return input instanceof Uint8Array ? input.length : 0;
56
+ }
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.ProfileRegistry = void 0;
5
+ const operation_result_js_1 = require("../domain/operation-result.js");
6
+ const diagnostic_collector_js_1 = require("../validation/diagnostic-collector.js");
7
+ const jcs_profile_js_1 = require("./jcs-profile.js");
8
+ const raw_bytes_profile_js_1 = require("./raw-bytes-profile.js");
9
+ class ProfileRegistry {
10
+ profiles = new Map();
11
+ constructor(additional = []) {
12
+ this.registerBuiltin(raw_bytes_profile_js_1.rawBytesProfile);
13
+ this.registerBuiltin(jcs_profile_js_1.jcsProfile);
14
+ for (const profile of additional) {
15
+ const result = this.register(profile);
16
+ if (!result.ok)
17
+ throw new Error("profile registration conflict");
18
+ }
19
+ }
20
+ register(profile) {
21
+ const key = profileKey(profile.id, profile.version);
22
+ if (this.profiles.has(key)) {
23
+ return (0, operation_result_js_1.failure)([(0, diagnostic_collector_js_1.createDiagnostic)("PROFILE_VERSION_CONFLICT", "input")]);
24
+ }
25
+ this.profiles.set(key, eraseProfile(profile));
26
+ return (0, operation_result_js_1.success)(undefined);
27
+ }
28
+ resolve(id, version) {
29
+ const profile = this.profiles.get(profileKey(id, version));
30
+ if (profile === undefined)
31
+ return (0, operation_result_js_1.failure)([(0, diagnostic_collector_js_1.createDiagnostic)("PROFILE_UNKNOWN", "input")]);
32
+ return (0, operation_result_js_1.success)(profile);
33
+ }
34
+ resolveValidated(reference) {
35
+ const profile = this.profiles.get(`${reference.id}\u0000${reference.version}`);
36
+ if (profile === undefined)
37
+ return (0, operation_result_js_1.failure)([(0, diagnostic_collector_js_1.createDiagnostic)("PROFILE_UNKNOWN", "input")]);
38
+ return (0, operation_result_js_1.success)(profile);
39
+ }
40
+ registerBuiltin(profile) {
41
+ this.profiles.set(profileKey(profile.id, profile.version), eraseProfile(profile));
42
+ }
43
+ }
44
+ exports.ProfileRegistry = ProfileRegistry;
45
+ function eraseProfile(profile) {
46
+ return Object.freeze({
47
+ id: profile.id,
48
+ version: profile.version,
49
+ inputKind: profile.inputKind,
50
+ validate: (input, limits) => profile.validate(input, limits),
51
+ normalize: (input, sink, limits) => {
52
+ const validated = profile.validate(input, limits);
53
+ if (!validated.ok)
54
+ return validated;
55
+ return profile.normalize(validated.value, sink, limits);
56
+ },
57
+ normalizeValidated: (input, sink, limits) => {
58
+ // The record service invokes this only after the profile validator succeeds.
59
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- erased generic at the trusted registry boundary
60
+ return profile.normalize(input, sink, limits);
61
+ },
62
+ });
63
+ }
64
+ function profileKey(id, version) {
65
+ return `${id.value}\u0000${version.value}`;
66
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.rawBytesProfile = void 0;
5
+ const node_util_1 = require("node:util");
6
+ const identifiers_js_1 = require("../domain/identifiers.js");
7
+ const version_js_1 = require("../domain/version.js");
8
+ const operation_result_js_1 = require("../domain/operation-result.js");
9
+ const result_helpers_js_1 = require("../validation/result-helpers.js");
10
+ const RAW_PROFILE_ID = identifiers_js_1.ProfileId.fromValidated("dev.noeos.raw-bytes");
11
+ const RAW_PROFILE_VERSION = version_js_1.ProfileVersion.fromValidated("1.0.0");
12
+ exports.rawBytesProfile = Object.freeze({
13
+ id: RAW_PROFILE_ID,
14
+ version: RAW_PROFILE_VERSION,
15
+ inputKind: "bytes",
16
+ validate(input, limits) {
17
+ if (node_util_1.types.isProxy(input) || !(input instanceof Uint8Array))
18
+ return (0, result_helpers_js_1.failureWithCode)("INPUT_TYPE_INVALID", "input");
19
+ if (input.length > limits.maxPayloadBytes)
20
+ return (0, result_helpers_js_1.failureWithCode)("INPUT_LIMIT_EXCEEDED", "input");
21
+ return (0, operation_result_js_1.success)(input);
22
+ },
23
+ normalize(input, sink) {
24
+ sink.write(input);
25
+ return (0, operation_result_js_1.success)(Object.freeze({ byteLength: input.length }));
26
+ },
27
+ });
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "commonjs"
3
+ }
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.BUILTIN_PROFILES = void 0;
5
+ /** @public */
6
+ exports.BUILTIN_PROFILES = Object.freeze([
7
+ Object.freeze({ id: "dev.noeos.raw-bytes", version: "1.0.0", inputKind: "bytes" }),
8
+ Object.freeze({ id: "dev.noeos.jcs", version: "1.0.0", inputKind: "json" }),
9
+ ]);
@@ -0,0 +1,278 @@
1
+ "use strict";
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.hashRecord = hashRecord;
5
+ exports.computeRecord = computeRecord;
6
+ exports.verifyComputedRecord = verifyComputedRecord;
7
+ exports.validateRecordInput = validateRecordInput;
8
+ exports.validateProfile = validateProfile;
9
+ exports.freezeRecordEvidence = freezeRecordEvidence;
10
+ const node_util_1 = require("node:util");
11
+ const evidence_js_1 = require("../domain/evidence.js");
12
+ const operation_result_js_1 = require("../domain/operation-result.js");
13
+ const frame_builders_js_1 = require("../framing/frame-builders.js");
14
+ const hash_frame_js_1 = require("../hashing/hash-frame.js");
15
+ const normalize_js_1 = require("../normalization/normalize.js");
16
+ const rule_set_js_1 = require("../rules/rule-set.js");
17
+ const diagnostic_collector_js_1 = require("../validation/diagnostic-collector.js");
18
+ const algorithm_validation_js_1 = require("../validation/algorithm-validation.js");
19
+ const digest_validation_js_1 = require("../validation/digest-validation.js");
20
+ const identifier_validation_js_1 = require("../validation/identifier-validation.js");
21
+ const object_inspection_js_1 = require("../validation/object-inspection.js");
22
+ const result_helpers_js_1 = require("../validation/result-helpers.js");
23
+ const version_validation_js_1 = require("../validation/version-validation.js");
24
+ function hashRecord(input, options) {
25
+ const computed = computeRecord(input, options);
26
+ if (!computed.ok)
27
+ return computed;
28
+ return (0, operation_result_js_1.success)(computed.value.evidence, computed.diagnostics);
29
+ }
30
+ function computeRecord(input, options) {
31
+ const validated = validateRecordInput(input, options.limits);
32
+ if (!validated.ok)
33
+ return validated;
34
+ const collector = new diagnostic_collector_js_1.DiagnosticCollector(options.limits);
35
+ const hasRules = options.rules?.hasRules() === true;
36
+ if (hasRules) {
37
+ addAll(collector, options.rules.evaluate(Object.freeze({
38
+ phase: "input",
39
+ input: freezeInputView(validated.value),
40
+ recordId: validated.value.recordId,
41
+ }), options.limits));
42
+ }
43
+ if (collector.hasErrors())
44
+ return (0, operation_result_js_1.failure)(collector.finish());
45
+ const profileReference = validateProfileReference(validated.value, options);
46
+ if (!profileReference.ok)
47
+ return profileReference;
48
+ const profile = profileReference.value;
49
+ if (profile.inputKind === "json" && inputPayloadIsBytes(validated.value.payload)) {
50
+ collector.addCode("PROFILE_INPUT_KIND_MISMATCH", "input", {
51
+ recordId: validated.value.recordId,
52
+ });
53
+ return (0, operation_result_js_1.failure)(collector.finish());
54
+ }
55
+ if (profile.inputKind === "bytes" && !inputPayloadIsBytes(validated.value.payload)) {
56
+ collector.addCode("PROFILE_INPUT_KIND_MISMATCH", "input", {
57
+ recordId: validated.value.recordId,
58
+ });
59
+ return (0, operation_result_js_1.failure)(collector.finish());
60
+ }
61
+ if (isBuiltinRawProfile(profile) && !hasRules) {
62
+ return computeBuiltinRawRecord(validated.value, options);
63
+ }
64
+ const profileInput = profile.validate(validated.value.payload, options.limits);
65
+ if (!profileInput.ok)
66
+ return profileInput;
67
+ const normalized = (0, normalize_js_1.normalizeRegisteredToBytes)(profile, profileInput.value, options.limits);
68
+ if (!normalized.ok)
69
+ return normalized;
70
+ addAll(collector, normalized.diagnostics);
71
+ if (hasRules) {
72
+ addAll(collector, options.rules.evaluate(Object.freeze({
73
+ phase: "normalization",
74
+ normalized: (0, rule_set_js_1.createReadonlyByteView)(normalized.value.bytes),
75
+ recordId: validated.value.recordId,
76
+ }), options.limits));
77
+ }
78
+ if (collector.hasErrors())
79
+ return (0, operation_result_js_1.failure)(collector.finish());
80
+ const contentDigest = (0, hash_frame_js_1.hashTrustedFrame)(validated.value.algorithm, (0, frame_builders_js_1.buildTrustedContentFrame)({
81
+ algorithm: validated.value.algorithm,
82
+ profileId: validated.value.profile.id,
83
+ profileVersion: validated.value.profile.version,
84
+ normalizedBytes: normalized.value.bytes,
85
+ }, options.limits));
86
+ if (!contentDigest.ok)
87
+ return contentDigest;
88
+ const recordDigest = (0, hash_frame_js_1.hashTrustedFrame)(validated.value.algorithm, (0, frame_builders_js_1.buildTrustedRecordFrame)({
89
+ algorithm: validated.value.algorithm,
90
+ contextId: validated.value.contextId,
91
+ recordId: validated.value.recordId,
92
+ profileId: validated.value.profile.id,
93
+ profileVersion: validated.value.profile.version,
94
+ normalizedByteLength: normalized.value.stats.byteLength,
95
+ contentDigest: contentDigest.value,
96
+ }, options.limits));
97
+ if (!recordDigest.ok)
98
+ return recordDigest;
99
+ const evidence = freezeRecordEvidence({
100
+ $schema: evidence_js_1.RECORD_EVIDENCE_SCHEMA,
101
+ protocolVersion: 1,
102
+ contextId: validated.value.contextId,
103
+ recordId: validated.value.recordId,
104
+ profile: validated.value.profile,
105
+ algorithm: validated.value.algorithm,
106
+ normalizedByteLength: normalized.value.stats.byteLength,
107
+ contentDigest: contentDigest.value.toHex(),
108
+ recordDigest: recordDigest.value.toHex(),
109
+ });
110
+ if (hasRules) {
111
+ addAll(collector, options.rules.evaluate(Object.freeze({
112
+ phase: "record",
113
+ record: evidence,
114
+ recordId: evidence.recordId,
115
+ }), options.limits));
116
+ }
117
+ if (collector.hasErrors())
118
+ return (0, operation_result_js_1.failure)(collector.finish());
119
+ return (0, operation_result_js_1.success)(Object.freeze({
120
+ evidence,
121
+ contentDigest: contentDigest.value,
122
+ recordDigest: recordDigest.value,
123
+ }), collector.finish());
124
+ }
125
+ function computeBuiltinRawRecord(input, options) {
126
+ if (node_util_1.types.isProxy(input.payload) || !(input.payload instanceof Uint8Array)) {
127
+ return (0, result_helpers_js_1.failureWithCode)("INPUT_TYPE_INVALID", "input");
128
+ }
129
+ if (input.payload.length > options.limits.maxPayloadBytes) {
130
+ return (0, result_helpers_js_1.failureWithCode)("INPUT_LIMIT_EXCEEDED", "input");
131
+ }
132
+ const contentDigest = (0, hash_frame_js_1.hashTrustedFrame)(input.algorithm, (0, frame_builders_js_1.buildTrustedContentFrame)({
133
+ algorithm: input.algorithm,
134
+ profileId: input.profile.id,
135
+ profileVersion: input.profile.version,
136
+ normalizedBytes: input.payload,
137
+ }, options.limits));
138
+ if (!contentDigest.ok)
139
+ return contentDigest;
140
+ const recordDigest = (0, hash_frame_js_1.hashTrustedFrame)(input.algorithm, (0, frame_builders_js_1.buildTrustedRecordFrame)({
141
+ algorithm: input.algorithm,
142
+ contextId: input.contextId,
143
+ recordId: input.recordId,
144
+ profileId: input.profile.id,
145
+ profileVersion: input.profile.version,
146
+ normalizedByteLength: input.payload.length,
147
+ contentDigest: contentDigest.value,
148
+ }, options.limits));
149
+ if (!recordDigest.ok)
150
+ return recordDigest;
151
+ const evidence = freezeRecordEvidence({
152
+ $schema: evidence_js_1.RECORD_EVIDENCE_SCHEMA,
153
+ protocolVersion: 1,
154
+ contextId: input.contextId,
155
+ recordId: input.recordId,
156
+ profile: input.profile,
157
+ algorithm: input.algorithm,
158
+ normalizedByteLength: input.payload.length,
159
+ contentDigest: contentDigest.value.toHex(),
160
+ recordDigest: recordDigest.value.toHex(),
161
+ });
162
+ return (0, operation_result_js_1.success)(Object.freeze({
163
+ evidence,
164
+ contentDigest: contentDigest.value,
165
+ recordDigest: recordDigest.value,
166
+ }));
167
+ }
168
+ function verifyComputedRecord(expected, payload, options) {
169
+ const computed = computeRecord({
170
+ contextId: expected.contextId,
171
+ recordId: expected.recordId,
172
+ payload,
173
+ profile: expected.profile,
174
+ algorithm: expected.algorithm,
175
+ }, options);
176
+ if (!computed.ok)
177
+ return computed;
178
+ const expectedContent = expected.contentDigest;
179
+ const expectedRecord = expected.recordDigest;
180
+ const actualContent = computed.value.evidence.contentDigest;
181
+ const actualRecord = computed.value.evidence.recordDigest;
182
+ const collector = new diagnostic_collector_js_1.DiagnosticCollector(options.limits);
183
+ addAll(collector, computed.diagnostics);
184
+ if (!sameDigest(expectedContent, actualContent, expected.algorithm)) {
185
+ collector.addCode("CONTENT_DIGEST_MISMATCH", "record", { recordId: expected.recordId });
186
+ }
187
+ if (!sameDigest(expectedRecord, actualRecord, expected.algorithm)) {
188
+ collector.addCode("RECORD_DIGEST_MISMATCH", "record", { recordId: expected.recordId });
189
+ }
190
+ if (collector.hasErrors())
191
+ return (0, operation_result_js_1.failure)(collector.finish());
192
+ return (0, operation_result_js_1.success)(computed.value.evidence, collector.finish());
193
+ }
194
+ function validateRecordInput(value, limits) {
195
+ const exact = (0, object_inspection_js_1.inspectExactProperties)(value, [
196
+ "contextId",
197
+ "recordId",
198
+ "payload",
199
+ "profile",
200
+ "algorithm",
201
+ ]);
202
+ if (exact === undefined)
203
+ return inputFailure(limits);
204
+ const [contextIdInput, recordIdInput, payload, profileInput, algorithmInput] = exact;
205
+ const contextId = (0, identifier_validation_js_1.validateContextId)(contextIdInput);
206
+ const recordId = (0, identifier_validation_js_1.validateRecordId)(recordIdInput);
207
+ const profile = validateProfile(profileInput, limits);
208
+ const algorithm = (0, algorithm_validation_js_1.validateAlgorithmId)(algorithmInput);
209
+ if (!contextId.ok)
210
+ return contextId;
211
+ if (!recordId.ok)
212
+ return recordId;
213
+ if (!profile.ok)
214
+ return profile;
215
+ if (!algorithm.ok)
216
+ return algorithm;
217
+ return (0, operation_result_js_1.success)(Object.freeze({
218
+ contextId: contextId.value.value,
219
+ recordId: recordId.value.value,
220
+ payload,
221
+ profile: profile.value,
222
+ algorithm: algorithm.value,
223
+ }));
224
+ }
225
+ function validateProfile(value, limits) {
226
+ void limits;
227
+ const exact = (0, object_inspection_js_1.inspectExactProperties)(value, ["id", "version"]);
228
+ if (exact === undefined)
229
+ return inputFailure(limits);
230
+ const [idInput, versionInput] = exact;
231
+ const id = (0, identifier_validation_js_1.validateProfileId)(idInput);
232
+ const version = (0, version_validation_js_1.validateProfileVersion)(versionInput);
233
+ if (!id.ok)
234
+ return id;
235
+ if (!version.ok)
236
+ return version;
237
+ return (0, operation_result_js_1.success)(Object.freeze({ id: id.value.value, version: version.value.value }));
238
+ }
239
+ function freezeRecordEvidence(value) {
240
+ return Object.freeze(value);
241
+ }
242
+ function validateProfileReference(input, options) {
243
+ return options.profiles.resolveValidated(input.profile);
244
+ }
245
+ function inputPayloadIsBytes(value) {
246
+ return value instanceof Uint8Array;
247
+ }
248
+ function isBuiltinRawProfile(profile) {
249
+ return profile.id.value === "dev.noeos.raw-bytes";
250
+ }
251
+ function freezeInputView(value) {
252
+ return Object.freeze({
253
+ contextId: value.contextId,
254
+ recordId: value.recordId,
255
+ profile: Object.freeze({ ...value.profile }),
256
+ algorithm: value.algorithm,
257
+ });
258
+ }
259
+ function sameDigest(expected, actual, algorithm) {
260
+ const left = hexToDigest(expected, algorithm);
261
+ const right = hexToDigest(actual, algorithm);
262
+ return left !== undefined && right !== undefined && (0, digest_validation_js_1.equalDigest)(left, right);
263
+ }
264
+ function hexToDigest(value, algorithm) {
265
+ const result = (0, digest_validation_js_1.validateDigest)(value, algorithm);
266
+ return result.ok ? result.value : undefined;
267
+ }
268
+ function addAll(collector, diagnostics) {
269
+ if (diagnostics === undefined)
270
+ return;
271
+ for (const diagnostic of diagnostics)
272
+ collector.add(diagnostic);
273
+ }
274
+ function inputFailure(limits) {
275
+ const collector = new diagnostic_collector_js_1.DiagnosticCollector(limits);
276
+ collector.addCode("INPUT_TYPE_INVALID", "input");
277
+ return (0, operation_result_js_1.failure)(collector.finish());
278
+ }