@fireproof/core-test 0.23.13 → 0.23.15-dev-windows
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/blockstore/keyed-crypto-indexeddb-file.test.js +4 -4
- package/blockstore/keyed-crypto-indexeddb-file.test.js.map +1 -1
- package/blockstore/keyed-crypto.test.js +16 -34
- package/blockstore/keyed-crypto.test.js.map +1 -1
- package/fireproof/attachable-subscription.test.js +1 -1
- package/fireproof/attachable-subscription.test.js.map +1 -1
- package/fireproof/attachable.test.js +3 -3
- package/fireproof/attachable.test.js.map +1 -1
- package/helpers.js +3 -2
- package/helpers.js.map +1 -1
- package/package.json +28 -25
- package/protocols/cloud/to-cloud.test.d.ts +1 -0
- package/protocols/cloud/to-cloud.test.js +32 -0
- package/protocols/cloud/to-cloud.test.js.map +1 -0
- package/runtime/device-id.test.d.ts +1 -0
- package/runtime/device-id.test.js +359 -0
- package/runtime/device-id.test.js.map +1 -0
- package/runtime/hash.test.d.ts +1 -0
- package/runtime/hash.test.js +202 -0
- package/runtime/hash.test.js.map +1 -0
- package/runtime/key-bag.test.js +244 -20
- package/runtime/key-bag.test.js.map +1 -1
- package/runtime/meta-key-hack.test.js +4 -4
- package/runtime/meta-key-hack.test.js.map +1 -1
- package/runtime/text-en-decoder.test.d.ts +1 -0
- package/runtime/text-en-decoder.test.js +29 -0
- package/runtime/text-en-decoder.test.js.map +1 -0
- package/tsconfig.json +1 -1
- package/vitest.indexeddb.config.js +5 -1
- package/vitest.indexeddb.config.js.map +1 -1
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { SimpleTokenStrategy } from "@fireproof/core-gateways-cloud";
|
|
2
|
+
import { toCloud } from "use-fireproof";
|
|
3
|
+
import { describe, it, expect } from "vitest";
|
|
4
|
+
describe("toCloud", () => {
|
|
5
|
+
it("should be the same instance", () => {
|
|
6
|
+
const ref = toCloud({
|
|
7
|
+
urls: { base: "memory://test" },
|
|
8
|
+
strategy: new SimpleTokenStrategy(""),
|
|
9
|
+
});
|
|
10
|
+
for (let i = 0; i < 10; i++) {
|
|
11
|
+
const tc = toCloud({
|
|
12
|
+
urls: { base: "memory://test" },
|
|
13
|
+
strategy: new SimpleTokenStrategy(""),
|
|
14
|
+
});
|
|
15
|
+
expect(tc).toBeDefined();
|
|
16
|
+
expect(tc).toBe(ref);
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
it("should be other instance", () => {
|
|
20
|
+
const ref = toCloud({
|
|
21
|
+
urls: { base: "memory://test0" },
|
|
22
|
+
strategy: new SimpleTokenStrategy(""),
|
|
23
|
+
});
|
|
24
|
+
const tc = toCloud({
|
|
25
|
+
urls: { base: "memory://test" },
|
|
26
|
+
strategy: new SimpleTokenStrategy(""),
|
|
27
|
+
});
|
|
28
|
+
expect(tc).toBeDefined();
|
|
29
|
+
expect(tc).not.toBe(ref);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=to-cloud.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"to-cloud.test.js","sourceRoot":"","sources":["../../../jsr/protocols/cloud/to-cloud.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC;IACxB,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,OAAO,CAAC;YAClB,IAAI,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE;YAC/B,QAAQ,EAAE,IAAI,mBAAmB,CAAC,EAAE,CAAC;SACtC,CAAC,CAAC;QACH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,MAAM,EAAE,GAAG,OAAO,CAAC;gBACjB,IAAI,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE;gBAC/B,QAAQ,EAAE,IAAI,mBAAmB,CAAC,EAAE,CAAC;aACtC,CAAC,CAAC;YACH,MAAM,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;YAEzB,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;IAAA,CACF,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,OAAO,CAAC;YAClB,IAAI,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE;YAChC,QAAQ,EAAE,IAAI,mBAAmB,CAAC,EAAE,CAAC;SACtC,CAAC,CAAC;QACH,MAAM,EAAE,GAAG,OAAO,CAAC;YACjB,IAAI,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE;YAC/B,QAAQ,EAAE,IAAI,mBAAmB,CAAC,EAAE,CAAC;SACtC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAAA,CAC1B,CAAC,CAAC;AAAA,CACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, assert } from "vitest";
|
|
2
|
+
import { decodeProtectedHeader, importJWK, jwtVerify } from "jose";
|
|
3
|
+
import { ensureSuperThis } from "@fireproof/core-runtime";
|
|
4
|
+
import { DeviceIdCA, DeviceIdCSR, DeviceIdKey, DeviceIdSignMsg, DeviceIdValidator, DeviceIdVerifyMsg, } from "@fireproof/core-device-id";
|
|
5
|
+
import { CertificatePayloadSchema, } from "@fireproof/core-types-base";
|
|
6
|
+
const sthis = ensureSuperThis();
|
|
7
|
+
describe("DeviceIdKey", () => {
|
|
8
|
+
it("should export private key as JWK", async () => {
|
|
9
|
+
const key = await DeviceIdKey.create();
|
|
10
|
+
const jwk = await key.exportPrivateJWK();
|
|
11
|
+
expect(jwk).toBeDefined();
|
|
12
|
+
expect(jwk.kty).toBe("EC");
|
|
13
|
+
if (jwk.kty !== "EC") {
|
|
14
|
+
assert.fail("Invalid JWK");
|
|
15
|
+
}
|
|
16
|
+
expect(jwk.d).toBeDefined();
|
|
17
|
+
const rImported = await DeviceIdKey.createFromJWK(jwk);
|
|
18
|
+
if (rImported.isErr()) {
|
|
19
|
+
assert.fail(rImported.Err().message);
|
|
20
|
+
}
|
|
21
|
+
const imported = rImported.Ok();
|
|
22
|
+
const jwk2 = await imported.exportPrivateJWK();
|
|
23
|
+
expect(jwk2).toEqual(jwk);
|
|
24
|
+
expect(await key.publicKey()).toEqual(await imported.publicKey());
|
|
25
|
+
expect(await key.publicKey()).toEqual({
|
|
26
|
+
crv: "P-256",
|
|
27
|
+
kty: "EC",
|
|
28
|
+
x: expect.any(String),
|
|
29
|
+
y: expect.any(String),
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
describe("DeviceIdCSR and DeviceIdValidator integration", () => {
|
|
34
|
+
it("should create and validate a CSR successfully", async () => {
|
|
35
|
+
const key = await DeviceIdKey.create();
|
|
36
|
+
const csr = new DeviceIdCSR(sthis, key);
|
|
37
|
+
const subject = {
|
|
38
|
+
commonName: "test.example.com",
|
|
39
|
+
organization: "Test Corp",
|
|
40
|
+
locality: "San Francisco",
|
|
41
|
+
stateOrProvinceName: "California",
|
|
42
|
+
countryName: "US",
|
|
43
|
+
};
|
|
44
|
+
const extensions = {
|
|
45
|
+
subjectAltName: ["test.example.com", "www.test.example.com"],
|
|
46
|
+
keyUsage: ["digitalSignature", "keyEncipherment"],
|
|
47
|
+
extendedKeyUsage: ["serverAuth", "clientAuth"],
|
|
48
|
+
};
|
|
49
|
+
const rCsrJWS = await csr.createCSR(subject, extensions);
|
|
50
|
+
if (rCsrJWS.isErr()) {
|
|
51
|
+
assert.fail(rCsrJWS.Err().message);
|
|
52
|
+
}
|
|
53
|
+
const csrJWS = rCsrJWS.Ok();
|
|
54
|
+
expect(csrJWS).toBeDefined();
|
|
55
|
+
expect(typeof csrJWS).toBe("string");
|
|
56
|
+
const validator = new DeviceIdValidator();
|
|
57
|
+
const validation = await validator.validateCSR(csrJWS);
|
|
58
|
+
expect(validation.valid).toBe(true);
|
|
59
|
+
if (!validation.valid) {
|
|
60
|
+
throw new Error(`Validation failed: ${validation.error}`);
|
|
61
|
+
}
|
|
62
|
+
expect(validation.payload).toBeDefined();
|
|
63
|
+
expect(validation.publicKey).toBeDefined();
|
|
64
|
+
if (!validation.payload) {
|
|
65
|
+
throw new Error("No payload");
|
|
66
|
+
}
|
|
67
|
+
const payload = validation.payload;
|
|
68
|
+
expect(payload.sub).toBe(subject.commonName);
|
|
69
|
+
expect(payload.iss).toBe("csr-client");
|
|
70
|
+
expect(payload.aud).toBe("certificate-authority");
|
|
71
|
+
expect(payload.csr.subject).toEqual(subject);
|
|
72
|
+
expect(payload.csr.extensions?.subjectAltName).toEqual(extensions.subjectAltName);
|
|
73
|
+
expect(payload.csr.extensions?.keyUsage).toEqual(extensions.keyUsage);
|
|
74
|
+
expect(payload.csr.extensions?.extendedKeyUsage).toEqual(extensions.extendedKeyUsage);
|
|
75
|
+
});
|
|
76
|
+
it("should fail validation for tampered CSR", async () => {
|
|
77
|
+
const key = await DeviceIdKey.create();
|
|
78
|
+
const csr = new DeviceIdCSR(sthis, key);
|
|
79
|
+
const subject = { commonName: "test.example.com" };
|
|
80
|
+
const rCsrJWS = await csr.createCSR(subject);
|
|
81
|
+
if (rCsrJWS.isErr()) {
|
|
82
|
+
assert.fail(rCsrJWS.Err().message);
|
|
83
|
+
}
|
|
84
|
+
const csrJWS = rCsrJWS.Ok();
|
|
85
|
+
const tamperedCSR = csrJWS.slice(0, -10) + "tampered123";
|
|
86
|
+
const validator = new DeviceIdValidator();
|
|
87
|
+
const validation = await validator.validateCSR(tamperedCSR);
|
|
88
|
+
expect(validation.valid).toBe(false);
|
|
89
|
+
if (validation.valid) {
|
|
90
|
+
throw new Error("Validation should have failed");
|
|
91
|
+
}
|
|
92
|
+
expect(validation.error).toBeDefined();
|
|
93
|
+
});
|
|
94
|
+
it("should fail validation for CSR without public key in header", async () => {
|
|
95
|
+
const validator = new DeviceIdValidator();
|
|
96
|
+
const invalidCSR = "eyJhbGciOiJFUzI1NiIsInR5cCI6IkNTUitKV1QifQ.eyJzdWIiOiJ0ZXN0In0.invalid";
|
|
97
|
+
const validation = await validator.validateCSR(invalidCSR);
|
|
98
|
+
expect(validation.valid).toBe(false);
|
|
99
|
+
if (validation.valid) {
|
|
100
|
+
throw new Error("Validation should have failed");
|
|
101
|
+
}
|
|
102
|
+
expect(validation.error).toContain("No public key in CSR header");
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
describe("DeviceIdCA certificate generation and validation", () => {
|
|
106
|
+
it("should generate and validate a certificate from CSR", async () => {
|
|
107
|
+
const caKey = await DeviceIdKey.create();
|
|
108
|
+
const caSubject = {
|
|
109
|
+
commonName: "Test CA",
|
|
110
|
+
organization: "Test CA Corp",
|
|
111
|
+
locality: "San Francisco",
|
|
112
|
+
stateOrProvinceName: "California",
|
|
113
|
+
countryName: "US",
|
|
114
|
+
};
|
|
115
|
+
const mockActions = {
|
|
116
|
+
generateSerialNumber: async () => crypto.randomUUID(),
|
|
117
|
+
};
|
|
118
|
+
const ca = new DeviceIdCA({
|
|
119
|
+
base64: sthis.txt.base64,
|
|
120
|
+
caKey,
|
|
121
|
+
caSubject,
|
|
122
|
+
actions: mockActions,
|
|
123
|
+
});
|
|
124
|
+
const deviceKey = await DeviceIdKey.create();
|
|
125
|
+
const csr = new DeviceIdCSR(sthis, deviceKey);
|
|
126
|
+
const subject = {
|
|
127
|
+
commonName: "device.example.com",
|
|
128
|
+
organization: "Device Corp",
|
|
129
|
+
locality: "New York",
|
|
130
|
+
stateOrProvinceName: "New York",
|
|
131
|
+
countryName: "US",
|
|
132
|
+
};
|
|
133
|
+
const extensions = {
|
|
134
|
+
subjectAltName: ["device.example.com", "alt.device.example.com"],
|
|
135
|
+
keyUsage: ["digitalSignature", "keyEncipherment"],
|
|
136
|
+
extendedKeyUsage: ["serverAuth"],
|
|
137
|
+
};
|
|
138
|
+
const rCsrJWS = await csr.createCSR(subject, extensions);
|
|
139
|
+
if (rCsrJWS.isErr()) {
|
|
140
|
+
assert.fail(rCsrJWS.Err().message);
|
|
141
|
+
}
|
|
142
|
+
const csrJWS = rCsrJWS.Ok();
|
|
143
|
+
const rCertificate = await ca.processCSR(csrJWS);
|
|
144
|
+
if (rCertificate.isErr()) {
|
|
145
|
+
assert.fail(rCertificate.Err().message);
|
|
146
|
+
}
|
|
147
|
+
const certificate = rCertificate.Ok();
|
|
148
|
+
expect(certificate.certificateJWT).toBeDefined();
|
|
149
|
+
expect(certificate.format).toBe("JWS");
|
|
150
|
+
expect(certificate.serialNumber).toBeDefined();
|
|
151
|
+
expect(certificate.issuer).toBe(caSubject.commonName);
|
|
152
|
+
expect(certificate.subject).toBe(subject.commonName);
|
|
153
|
+
expect(certificate.validityPeriod.notBefore).toBeInstanceOf(Date);
|
|
154
|
+
expect(certificate.validityPeriod.notAfter).toBeInstanceOf(Date);
|
|
155
|
+
expect(certificate.publicKey).toBeDefined();
|
|
156
|
+
const caPublicKey = await caKey.publicKey();
|
|
157
|
+
const caKeyForVerification = await importJWK(caPublicKey, "ES256");
|
|
158
|
+
const { payload: certPayload, protectedHeader } = await jwtVerify(certificate.certificateJWT, caKeyForVerification, {
|
|
159
|
+
typ: "CERT+JWT",
|
|
160
|
+
});
|
|
161
|
+
expect(certPayload.iss).toBe(caSubject.commonName);
|
|
162
|
+
expect(certPayload.sub).toBe(subject.commonName);
|
|
163
|
+
expect(certPayload.jti).toBe(certificate.serialNumber);
|
|
164
|
+
expect(certPayload.certificate).toBeDefined();
|
|
165
|
+
const cert = certPayload.certificate;
|
|
166
|
+
expect(cert.subject).toEqual(subject);
|
|
167
|
+
expect(cert.issuer).toEqual(caSubject);
|
|
168
|
+
expect(cert.subjectPublicKeyInfo).toEqual(certificate.publicKey);
|
|
169
|
+
expect(protectedHeader.alg).toBe("ES256");
|
|
170
|
+
expect(protectedHeader.typ).toBe("CERT+JWT");
|
|
171
|
+
expect(protectedHeader.kid).toBe(await caKey.fingerPrint());
|
|
172
|
+
});
|
|
173
|
+
it("should reject invalid CSR", async () => {
|
|
174
|
+
const caKey = await DeviceIdKey.create();
|
|
175
|
+
const caSubject = { commonName: "Test CA" };
|
|
176
|
+
const mockActions = {
|
|
177
|
+
generateSerialNumber: async () => crypto.randomUUID(),
|
|
178
|
+
};
|
|
179
|
+
const ca = new DeviceIdCA({
|
|
180
|
+
base64: sthis.txt.base64,
|
|
181
|
+
caKey,
|
|
182
|
+
caSubject,
|
|
183
|
+
actions: mockActions,
|
|
184
|
+
});
|
|
185
|
+
const invalidCSR = "invalid.csr.string";
|
|
186
|
+
expect((await ca.processCSR(invalidCSR)).Err().message).toContain("Invalid Token");
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
describe("DeviceIdSignMsg", () => {
|
|
190
|
+
let deviceKey;
|
|
191
|
+
let caKey;
|
|
192
|
+
let certificate;
|
|
193
|
+
const { base64 } = ensureSuperThis().txt;
|
|
194
|
+
let ca;
|
|
195
|
+
const caSubject = {
|
|
196
|
+
commonName: "Test CA",
|
|
197
|
+
organization: "Test CA Corp",
|
|
198
|
+
};
|
|
199
|
+
const jwtPayload = {
|
|
200
|
+
iss: "test",
|
|
201
|
+
sub: "test",
|
|
202
|
+
aud: "test",
|
|
203
|
+
iat: Math.floor(Date.now() / 1000),
|
|
204
|
+
nbf: Math.floor(Date.now() / 1000),
|
|
205
|
+
exp: Math.floor(Date.now() / 1000) + 3600,
|
|
206
|
+
jti: "test",
|
|
207
|
+
};
|
|
208
|
+
const mockActions = {
|
|
209
|
+
generateSerialNumber: async () => crypto.randomUUID(),
|
|
210
|
+
};
|
|
211
|
+
beforeEach(async () => {
|
|
212
|
+
caKey = await DeviceIdKey.create();
|
|
213
|
+
deviceKey = await DeviceIdKey.create();
|
|
214
|
+
ca = new DeviceIdCA({
|
|
215
|
+
base64: sthis.txt.base64,
|
|
216
|
+
caKey,
|
|
217
|
+
caSubject,
|
|
218
|
+
actions: mockActions,
|
|
219
|
+
});
|
|
220
|
+
const csr = new DeviceIdCSR(sthis, deviceKey);
|
|
221
|
+
const subject = {
|
|
222
|
+
commonName: "device.example.com",
|
|
223
|
+
organization: "Device Corp",
|
|
224
|
+
};
|
|
225
|
+
const rCsrJWS = await csr.createCSR(subject);
|
|
226
|
+
if (rCsrJWS.isErr()) {
|
|
227
|
+
assert.fail(rCsrJWS.Err().message);
|
|
228
|
+
}
|
|
229
|
+
const csrJWS = rCsrJWS.Ok();
|
|
230
|
+
const rCertResult = await ca.processCSR(csrJWS);
|
|
231
|
+
const caPublicKey = await caKey.publicKey();
|
|
232
|
+
const caKeyForVerification = await importJWK(caPublicKey, "ES256");
|
|
233
|
+
const { payload } = await jwtVerify(rCertResult.Ok().certificateJWT, caKeyForVerification, { typ: "CERT+JWT" });
|
|
234
|
+
certificate = CertificatePayloadSchema.parse(payload);
|
|
235
|
+
});
|
|
236
|
+
it("should sign a payload and include certificate information", async () => {
|
|
237
|
+
const signMsg = new DeviceIdSignMsg(base64, deviceKey, certificate);
|
|
238
|
+
const payload = { ...jwtPayload, message: "test payload", timestamp: Date.now() };
|
|
239
|
+
const jwt = await signMsg.sign(payload);
|
|
240
|
+
expect(jwt).toBeDefined();
|
|
241
|
+
expect(typeof jwt).toBe("string");
|
|
242
|
+
const header = decodeProtectedHeader(jwt);
|
|
243
|
+
expect(header.alg).toBe("ES256");
|
|
244
|
+
expect(header.typ).toBe("JWT");
|
|
245
|
+
expect(header.kid).toBe(await deviceKey.fingerPrint());
|
|
246
|
+
expect(header.x5c).toBeDefined();
|
|
247
|
+
expect(Array.isArray(header.x5c)).toBe(true);
|
|
248
|
+
expect(header.x5c?.length).toBe(1);
|
|
249
|
+
expect(header.x5t).toBeDefined();
|
|
250
|
+
expect(header["x5t#S256"]).toBeDefined();
|
|
251
|
+
});
|
|
252
|
+
it("should verify signed JWT with device public key", async () => {
|
|
253
|
+
const signMsg = new DeviceIdSignMsg(base64, deviceKey, certificate);
|
|
254
|
+
const payload = { ...jwtPayload, message: "verification test", id: 123 };
|
|
255
|
+
const jwt = await signMsg.sign(payload);
|
|
256
|
+
const devicePublicKey = await deviceKey.publicKey();
|
|
257
|
+
const deviceKeyForVerification = await importJWK(devicePublicKey, "ES256");
|
|
258
|
+
const { payload: verifiedPayload } = await jwtVerify(jwt, deviceKeyForVerification);
|
|
259
|
+
expect(verifiedPayload.message).toBe(payload.message);
|
|
260
|
+
expect(verifiedPayload.id).toBe(payload.id);
|
|
261
|
+
expect(verifiedPayload.iat).toBeDefined();
|
|
262
|
+
expect(verifiedPayload.exp).toBeDefined();
|
|
263
|
+
});
|
|
264
|
+
it("should include valid certificate thumbprints", async () => {
|
|
265
|
+
const signMsg = new DeviceIdSignMsg(base64, deviceKey, certificate);
|
|
266
|
+
const payload = { ...jwtPayload, test: "thumbprint validation" };
|
|
267
|
+
const jwt = await signMsg.sign(payload);
|
|
268
|
+
const header = decodeProtectedHeader(jwt);
|
|
269
|
+
expect(typeof header.x5t).toBe("string");
|
|
270
|
+
expect(header.x5t?.length).toBeGreaterThan(0);
|
|
271
|
+
expect(typeof header["x5t#S256"]).toBe("string");
|
|
272
|
+
expect(header["x5t#S256"].length).toBeGreaterThan(0);
|
|
273
|
+
});
|
|
274
|
+
it("should fail verification with wrong key", async () => {
|
|
275
|
+
const signMsg = new DeviceIdSignMsg(base64, deviceKey, certificate);
|
|
276
|
+
const payload = { ...jwtPayload, message: "wrong key test" };
|
|
277
|
+
const jwt = await signMsg.sign(payload);
|
|
278
|
+
const wrongKey = await DeviceIdKey.create();
|
|
279
|
+
const wrongPublicKey = await wrongKey.publicKey();
|
|
280
|
+
const wrongKeyForVerification = await importJWK(wrongPublicKey, "ES256");
|
|
281
|
+
await expect(jwtVerify(jwt, wrongKeyForVerification)).rejects.toThrow();
|
|
282
|
+
});
|
|
283
|
+
it("should verify JWT with valid certificate", async () => {
|
|
284
|
+
const signMsg = new DeviceIdSignMsg(base64, deviceKey, certificate);
|
|
285
|
+
const payload = { ...jwtPayload, message: "verification test", id: 123 };
|
|
286
|
+
const jwt = await signMsg.sign(payload);
|
|
287
|
+
expect(jwt).toBeDefined();
|
|
288
|
+
expect(typeof jwt).toBe("string");
|
|
289
|
+
const caCert = await ca.caCertificate();
|
|
290
|
+
const deviceVerifyMsg = new DeviceIdVerifyMsg(base64, [caCert.Ok()], {
|
|
291
|
+
clockTolerance: 60,
|
|
292
|
+
maxAge: 3600,
|
|
293
|
+
});
|
|
294
|
+
const ret = await deviceVerifyMsg.verifyWithCertificate(jwt);
|
|
295
|
+
expect(ret.valid).toBe(true);
|
|
296
|
+
});
|
|
297
|
+
it.skip("change the caKey", async () => {
|
|
298
|
+
const signMsg = new DeviceIdSignMsg(base64, deviceKey, certificate);
|
|
299
|
+
const payload = { ...jwtPayload, message: "verification test", id: 123 };
|
|
300
|
+
const jwt = await signMsg.sign(payload);
|
|
301
|
+
expect(jwt).toBeDefined();
|
|
302
|
+
expect(typeof jwt).toBe("string");
|
|
303
|
+
const newCaKey = await DeviceIdKey.create();
|
|
304
|
+
const newCa = new DeviceIdCA({
|
|
305
|
+
base64: sthis.txt.base64,
|
|
306
|
+
caKey: newCaKey,
|
|
307
|
+
caSubject,
|
|
308
|
+
actions: mockActions,
|
|
309
|
+
});
|
|
310
|
+
const deviceVerifyMsg = new DeviceIdVerifyMsg(base64, [(await newCa.caCertificate()).Ok()], {
|
|
311
|
+
clockTolerance: 60,
|
|
312
|
+
maxAge: 3600,
|
|
313
|
+
});
|
|
314
|
+
const ret = await deviceVerifyMsg.verifyWithCertificate(jwt);
|
|
315
|
+
expect(ret.valid).toBe(false);
|
|
316
|
+
});
|
|
317
|
+
it("use a new deviceId ", async () => {
|
|
318
|
+
const newDeviceKey = await DeviceIdKey.create();
|
|
319
|
+
const signMsg = new DeviceIdSignMsg(base64, newDeviceKey, certificate);
|
|
320
|
+
const payload = { ...jwtPayload, message: "verification test", id: 123 };
|
|
321
|
+
const jwt = await signMsg.sign(payload);
|
|
322
|
+
expect(jwt).toBeDefined();
|
|
323
|
+
expect(typeof jwt).toBe("string");
|
|
324
|
+
const newCaKey = await DeviceIdKey.create();
|
|
325
|
+
const newCa = new DeviceIdCA({
|
|
326
|
+
base64: sthis.txt.base64,
|
|
327
|
+
caKey: newCaKey,
|
|
328
|
+
caSubject,
|
|
329
|
+
actions: mockActions,
|
|
330
|
+
});
|
|
331
|
+
const deviceVerifyMsg = new DeviceIdVerifyMsg(base64, [(await newCa.caCertificate()).Ok()], {
|
|
332
|
+
clockTolerance: 60,
|
|
333
|
+
maxAge: 3600,
|
|
334
|
+
});
|
|
335
|
+
const ret = await deviceVerifyMsg.verifyWithCertificate(jwt);
|
|
336
|
+
expect(ret.valid).toBe(false);
|
|
337
|
+
});
|
|
338
|
+
it("use a forged caCert", async () => {
|
|
339
|
+
const signMsg = new DeviceIdSignMsg(base64, deviceKey, { ...certificate, nbf: certificate.nbf + 1 });
|
|
340
|
+
const payload = { ...jwtPayload, message: "verification test", id: 123 };
|
|
341
|
+
const jwt = await signMsg.sign(payload);
|
|
342
|
+
expect(jwt).toBeDefined();
|
|
343
|
+
expect(typeof jwt).toBe("string");
|
|
344
|
+
const newCaKey = await DeviceIdKey.create();
|
|
345
|
+
const newCa = new DeviceIdCA({
|
|
346
|
+
base64: sthis.txt.base64,
|
|
347
|
+
caKey: newCaKey,
|
|
348
|
+
caSubject,
|
|
349
|
+
actions: mockActions,
|
|
350
|
+
});
|
|
351
|
+
const deviceVerifyMsg = new DeviceIdVerifyMsg(base64, [(await newCa.caCertificate()).Ok()], {
|
|
352
|
+
clockTolerance: 60,
|
|
353
|
+
maxAge: 3600,
|
|
354
|
+
});
|
|
355
|
+
const ret = await deviceVerifyMsg.verifyWithCertificate(jwt);
|
|
356
|
+
expect(ret.valid).toBe(false);
|
|
357
|
+
});
|
|
358
|
+
});
|
|
359
|
+
//# sourceMappingURL=device-id.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-id.test.js","sourceRoot":"","sources":["../../jsr/runtime/device-id.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { hashStringSync, hashObjectSync } from "@fireproof/core-runtime";
|
|
3
|
+
describe("Hash functions", () => {
|
|
4
|
+
describe("hashStringSync", () => {
|
|
5
|
+
it("should hash a simple string", () => {
|
|
6
|
+
const result = hashStringSync("hello");
|
|
7
|
+
expect(result).toEqual(expect.any(String));
|
|
8
|
+
expect(result.length).toBeGreaterThan(0);
|
|
9
|
+
});
|
|
10
|
+
it("should produce consistent hashes for the same input", () => {
|
|
11
|
+
const input = "test string";
|
|
12
|
+
const hash1 = hashStringSync(input);
|
|
13
|
+
const hash2 = hashStringSync(input);
|
|
14
|
+
expect(hash1).toBe(hash2);
|
|
15
|
+
});
|
|
16
|
+
it("should produce different hashes for different inputs", () => {
|
|
17
|
+
const hash1 = hashStringSync("hello");
|
|
18
|
+
const hash2 = hashStringSync("world");
|
|
19
|
+
expect(hash1).not.toBe(hash2);
|
|
20
|
+
});
|
|
21
|
+
it("should handle empty string", () => {
|
|
22
|
+
const result = hashStringSync("");
|
|
23
|
+
expect(result).toEqual(expect.any(String));
|
|
24
|
+
expect(result.length).toBeGreaterThan(0);
|
|
25
|
+
});
|
|
26
|
+
it("should handle unicode characters", () => {
|
|
27
|
+
const result = hashStringSync("=%>�");
|
|
28
|
+
expect(result).toEqual(expect.any(String));
|
|
29
|
+
expect(result.length).toBeGreaterThan(0);
|
|
30
|
+
});
|
|
31
|
+
it("should handle long strings", () => {
|
|
32
|
+
const longString = "a".repeat(10000);
|
|
33
|
+
const result = hashStringSync(longString);
|
|
34
|
+
expect(result).toEqual(expect.any(String));
|
|
35
|
+
expect(result.length).toBeGreaterThan(0);
|
|
36
|
+
});
|
|
37
|
+
it("should produce different hashes for strings with different whitespace", () => {
|
|
38
|
+
const hash1 = hashStringSync("hello world");
|
|
39
|
+
const hash2 = hashStringSync("hello world");
|
|
40
|
+
const hash3 = hashStringSync("hello\tworld");
|
|
41
|
+
const hash4 = hashStringSync("hello\nworld");
|
|
42
|
+
expect(hash1).not.toBe(hash2);
|
|
43
|
+
expect(hash1).not.toBe(hash3);
|
|
44
|
+
expect(hash1).not.toBe(hash4);
|
|
45
|
+
expect(hash2).not.toBe(hash3);
|
|
46
|
+
expect(hash2).not.toBe(hash4);
|
|
47
|
+
expect(hash3).not.toBe(hash4);
|
|
48
|
+
});
|
|
49
|
+
it("should be case sensitive", () => {
|
|
50
|
+
const hash1 = hashStringSync("Hello");
|
|
51
|
+
const hash2 = hashStringSync("hello");
|
|
52
|
+
expect(hash1).not.toBe(hash2);
|
|
53
|
+
});
|
|
54
|
+
it("should handle special characters and symbols", () => {
|
|
55
|
+
const specialChars = "!@#$%^&*()_+-=[]{}|;:,.<>?";
|
|
56
|
+
const result = hashStringSync(specialChars);
|
|
57
|
+
expect(result).toEqual(expect.any(String));
|
|
58
|
+
expect(result.length).toBeGreaterThan(0);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
describe("hashObjectSync", () => {
|
|
62
|
+
it("should hash a simple object", () => {
|
|
63
|
+
const obj = { name: "test", value: 42 };
|
|
64
|
+
const result = hashObjectSync(obj);
|
|
65
|
+
expect(result).toEqual(expect.any(String));
|
|
66
|
+
expect(result.length).toBeGreaterThan(0);
|
|
67
|
+
});
|
|
68
|
+
it("should produce consistent hashes for the same object", () => {
|
|
69
|
+
const obj = { name: "test", value: 42 };
|
|
70
|
+
const hash1 = hashObjectSync(obj);
|
|
71
|
+
const hash2 = hashObjectSync(obj);
|
|
72
|
+
expect(hash1).toBe(hash2);
|
|
73
|
+
});
|
|
74
|
+
it("should produce same hash for objects with same properties in different order", () => {
|
|
75
|
+
const obj1 = { name: "test", value: 42 };
|
|
76
|
+
const obj2 = { value: 42, name: "test" };
|
|
77
|
+
const hash1 = hashObjectSync(obj1);
|
|
78
|
+
const hash2 = hashObjectSync(obj2);
|
|
79
|
+
expect(hash1).toBe(hash2);
|
|
80
|
+
});
|
|
81
|
+
it("should produce different hashes for objects with different values", () => {
|
|
82
|
+
const obj1 = { name: "test", value: 42 };
|
|
83
|
+
const obj2 = { name: "test", value: 43 };
|
|
84
|
+
const hash1 = hashObjectSync(obj1);
|
|
85
|
+
const hash2 = hashObjectSync(obj2);
|
|
86
|
+
expect(hash1).not.toBe(hash2);
|
|
87
|
+
});
|
|
88
|
+
it("should handle nested objects", () => {
|
|
89
|
+
const obj = {
|
|
90
|
+
user: {
|
|
91
|
+
name: "John",
|
|
92
|
+
details: {
|
|
93
|
+
age: 30,
|
|
94
|
+
address: {
|
|
95
|
+
city: "New York",
|
|
96
|
+
zip: "10001",
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
const result = hashObjectSync(obj);
|
|
102
|
+
expect(result).toEqual(expect.any(String));
|
|
103
|
+
expect(result.length).toBeGreaterThan(0);
|
|
104
|
+
});
|
|
105
|
+
it("should handle arrays", () => {
|
|
106
|
+
const obj = {
|
|
107
|
+
items: ["apple", "banana", "cherry"],
|
|
108
|
+
numbers: [1, 2, 3],
|
|
109
|
+
};
|
|
110
|
+
const result = hashObjectSync(obj);
|
|
111
|
+
expect(result).toEqual(expect.any(String));
|
|
112
|
+
expect(result.length).toBeGreaterThan(0);
|
|
113
|
+
});
|
|
114
|
+
it("should produce different hashes for arrays with same elements in different order", () => {
|
|
115
|
+
const obj1 = { items: ["apple", "banana", "cherry"] };
|
|
116
|
+
const obj2 = { items: ["banana", "apple", "cherry"] };
|
|
117
|
+
const hash1 = hashObjectSync(obj1);
|
|
118
|
+
const hash2 = hashObjectSync(obj2);
|
|
119
|
+
expect(hash1).not.toBe(hash2);
|
|
120
|
+
});
|
|
121
|
+
it("should handle empty object", () => {
|
|
122
|
+
const result = hashObjectSync({});
|
|
123
|
+
expect(result).toEqual(expect.any(String));
|
|
124
|
+
expect(result.length).toBeGreaterThan(0);
|
|
125
|
+
});
|
|
126
|
+
it("should handle null and undefined values", () => {
|
|
127
|
+
const obj = {
|
|
128
|
+
nullValue: null,
|
|
129
|
+
undefinedValue: undefined,
|
|
130
|
+
normalValue: "test",
|
|
131
|
+
};
|
|
132
|
+
const result = hashObjectSync(obj);
|
|
133
|
+
expect(result).toEqual(expect.any(String));
|
|
134
|
+
expect(result.length).toBeGreaterThan(0);
|
|
135
|
+
});
|
|
136
|
+
it("should handle boolean values", () => {
|
|
137
|
+
const obj = {
|
|
138
|
+
isTrue: true,
|
|
139
|
+
isFalse: false,
|
|
140
|
+
name: "test",
|
|
141
|
+
};
|
|
142
|
+
const result = hashObjectSync(obj);
|
|
143
|
+
expect(result).toEqual(expect.any(String));
|
|
144
|
+
expect(result.length).toBeGreaterThan(0);
|
|
145
|
+
});
|
|
146
|
+
it("should handle mixed data types", () => {
|
|
147
|
+
const obj = {
|
|
148
|
+
string: "hello",
|
|
149
|
+
number: 42,
|
|
150
|
+
boolean: true,
|
|
151
|
+
array: [1, "two", { three: 3 }],
|
|
152
|
+
nested: {
|
|
153
|
+
date: "2023-01-01",
|
|
154
|
+
count: 0,
|
|
155
|
+
},
|
|
156
|
+
};
|
|
157
|
+
const result = hashObjectSync(obj);
|
|
158
|
+
expect(result).toEqual(expect.any(String));
|
|
159
|
+
expect(result.length).toBeGreaterThan(0);
|
|
160
|
+
});
|
|
161
|
+
it("should produce different hashes when properties are added", () => {
|
|
162
|
+
const obj1 = { name: "test" };
|
|
163
|
+
const obj2 = { name: "test", extra: "property" };
|
|
164
|
+
const hash1 = hashObjectSync(obj1);
|
|
165
|
+
const hash2 = hashObjectSync(obj2);
|
|
166
|
+
expect(hash1).not.toBe(hash2);
|
|
167
|
+
});
|
|
168
|
+
it("should produce different hashes when properties are removed", () => {
|
|
169
|
+
const obj1 = { name: "test", value: 42 };
|
|
170
|
+
const obj2 = { name: "test" };
|
|
171
|
+
const hash1 = hashObjectSync(obj1);
|
|
172
|
+
const hash2 = hashObjectSync(obj2);
|
|
173
|
+
expect(hash1).not.toBe(hash2);
|
|
174
|
+
});
|
|
175
|
+
it("should handle objects with many properties", () => {
|
|
176
|
+
const largeObj = {};
|
|
177
|
+
for (let i = 0; i < 100; i++) {
|
|
178
|
+
largeObj[`prop${i}`] = `value${i}`;
|
|
179
|
+
}
|
|
180
|
+
const result = hashObjectSync(largeObj);
|
|
181
|
+
expect(result).toEqual(expect.any(String));
|
|
182
|
+
expect(result.length).toBeGreaterThan(0);
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
describe("Cross-function consistency", () => {
|
|
186
|
+
it("should produce different hashes for string vs object with same content", () => {
|
|
187
|
+
const str = "hello";
|
|
188
|
+
const obj = { value: "hello" };
|
|
189
|
+
const stringHash = hashStringSync(str);
|
|
190
|
+
const objectHash = hashObjectSync(obj);
|
|
191
|
+
expect(stringHash).not.toBe(objectHash);
|
|
192
|
+
});
|
|
193
|
+
it("should produce different hashes for number as string vs number", () => {
|
|
194
|
+
const strObj = { value: "42" };
|
|
195
|
+
const numObj = { value: 42 };
|
|
196
|
+
const stringHash = hashObjectSync(strObj);
|
|
197
|
+
const numberHash = hashObjectSync(numObj);
|
|
198
|
+
expect(stringHash).not.toBe(numberHash);
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
//# sourceMappingURL=hash.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.test.js","sourceRoot":"","sources":["../../jsr/runtime/hash.test.ts"],"names":[],"mappings":"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"}
|