@fkn/package-manifest 0.1.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.
- package/README.md +61 -0
- package/build/fixtures.cjs +122 -0
- package/build/fixtures.d.ts +48 -0
- package/build/fixtures.js +121 -0
- package/build/index.cjs +462 -0
- package/build/index.d.ts +144 -0
- package/build/index.js +438 -0
- package/fixtures/vectors.json +261 -0
- package/package.json +56 -0
package/README.md
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# @fkn/package-manifest
|
|
2
|
+
|
|
3
|
+
App ids, canonical source ids, and the one verifier for an FKN app manifest.
|
|
4
|
+
|
|
5
|
+
An app is a developer's root Ed25519 key plus a permanent slug. This package derives the ids that
|
|
6
|
+
follow from that pair, canonicalises every spelling a caller id can have into the one string a
|
|
7
|
+
manifest lists, and runs every stateless check on a manifest. The broker, the api, the vite plugin
|
|
8
|
+
and the sign CLI all read this package, so acceptance is identical by construction rather than by
|
|
9
|
+
four implementations agreeing.
|
|
10
|
+
|
|
11
|
+
It is deliberately inert: no fetch, no state, no globals, no clock read. `now` is an argument.
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
import { appIdOf, canonicalSourceOf, verifyManifest } from '@fkn/package-manifest'
|
|
15
|
+
|
|
16
|
+
const source = canonicalSourceOf('https://anime.fkn.app/watch') // 'https:anime.fkn.app'
|
|
17
|
+
const result = verifyManifest(text, { now: Date.now() / 1000 | 0, source })
|
|
18
|
+
if (!result.ok) throw new Error(`${result.code}: ${result.message}`)
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Everything that needs state stays with the caller: which key list is held, which manifest is newest,
|
|
22
|
+
and how fresh an `https:` source has to be. `verifyManifest` decides only what a document says about
|
|
23
|
+
itself.
|
|
24
|
+
|
|
25
|
+
## Signing
|
|
26
|
+
|
|
27
|
+
Signing is not here. A signer builds a statement with `keyListStatement`, `manifestStatement`,
|
|
28
|
+
`succeedStatement` or `registerStatement` and passes it to `ed25519.sign`, so the private key never
|
|
29
|
+
reaches this package. `tests/helpers.ts` is a worked example.
|
|
30
|
+
|
|
31
|
+
## What a signer must get right
|
|
32
|
+
|
|
33
|
+
An explicit `"name": null` is MALFORMED: only the absence of the field means the app has no name.
|
|
34
|
+
|
|
35
|
+
A member named twice in a key list is refused rather than deduplicated.
|
|
36
|
+
|
|
37
|
+
`sources` names 1 to 32 canonical source ids, and a caller id over 512 characters is never
|
|
38
|
+
canonical, so `canonicalSourceOf` returns null for it.
|
|
39
|
+
|
|
40
|
+
## Fixtures
|
|
41
|
+
|
|
42
|
+
`@fkn/package-manifest/fixtures` is the cross-implementation contract: the zero-root id and fingerprint,
|
|
43
|
+
every source spelling with what it collapses to, every room scope spelling with whether a room may
|
|
44
|
+
be dialled under it, one fully signed manifest with the seeds that made it, and a pair of signatures
|
|
45
|
+
that separate `{ zip215: false }` from noble's permissive default.
|
|
46
|
+
|
|
47
|
+
```ts
|
|
48
|
+
import { vectors } from '@fkn/package-manifest/fixtures'
|
|
49
|
+
|
|
50
|
+
for (const [scope, accepted] of vectors.roomScopes) expect(roomScopeOf(scope) !== 'reserved').toBe(accepted)
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
It is a BUILT module, not the JSON: `fixtures/vectors.json` is inlined at build time, so a consumer
|
|
54
|
+
needs no JSON resolution, and nothing there reaches the curve code. `roomScopes` is the rooms Worker
|
|
55
|
+
and the broker's carve-out, which each hold their own two lines refusing a `fkn:` scope that is not
|
|
56
|
+
an app id; neither repo can read the other's file, so these rows are what stops the two copies
|
|
57
|
+
drifting.
|
|
58
|
+
|
|
59
|
+
Regenerate with `npm run vectors`; the JSON is committed, so a change in derivation shows up as a
|
|
60
|
+
diff. The signed vector's `issuedAt` is 2025-09-08, so an `https:` source test that reuses it
|
|
61
|
+
verbatim is older than the api's freshness window; the seeds ship with it so a test can re-sign.
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
//#endregion
|
|
3
|
+
//#region src/fixtures.ts
|
|
4
|
+
/**
|
|
5
|
+
* The cross-implementation vectors, as a built module: `fixtures/vectors.json` is inlined at build
|
|
6
|
+
* time, so a consumer needs no JSON resolution and no bundler configuration of its own. Generated
|
|
7
|
+
* by `scripts/make-vectors.ts` (`npm run vectors`).
|
|
8
|
+
*
|
|
9
|
+
* Nothing here reaches the curve code, so a consumer that imports the vectors alone carries none of
|
|
10
|
+
* it.
|
|
11
|
+
*/
|
|
12
|
+
var vectors = {
|
|
13
|
+
zeroRoot: {
|
|
14
|
+
"rootHex": "0000000000000000000000000000000000000000000000000000000000000000",
|
|
15
|
+
"slug": "stub",
|
|
16
|
+
"app": "fkn:app:1jypnc6jbtvxg7gn5cuqczwqct6oa62fhjmimlol7cs4dhmpw4nbq",
|
|
17
|
+
"fingerprint": "1mzuhvlpymk6xo3epygfy5h4oeaejofefn3rdhm4qfjmr2dk7fesq",
|
|
18
|
+
"sha256Root": "66687aadf862bd776c8fc18b8e9f8e20089714856ee233b3902a591d0d5f2925",
|
|
19
|
+
"sha256AppInput": "4e1ed179219d6e6f99bd15202cda029f9c0f68a74b10c5b97f14b833b1f6e343"
|
|
20
|
+
},
|
|
21
|
+
sources: [
|
|
22
|
+
["npm:@banou/stub", "npm:@banou/stub"],
|
|
23
|
+
["npm:@banou/stub@1.2.3", "npm:@banou/stub"],
|
|
24
|
+
["npm:lodash", "npm:lodash"],
|
|
25
|
+
["gh:owner/repo", "gh:owner/repo"],
|
|
26
|
+
["gh:owner/repo@ref", "gh:owner/repo"],
|
|
27
|
+
["https:anime.fkn.app", "https:anime.fkn.app"],
|
|
28
|
+
["https:anime.fkn.app:8443", "https:anime.fkn.app:8443"],
|
|
29
|
+
["https:anime.fkn.app@L3g", "https:anime.fkn.app@L3g"],
|
|
30
|
+
["https:anime.fkn.app@Lw", "https:anime.fkn.app"],
|
|
31
|
+
["https:anime.fkn.app@Ly94Ly8", "https:anime.fkn.app@L3g"],
|
|
32
|
+
["https://anime.fkn.app", "https:anime.fkn.app"],
|
|
33
|
+
["https://anime.fkn.app/", "https:anime.fkn.app"],
|
|
34
|
+
["https://Anime.FKN.app/x", "https:anime.fkn.app"],
|
|
35
|
+
["https://anime.fkn.app:8443", "https:anime.fkn.app:8443"],
|
|
36
|
+
["http://x", null],
|
|
37
|
+
["http://anime.fkn.app", null],
|
|
38
|
+
["localhost:1234", null],
|
|
39
|
+
["global", null],
|
|
40
|
+
["fkn:app:1aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", null],
|
|
41
|
+
["fkn:platform", null],
|
|
42
|
+
["https:anime.fkn.app/x", null],
|
|
43
|
+
["npm:@banou/stub@not a version", null],
|
|
44
|
+
["gh:owner", null],
|
|
45
|
+
["", null],
|
|
46
|
+
["npm:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", null],
|
|
47
|
+
["https:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com", null]
|
|
48
|
+
],
|
|
49
|
+
roomScopes: [
|
|
50
|
+
["fkn:app:1aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", true],
|
|
51
|
+
["fkn:app:1bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", true],
|
|
52
|
+
["fkn:app:1aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", false],
|
|
53
|
+
["fkn:app:1aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", false],
|
|
54
|
+
["fkn:app:10aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", false],
|
|
55
|
+
["fkn:app:11aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", false],
|
|
56
|
+
["fkn:app:18aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", false],
|
|
57
|
+
["fkn:app:19aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", false],
|
|
58
|
+
["fkn:app:2aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", false],
|
|
59
|
+
["FKN:APP:1aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", false],
|
|
60
|
+
["fkn:app:1", false],
|
|
61
|
+
["fkn:", false],
|
|
62
|
+
["fkn:platform", false],
|
|
63
|
+
["fkn:app", false],
|
|
64
|
+
["global", true],
|
|
65
|
+
["npm:@banou/social", true],
|
|
66
|
+
["https:anime.fkn.app", true],
|
|
67
|
+
["https://anime.fkn.app", true]
|
|
68
|
+
],
|
|
69
|
+
signed: {
|
|
70
|
+
"rootSeedHex": "0101010101010101010101010101010101010101010101010101010101010101",
|
|
71
|
+
"rootPublicB64": "iojj3XQJ8ZX9UtstPLpdcspnCb8dlBIb83SIAbQPb1w=",
|
|
72
|
+
"subkeySeedsHex": ["0202020202020202020202020202020202020202020202020202020202020202", "0303030303030303030303030303030303030303030303030303030303030303"],
|
|
73
|
+
"subkeyPublicsB64": ["gTl3Dqh9F19Wo1Rmw0x+zMuNipG07jeiXfYPW4/Js5Q=", "7UkoxijRwsbq6QM4kFmVYSlZJzpcY/k2NsFGFKyHN9E="],
|
|
74
|
+
"app": "fkn:app:1ri3bdrqt6s523pw4qoipbqktj3dfk2ix735ilnmamp5sstxrlgbq",
|
|
75
|
+
"slug": "fixture",
|
|
76
|
+
"serial": 3,
|
|
77
|
+
"sources": ["npm:@fkn/fixture", "https:fixture.example"],
|
|
78
|
+
"issuedAt": 17573e5,
|
|
79
|
+
"previous": {
|
|
80
|
+
"rootSeedHex": "0404040404040404040404040404040404040404040404040404040404040404",
|
|
81
|
+
"rootPublicB64": "ypOsFwUYcHHWe4PH/w7+gQjo7EUwV113JoeTM9vavnw=",
|
|
82
|
+
"slug": "stub",
|
|
83
|
+
"app": "fkn:app:1krjgaj3uu7q76pudzhuitywhf4gordjipzcbrjyk5oprica7nb3q"
|
|
84
|
+
},
|
|
85
|
+
"manifest": {
|
|
86
|
+
"v": 1,
|
|
87
|
+
"app": "fkn:app:1ri3bdrqt6s523pw4qoipbqktj3dfk2ix735ilnmamp5sstxrlgbq",
|
|
88
|
+
"root": "iojj3XQJ8ZX9UtstPLpdcspnCb8dlBIb83SIAbQPb1w=",
|
|
89
|
+
"slug": "fixture",
|
|
90
|
+
"keys": {
|
|
91
|
+
"serial": 3,
|
|
92
|
+
"members": ["gTl3Dqh9F19Wo1Rmw0x+zMuNipG07jeiXfYPW4/Js5Q=", "7UkoxijRwsbq6QM4kFmVYSlZJzpcY/k2NsFGFKyHN9E="],
|
|
93
|
+
"sig": "/P/l+SM/vh5P23lt1mVjBRW9CvcytmHI0UGyMZ4nwcnWCqR5syMv5OLy6RGVRPGBqkO6Nlhr8NwLDV+ZIWiuAA=="
|
|
94
|
+
},
|
|
95
|
+
"key": "gTl3Dqh9F19Wo1Rmw0x+zMuNipG07jeiXfYPW4/Js5Q=",
|
|
96
|
+
"sources": ["npm:@fkn/fixture", "https:fixture.example"],
|
|
97
|
+
"name": "Fixture",
|
|
98
|
+
"issuedAt": 17573e5,
|
|
99
|
+
"previous": [{
|
|
100
|
+
"app": "fkn:app:1krjgaj3uu7q76pudzhuitywhf4gordjipzcbrjyk5oprica7nb3q",
|
|
101
|
+
"root": "ypOsFwUYcHHWe4PH/w7+gQjo7EUwV113JoeTM9vavnw=",
|
|
102
|
+
"slug": "stub",
|
|
103
|
+
"sig": "WLs2nkaR5RNb8xw62/HLNBubxuDqTLpff/aYyh1dGZYDYR+Fc4nLJcemNgvWmILFVT8boTHROJFQg3zECTXsBg=="
|
|
104
|
+
}],
|
|
105
|
+
"sig": "xmttQ9pgcfFQxnVhTrJiCeMEnU7fNF3tVeObxaTkiYmXLLzv7CrYNN2sxcDuHRSJHPmbOdGHniEnHpEwHXr7Bg=="
|
|
106
|
+
},
|
|
107
|
+
"raw": "{\"v\":1,\"app\":\"fkn:app:1ri3bdrqt6s523pw4qoipbqktj3dfk2ix735ilnmamp5sstxrlgbq\",\"root\":\"iojj3XQJ8ZX9UtstPLpdcspnCb8dlBIb83SIAbQPb1w=\",\"slug\":\"fixture\",\"keys\":{\"serial\":3,\"members\":[\"gTl3Dqh9F19Wo1Rmw0x+zMuNipG07jeiXfYPW4/Js5Q=\",\"7UkoxijRwsbq6QM4kFmVYSlZJzpcY/k2NsFGFKyHN9E=\"],\"sig\":\"/P/l+SM/vh5P23lt1mVjBRW9CvcytmHI0UGyMZ4nwcnWCqR5syMv5OLy6RGVRPGBqkO6Nlhr8NwLDV+ZIWiuAA==\"},\"key\":\"gTl3Dqh9F19Wo1Rmw0x+zMuNipG07jeiXfYPW4/Js5Q=\",\"sources\":[\"npm:@fkn/fixture\",\"https:fixture.example\"],\"name\":\"Fixture\",\"issuedAt\":1757300000,\"previous\":[{\"app\":\"fkn:app:1krjgaj3uu7q76pudzhuitywhf4gordjipzcbrjyk5oprica7nb3q\",\"root\":\"ypOsFwUYcHHWe4PH/w7+gQjo7EUwV113JoeTM9vavnw=\",\"slug\":\"stub\",\"sig\":\"WLs2nkaR5RNb8xw62/HLNBubxuDqTLpff/aYyh1dGZYDYR+Fc4nLJcemNgvWmILFVT8boTHROJFQg3zECTXsBg==\"}],\"sig\":\"xmttQ9pgcfFQxnVhTrJiCeMEnU7fNF3tVeObxaTkiYmXLLzv7CrYNN2sxcDuHRSJHPmbOdGHniEnHpEwHXr7Bg==\"}"
|
|
108
|
+
},
|
|
109
|
+
zip215: [{
|
|
110
|
+
"note": "a small-order public key",
|
|
111
|
+
"publicKeyB64": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
|
|
112
|
+
"signatureB64": "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
|
|
113
|
+
"message": "fkn/app/v1/zip215"
|
|
114
|
+
}, {
|
|
115
|
+
"note": "a non-canonical R encoding under an ordinary public key",
|
|
116
|
+
"publicKeyB64": "bnoc3Smwt4/ROvTFWY/v9O8qlxZuPKby5Pv8zYBQW/E=",
|
|
117
|
+
"signatureB64": "7v///////////////////////////////////////3+QeLxhli1v6jdHPU8IhIUS3KXJ2zstCQCFk5+gqYu4Cg==",
|
|
118
|
+
"message": "fkn/app/v1/zip215"
|
|
119
|
+
}]
|
|
120
|
+
};
|
|
121
|
+
//#endregion
|
|
122
|
+
exports.vectors = vectors;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The cross-implementation vectors, as a built module: `fixtures/vectors.json` is inlined at build
|
|
3
|
+
* time, so a consumer needs no JSON resolution and no bundler configuration of its own. Generated
|
|
4
|
+
* by `scripts/make-vectors.ts` (`npm run vectors`).
|
|
5
|
+
*
|
|
6
|
+
* Nothing here reaches the curve code, so a consumer that imports the vectors alone carries none of
|
|
7
|
+
* it.
|
|
8
|
+
*/
|
|
9
|
+
export type Vectors = {
|
|
10
|
+
zeroRoot: {
|
|
11
|
+
rootHex: string;
|
|
12
|
+
slug: string;
|
|
13
|
+
app: string;
|
|
14
|
+
fingerprint: string;
|
|
15
|
+
sha256Root: string;
|
|
16
|
+
sha256AppInput: string;
|
|
17
|
+
};
|
|
18
|
+
/** Every caller id spelling, with the canonical source id it collapses to, or null. */
|
|
19
|
+
sources: [string, string | null][];
|
|
20
|
+
/** Every room scope spelling, with whether a room id may be dialled under it. */
|
|
21
|
+
roomScopes: [string, boolean][];
|
|
22
|
+
signed: {
|
|
23
|
+
rootSeedHex: string;
|
|
24
|
+
rootPublicB64: string;
|
|
25
|
+
subkeySeedsHex: string[];
|
|
26
|
+
subkeyPublicsB64: string[];
|
|
27
|
+
app: string;
|
|
28
|
+
slug: string;
|
|
29
|
+
serial: number;
|
|
30
|
+
sources: string[];
|
|
31
|
+
issuedAt: number;
|
|
32
|
+
previous: {
|
|
33
|
+
rootSeedHex: string;
|
|
34
|
+
rootPublicB64: string;
|
|
35
|
+
slug: string;
|
|
36
|
+
app: string;
|
|
37
|
+
};
|
|
38
|
+
manifest: Record<string, unknown>;
|
|
39
|
+
raw: string;
|
|
40
|
+
};
|
|
41
|
+
zip215: {
|
|
42
|
+
note: string;
|
|
43
|
+
publicKeyB64: string;
|
|
44
|
+
signatureB64: string;
|
|
45
|
+
message: string;
|
|
46
|
+
}[];
|
|
47
|
+
};
|
|
48
|
+
export declare const vectors: Vectors;
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
//#endregion
|
|
2
|
+
//#region src/fixtures.ts
|
|
3
|
+
/**
|
|
4
|
+
* The cross-implementation vectors, as a built module: `fixtures/vectors.json` is inlined at build
|
|
5
|
+
* time, so a consumer needs no JSON resolution and no bundler configuration of its own. Generated
|
|
6
|
+
* by `scripts/make-vectors.ts` (`npm run vectors`).
|
|
7
|
+
*
|
|
8
|
+
* Nothing here reaches the curve code, so a consumer that imports the vectors alone carries none of
|
|
9
|
+
* it.
|
|
10
|
+
*/
|
|
11
|
+
var vectors = {
|
|
12
|
+
zeroRoot: {
|
|
13
|
+
"rootHex": "0000000000000000000000000000000000000000000000000000000000000000",
|
|
14
|
+
"slug": "stub",
|
|
15
|
+
"app": "fkn:app:1jypnc6jbtvxg7gn5cuqczwqct6oa62fhjmimlol7cs4dhmpw4nbq",
|
|
16
|
+
"fingerprint": "1mzuhvlpymk6xo3epygfy5h4oeaejofefn3rdhm4qfjmr2dk7fesq",
|
|
17
|
+
"sha256Root": "66687aadf862bd776c8fc18b8e9f8e20089714856ee233b3902a591d0d5f2925",
|
|
18
|
+
"sha256AppInput": "4e1ed179219d6e6f99bd15202cda029f9c0f68a74b10c5b97f14b833b1f6e343"
|
|
19
|
+
},
|
|
20
|
+
sources: [
|
|
21
|
+
["npm:@banou/stub", "npm:@banou/stub"],
|
|
22
|
+
["npm:@banou/stub@1.2.3", "npm:@banou/stub"],
|
|
23
|
+
["npm:lodash", "npm:lodash"],
|
|
24
|
+
["gh:owner/repo", "gh:owner/repo"],
|
|
25
|
+
["gh:owner/repo@ref", "gh:owner/repo"],
|
|
26
|
+
["https:anime.fkn.app", "https:anime.fkn.app"],
|
|
27
|
+
["https:anime.fkn.app:8443", "https:anime.fkn.app:8443"],
|
|
28
|
+
["https:anime.fkn.app@L3g", "https:anime.fkn.app@L3g"],
|
|
29
|
+
["https:anime.fkn.app@Lw", "https:anime.fkn.app"],
|
|
30
|
+
["https:anime.fkn.app@Ly94Ly8", "https:anime.fkn.app@L3g"],
|
|
31
|
+
["https://anime.fkn.app", "https:anime.fkn.app"],
|
|
32
|
+
["https://anime.fkn.app/", "https:anime.fkn.app"],
|
|
33
|
+
["https://Anime.FKN.app/x", "https:anime.fkn.app"],
|
|
34
|
+
["https://anime.fkn.app:8443", "https:anime.fkn.app:8443"],
|
|
35
|
+
["http://x", null],
|
|
36
|
+
["http://anime.fkn.app", null],
|
|
37
|
+
["localhost:1234", null],
|
|
38
|
+
["global", null],
|
|
39
|
+
["fkn:app:1aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", null],
|
|
40
|
+
["fkn:platform", null],
|
|
41
|
+
["https:anime.fkn.app/x", null],
|
|
42
|
+
["npm:@banou/stub@not a version", null],
|
|
43
|
+
["gh:owner", null],
|
|
44
|
+
["", null],
|
|
45
|
+
["npm:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", null],
|
|
46
|
+
["https:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com", null]
|
|
47
|
+
],
|
|
48
|
+
roomScopes: [
|
|
49
|
+
["fkn:app:1aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", true],
|
|
50
|
+
["fkn:app:1bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", true],
|
|
51
|
+
["fkn:app:1aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", false],
|
|
52
|
+
["fkn:app:1aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", false],
|
|
53
|
+
["fkn:app:10aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", false],
|
|
54
|
+
["fkn:app:11aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", false],
|
|
55
|
+
["fkn:app:18aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", false],
|
|
56
|
+
["fkn:app:19aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", false],
|
|
57
|
+
["fkn:app:2aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", false],
|
|
58
|
+
["FKN:APP:1aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", false],
|
|
59
|
+
["fkn:app:1", false],
|
|
60
|
+
["fkn:", false],
|
|
61
|
+
["fkn:platform", false],
|
|
62
|
+
["fkn:app", false],
|
|
63
|
+
["global", true],
|
|
64
|
+
["npm:@banou/social", true],
|
|
65
|
+
["https:anime.fkn.app", true],
|
|
66
|
+
["https://anime.fkn.app", true]
|
|
67
|
+
],
|
|
68
|
+
signed: {
|
|
69
|
+
"rootSeedHex": "0101010101010101010101010101010101010101010101010101010101010101",
|
|
70
|
+
"rootPublicB64": "iojj3XQJ8ZX9UtstPLpdcspnCb8dlBIb83SIAbQPb1w=",
|
|
71
|
+
"subkeySeedsHex": ["0202020202020202020202020202020202020202020202020202020202020202", "0303030303030303030303030303030303030303030303030303030303030303"],
|
|
72
|
+
"subkeyPublicsB64": ["gTl3Dqh9F19Wo1Rmw0x+zMuNipG07jeiXfYPW4/Js5Q=", "7UkoxijRwsbq6QM4kFmVYSlZJzpcY/k2NsFGFKyHN9E="],
|
|
73
|
+
"app": "fkn:app:1ri3bdrqt6s523pw4qoipbqktj3dfk2ix735ilnmamp5sstxrlgbq",
|
|
74
|
+
"slug": "fixture",
|
|
75
|
+
"serial": 3,
|
|
76
|
+
"sources": ["npm:@fkn/fixture", "https:fixture.example"],
|
|
77
|
+
"issuedAt": 17573e5,
|
|
78
|
+
"previous": {
|
|
79
|
+
"rootSeedHex": "0404040404040404040404040404040404040404040404040404040404040404",
|
|
80
|
+
"rootPublicB64": "ypOsFwUYcHHWe4PH/w7+gQjo7EUwV113JoeTM9vavnw=",
|
|
81
|
+
"slug": "stub",
|
|
82
|
+
"app": "fkn:app:1krjgaj3uu7q76pudzhuitywhf4gordjipzcbrjyk5oprica7nb3q"
|
|
83
|
+
},
|
|
84
|
+
"manifest": {
|
|
85
|
+
"v": 1,
|
|
86
|
+
"app": "fkn:app:1ri3bdrqt6s523pw4qoipbqktj3dfk2ix735ilnmamp5sstxrlgbq",
|
|
87
|
+
"root": "iojj3XQJ8ZX9UtstPLpdcspnCb8dlBIb83SIAbQPb1w=",
|
|
88
|
+
"slug": "fixture",
|
|
89
|
+
"keys": {
|
|
90
|
+
"serial": 3,
|
|
91
|
+
"members": ["gTl3Dqh9F19Wo1Rmw0x+zMuNipG07jeiXfYPW4/Js5Q=", "7UkoxijRwsbq6QM4kFmVYSlZJzpcY/k2NsFGFKyHN9E="],
|
|
92
|
+
"sig": "/P/l+SM/vh5P23lt1mVjBRW9CvcytmHI0UGyMZ4nwcnWCqR5syMv5OLy6RGVRPGBqkO6Nlhr8NwLDV+ZIWiuAA=="
|
|
93
|
+
},
|
|
94
|
+
"key": "gTl3Dqh9F19Wo1Rmw0x+zMuNipG07jeiXfYPW4/Js5Q=",
|
|
95
|
+
"sources": ["npm:@fkn/fixture", "https:fixture.example"],
|
|
96
|
+
"name": "Fixture",
|
|
97
|
+
"issuedAt": 17573e5,
|
|
98
|
+
"previous": [{
|
|
99
|
+
"app": "fkn:app:1krjgaj3uu7q76pudzhuitywhf4gordjipzcbrjyk5oprica7nb3q",
|
|
100
|
+
"root": "ypOsFwUYcHHWe4PH/w7+gQjo7EUwV113JoeTM9vavnw=",
|
|
101
|
+
"slug": "stub",
|
|
102
|
+
"sig": "WLs2nkaR5RNb8xw62/HLNBubxuDqTLpff/aYyh1dGZYDYR+Fc4nLJcemNgvWmILFVT8boTHROJFQg3zECTXsBg=="
|
|
103
|
+
}],
|
|
104
|
+
"sig": "xmttQ9pgcfFQxnVhTrJiCeMEnU7fNF3tVeObxaTkiYmXLLzv7CrYNN2sxcDuHRSJHPmbOdGHniEnHpEwHXr7Bg=="
|
|
105
|
+
},
|
|
106
|
+
"raw": "{\"v\":1,\"app\":\"fkn:app:1ri3bdrqt6s523pw4qoipbqktj3dfk2ix735ilnmamp5sstxrlgbq\",\"root\":\"iojj3XQJ8ZX9UtstPLpdcspnCb8dlBIb83SIAbQPb1w=\",\"slug\":\"fixture\",\"keys\":{\"serial\":3,\"members\":[\"gTl3Dqh9F19Wo1Rmw0x+zMuNipG07jeiXfYPW4/Js5Q=\",\"7UkoxijRwsbq6QM4kFmVYSlZJzpcY/k2NsFGFKyHN9E=\"],\"sig\":\"/P/l+SM/vh5P23lt1mVjBRW9CvcytmHI0UGyMZ4nwcnWCqR5syMv5OLy6RGVRPGBqkO6Nlhr8NwLDV+ZIWiuAA==\"},\"key\":\"gTl3Dqh9F19Wo1Rmw0x+zMuNipG07jeiXfYPW4/Js5Q=\",\"sources\":[\"npm:@fkn/fixture\",\"https:fixture.example\"],\"name\":\"Fixture\",\"issuedAt\":1757300000,\"previous\":[{\"app\":\"fkn:app:1krjgaj3uu7q76pudzhuitywhf4gordjipzcbrjyk5oprica7nb3q\",\"root\":\"ypOsFwUYcHHWe4PH/w7+gQjo7EUwV113JoeTM9vavnw=\",\"slug\":\"stub\",\"sig\":\"WLs2nkaR5RNb8xw62/HLNBubxuDqTLpff/aYyh1dGZYDYR+Fc4nLJcemNgvWmILFVT8boTHROJFQg3zECTXsBg==\"}],\"sig\":\"xmttQ9pgcfFQxnVhTrJiCeMEnU7fNF3tVeObxaTkiYmXLLzv7CrYNN2sxcDuHRSJHPmbOdGHniEnHpEwHXr7Bg==\"}"
|
|
107
|
+
},
|
|
108
|
+
zip215: [{
|
|
109
|
+
"note": "a small-order public key",
|
|
110
|
+
"publicKeyB64": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
|
|
111
|
+
"signatureB64": "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
|
|
112
|
+
"message": "fkn/app/v1/zip215"
|
|
113
|
+
}, {
|
|
114
|
+
"note": "a non-canonical R encoding under an ordinary public key",
|
|
115
|
+
"publicKeyB64": "bnoc3Smwt4/ROvTFWY/v9O8qlxZuPKby5Pv8zYBQW/E=",
|
|
116
|
+
"signatureB64": "7v///////////////////////////////////////3+QeLxhli1v6jdHPU8IhIUS3KXJ2zstCQCFk5+gqYu4Cg==",
|
|
117
|
+
"message": "fkn/app/v1/zip215"
|
|
118
|
+
}]
|
|
119
|
+
};
|
|
120
|
+
//#endregion
|
|
121
|
+
export { vectors };
|