stated-protocol 5.2.2 → 5.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/fixtures.test.d.ts +2 -0
- package/dist/fixtures.test.d.ts.map +1 -0
- package/dist/fixtures.test.js +207 -0
- package/dist/fixtures.test.js.map +1 -0
- package/dist/hash.js +2 -2
- package/dist/hash.js.map +1 -1
- package/dist/hash.test.d.ts +2 -0
- package/dist/hash.test.d.ts.map +1 -0
- package/dist/hash.test.js +183 -0
- package/dist/hash.test.js.map +1 -0
- package/dist/observation.test.d.ts +2 -0
- package/dist/observation.test.d.ts.map +1 -0
- package/dist/observation.test.js +101 -0
- package/dist/observation.test.js.map +1 -0
- package/dist/organisation-verification.test.d.ts +2 -0
- package/dist/organisation-verification.test.d.ts.map +1 -0
- package/dist/organisation-verification.test.js +44 -0
- package/dist/organisation-verification.test.js.map +1 -0
- package/dist/person-verification.test.d.ts +2 -0
- package/dist/person-verification.test.d.ts.map +1 -0
- package/dist/person-verification.test.js +41 -0
- package/dist/person-verification.test.js.map +1 -0
- package/dist/poll.test.d.ts +2 -0
- package/dist/poll.test.d.ts.map +1 -0
- package/dist/poll.test.js +26 -0
- package/dist/poll.test.js.map +1 -0
- package/dist/protocol.d.ts +3 -1
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +47 -5
- package/dist/protocol.js.map +1 -1
- package/dist/rating.test.d.ts +2 -0
- package/dist/rating.test.d.ts.map +1 -0
- package/dist/rating.test.js +24 -0
- package/dist/rating.test.js.map +1 -0
- package/dist/signature.js +2 -2
- package/dist/signature.js.map +1 -1
- package/dist/signature.test.d.ts +2 -0
- package/dist/signature.test.d.ts.map +1 -0
- package/dist/signature.test.js +165 -0
- package/dist/signature.test.js.map +1 -0
- package/dist/statement.test.d.ts +2 -0
- package/dist/statement.test.d.ts.map +1 -0
- package/dist/statement.test.js +90 -0
- package/dist/statement.test.js.map +1 -0
- package/dist/types.d.ts +6 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils.d.ts +0 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +0 -1
- package/dist/utils.js.map +1 -1
- package/dist/utils.test.d.ts +2 -0
- package/dist/utils.test.d.ts.map +1 -0
- package/dist/utils.test.js +106 -0
- package/dist/utils.test.js.map +1 -0
- package/package.json +1 -1
- package/src/fixtures.test.ts +8 -1
- package/src/hash.ts +2 -2
- package/src/observation.test.ts +128 -0
- package/src/poll.test.ts +1 -1
- package/src/protocol.ts +50 -5
- package/src/rating.test.ts +5 -1
- package/src/signature.ts +2 -2
- package/src/types.ts +8 -1
- package/src/utils.test.ts +5 -10
- package/src/utils.ts +0 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixtures.test.d.ts","sourceRoot":"","sources":["../src/fixtures.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
import { describe, it } from 'node:test';
|
|
5
|
+
import assert from 'node:assert';
|
|
6
|
+
import { buildStatement, parseStatement, buildPollContent, buildVoteContent, buildOrganisationVerificationContent, buildPersonVerificationContent, buildDisputeAuthenticityContent, buildDisputeContentContent, buildResponseContent, buildPDFSigningContent, buildRating, buildObservationContent, } from './protocol';
|
|
7
|
+
import { verifySignedStatement } from './signature';
|
|
8
|
+
// ESM-compatible __dirname
|
|
9
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
10
|
+
const __dirname = path.dirname(__filename);
|
|
11
|
+
const fixturesDir = path.join(__dirname, '../fixtures');
|
|
12
|
+
function getFixtureDirs() {
|
|
13
|
+
if (!fs.existsSync(fixturesDir)) {
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
return fs
|
|
17
|
+
.readdirSync(fixturesDir, { withFileTypes: true })
|
|
18
|
+
.filter((dirent) => dirent.isDirectory())
|
|
19
|
+
.map((dirent) => dirent.name);
|
|
20
|
+
}
|
|
21
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
22
|
+
function buildContentFromInput(contentObj) {
|
|
23
|
+
if (!contentObj || typeof contentObj !== 'object') {
|
|
24
|
+
throw new Error('Content must be an object with a type field');
|
|
25
|
+
}
|
|
26
|
+
switch (contentObj.type) {
|
|
27
|
+
case 'poll':
|
|
28
|
+
return buildPollContent({
|
|
29
|
+
poll: contentObj.poll,
|
|
30
|
+
options: contentObj.options || [],
|
|
31
|
+
deadline: contentObj.deadline ? new Date(contentObj.deadline) : undefined,
|
|
32
|
+
scopeDescription: contentObj.scopeDescription,
|
|
33
|
+
allowArbitraryVote: contentObj.allowArbitraryVote,
|
|
34
|
+
});
|
|
35
|
+
case 'vote':
|
|
36
|
+
return buildVoteContent({
|
|
37
|
+
pollHash: contentObj.pollHash,
|
|
38
|
+
poll: contentObj.poll,
|
|
39
|
+
vote: contentObj.vote,
|
|
40
|
+
});
|
|
41
|
+
case 'organisation_verification':
|
|
42
|
+
return buildOrganisationVerificationContent({
|
|
43
|
+
name: contentObj.name,
|
|
44
|
+
englishName: contentObj.englishName,
|
|
45
|
+
country: contentObj.country,
|
|
46
|
+
city: contentObj.city,
|
|
47
|
+
province: contentObj.province,
|
|
48
|
+
legalForm: contentObj.legalForm,
|
|
49
|
+
department: contentObj.department,
|
|
50
|
+
domain: contentObj.domain,
|
|
51
|
+
foreignDomain: contentObj.foreignDomain,
|
|
52
|
+
serialNumber: contentObj.serialNumber,
|
|
53
|
+
confidence: contentObj.confidence,
|
|
54
|
+
reliabilityPolicy: contentObj.reliabilityPolicy,
|
|
55
|
+
employeeCount: contentObj.employeeCount,
|
|
56
|
+
latitude: contentObj.latitude,
|
|
57
|
+
longitude: contentObj.longitude,
|
|
58
|
+
population: contentObj.population,
|
|
59
|
+
publicKey: contentObj.publicKey,
|
|
60
|
+
});
|
|
61
|
+
case 'person_verification':
|
|
62
|
+
return buildPersonVerificationContent({
|
|
63
|
+
name: contentObj.name,
|
|
64
|
+
countryOfBirth: contentObj.countryOfBirth,
|
|
65
|
+
cityOfBirth: contentObj.cityOfBirth,
|
|
66
|
+
ownDomain: contentObj.ownDomain,
|
|
67
|
+
foreignDomain: contentObj.foreignDomain,
|
|
68
|
+
dateOfBirth: new Date(contentObj.dateOfBirth),
|
|
69
|
+
jobTitle: contentObj.jobTitle,
|
|
70
|
+
employer: contentObj.employer,
|
|
71
|
+
verificationMethod: contentObj.verificationMethod,
|
|
72
|
+
confidence: contentObj.confidence,
|
|
73
|
+
reliabilityPolicy: contentObj.reliabilityPolicy,
|
|
74
|
+
publicKey: contentObj.publicKey,
|
|
75
|
+
});
|
|
76
|
+
case 'dispute_authenticity':
|
|
77
|
+
return buildDisputeAuthenticityContent({
|
|
78
|
+
hash: contentObj.hash,
|
|
79
|
+
confidence: contentObj.confidence,
|
|
80
|
+
reliabilityPolicy: contentObj.reliabilityPolicy,
|
|
81
|
+
});
|
|
82
|
+
case 'dispute_content':
|
|
83
|
+
return buildDisputeContentContent({
|
|
84
|
+
hash: contentObj.hash,
|
|
85
|
+
confidence: contentObj.confidence,
|
|
86
|
+
reliabilityPolicy: contentObj.reliabilityPolicy,
|
|
87
|
+
});
|
|
88
|
+
case 'response':
|
|
89
|
+
return buildResponseContent({
|
|
90
|
+
hash: contentObj.hash,
|
|
91
|
+
response: contentObj.response,
|
|
92
|
+
});
|
|
93
|
+
case 'pdf_signing':
|
|
94
|
+
return buildPDFSigningContent({});
|
|
95
|
+
case 'rating':
|
|
96
|
+
return buildRating({
|
|
97
|
+
subjectName: contentObj.subjectName,
|
|
98
|
+
subjectType: contentObj.subjectType,
|
|
99
|
+
subjectReference: contentObj.subjectReference,
|
|
100
|
+
documentFileHash: contentObj.documentFileHash,
|
|
101
|
+
rating: contentObj.rating,
|
|
102
|
+
quality: contentObj.quality,
|
|
103
|
+
comment: contentObj.comment,
|
|
104
|
+
});
|
|
105
|
+
case 'observation':
|
|
106
|
+
return buildObservationContent({
|
|
107
|
+
subject: contentObj.subject,
|
|
108
|
+
property: contentObj.property,
|
|
109
|
+
value: contentObj.value,
|
|
110
|
+
});
|
|
111
|
+
default:
|
|
112
|
+
throw new Error(`Unknown content type: ${contentObj.type}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
describe('Fixture Validation', () => {
|
|
116
|
+
const fixtureDirs = getFixtureDirs();
|
|
117
|
+
if (fixtureDirs.length === 0) {
|
|
118
|
+
it('no fixtures found', () => {
|
|
119
|
+
// No fixture directories found
|
|
120
|
+
assert.ok(true);
|
|
121
|
+
});
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
for (const dir of fixtureDirs) {
|
|
125
|
+
describe(`Fixture: ${dir}`, () => {
|
|
126
|
+
const inputPath = path.join(fixturesDir, dir, 'input.json');
|
|
127
|
+
const outputPath = path.join(fixturesDir, dir, 'output.txt');
|
|
128
|
+
if (!fs.existsSync(inputPath)) {
|
|
129
|
+
it('should have input.json', () => {
|
|
130
|
+
assert.fail(`Missing input.json in ${dir}`);
|
|
131
|
+
});
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
if (!fs.existsSync(outputPath)) {
|
|
135
|
+
it('should have output.txt', () => {
|
|
136
|
+
assert.fail(`Missing output.txt in ${dir}`);
|
|
137
|
+
});
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
it('output.txt should match built statement from input.json', async () => {
|
|
141
|
+
const input = JSON.parse(fs.readFileSync(inputPath, 'utf-8'));
|
|
142
|
+
const expectedOutput = fs.readFileSync(outputPath, 'utf-8');
|
|
143
|
+
if (input.signature) {
|
|
144
|
+
const isValid = await verifySignedStatement(expectedOutput);
|
|
145
|
+
assert.strictEqual(isValid, true);
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
let content;
|
|
149
|
+
if (typeof input.content === 'string') {
|
|
150
|
+
content = input.content;
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
content = buildContentFromInput(input.content);
|
|
154
|
+
}
|
|
155
|
+
// Build statement
|
|
156
|
+
const builtStatement = buildStatement({
|
|
157
|
+
domain: input.domain,
|
|
158
|
+
author: input.author,
|
|
159
|
+
time: new Date(input.time),
|
|
160
|
+
tags: input.tags,
|
|
161
|
+
content,
|
|
162
|
+
representative: input.representative,
|
|
163
|
+
supersededStatement: input.supersededStatement,
|
|
164
|
+
translations: input.translations,
|
|
165
|
+
attachments: input.attachments,
|
|
166
|
+
});
|
|
167
|
+
assert.strictEqual(builtStatement, expectedOutput);
|
|
168
|
+
});
|
|
169
|
+
it('output.txt should not contain double newlines', () => {
|
|
170
|
+
const output = fs.readFileSync(outputPath, 'utf-8');
|
|
171
|
+
assert.ok(!/\n\n/.test(output));
|
|
172
|
+
});
|
|
173
|
+
it('output.txt should be parseable', () => {
|
|
174
|
+
const output = fs.readFileSync(outputPath, 'utf-8');
|
|
175
|
+
const parsed = parseStatement({ statement: output });
|
|
176
|
+
assert.ok(parsed.domain);
|
|
177
|
+
assert.ok(parsed.author);
|
|
178
|
+
assert.ok(parsed.content);
|
|
179
|
+
assert.strictEqual(parsed.formatVersion, '5.3');
|
|
180
|
+
});
|
|
181
|
+
it('round-trip: parse(output.txt) should match input.json structure', () => {
|
|
182
|
+
const input = JSON.parse(fs.readFileSync(inputPath, 'utf-8'));
|
|
183
|
+
const output = fs.readFileSync(outputPath, 'utf-8');
|
|
184
|
+
const parsed = parseStatement({ statement: output });
|
|
185
|
+
assert.strictEqual(parsed.domain, input.domain);
|
|
186
|
+
assert.strictEqual(parsed.author, input.author);
|
|
187
|
+
assert.strictEqual(new Date(parsed.time).toISOString(), new Date(input.time).toISOString());
|
|
188
|
+
if (input.tags) {
|
|
189
|
+
assert.deepStrictEqual(parsed.tags, input.tags);
|
|
190
|
+
}
|
|
191
|
+
if (input.representative) {
|
|
192
|
+
assert.strictEqual(parsed.representative, input.representative);
|
|
193
|
+
}
|
|
194
|
+
if (input.supersededStatement) {
|
|
195
|
+
assert.strictEqual(parsed.supersededStatement, input.supersededStatement);
|
|
196
|
+
}
|
|
197
|
+
if (input.attachments) {
|
|
198
|
+
assert.deepStrictEqual(parsed.attachments, input.attachments);
|
|
199
|
+
}
|
|
200
|
+
if (input.translations) {
|
|
201
|
+
assert.deepStrictEqual(parsed.translations, input.translations);
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
//# sourceMappingURL=fixtures.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixtures.test.js","sourceRoot":"","sources":["../src/fixtures.test.ts"],"names":[],"mappings":"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"}
|
package/dist/hash.js
CHANGED
|
@@ -61,9 +61,9 @@ export const toUrlSafeBase64 = (base64) => {
|
|
|
61
61
|
* @returns Base64 string
|
|
62
62
|
*/
|
|
63
63
|
function bytesToBase64(bytes) {
|
|
64
|
-
// Use btoa if available (browser), otherwise use Buffer (Node.js)
|
|
65
64
|
if (typeof btoa !== 'undefined') {
|
|
66
|
-
|
|
65
|
+
const binaryString = Array.from(bytes, byte => String.fromCharCode(byte)).join('');
|
|
66
|
+
return btoa(binaryString);
|
|
67
67
|
}
|
|
68
68
|
else {
|
|
69
69
|
return Buffer.from(bytes).toString('base64');
|
package/dist/hash.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hash.js","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAE9D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAA0B,EAAU,EAAE;IAC3D,IAAI,IAAgB,CAAC;IAErB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAClC,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,KAAK,CAAC;IACf,CAAC;IAED,0DAA0D;IAC1D,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAEpC,oBAAoB;IACpB,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IAExC,kEAAkE;IAClE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAEjF,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,OAA4B,EAAE,IAAY,EAAW,EAAE;IAC5E,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IACjC,OAAO,QAAQ,KAAK,IAAI,CAAC;AAC3B,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,OAAe,EAAU,EAAE;IAC3D,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC7D,wBAAwB;IACxB,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,OAAO,MAAM,GAAG,OAAO,CAAC;AAC1B,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAc,EAAU,EAAE;IACxD,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAC1E,CAAC,CAAC;AAEF;;;;GAIG;AACH,SAAS,aAAa,CAAC,KAAiB;IACtC,
|
|
1
|
+
{"version":3,"file":"hash.js","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.test.d.ts","sourceRoot":"","sources":["../src/hash.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { describe, it } from 'node:test';
|
|
2
|
+
import assert from 'node:assert';
|
|
3
|
+
import { sha256, verify, fromUrlSafeBase64, toUrlSafeBase64 } from './hash';
|
|
4
|
+
describe('Hash utilities', () => {
|
|
5
|
+
describe('sha256', () => {
|
|
6
|
+
it('should hash a simple string', () => {
|
|
7
|
+
const input = 'hello world';
|
|
8
|
+
const hash = sha256(input);
|
|
9
|
+
// Verify it's URL-safe (no +, /, or =)
|
|
10
|
+
assert.ok(!hash.includes('+'));
|
|
11
|
+
assert.ok(!hash.includes('/'));
|
|
12
|
+
assert.ok(!hash.includes('='));
|
|
13
|
+
// Verify consistent output
|
|
14
|
+
const hash2 = sha256(input);
|
|
15
|
+
assert.strictEqual(hash, hash2);
|
|
16
|
+
});
|
|
17
|
+
it('should produce correct hash for known input', () => {
|
|
18
|
+
const input = 'hello world';
|
|
19
|
+
const expectedHash = 'uU0nuZNNPgilLlLX2n2r-sSE7-N6U4DukIj3rOLvzek';
|
|
20
|
+
const hash = sha256(input);
|
|
21
|
+
assert.strictEqual(hash, expectedHash);
|
|
22
|
+
});
|
|
23
|
+
it('should handle empty string', () => {
|
|
24
|
+
const hash = sha256('');
|
|
25
|
+
assert.ok(hash);
|
|
26
|
+
assert.strictEqual(typeof hash, 'string');
|
|
27
|
+
});
|
|
28
|
+
it('should handle unicode characters', () => {
|
|
29
|
+
const input = '你好世界 🌍';
|
|
30
|
+
const hash = sha256(input);
|
|
31
|
+
assert.ok(hash);
|
|
32
|
+
assert.strictEqual(typeof hash, 'string');
|
|
33
|
+
// Verify consistency
|
|
34
|
+
const hash2 = sha256(input);
|
|
35
|
+
assert.strictEqual(hash, hash2);
|
|
36
|
+
});
|
|
37
|
+
it('should handle Buffer input', () => {
|
|
38
|
+
const data = Buffer.from('hello world');
|
|
39
|
+
const hash = sha256(data);
|
|
40
|
+
// Should produce same hash as string input
|
|
41
|
+
const stringHash = sha256('hello world');
|
|
42
|
+
assert.strictEqual(hash, stringHash);
|
|
43
|
+
});
|
|
44
|
+
it('should produce different hashes for different inputs', () => {
|
|
45
|
+
const hash1 = sha256('hello');
|
|
46
|
+
const hash2 = sha256('world');
|
|
47
|
+
assert.notStrictEqual(hash1, hash2);
|
|
48
|
+
});
|
|
49
|
+
it('should produce 43-character URL-safe base64 string', () => {
|
|
50
|
+
const hash = sha256('test');
|
|
51
|
+
// SHA-256 produces 256 bits = 32 bytes
|
|
52
|
+
// Base64 encoding: 32 bytes * 4/3 = 42.67, rounded up = 43 chars (without padding)
|
|
53
|
+
assert.strictEqual(hash.length, 43);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
describe('verify', () => {
|
|
57
|
+
it('should verify correct hash', () => {
|
|
58
|
+
const content = 'hello world';
|
|
59
|
+
const hash = sha256(content);
|
|
60
|
+
const isValid = verify(content, hash);
|
|
61
|
+
assert.strictEqual(isValid, true);
|
|
62
|
+
});
|
|
63
|
+
it('should reject incorrect hash', () => {
|
|
64
|
+
const content = 'hello world';
|
|
65
|
+
const wrongHash = 'incorrect_hash_value_here_1234567890';
|
|
66
|
+
const isValid = verify(content, wrongHash);
|
|
67
|
+
assert.strictEqual(isValid, false);
|
|
68
|
+
});
|
|
69
|
+
it('should reject hash for different content', () => {
|
|
70
|
+
const content1 = 'hello world';
|
|
71
|
+
const content2 = 'goodbye world';
|
|
72
|
+
const hash1 = sha256(content1);
|
|
73
|
+
const isValid = verify(content2, hash1);
|
|
74
|
+
assert.strictEqual(isValid, false);
|
|
75
|
+
});
|
|
76
|
+
it('should work with Buffer', () => {
|
|
77
|
+
const data = Buffer.from('test data');
|
|
78
|
+
const hash = sha256(data);
|
|
79
|
+
const isValid = verify(data, hash);
|
|
80
|
+
assert.strictEqual(isValid, true);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
describe('fromUrlSafeBase64', () => {
|
|
84
|
+
it('should convert URL-safe base64 to standard base64', () => {
|
|
85
|
+
// Use a URL-safe string that contains both - and _ characters
|
|
86
|
+
const urlSafe = 'abc-def_ghi';
|
|
87
|
+
const standard = fromUrlSafeBase64(urlSafe);
|
|
88
|
+
// Should replace - with + and _ with /
|
|
89
|
+
assert.ok(standard.includes('+'));
|
|
90
|
+
assert.ok(standard.includes('/'));
|
|
91
|
+
// Should add padding
|
|
92
|
+
assert.strictEqual(standard.endsWith('='), true);
|
|
93
|
+
});
|
|
94
|
+
it('should add correct padding', () => {
|
|
95
|
+
// Test different padding scenarios
|
|
96
|
+
const testCases = [
|
|
97
|
+
{ input: 'abc', expectedPadding: 1 },
|
|
98
|
+
{ input: 'abcd', expectedPadding: 0 },
|
|
99
|
+
{ input: 'abcde', expectedPadding: 3 },
|
|
100
|
+
{ input: 'abcdef', expectedPadding: 2 },
|
|
101
|
+
];
|
|
102
|
+
testCases.forEach(({ input, expectedPadding }) => {
|
|
103
|
+
const result = fromUrlSafeBase64(input);
|
|
104
|
+
const paddingCount = (result.match(/=/g) || []).length;
|
|
105
|
+
assert.strictEqual(paddingCount, expectedPadding);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
it('should handle strings without special characters', () => {
|
|
109
|
+
const input = 'abcdefghijklmnop';
|
|
110
|
+
const result = fromUrlSafeBase64(input);
|
|
111
|
+
assert.ok(result);
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
describe('toUrlSafeBase64', () => {
|
|
115
|
+
it('should convert standard base64 to URL-safe', () => {
|
|
116
|
+
const standard = 'uU0nuZNNPgilLlLX2n2r+sSE7+N6U4DukIj3rOLvzek=';
|
|
117
|
+
const urlSafe = toUrlSafeBase64(standard);
|
|
118
|
+
// Should not contain standard base64 special characters
|
|
119
|
+
assert.ok(!urlSafe.includes('+'));
|
|
120
|
+
assert.ok(!urlSafe.includes('/'));
|
|
121
|
+
assert.ok(!urlSafe.includes('='));
|
|
122
|
+
// Should contain URL-safe replacements
|
|
123
|
+
assert.ok(urlSafe.includes('-'));
|
|
124
|
+
});
|
|
125
|
+
it('should remove padding', () => {
|
|
126
|
+
const withPadding = 'abc=';
|
|
127
|
+
const result = toUrlSafeBase64(withPadding);
|
|
128
|
+
assert.ok(!result.includes('='));
|
|
129
|
+
assert.strictEqual(result, 'abc');
|
|
130
|
+
});
|
|
131
|
+
it('should be reversible with fromUrlSafeBase64', () => {
|
|
132
|
+
// Start with a standard base64 string with special chars
|
|
133
|
+
const original = 'test+data/with==';
|
|
134
|
+
const urlSafe = toUrlSafeBase64(original);
|
|
135
|
+
const restored = fromUrlSafeBase64(urlSafe);
|
|
136
|
+
// Should restore to equivalent base64 (padding might differ slightly)
|
|
137
|
+
assert.strictEqual(restored.replace(/=+$/, ''), original.replace(/=+$/, ''));
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
describe('Round-trip conversions', () => {
|
|
141
|
+
it('should maintain hash integrity through URL-safe conversion', () => {
|
|
142
|
+
const content = 'test content for hashing';
|
|
143
|
+
const hash = sha256(content);
|
|
144
|
+
// Convert to standard base64 and back
|
|
145
|
+
const standard = fromUrlSafeBase64(hash);
|
|
146
|
+
const backToUrlSafe = toUrlSafeBase64(standard);
|
|
147
|
+
assert.strictEqual(backToUrlSafe, hash);
|
|
148
|
+
});
|
|
149
|
+
it('should verify hash after conversion', () => {
|
|
150
|
+
const content = 'verification test';
|
|
151
|
+
const hash = sha256(content);
|
|
152
|
+
// Convert and back
|
|
153
|
+
const standard = fromUrlSafeBase64(hash);
|
|
154
|
+
const urlSafe = toUrlSafeBase64(standard);
|
|
155
|
+
// Should still verify
|
|
156
|
+
const isValid = verify(content, urlSafe);
|
|
157
|
+
assert.strictEqual(isValid, true);
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
describe('Edge cases', () => {
|
|
161
|
+
it('should handle very long strings', () => {
|
|
162
|
+
const longString = 'a'.repeat(10000);
|
|
163
|
+
const hash = sha256(longString);
|
|
164
|
+
assert.ok(hash);
|
|
165
|
+
assert.strictEqual(hash.length, 43);
|
|
166
|
+
});
|
|
167
|
+
it('should handle special characters', () => {
|
|
168
|
+
const special = '!@#$%^&*()_+-=[]{}|;:,.<>?';
|
|
169
|
+
const hash = sha256(special);
|
|
170
|
+
assert.ok(hash);
|
|
171
|
+
const isValid = verify(special, hash);
|
|
172
|
+
assert.strictEqual(isValid, true);
|
|
173
|
+
});
|
|
174
|
+
it('should handle newlines and whitespace', () => {
|
|
175
|
+
const withNewlines = 'line1\nline2\r\nline3\ttab';
|
|
176
|
+
const hash = sha256(withNewlines);
|
|
177
|
+
assert.ok(hash);
|
|
178
|
+
const isValid = verify(withNewlines, hash);
|
|
179
|
+
assert.strictEqual(isValid, true);
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
//# sourceMappingURL=hash.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.test.js","sourceRoot":"","sources":["../src/hash.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observation.test.d.ts","sourceRoot":"","sources":["../src/observation.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { describe, it } from 'node:test';
|
|
2
|
+
import assert from 'node:assert';
|
|
3
|
+
import { buildObservationContent, parseObservation, buildStatement, parseStatement, } from './protocol';
|
|
4
|
+
describe('Observation', () => {
|
|
5
|
+
it('should build observation content', () => {
|
|
6
|
+
const observation = {
|
|
7
|
+
subject: 'John_Doe@globalcoordination.johndoe.com',
|
|
8
|
+
property: 'Among the members of this network they are the most appropriate to represent',
|
|
9
|
+
value: 'Germany',
|
|
10
|
+
};
|
|
11
|
+
const content = buildObservationContent(observation);
|
|
12
|
+
assert.ok(content.includes('Type: Observation'));
|
|
13
|
+
assert.ok(content.includes('Subject: John_Doe@globalcoordination.johndoe.com'));
|
|
14
|
+
assert.ok(content.includes('Property: Among the members of this network they are the most appropriate to represent'));
|
|
15
|
+
assert.ok(content.includes('Value: Germany'));
|
|
16
|
+
});
|
|
17
|
+
it('should parse observation content', () => {
|
|
18
|
+
const content = ' Type: Observation\n' +
|
|
19
|
+
' Subject: John_Doe@globalcoordination.johndoe.com\n' +
|
|
20
|
+
' Property: Among the members of this network they are the most appropriate to represent\n' +
|
|
21
|
+
' Value: Germany\n';
|
|
22
|
+
const parsed = parseObservation(content);
|
|
23
|
+
assert.strictEqual(parsed.subject, 'John_Doe@globalcoordination.johndoe.com');
|
|
24
|
+
assert.strictEqual(parsed.property, 'Among the members of this network they are the most appropriate to represent');
|
|
25
|
+
assert.strictEqual(parsed.value, 'Germany');
|
|
26
|
+
});
|
|
27
|
+
it('should build and parse observation in a statement', () => {
|
|
28
|
+
const observation = {
|
|
29
|
+
subject: 'John_Doe@globalcoordination.johndoe.com',
|
|
30
|
+
property: 'Among the members of this network they are the most appropriate to represent',
|
|
31
|
+
value: 'Germany',
|
|
32
|
+
};
|
|
33
|
+
const content = buildObservationContent(observation);
|
|
34
|
+
const statement = buildStatement({
|
|
35
|
+
domain: 'example.com',
|
|
36
|
+
author: 'Test Author',
|
|
37
|
+
time: new Date('2023-06-15T10:00:00Z'),
|
|
38
|
+
content,
|
|
39
|
+
});
|
|
40
|
+
const parsed = parseStatement({ statement });
|
|
41
|
+
assert.strictEqual(parsed.type, 'observation');
|
|
42
|
+
const parsedObservation = parseObservation(parsed.content);
|
|
43
|
+
assert.strictEqual(parsedObservation.subject, observation.subject);
|
|
44
|
+
assert.strictEqual(parsedObservation.property, observation.property);
|
|
45
|
+
assert.strictEqual(parsedObservation.value, observation.value);
|
|
46
|
+
});
|
|
47
|
+
it('should throw error when subject is missing', () => {
|
|
48
|
+
assert.throws(() => {
|
|
49
|
+
buildObservationContent({
|
|
50
|
+
subject: '',
|
|
51
|
+
property: 'Some property',
|
|
52
|
+
value: 'Some value',
|
|
53
|
+
});
|
|
54
|
+
}, /Subject is required/);
|
|
55
|
+
});
|
|
56
|
+
it('should throw error when property is missing', () => {
|
|
57
|
+
assert.throws(() => {
|
|
58
|
+
buildObservationContent({
|
|
59
|
+
subject: 'test@example.com',
|
|
60
|
+
property: '',
|
|
61
|
+
value: 'Some value',
|
|
62
|
+
});
|
|
63
|
+
}, /Property is required/);
|
|
64
|
+
});
|
|
65
|
+
it('should throw error when value is missing', () => {
|
|
66
|
+
assert.throws(() => {
|
|
67
|
+
buildObservationContent({
|
|
68
|
+
subject: 'test@example.com',
|
|
69
|
+
property: 'Some property',
|
|
70
|
+
value: '',
|
|
71
|
+
});
|
|
72
|
+
}, /Value is required/);
|
|
73
|
+
});
|
|
74
|
+
it('should handle various subject formats', () => {
|
|
75
|
+
const observations = [
|
|
76
|
+
{
|
|
77
|
+
subject: 'user@domain.com',
|
|
78
|
+
property: 'role',
|
|
79
|
+
value: 'administrator',
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
subject: 'https://example.com/resource/123',
|
|
83
|
+
property: 'status',
|
|
84
|
+
value: 'active',
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
subject: 'Organization Name',
|
|
88
|
+
property: 'headquarters',
|
|
89
|
+
value: 'Berlin, Germany',
|
|
90
|
+
},
|
|
91
|
+
];
|
|
92
|
+
observations.forEach((obs) => {
|
|
93
|
+
const content = buildObservationContent(obs);
|
|
94
|
+
const parsed = parseObservation(content);
|
|
95
|
+
assert.strictEqual(parsed.subject, obs.subject);
|
|
96
|
+
assert.strictEqual(parsed.property, obs.property);
|
|
97
|
+
assert.strictEqual(parsed.value, obs.value);
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
//# sourceMappingURL=observation.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observation.test.js","sourceRoot":"","sources":["../src/observation.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"organisation-verification.test.d.ts","sourceRoot":"","sources":["../src/organisation-verification.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { describe, it } from 'node:test';
|
|
2
|
+
import assert from 'node:assert';
|
|
3
|
+
import { parseOrganisationVerification, buildOrganisationVerificationContent } from './protocol';
|
|
4
|
+
const randomUnicodeString = () => Array.from({ length: 20 }, () => String.fromCharCode(Math.floor(Math.random() * 65536)))
|
|
5
|
+
.join('')
|
|
6
|
+
.replace(/[\n;>=<"''\\]/g, '');
|
|
7
|
+
describe('Organisation verification building', () => {
|
|
8
|
+
it('build & parse function compatibility: input=parse(build(input))', () => {
|
|
9
|
+
const [name, englishName, city, domain, foreignDomain, serialNumber, reliabilityPolicy] = Array.from({ length: 7 }, randomUnicodeString);
|
|
10
|
+
const country = 'Germany';
|
|
11
|
+
const province = 'Bayern';
|
|
12
|
+
const legalForm = 'corporation';
|
|
13
|
+
const employeeCount = '100-1000';
|
|
14
|
+
const confidence = 0.8;
|
|
15
|
+
const verificationContent = buildOrganisationVerificationContent({
|
|
16
|
+
name,
|
|
17
|
+
englishName,
|
|
18
|
+
country,
|
|
19
|
+
city,
|
|
20
|
+
province,
|
|
21
|
+
legalForm,
|
|
22
|
+
domain,
|
|
23
|
+
foreignDomain,
|
|
24
|
+
serialNumber,
|
|
25
|
+
confidence,
|
|
26
|
+
reliabilityPolicy,
|
|
27
|
+
employeeCount,
|
|
28
|
+
});
|
|
29
|
+
const parsedVerification = parseOrganisationVerification(verificationContent);
|
|
30
|
+
assert.strictEqual(parsedVerification.name, name);
|
|
31
|
+
assert.strictEqual(parsedVerification.englishName, englishName);
|
|
32
|
+
assert.strictEqual(parsedVerification.country, country);
|
|
33
|
+
assert.strictEqual(parsedVerification.city, city);
|
|
34
|
+
assert.strictEqual(parsedVerification.province, province);
|
|
35
|
+
assert.strictEqual(parsedVerification.legalForm, legalForm);
|
|
36
|
+
assert.strictEqual(parsedVerification.domain, domain);
|
|
37
|
+
assert.strictEqual(parsedVerification.foreignDomain, foreignDomain);
|
|
38
|
+
assert.strictEqual(parsedVerification.serialNumber, serialNumber);
|
|
39
|
+
assert.strictEqual(parsedVerification.confidence, confidence);
|
|
40
|
+
assert.strictEqual(parsedVerification.reliabilityPolicy, reliabilityPolicy);
|
|
41
|
+
assert.strictEqual(parsedVerification.employeeCount, employeeCount);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
//# sourceMappingURL=organisation-verification.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"organisation-verification.test.js","sourceRoot":"","sources":["../src/organisation-verification.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,6BAA6B,EAAE,oCAAoC,EAAE,MAAM,YAAY,CAAC;AAEjG,MAAM,mBAAmB,GAAG,GAAG,EAAE,CAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;KACrF,IAAI,CAAC,EAAE,CAAC;KACR,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;AAEnC,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;IAClD,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,iBAAiB,CAAC,GACrF,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,mBAAmB,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,SAAS,CAAC;QAC1B,MAAM,QAAQ,GAAG,QAAQ,CAAC;QAC1B,MAAM,SAAS,GAAG,aAAa,CAAC;QAChC,MAAM,aAAa,GAAG,UAAU,CAAC;QACjC,MAAM,UAAU,GAAG,GAAG,CAAC;QACvB,MAAM,mBAAmB,GAAG,oCAAoC,CAAC;YAC/D,IAAI;YACJ,WAAW;YACX,OAAO;YACP,IAAI;YACJ,QAAQ;YACR,SAAS;YACT,MAAM;YACN,aAAa;YACb,YAAY;YACZ,UAAU;YACV,iBAAiB;YACjB,aAAa;SACd,CAAC,CAAC;QACH,MAAM,kBAAkB,GAAG,6BAA6B,CAAC,mBAAmB,CAAC,CAAC;QAC9E,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAClD,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAChE,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxD,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAClD,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC1D,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC5D,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACtD,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;QACpE,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;QAClE,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAC9D,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAC;QAC5E,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|