@keyneom/sync-kit 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +40 -5
- package/dist/crypto/profiles.d.ts +6 -46
- package/dist/crypto/profiles.d.ts.map +1 -1
- package/dist/crypto/profiles.js +33 -46
- package/dist/crypto/profiles.js.map +1 -1
- package/package.json +2 -4
- package/fixtures/v1/easybc-web-android-gzip.json +0 -41
- package/fixtures/v1/easybc-web-uncompressed.json +0 -35
- package/fixtures/v1/failures.json +0 -42
- package/fixtures/v1/family-chores-web-uncompressed.json +0 -73
- package/fixtures/v1/profiles.json +0 -51
package/README.md
CHANGED
|
@@ -9,7 +9,9 @@ lifecycle policy.
|
|
|
9
9
|
|
|
10
10
|
## Status
|
|
11
11
|
|
|
12
|
-
Version `0.1.0`
|
|
12
|
+
Version `0.1.0` was published to npm on 2026-06-30. Current source version
|
|
13
|
+
`0.1.1` removes application-specific runtime presets and keeps compatibility
|
|
14
|
+
profiles consumer-owned.
|
|
13
15
|
|
|
14
16
|
The tests in this repository cover frozen compatibility vectors, mocked
|
|
15
17
|
browser providers, package orchestration, and installation/imports from the
|
|
@@ -33,8 +35,9 @@ The package has no runtime dependencies and is ESM-only.
|
|
|
33
35
|
|
|
34
36
|
```ts
|
|
35
37
|
import {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
+
createV1EnvelopeCrypto,
|
|
39
|
+
createWebCryptoBackend,
|
|
40
|
+
defineV1CompatibilityProfile,
|
|
38
41
|
} from "@keyneom/sync-kit/crypto";
|
|
39
42
|
import { createSnapshotSync } from "@keyneom/sync-kit/snapshot";
|
|
40
43
|
import { createWebPasskeyProvider } from "@keyneom/sync-kit/keys/web-passkey";
|
|
@@ -45,6 +48,38 @@ import {
|
|
|
45
48
|
} from "@keyneom/sync-kit/stores/google-drive";
|
|
46
49
|
```
|
|
47
50
|
|
|
51
|
+
Applications define their own profile:
|
|
52
|
+
|
|
53
|
+
```ts
|
|
54
|
+
const profile = defineV1CompatibilityProfile({
|
|
55
|
+
appId: "my-notes",
|
|
56
|
+
filename: "my-notes-sync-v1.json",
|
|
57
|
+
aad: "my-notes-sync-envelope-v1",
|
|
58
|
+
hkdfInfo: "my-notes-content-key-v1",
|
|
59
|
+
compression: "gzip-if-smaller",
|
|
60
|
+
passkey: {
|
|
61
|
+
rpName: "My Notes",
|
|
62
|
+
userName: "encrypted-sync",
|
|
63
|
+
userDisplayName: "My Notes encrypted sync",
|
|
64
|
+
algorithm: -7,
|
|
65
|
+
residentKey: "required",
|
|
66
|
+
userVerification: "required",
|
|
67
|
+
timeoutMs: 60_000,
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
const envelopeCrypto = createV1EnvelopeCrypto(
|
|
72
|
+
profile,
|
|
73
|
+
appCodec,
|
|
74
|
+
createWebCryptoBackend(),
|
|
75
|
+
);
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
The package does not export profiles for EasyBC, Family Chores, or any other
|
|
79
|
+
consumer. Profile values are application configuration. Application data
|
|
80
|
+
models, parsing, migration, merge, and fingerprints remain in `appCodec`, so a
|
|
81
|
+
model change does not require a `sync-kit` release.
|
|
82
|
+
|
|
48
83
|
Available exports:
|
|
49
84
|
|
|
50
85
|
- `/core` — provider contracts and standardized errors
|
|
@@ -116,8 +151,8 @@ See [native consumer guidance](docs/native-consumers.md) and the exact
|
|
|
116
151
|
|
|
117
152
|
## Compatibility and isolation
|
|
118
153
|
|
|
119
|
-
|
|
120
|
-
|
|
154
|
+
Each application owns the profile that preserves its filename, AAD, HKDF
|
|
155
|
+
label, compression behavior, and passkey names. V1 readers remain separate
|
|
121
156
|
because their cryptographic contexts are intentionally incompatible.
|
|
122
157
|
|
|
123
158
|
The Drive snapshot wrapper rejects the wrong `appId` before making a request.
|
|
@@ -24,50 +24,10 @@ export type V1CompatibilityProfile = {
|
|
|
24
24
|
tagBits: 128;
|
|
25
25
|
passkey: PasskeyProfile;
|
|
26
26
|
};
|
|
27
|
-
export
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
readonly readVersions: readonly [1];
|
|
34
|
-
readonly writeVersion: 1;
|
|
35
|
-
readonly compression: "gzip-if-smaller";
|
|
36
|
-
readonly nonceBytes: 12;
|
|
37
|
-
readonly kdfSaltBytes: 32;
|
|
38
|
-
readonly prfInputBytes: 32;
|
|
39
|
-
readonly tagBits: 128;
|
|
40
|
-
readonly passkey: {
|
|
41
|
-
readonly rpName: "EasyBC";
|
|
42
|
-
readonly userName: "encrypted-sync";
|
|
43
|
-
readonly userDisplayName: "EasyBC encrypted sync";
|
|
44
|
-
readonly algorithm: -7;
|
|
45
|
-
readonly residentKey: "required";
|
|
46
|
-
readonly userVerification: "required";
|
|
47
|
-
readonly timeoutMs: 60000;
|
|
48
|
-
};
|
|
49
|
-
};
|
|
50
|
-
export declare const familyChoresV1Profile: {
|
|
51
|
-
readonly appId: "family-chores";
|
|
52
|
-
readonly filename: "family-chores-sync-v1.json";
|
|
53
|
-
readonly aad: "family-chores-sync-envelope-v1";
|
|
54
|
-
readonly hkdfInfo: "family-chores-cloud-content-key-v1";
|
|
55
|
-
readonly algorithm: "AES-256-GCM+HKDF-SHA-256";
|
|
56
|
-
readonly readVersions: readonly [1];
|
|
57
|
-
readonly writeVersion: 1;
|
|
58
|
-
readonly compression: "none";
|
|
59
|
-
readonly nonceBytes: 12;
|
|
60
|
-
readonly kdfSaltBytes: 32;
|
|
61
|
-
readonly prfInputBytes: 32;
|
|
62
|
-
readonly tagBits: 128;
|
|
63
|
-
readonly passkey: {
|
|
64
|
-
readonly rpName: "Family Chores";
|
|
65
|
-
readonly userName: "encrypted-sync";
|
|
66
|
-
readonly userDisplayName: "Family Chores encrypted sync";
|
|
67
|
-
readonly algorithm: -7;
|
|
68
|
-
readonly residentKey: "required";
|
|
69
|
-
readonly userVerification: "required";
|
|
70
|
-
readonly timeoutMs: 60000;
|
|
71
|
-
};
|
|
72
|
-
};
|
|
27
|
+
export type V1CompatibilityProfileInput = Pick<V1CompatibilityProfile, "appId" | "filename" | "aad" | "hkdfInfo" | "compression" | "passkey">;
|
|
28
|
+
/**
|
|
29
|
+
* Creates a consumer-owned v1 profile while fixing protocol-level constants.
|
|
30
|
+
* Application profiles are configuration, not package presets.
|
|
31
|
+
*/
|
|
32
|
+
export declare function defineV1CompatibilityProfile(input: V1CompatibilityProfileInput): Readonly<V1CompatibilityProfile>;
|
|
73
33
|
//# sourceMappingURL=profiles.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../src/crypto/profiles.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,EAAG,0BAAmC,CAAC;AAEhE,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,iBAAiB,CAAC;AAEvD,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,CAAC,CAAC,CAAC;IACd,WAAW,EAAE,UAAU,CAAC;IACxB,gBAAgB,EAAE,UAAU,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,YAAY,CAAC;IAC/B,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IAC3B,YAAY,EAAE,CAAC,CAAC;IAChB,WAAW,EAAE,aAAa,CAAC;IAC3B,UAAU,EAAE,EAAE,CAAC;IACf,YAAY,EAAE,EAAE,CAAC;IACjB,aAAa,EAAE,EAAE,CAAC;IAClB,OAAO,EAAE,GAAG,CAAC;IACb,OAAO,EAAE,cAAc,CAAC;CACzB,CAAC;AAEF,
|
|
1
|
+
{"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../src/crypto/profiles.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,EAAG,0BAAmC,CAAC;AAEhE,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,iBAAiB,CAAC;AAEvD,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,CAAC,CAAC,CAAC;IACd,WAAW,EAAE,UAAU,CAAC;IACxB,gBAAgB,EAAE,UAAU,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,YAAY,CAAC;IAC/B,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IAC3B,YAAY,EAAE,CAAC,CAAC;IAChB,WAAW,EAAE,aAAa,CAAC;IAC3B,UAAU,EAAE,EAAE,CAAC;IACf,YAAY,EAAE,EAAE,CAAC;IACjB,aAAa,EAAE,EAAE,CAAC;IAClB,OAAO,EAAE,GAAG,CAAC;IACb,OAAO,EAAE,cAAc,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG,IAAI,CAC5C,sBAAsB,EACtB,OAAO,GAAG,UAAU,GAAG,KAAK,GAAG,UAAU,GAAG,aAAa,GAAG,SAAS,CACtE,CAAC;AAEF;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,2BAA2B,GACjC,QAAQ,CAAC,sBAAsB,CAAC,CA6BlC"}
|
package/dist/crypto/profiles.js
CHANGED
|
@@ -1,48 +1,35 @@
|
|
|
1
1
|
export const V1_ALGORITHM = "AES-256-GCM+HKDF-SHA-256";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
kdfSaltBytes: 32,
|
|
36
|
-
prfInputBytes: 32,
|
|
37
|
-
tagBits: 128,
|
|
38
|
-
passkey: {
|
|
39
|
-
rpName: "Family Chores",
|
|
40
|
-
userName: "encrypted-sync",
|
|
41
|
-
userDisplayName: "Family Chores encrypted sync",
|
|
42
|
-
algorithm: -7,
|
|
43
|
-
residentKey: "required",
|
|
44
|
-
userVerification: "required",
|
|
45
|
-
timeoutMs: 60_000,
|
|
46
|
-
},
|
|
47
|
-
};
|
|
2
|
+
/**
|
|
3
|
+
* Creates a consumer-owned v1 profile while fixing protocol-level constants.
|
|
4
|
+
* Application profiles are configuration, not package presets.
|
|
5
|
+
*/
|
|
6
|
+
export function defineV1CompatibilityProfile(input) {
|
|
7
|
+
for (const [name, value] of Object.entries({
|
|
8
|
+
appId: input.appId,
|
|
9
|
+
filename: input.filename,
|
|
10
|
+
aad: input.aad,
|
|
11
|
+
hkdfInfo: input.hkdfInfo,
|
|
12
|
+
rpName: input.passkey.rpName,
|
|
13
|
+
userName: input.passkey.userName,
|
|
14
|
+
userDisplayName: input.passkey.userDisplayName,
|
|
15
|
+
})) {
|
|
16
|
+
if (!value.trim())
|
|
17
|
+
throw new TypeError(`${name} must not be empty.`);
|
|
18
|
+
}
|
|
19
|
+
if (!Number.isFinite(input.passkey.timeoutMs) ||
|
|
20
|
+
input.passkey.timeoutMs <= 0) {
|
|
21
|
+
throw new TypeError("passkey.timeoutMs must be positive.");
|
|
22
|
+
}
|
|
23
|
+
return Object.freeze({
|
|
24
|
+
...input,
|
|
25
|
+
passkey: Object.freeze({ ...input.passkey }),
|
|
26
|
+
algorithm: V1_ALGORITHM,
|
|
27
|
+
readVersions: [1],
|
|
28
|
+
writeVersion: 1,
|
|
29
|
+
nonceBytes: 12,
|
|
30
|
+
kdfSaltBytes: 32,
|
|
31
|
+
prfInputBytes: 32,
|
|
32
|
+
tagBits: 128,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
48
35
|
//# sourceMappingURL=profiles.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/crypto/profiles.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,0BAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/crypto/profiles.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,0BAAmC,CAAC;AAmChE;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAC1C,KAAkC;IAElC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC;QACzC,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM;QAC5B,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,QAAQ;QAChC,eAAe,EAAE,KAAK,CAAC,OAAO,CAAC,eAAe;KAC/C,CAAC,EAAE,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;YAAE,MAAM,IAAI,SAAS,CAAC,GAAG,IAAI,qBAAqB,CAAC,CAAC;IACvE,CAAC;IACD,IACE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;QACzC,KAAK,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,EAC5B,CAAC;QACD,MAAM,IAAI,SAAS,CAAC,qCAAqC,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,GAAG,KAAK;QACR,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;QAC5C,SAAS,EAAE,YAAY;QACvB,YAAY,EAAE,CAAC,CAAC,CAAU;QAC1B,YAAY,EAAE,CAAC;QACf,UAAU,EAAE,EAAE;QACd,YAAY,EAAE,EAAE;QAChB,aAAa,EAAE,EAAE;QACjB,OAAO,EAAE,GAAG;KACb,CAAC,CAAC;AACL,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@keyneom/sync-kit",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Provider-neutral encrypted application-data synchronization with opt-in browser adapters.",
|
|
6
6
|
"type": "module",
|
|
@@ -8,7 +8,6 @@
|
|
|
8
8
|
"sideEffects": false,
|
|
9
9
|
"files": [
|
|
10
10
|
"dist",
|
|
11
|
-
"fixtures",
|
|
12
11
|
"README.md",
|
|
13
12
|
"LICENSE"
|
|
14
13
|
],
|
|
@@ -44,8 +43,7 @@
|
|
|
44
43
|
"./stores/google-drive": {
|
|
45
44
|
"types": "./dist/stores/google-drive/index.d.ts",
|
|
46
45
|
"import": "./dist/stores/google-drive/index.js"
|
|
47
|
-
}
|
|
48
|
-
"./fixtures/*": "./fixtures/*"
|
|
46
|
+
}
|
|
49
47
|
},
|
|
50
48
|
"scripts": {
|
|
51
49
|
"build": "tsc -p tsconfig.build.json",
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"provenance": "Shared by live EasyBC web crypto.test.ts and Android SyncCryptoTest.decryptsSharedGzipCryptoVector",
|
|
3
|
-
"secret": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8",
|
|
4
|
-
"payload": {
|
|
5
|
-
"schemaVersion": 1,
|
|
6
|
-
"exportedAt": "2026-06-22T12:00:00Z",
|
|
7
|
-
"planner": {
|
|
8
|
-
"value": {
|
|
9
|
-
"ageYears": 38
|
|
10
|
-
},
|
|
11
|
-
"updatedAt": "2026-06-22T12:00:00Z"
|
|
12
|
-
},
|
|
13
|
-
"periodRecords": [],
|
|
14
|
-
"deletedPeriodStarts": {},
|
|
15
|
-
"calendarDayLogs": {
|
|
16
|
-
"2026-06-22": {
|
|
17
|
-
"notes": "cross-platform gzip vector cross-platform gzip vector cross-platform gzip vector cross-platform gzip vector cross-platform gzip vector cross-platform gzip vector cross-platform gzip vector cross-platform gzip vector cross-platform gzip vector cross-platform gzip vector cross-platform gzip vector cross-platform gzip vector cross-platform gzip vector cross-platform gzip vector cross-platform gzip vector cross-platform gzip vector cross-platform gzip vector cross-platform gzip vector cross-platform gzip vector cross-platform gzip vector ",
|
|
18
|
-
"updatedAt": "2026-06-22T12:00:00Z"
|
|
19
|
-
}
|
|
20
|
-
},
|
|
21
|
-
"voluntaryAbstinenceDates": {},
|
|
22
|
-
"voluntaryAbstinenceUpdatedAt": {},
|
|
23
|
-
"deletedVoluntaryAbstinenceDates": {},
|
|
24
|
-
"ecJournal": {
|
|
25
|
-
"value": false,
|
|
26
|
-
"updatedAt": "2026-06-22T12:00:00Z"
|
|
27
|
-
}
|
|
28
|
-
},
|
|
29
|
-
"envelope": {
|
|
30
|
-
"schemaVersion": 1,
|
|
31
|
-
"algorithm": "AES-256-GCM+HKDF-SHA-256",
|
|
32
|
-
"compression": "gzip",
|
|
33
|
-
"credentialId": "credential",
|
|
34
|
-
"rpId": "keyneom.github.io",
|
|
35
|
-
"prfInput": "AA",
|
|
36
|
-
"kdfSalt": "ICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj8",
|
|
37
|
-
"nonce": "QEFCQ0RFRkdISUpL",
|
|
38
|
-
"ciphertext": "LMBOEaK5ATYQxI26eKGwIdJ_ELsBJ8rf76MIXyxVsT3kN1K3qY42h07AZHOYkztpJYdhERCZmbG2j_Pd1zhqKRMIMdrj_-pBd6DljWZU0uD7d5rHWCbyAqudt_psdPSHm47MuQauJTsCjVmEkPNKCZZNOZkYnceNyC9MZQM_tY15jJLsHEdOnQS43zyNhv180UmM9POJcsaWBAG6yIfDRDpd2b1IpPuxmIAV3GLMYLiNHbJ4yDUX6PRYFhzI-Hh18rggXBENhWfq9kZ3hBpPKGkms-j4MHFIGhg_o3GY_rZTHCzq3phTdD3Mo4iSWf7D6FXezQP6H_jwyhDE0ydJyTjNfIPPyCESZtc",
|
|
39
|
-
"updatedAt": "2026-06-22T12:00:00Z"
|
|
40
|
-
}
|
|
41
|
-
}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"provenance": "EasyBC Android SyncCryptoTest.decryptsWebCryptoVector and live web crypto.ts",
|
|
3
|
-
"secret": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8",
|
|
4
|
-
"payload": {
|
|
5
|
-
"schemaVersion": 1,
|
|
6
|
-
"exportedAt": "2026-06-21T12:00:00Z",
|
|
7
|
-
"planner": {
|
|
8
|
-
"value": {
|
|
9
|
-
"ageYears": 37
|
|
10
|
-
},
|
|
11
|
-
"updatedAt": "2026-06-21T12:00:00Z"
|
|
12
|
-
},
|
|
13
|
-
"periodRecords": [],
|
|
14
|
-
"deletedPeriodStarts": {},
|
|
15
|
-
"calendarDayLogs": {},
|
|
16
|
-
"voluntaryAbstinenceDates": {},
|
|
17
|
-
"voluntaryAbstinenceUpdatedAt": {},
|
|
18
|
-
"deletedVoluntaryAbstinenceDates": {},
|
|
19
|
-
"ecJournal": {
|
|
20
|
-
"value": false,
|
|
21
|
-
"updatedAt": "1970-01-01T00:00:00.000Z"
|
|
22
|
-
}
|
|
23
|
-
},
|
|
24
|
-
"envelope": {
|
|
25
|
-
"schemaVersion": 1,
|
|
26
|
-
"algorithm": "AES-256-GCM+HKDF-SHA-256",
|
|
27
|
-
"credentialId": "credential",
|
|
28
|
-
"rpId": "keyneom.github.io",
|
|
29
|
-
"prfInput": "AA",
|
|
30
|
-
"kdfSalt": "ICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj8",
|
|
31
|
-
"nonce": "QEFCQ0RFRkdISUpL",
|
|
32
|
-
"ciphertext": "SGk1csrcbFdGshJaXqUdM-SLg9O0ZjtkHuUREJkV5R89VrpDkTmr12IlZ5W6d4Qk4pQ0kVT9XO7F_r4OHtoWNGbjzrdv49y2LhT-uDLjzNu38r-xVoQXGU3HTJdvr6VFk18TbaKAN08gD3wluMP9JH_IKwpGHeAgZyoajp3agwg4bGV-VSw9URAFlHrXtgJKymwNPz_4E4UHbmjcnCK94JngZgqYXnhBueTwX4fTayIrzqXl_JEcGDm6aEcae_FoqhZ1dVUVx5KynVj_JRgPMKOtviGe-LLk7aXbCoRLxSjZDU4nlPQOV2dFkbrwpV6afwsu1IQWwZ-xvnDovfN8eHzVuvdb7JgSIShs62Yy5N-wgCm-BUWxHp5oq0LUFkGB2njyTQjkmSYBiM4eVOYvhBTIRNQZqFMXSEI32-NyCEaLvv63y43OkQ9-kpWKZ7-yDpM-Mcs5ckNk3IKTHTGhl_0DMpZxA5QONtGvDCW4SHr8dKEQ6aDQ",
|
|
33
|
-
"updatedAt": "2026-06-21T12:00:00Z"
|
|
34
|
-
}
|
|
35
|
-
}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"wrongSecret": "4OHi4-Tl5ufo6err7O3u7_Dx8vP09fb3-Pn6-_z9_v8",
|
|
3
|
-
"tamperedEnvelope": {
|
|
4
|
-
"schemaVersion": 1,
|
|
5
|
-
"algorithm": "AES-256-GCM+HKDF-SHA-256",
|
|
6
|
-
"credentialId": "credential",
|
|
7
|
-
"rpId": "keyneom.github.io",
|
|
8
|
-
"prfInput": "AA",
|
|
9
|
-
"kdfSalt": "ICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj8",
|
|
10
|
-
"nonce": "QEFCQ0RFRkdISUpL",
|
|
11
|
-
"ciphertext": "AGk1csrcbFdGshJaXqUdM-SLg9O0ZjtkHuUREJkV5R89VrpDkTmr12IlZ5W6d4Qk4pQ0kVT9XO7F_r4OHtoWNGbjzrdv49y2LhT-uDLjzNu38r-xVoQXGU3HTJdvr6VFk18TbaKAN08gD3wluMP9JH_IKwpGHeAgZyoajp3agwg4bGV-VSw9URAFlHrXtgJKymwNPz_4E4UHbmjcnCK94JngZgqYXnhBueTwX4fTayIrzqXl_JEcGDm6aEcae_FoqhZ1dVUVx5KynVj_JRgPMKOtviGe-LLk7aXbCoRLxSjZDU4nlPQOV2dFkbrwpV6afwsu1IQWwZ-xvnDovfN8eHzVuvdb7JgSIShs62Yy5N-wgCm-BUWxHp5oq0LUFkGB2njyTQjkmSYBiM4eVOYvhBTIRNQZqFMXSEI32-NyCEaLvv63y43OkQ9-kpWKZ7-yDpM-Mcs5ckNk3IKTHTGhl_0DMpZxA5QONtGvDCW4SHr8dKEQ6aDQ",
|
|
12
|
-
"updatedAt": "2026-06-21T12:00:00Z"
|
|
13
|
-
},
|
|
14
|
-
"wrongContextEnvelope": {
|
|
15
|
-
"schemaVersion": 1,
|
|
16
|
-
"algorithm": "AES-256-GCM+HKDF-SHA-256",
|
|
17
|
-
"credentialId": "fixture-credential",
|
|
18
|
-
"rpId": "keyneom.github.io",
|
|
19
|
-
"prfInput": "YGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn8",
|
|
20
|
-
"kdfSalt": "ICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj8",
|
|
21
|
-
"nonce": "QEFCQ0RFRkdISUpL",
|
|
22
|
-
"ciphertext": "BQrSErMr1-99BpL6zSlFWuWBX2E95QI0FzCgOPe1hVzCEAX6AC94BwSXtF8WaFzt-p-NXyqtMCAtSejFY3VpS76Tk5QkOYaWb30zKkIydzJaxPyxsgsRyTVyc02BlSiV4qLxKy8PevEJ9_ZhrZEup93xuZ29GTgwaNPFilZYTBkGrkwxoQKKJ-Dus3QjRPqbD93o_yyi1sU6Gg3TmnoxX5wO9mQyXiPi856uGnCETa-9SHq3HPP4ZiNXoTzC8nUYPRxDtFfT7xd15T1QsK2ej3sdQz9djURZB9t8hX0Yc0TqbRjuqZZvvhGsodPI8vOw8b-UqSJJ3ZyXzV7yWjCVJ4TjpXAshfhDDbsK2ajZqoKEDEe_c9EH2ZsJwoQaOLmRlB-7v4vbhHrFb_soFf31ANGwXK8stBLyPbjYNducqss0L4F5JDAU_j8FcGMhKX9kFy0n7odbalAZtzN41WVm21LRh1ZBvkak9ycDZNHMHueyccjDcwxl_y0vgjfLD_bQycBLFM_GAy3aVM-H2I0JOJPePdxjqAwOpOSP6VjKZzR--4Glnm1nRj64DO09PFQQttMt8yGK5WsSqNHAP0ViAqW_2QgVH_ClFKfFfwGqb6DMfn1QgQ50m0Xf9ICxKhzFiAvaax82mDoUQju21ZnNQ1hKxvy8NUccCJ-hiT0Vl9RZMO5mXMbagtFMzb8nYYJpJ56M0e0SkHOk8XKYnOgDIUOFybfQLAIG1xYA7GjgxIG0CTUau-1PRCuH5SHntDn7dID2EPllxW3wyQRZpMWw98DodPYfXGo4n2gonLqn2VIF-h9cXGCMkjnnZOFTTFzt1i5zmSyF1prXBFHOQRGTfRZsZd5Iox5tsieiFvEzm5C5bU67G2Gn-wBjSJVmASMlSVxY622eHwkT9HlMnNyZq2fCAcrC-DwQjDx_wGdi_qxRirNIUM5qvoD655R66r7jFbhn6y9LrPrTgrwR1i2c51s5JdtC_JwhFA3nCz816sfK7oGpLq5BLmeVvrPWhiyjDFGByY79_uT63hOekL59uDl7Me_-xauWwbLv",
|
|
23
|
-
"updatedAt": "2026-06-21T00:00:00.000Z"
|
|
24
|
-
},
|
|
25
|
-
"malformedEnvelope": {
|
|
26
|
-
"schemaVersion": 1,
|
|
27
|
-
"algorithm": "AES-256-GCM+HKDF-SHA-256",
|
|
28
|
-
"credentialId": "fixture-credential"
|
|
29
|
-
},
|
|
30
|
-
"decompressionErrorEnvelope": {
|
|
31
|
-
"schemaVersion": 1,
|
|
32
|
-
"algorithm": "AES-256-GCM+HKDF-SHA-256",
|
|
33
|
-
"compression": "gzip",
|
|
34
|
-
"credentialId": "fixture-credential",
|
|
35
|
-
"rpId": "keyneom.github.io",
|
|
36
|
-
"prfInput": "YGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn8",
|
|
37
|
-
"kdfSalt": "ICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj8",
|
|
38
|
-
"nonce": "QEFCQ0RFRkdISUpL",
|
|
39
|
-
"ciphertext": "Uj4yecfXdV9zthRMU-oDfb_TwYW0Zj8rGPkVAPgItAVxC_5RxjT8myZndrL_N9t1v4DvXIgzQ1qpRWd5TXfpZKc",
|
|
40
|
-
"updatedAt": "2026-06-29T00:00:00.000Z"
|
|
41
|
-
}
|
|
42
|
-
}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"provenance": "Generated from the uncommitted live Family Chores sync implementation",
|
|
3
|
-
"secret": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8",
|
|
4
|
-
"payload": {
|
|
5
|
-
"schemaVersion": 1,
|
|
6
|
-
"exportedAt": "2026-06-21T00:00:00.000Z",
|
|
7
|
-
"state": {
|
|
8
|
-
"children": [],
|
|
9
|
-
"tasks": [],
|
|
10
|
-
"taskInstances": [],
|
|
11
|
-
"completedTasks": {},
|
|
12
|
-
"timers": {},
|
|
13
|
-
"timedCompletions": [],
|
|
14
|
-
"actionLog": [],
|
|
15
|
-
"parentSettings": {
|
|
16
|
-
"approvals": {
|
|
17
|
-
"task": false,
|
|
18
|
-
"reward": false
|
|
19
|
-
},
|
|
20
|
-
"timedAutoApproveDefault": false,
|
|
21
|
-
"pins": [],
|
|
22
|
-
"childDisplayOrder": [],
|
|
23
|
-
"onboardingCompleted": false,
|
|
24
|
-
"voiceAnnouncements": false
|
|
25
|
-
}
|
|
26
|
-
},
|
|
27
|
-
"metadata": {
|
|
28
|
-
"schemaVersion": 1,
|
|
29
|
-
"collections": {
|
|
30
|
-
"children": {
|
|
31
|
-
"updatedAt": {},
|
|
32
|
-
"deletedAt": {}
|
|
33
|
-
},
|
|
34
|
-
"tasks": {
|
|
35
|
-
"updatedAt": {},
|
|
36
|
-
"deletedAt": {}
|
|
37
|
-
},
|
|
38
|
-
"taskInstances": {
|
|
39
|
-
"updatedAt": {},
|
|
40
|
-
"deletedAt": {}
|
|
41
|
-
},
|
|
42
|
-
"completedTasks": {
|
|
43
|
-
"updatedAt": {},
|
|
44
|
-
"deletedAt": {}
|
|
45
|
-
},
|
|
46
|
-
"timers": {
|
|
47
|
-
"updatedAt": {},
|
|
48
|
-
"deletedAt": {}
|
|
49
|
-
},
|
|
50
|
-
"timedCompletions": {
|
|
51
|
-
"updatedAt": {},
|
|
52
|
-
"deletedAt": {}
|
|
53
|
-
},
|
|
54
|
-
"actionLog": {
|
|
55
|
-
"updatedAt": {},
|
|
56
|
-
"deletedAt": {}
|
|
57
|
-
}
|
|
58
|
-
},
|
|
59
|
-
"parentSettingsUpdatedAt": "1970-01-01T00:00:00.000Z"
|
|
60
|
-
}
|
|
61
|
-
},
|
|
62
|
-
"envelope": {
|
|
63
|
-
"schemaVersion": 1,
|
|
64
|
-
"algorithm": "AES-256-GCM+HKDF-SHA-256",
|
|
65
|
-
"credentialId": "fixture-credential",
|
|
66
|
-
"rpId": "keyneom.github.io",
|
|
67
|
-
"prfInput": "YGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn8",
|
|
68
|
-
"kdfSalt": "ICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj8",
|
|
69
|
-
"nonce": "QEFCQ0RFRkdISUpL",
|
|
70
|
-
"ciphertext": "BQrSErMr1-99BpL6zSlFWuWBX2E95QI0FzCgOPe1hVzCEAX6AC94BwSXtF8WaFzt-p-NXyqtMCAtSejFY3VpS76Tk5QkOYaWb30zKkIydzJaxPyxsgsRyTVyc02BlSiV4qLxKy8PevEJ9_ZhrZEup93xuZ29GTgwaNPFilZYTBkGrkwxoQKKJ-Dus3QjRPqbD93o_yyi1sU6Gg3TmnoxX5wO9mQyXiPi856uGnCETa-9SHq3HPP4ZiNXoTzC8nUYPRxDtFfT7xd15T1QsK2ej3sdQz9djURZB9t8hX0Yc0TqbRjuqZZvvhGsodPI8vOw8b-UqSJJ3ZyXzV7yWjCVJ4TjpXAshfhDDbsK2ajZqoKEDEe_c9EH2ZsJwoQaOLmRlB-7v4vbhHrFb_soFf31ANGwXK8stBLyPbjYNducqss0L4F5JDAU_j8FcGMhKX9kFy0n7odbalAZtzN41WVm21LRh1ZBvkak9ycDZNHMHueyccjDcwxl_y0vgjfLD_bQycBLFM_GAy3aVM-H2I0JOJPePdxjqAwOpOSP6VjKZzR--4Glnm1nRj64DO09PFQQttMt8yGK5WsSqNHAP0ViAqW_2QgVH_ClFKfFfwGqb6DMfn1QgQ50m0Xf9ICxKhzFiAvaax82mDoUQju21ZnNQ1hKxvy8NUccCJ-hiT0Vl9RZMO5mXMbagtFMzb8nYYJpJ56M0e0SkHOk8XKYnOgDIUOFybfQLAIG1xYA7GjgxIG0CTUau-1PRCuH5SHntDn7dID2EPllxW3wyQRZpMWw98DodPYfXGo4n2gonLqn2VIF-h9cXGCMkjnnZOFTTFzt1i5zmSyF1prXBFHOQRGTfRZsZd5Iox5tsieiFvEzm5C5bU67G2Gn-wBjSJVmASMlSVxY622eHwkT9HlMnNyZq2fCAcrC-DwQjDx_wGdi_qxRirNIUM5qvoD655R66r7jFbhn6y9LrPrTgrwR1i2c51s5JdtC_JwhFA3nCz816sfK7oGpLq5BLmeVvrPWhiyjDFGByY79_uT63hOekL59uDl7Me_-xauWwbLv",
|
|
71
|
-
"updatedAt": "2026-06-21T00:00:00.000Z"
|
|
72
|
-
}
|
|
73
|
-
}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"generatedAt": "2026-06-29",
|
|
3
|
-
"profiles": [
|
|
4
|
-
{
|
|
5
|
-
"appId": "easy-bc",
|
|
6
|
-
"filename": "easybc-sync-v1.json",
|
|
7
|
-
"aad": "easy-bc-sync-envelope-v1",
|
|
8
|
-
"hkdfInfo": "easy-bc-cloud-content-key-v1",
|
|
9
|
-
"compression": "gzip-if-smaller",
|
|
10
|
-
"algorithm": "AES-256-GCM+HKDF-SHA-256",
|
|
11
|
-
"schemaVersion": 1,
|
|
12
|
-
"nonceBytes": 12,
|
|
13
|
-
"kdfSaltBytes": 32,
|
|
14
|
-
"prfInputBytes": 32,
|
|
15
|
-
"tagBits": 128,
|
|
16
|
-
"passkey": {
|
|
17
|
-
"rpId": "keyneom.github.io",
|
|
18
|
-
"rpName": "EasyBC",
|
|
19
|
-
"userName": "encrypted-sync",
|
|
20
|
-
"userDisplayName": "EasyBC encrypted sync",
|
|
21
|
-
"algorithm": -7,
|
|
22
|
-
"residentKey": "required",
|
|
23
|
-
"userVerification": "required",
|
|
24
|
-
"timeoutMs": 60000
|
|
25
|
-
}
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
"appId": "family-chores",
|
|
29
|
-
"filename": "family-chores-sync-v1.json",
|
|
30
|
-
"aad": "family-chores-sync-envelope-v1",
|
|
31
|
-
"hkdfInfo": "family-chores-cloud-content-key-v1",
|
|
32
|
-
"compression": "none",
|
|
33
|
-
"algorithm": "AES-256-GCM+HKDF-SHA-256",
|
|
34
|
-
"schemaVersion": 1,
|
|
35
|
-
"nonceBytes": 12,
|
|
36
|
-
"kdfSaltBytes": 32,
|
|
37
|
-
"prfInputBytes": 32,
|
|
38
|
-
"tagBits": 128,
|
|
39
|
-
"passkey": {
|
|
40
|
-
"rpId": "keyneom.github.io",
|
|
41
|
-
"rpName": "Family Chores",
|
|
42
|
-
"userName": "encrypted-sync",
|
|
43
|
-
"userDisplayName": "Family Chores encrypted sync",
|
|
44
|
-
"algorithm": -7,
|
|
45
|
-
"residentKey": "required",
|
|
46
|
-
"userVerification": "required",
|
|
47
|
-
"timeoutMs": 60000
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
]
|
|
51
|
-
}
|