Skip to content
Merged
Show file tree
Hide file tree
Changes from 250 commits
Commits
Show all changes
662 commits
Select commit Hold shift + click to select a range
b9d663c
fix(be): store the anchor the write path was handed, always
sea-snake Sep 6, 2026
ad7b846
Merge branch 'feat/session-cap-per-identity' into feat/sign-in-create…
sea-snake Sep 6, 2026
ff06ce6
refactor(be): the write path takes the identity record, and stores it
sea-snake Sep 6, 2026
850c996
Merge branch 'feat/session-create' into feat/session-cap-per-identity
sea-snake Sep 6, 2026
ca7aa68
Merge branch 'feat/session-cap-per-identity' into feat/sign-in-create…
sea-snake Sep 6, 2026
74fa1e4
refactor(be): the ceremony hands over keys, not conclusions
sea-snake Sep 6, 2026
ad956be
fix(be): refuse a session that is already over
sea-snake Sep 6, 2026
08283a5
Merge branch 'feat/session-create' into feat/session-cap-per-identity
sea-snake Sep 6, 2026
9efefa0
Merge branch 'feat/session-cap-per-identity' into feat/sign-in-create…
sea-snake Sep 6, 2026
a1ab2f8
refactor(be): the delegation paths ask for the salt rather than await…
sea-snake Sep 7, 2026
71737e9
refactor(be): nothing awaits the salt any more
sea-snake Sep 7, 2026
da60740
Merge branch 'refactor/account-reference-write-path' into refactor/mo…
sea-snake Sep 7, 2026
3f46069
Merge branch 'refactor/monotonic-application-numbers' into fix/read-a…
sea-snake Sep 7, 2026
abfde64
Merge branch 'fix/read-account-empty-list-is-not-default' into feat/t…
sea-snake Sep 7, 2026
9702956
Merge branch 'feat/track-default-accounts' into feat/account-principa…
sea-snake Sep 7, 2026
f90e1a9
Merge branch 'feat/account-principal-index' into feat/account-princip…
sea-snake Sep 7, 2026
8a7a3a1
Merge branch 'feat/account-principal-index-backfill' into feat/sessio…
sea-snake Sep 7, 2026
68ddb99
Merge branch 'feat/session-record-storage' into feat/session-devices-…
sea-snake Sep 7, 2026
4629e83
Merge branch 'feat/session-devices-registry' into feat/session-device…
sea-snake Sep 7, 2026
7649ba0
Merge branch 'feat/session-create' into feat/session-cap-per-identity
sea-snake Sep 7, 2026
ebed771
Merge branch 'feat/session-device-key-proof' into feat/session-create
sea-snake Sep 7, 2026
c463de7
Merge branch 'refactor/monotonic-application-numbers' into fix/read-a…
sea-snake Sep 7, 2026
3250b31
Merge branch 'fix/read-account-empty-list-is-not-default' into feat/t…
sea-snake Sep 7, 2026
b3739a1
Merge branch 'feat/track-default-accounts' into feat/account-principa…
sea-snake Sep 7, 2026
8779dec
Merge branch 'feat/account-principal-index' into feat/account-princip…
sea-snake Sep 7, 2026
6daf6be
Merge branch 'feat/account-principal-index-backfill' into feat/sessio…
sea-snake Sep 7, 2026
e258533
Merge branch 'feat/session-record-storage' into feat/session-devices-…
sea-snake Sep 7, 2026
aea1bc2
Merge branch 'feat/session-devices-registry' into feat/session-device…
sea-snake Sep 7, 2026
3b93122
Merge branch 'feat/session-create' into feat/session-cap-per-identity
sea-snake Sep 7, 2026
1bb1969
Merge branch 'feat/session-device-key-proof' into feat/session-create
sea-snake Sep 7, 2026
b4cc7d7
refactor(be): the sign-in ceremony does not await the salt
sea-snake Sep 7, 2026
f128675
fix(internet_identity): derive the salt from a timer at install
sea-snake Sep 7, 2026
f6f9f46
Merge branch 'fix/read-account-empty-list-is-not-default' into feat/t…
sea-snake Sep 7, 2026
df8a1b3
Merge branch 'refactor/monotonic-application-numbers' into fix/read-a…
sea-snake Sep 7, 2026
6151630
Merge branch 'refactor/account-reference-write-path' into refactor/mo…
sea-snake Sep 7, 2026
e0171cf
Merge branch 'feat/track-default-accounts' into feat/account-principa…
sea-snake Sep 7, 2026
51f8bb2
Merge branch 'feat/account-principal-index' into feat/account-princip…
sea-snake Sep 7, 2026
18834ca
Merge branch 'feat/account-principal-index-backfill' into feat/sessio…
sea-snake Sep 7, 2026
db6f3f9
Merge branch 'feat/session-record-storage' into feat/session-devices-…
sea-snake Sep 7, 2026
b3eebe9
Merge branch 'feat/session-devices-registry' into feat/session-device…
sea-snake Sep 7, 2026
057f454
Merge branch 'feat/session-create' into feat/session-cap-per-identity
sea-snake Sep 7, 2026
40796a7
Merge branch 'feat/session-device-key-proof' into feat/session-create
sea-snake Sep 7, 2026
6d4b9e5
Merge branch 'feat/session-cap-per-identity' into feat/sign-in-create…
sea-snake Sep 7, 2026
77d4574
fix(internet_identity): derive the salt from init, not from every upg…
sea-snake Sep 7, 2026
69cfc96
fix(internet_identity): refuse a repeated account reference
sea-snake Sep 7, 2026
3f4701a
Merge branch 'fix/read-account-empty-list-is-not-default' into feat/t…
sea-snake Sep 7, 2026
e3e9bf8
Merge branch 'refactor/monotonic-application-numbers' into fix/read-a…
sea-snake Sep 7, 2026
6f3b0ea
Merge branch 'refactor/account-reference-write-path' into refactor/mo…
sea-snake Sep 7, 2026
b67df08
fix(internet_identity): derive the default account from the reference…
sea-snake Sep 7, 2026
b5f7a49
docs(internet_identity): name what retiring a list does, and where th…
sea-snake Sep 7, 2026
ce80d6b
Merge branch 'feat/track-default-accounts' into feat/account-principa…
sea-snake Sep 7, 2026
d5ca19b
perf(internet_identity): derive only the accounts a write moved
sea-snake Sep 7, 2026
bff2630
Merge branch 'feat/account-principal-index-backfill' into feat/sessio…
sea-snake Sep 7, 2026
b7614ad
Merge branch 'feat/account-principal-index' into feat/account-princip…
sea-snake Sep 7, 2026
2b81c84
Merge branch 'feat/session-record-storage' into feat/session-devices-…
sea-snake Sep 7, 2026
d1aa655
Merge branch 'feat/session-devices-registry' into feat/session-device…
sea-snake Sep 7, 2026
ad84c7b
Merge branch 'feat/session-create' into feat/session-cap-per-identity
sea-snake Sep 7, 2026
b27036b
Merge branch 'feat/session-device-key-proof' into feat/session-create
sea-snake Sep 7, 2026
e82a441
Merge branch 'feat/session-cap-per-identity' into feat/sign-in-create…
sea-snake Sep 7, 2026
92d9040
test(internet_identity): build the default-repair reference through i…
sea-snake Sep 7, 2026
7d46b04
Merge branch 'feat/session-record-storage' into feat/session-devices-…
sea-snake Sep 7, 2026
9a5c56f
Merge branch 'feat/session-devices-registry' into feat/session-device…
sea-snake Sep 7, 2026
de03e4b
Merge branch 'feat/session-create' into feat/session-cap-per-identity
sea-snake Sep 7, 2026
2c4de6e
Merge branch 'feat/session-device-key-proof' into feat/session-create
sea-snake Sep 7, 2026
2d9fb82
Merge branch 'feat/session-cap-per-identity' into feat/sign-in-create…
sea-snake Sep 7, 2026
0e812a4
fix(internet_identity): ask for the salt at install, and let asking t…
sea-snake Sep 7, 2026
1e20ad2
Merge branch 'fix/read-account-empty-list-is-not-default' into feat/t…
sea-snake Sep 7, 2026
4911057
Merge branch 'refactor/monotonic-application-numbers' into fix/read-a…
sea-snake Sep 7, 2026
55532c4
Merge branch 'refactor/account-reference-write-path' into refactor/mo…
sea-snake Sep 7, 2026
3a1cb7e
Merge branch 'feat/track-default-accounts' into feat/account-principa…
sea-snake Sep 7, 2026
48ae1a0
Merge branch 'feat/account-principal-index' into feat/account-princip…
sea-snake Sep 7, 2026
4bbe067
Merge branch 'feat/account-principal-index-backfill' into feat/sessio…
sea-snake Sep 7, 2026
ec901e7
Merge branch 'feat/session-record-storage' into feat/session-devices-…
sea-snake Sep 7, 2026
23bbbcb
Merge branch 'feat/session-devices-registry' into feat/session-device…
sea-snake Sep 7, 2026
1860f26
Merge branch 'feat/session-create' into feat/session-cap-per-identity
sea-snake Sep 7, 2026
9c16933
Merge branch 'feat/session-device-key-proof' into feat/session-create
sea-snake Sep 7, 2026
1860841
Merge branch 'feat/session-cap-per-identity' into feat/sign-in-create…
sea-snake Sep 7, 2026
7f3fb76
test(internet_identity): regenerate the ICRC-3 vectors
sea-snake Sep 7, 2026
34d8366
Merge branch 'fix/read-account-empty-list-is-not-default' into feat/t…
sea-snake Sep 7, 2026
70c85af
Merge branch 'feat/track-default-accounts' into feat/account-principa…
sea-snake Sep 7, 2026
d8a55d1
Merge branch 'feat/account-principal-index' into feat/account-princip…
sea-snake Sep 7, 2026
d4915ac
Merge branch 'feat/account-principal-index-backfill' into feat/sessio…
sea-snake Sep 7, 2026
8befb66
Merge branch 'feat/session-record-storage' into feat/session-devices-…
sea-snake Sep 7, 2026
14f8b87
Merge branch 'feat/session-devices-registry' into feat/session-device…
sea-snake Sep 7, 2026
88ac674
Merge branch 'refactor/monotonic-application-numbers' into fix/read-a…
sea-snake Sep 7, 2026
1c1d44e
Merge branch 'feat/session-create' into feat/session-cap-per-identity
sea-snake Sep 7, 2026
9a07b8c
Merge branch 'feat/session-device-key-proof' into feat/session-create
sea-snake Sep 7, 2026
3a2daf5
Merge branch 'refactor/account-reference-write-path' into refactor/mo…
sea-snake Sep 7, 2026
8d444dd
Merge branch 'feat/session-cap-per-identity' into feat/sign-in-create…
sea-snake Sep 7, 2026
7c21adf
Merge branch 'fix/read-account-empty-list-is-not-default' into feat/t…
sea-snake Sep 7, 2026
d4ed180
Merge branch 'feat/track-default-accounts' into feat/account-principa…
sea-snake Sep 7, 2026
0ed09bc
Merge branch 'feat/account-principal-index' into feat/account-princip…
sea-snake Sep 7, 2026
bddc08b
Merge branch 'feat/account-principal-index-backfill' into feat/sessio…
sea-snake Sep 7, 2026
a51d25e
Merge branch 'feat/session-record-storage' into feat/session-devices-…
sea-snake Sep 7, 2026
e60b657
Merge branch 'feat/session-devices-registry' into feat/session-device…
sea-snake Sep 7, 2026
def7645
fix(internet_identity): the account cap refuses growth, not every write
sea-snake Sep 7, 2026
c051fc3
Merge branch 'feat/session-create' into feat/session-cap-per-identity
sea-snake Sep 7, 2026
41c6c36
Merge branch 'feat/session-cap-per-identity' into feat/sign-in-create…
sea-snake Sep 7, 2026
15f4d36
Merge branch 'feat/session-device-key-proof' into feat/session-create
sea-snake Sep 7, 2026
19bd01f
fix(internet_identity): the session cap refuses growth, not every move
sea-snake Sep 7, 2026
696dcf9
Merge branch 'feat/session-cap-per-identity' into feat/sign-in-create…
sea-snake Sep 7, 2026
3d89670
fix(internet_identity): evict at the cap, and take the default from t…
sea-snake Sep 7, 2026
ff6f5ef
Merge branch 'feat/track-default-accounts' into feat/account-principa…
sea-snake Sep 7, 2026
7925ec3
perf(internet_identity): stop copying the stored list, and bound the …
sea-snake Sep 7, 2026
21e4313
Merge branch 'feat/session-device-key-proof' into feat/session-create
sea-snake Sep 7, 2026
f81663a
Merge branch 'feat/account-principal-index' into feat/account-princip…
sea-snake Sep 7, 2026
c7f0008
Merge branch 'feat/account-principal-index-backfill' into feat/sessio…
sea-snake Sep 7, 2026
fe562e4
Merge branch 'feat/session-record-storage' into feat/session-devices-…
sea-snake Sep 7, 2026
410099b
Merge branch 'feat/session-devices-registry' into feat/session-device…
sea-snake Sep 7, 2026
46f414b
perf(internet_identity): bound the session index too
sea-snake Sep 7, 2026
d7b64cd
Merge branch 'feat/session-create' into feat/session-cap-per-identity
sea-snake Sep 7, 2026
c9fbe5c
Merge branch 'feat/session-cap-per-identity' into feat/sign-in-create…
sea-snake Sep 7, 2026
983626f
fix(internet_identity): rename the tombstone count at this helper too
sea-snake Sep 7, 2026
9bfb258
Merge branch 'feat/account-principal-index-backfill' into feat/sessio…
sea-snake Sep 7, 2026
6c6fd7e
Merge branch 'feat/session-record-storage' into feat/session-devices-…
sea-snake Sep 7, 2026
a190628
Merge branch 'feat/session-devices-registry' into feat/session-device…
sea-snake Sep 7, 2026
f3f2ba0
Merge branch 'feat/session-device-key-proof' into feat/session-create
sea-snake Sep 7, 2026
4b35ed2
Merge branch 'feat/session-create' into feat/session-cap-per-identity
sea-snake Sep 7, 2026
cc59180
Merge branch 'feat/session-cap-per-identity' into feat/sign-in-create…
sea-snake Sep 7, 2026
3feb398
Merge branch 'feat/account-principal-index' into feat/account-princip…
sea-snake Sep 7, 2026
ff93a79
Merge branch 'feat/account-principal-index-backfill' into feat/sessio…
sea-snake Sep 7, 2026
737b8e4
Merge branch 'feat/track-default-accounts' into feat/account-principa…
sea-snake Sep 7, 2026
34f6a8b
test(internet_identity): sign in past the cap before expecting an evi…
sea-snake Sep 7, 2026
dd819f0
Merge branch 'feat/session-record-storage' into feat/session-devices-…
sea-snake Sep 7, 2026
1a55ddf
Merge branch 'feat/session-devices-registry' into feat/session-device…
sea-snake Sep 7, 2026
b1d4469
Merge branch 'feat/session-device-key-proof' into feat/session-create
sea-snake Sep 7, 2026
c816a6e
Merge branch 'feat/session-create' into feat/session-cap-per-identity
sea-snake Sep 7, 2026
d8ade11
Merge branch 'feat/session-cap-per-identity' into feat/sign-in-create…
sea-snake Sep 7, 2026
5af770e
Merge remote-tracking branch 'origin/main' into refactor/account-refe…
sea-snake Sep 7, 2026
d9034cf
Merge branch 'refactor/account-reference-write-path' into refactor/mo…
sea-snake Sep 7, 2026
1d5f317
Merge branch 'feat/account-principal-index' into feat/account-princip…
sea-snake Sep 7, 2026
20d3228
Merge branch 'feat/account-principal-index-backfill' into feat/sessio…
sea-snake Sep 7, 2026
9a1cf63
Merge branch 'feat/session-record-storage' into feat/session-devices-…
sea-snake Sep 7, 2026
896741a
Merge branch 'feat/session-devices-registry' into feat/session-device…
sea-snake Sep 7, 2026
c652d54
Merge branch 'feat/session-device-key-proof' into feat/session-create
sea-snake Sep 7, 2026
25f94ef
Merge branch 'feat/session-create' into feat/session-cap-per-identity
sea-snake Sep 7, 2026
30a1f23
Merge branch 'feat/track-default-accounts' into feat/account-principa…
sea-snake Sep 7, 2026
bb31ab4
Merge branch 'refactor/monotonic-application-numbers' into fix/read-a…
sea-snake Sep 7, 2026
3d9a4bf
Merge branch 'fix/read-account-empty-list-is-not-default' into feat/t…
sea-snake Sep 7, 2026
51c46dd
Merge branch 'feat/session-cap-per-identity' into feat/sign-in-create…
sea-snake Sep 7, 2026
47abea1
fix(internet_identity): a backfill timer that fires after finishing i…
sea-snake Sep 8, 2026
876205e
Merge branch 'feat/account-principal-index-backfill' into feat/sessio…
sea-snake Sep 8, 2026
2281b22
Merge branch 'feat/session-record-storage' into feat/session-devices-…
sea-snake Sep 8, 2026
4a81fcd
Merge branch 'feat/session-devices-registry' into feat/session-device…
sea-snake Sep 8, 2026
483271c
Merge branch 'feat/session-device-key-proof' into feat/session-create
sea-snake Sep 8, 2026
d403a93
Merge branch 'feat/session-create' into feat/session-cap-per-identity
sea-snake Sep 8, 2026
aea8765
Merge branch 'feat/session-cap-per-identity' into feat/sign-in-create…
sea-snake Sep 8, 2026
66b2d67
docs(internet_identity): the backfill re-running is a cost, not a pur…
sea-snake Sep 8, 2026
18f27c7
docs(internet_identity): the index sync gives up redundancy, not repair
sea-snake Sep 8, 2026
a6d4823
Merge branch 'feat/account-principal-index' into feat/account-princip…
sea-snake Sep 8, 2026
8c7ae3e
Merge branch 'feat/account-principal-index-backfill' into feat/sessio…
sea-snake Sep 8, 2026
9a88ba0
Merge branch 'feat/session-record-storage' into feat/session-devices-…
sea-snake Sep 8, 2026
e39f89d
Merge branch 'feat/session-devices-registry' into feat/session-device…
sea-snake Sep 8, 2026
f71af57
Merge branch 'feat/session-device-key-proof' into feat/session-create
sea-snake Sep 8, 2026
d3e06c5
Merge branch 'feat/session-create' into feat/session-cap-per-identity
sea-snake Sep 8, 2026
46844f5
Merge branch 'feat/session-cap-per-identity' into feat/sign-in-create…
sea-snake Sep 8, 2026
327c8dd
fix(internet_identity): report the application-number allocator's memory
sea-snake Sep 8, 2026
7528b6e
Merge branch 'refactor/monotonic-application-numbers' into fix/read-a…
sea-snake Sep 8, 2026
8fa092d
Merge branch 'fix/read-account-empty-list-is-not-default' into feat/t…
sea-snake Sep 8, 2026
14243f1
Merge branch 'feat/track-default-accounts' into feat/account-principa…
sea-snake Sep 8, 2026
f103d6b
Merge branch 'feat/account-principal-index' into feat/account-princip…
sea-snake Sep 8, 2026
7cfb05f
Merge branch 'feat/account-principal-index-backfill' into feat/sessio…
sea-snake Sep 8, 2026
7e69b08
Merge branch 'feat/session-record-storage' into feat/session-devices-…
sea-snake Sep 8, 2026
d1f36ff
Merge branch 'feat/session-devices-registry' into feat/session-device…
sea-snake Sep 8, 2026
951ae05
Merge branch 'feat/session-device-key-proof' into feat/session-create
sea-snake Sep 8, 2026
d5218b4
fix(internet_identity): report the session index and id allocator's m…
sea-snake Sep 8, 2026
943d540
Merge branch 'feat/session-create' into feat/session-cap-per-identity
sea-snake Sep 8, 2026
9cc4a2c
Merge branch 'feat/session-cap-per-identity' into feat/sign-in-create…
sea-snake Sep 8, 2026
63a8eba
Merge remote-tracking branch 'origin/main' into refactor/account-refe…
sea-snake Sep 8, 2026
0ce06a9
Merge branch 'refactor/account-reference-write-path' into refactor/mo…
sea-snake Sep 8, 2026
a148eab
Merge branch 'refactor/monotonic-application-numbers' into fix/read-a…
sea-snake Sep 8, 2026
06d1abe
Merge branch 'fix/read-account-empty-list-is-not-default' into feat/t…
sea-snake Sep 8, 2026
bb415ab
Merge branch 'feat/track-default-accounts' into feat/account-principa…
sea-snake Sep 8, 2026
8a27173
Merge branch 'feat/account-principal-index' into feat/account-princip…
sea-snake Sep 8, 2026
054326a
Merge branch 'feat/account-principal-index-backfill' into feat/sessio…
sea-snake Sep 8, 2026
d417061
Merge branch 'feat/session-record-storage' into feat/session-devices-…
sea-snake Sep 8, 2026
5d4215f
Merge branch 'feat/session-device-key-proof' into feat/session-create
sea-snake Sep 8, 2026
2bc8aa1
Merge branch 'feat/session-devices-registry' into feat/session-device…
sea-snake Sep 8, 2026
8ba87e6
Merge branch 'feat/session-create' into feat/session-cap-per-identity
sea-snake Sep 8, 2026
7392f16
Merge branch 'feat/session-cap-per-identity' into feat/sign-in-create…
sea-snake Sep 8, 2026
864dcfc
chore: record main as merged after the bottom six landed
sea-snake Sep 8, 2026
a9d363b
chore: merge feat/session-record-storage
sea-snake Sep 8, 2026
c132027
chore: merge feat/session-device-key-proof
sea-snake Sep 8, 2026
0b5876b
chore: merge feat/session-create
sea-snake Sep 8, 2026
02a3d66
chore: merge feat/session-cap-per-identity
sea-snake Sep 8, 2026
ff07585
chore: merge feat/session-devices-registry
sea-snake Sep 8, 2026
9819730
refactor(internet_identity): a session records the browser it came from
sea-snake Sep 8, 2026
d8d8edb
chore: merge feat/session-record-storage
sea-snake Sep 8, 2026
fc15af3
chore: merge feat/session-device-key-proof
sea-snake Sep 8, 2026
712c7e1
chore: merge feat/session-create
sea-snake Sep 8, 2026
f7599da
chore: merge feat/session-cap-per-identity
sea-snake Sep 8, 2026
b5afb48
chore: merge feat/session-devices-registry
sea-snake Sep 8, 2026
8ca86a0
feat(internet_identity): count each browser's sessions where they are…
sea-snake Sep 8, 2026
e845284
chore: merge feat/session-create
sea-snake Sep 8, 2026
b95e3d4
chore: merge feat/session-cap-per-identity
sea-snake Sep 8, 2026
ef8c218
chore(internet_identity): retire the account principal index backfill
sea-snake Sep 8, 2026
024e35f
chore: merge chore/retire-account-principal-index-backfill
sea-snake Sep 8, 2026
3a8668d
chore: merge feat/session-record-storage
sea-snake Sep 8, 2026
d97094f
chore: merge feat/session-devices-registry
sea-snake Sep 8, 2026
c06643d
chore: merge feat/session-device-key-proof
sea-snake Sep 8, 2026
93b8c50
chore: merge feat/session-create
sea-snake Sep 8, 2026
2992f6b
chore: merge feat/session-cap-per-identity
sea-snake Sep 8, 2026
4835dcf
feat(internet_identity): a browser describes itself in tokens, not a …
sea-snake Sep 8, 2026
f72c880
chore: merge feat/session-devices-registry
sea-snake Sep 8, 2026
32cb0fe
chore: merge feat/session-device-key-proof, and take the description …
sea-snake Sep 8, 2026
3d62641
chore: merge feat/session-cap-per-identity
sea-snake Sep 8, 2026
e2a39ff
chore: merge feat/session-create
sea-snake Sep 8, 2026
38532bc
feat(internet_identity): a sign-in reports what the browser is, in to…
sea-snake Sep 8, 2026
e4e03b7
docs(internet_identity): state why one write, without narrating the loop
sea-snake Sep 8, 2026
3e0fa1a
chore: merge feat/session-cap-per-identity
sea-snake Sep 8, 2026
6277d0b
chore: merge feat/session-create
sea-snake Sep 8, 2026
22e4612
feat(internet_identity): name the six browsers that earn an icon
sea-snake Sep 9, 2026
fd3c05a
chore: merge feat/session-device-key-proof
sea-snake Sep 9, 2026
cdc36fb
chore: merge feat/session-devices-registry
sea-snake Sep 9, 2026
7e253e4
chore: merge feat/session-cap-per-identity
sea-snake Sep 9, 2026
4375096
chore: merge feat/session-create
sea-snake Sep 9, 2026
8e7f065
test(internet_identity): pick a named brand that still exists
sea-snake Sep 9, 2026
9de8210
fix(be): a sign-in writes its own origin, and the gate sweeps the rest
sea-snake Sep 9, 2026
54fa5f7
chore: merge feat/session-create
sea-snake Sep 9, 2026
bdd4d47
fix(be): the write gate reclaims sessions, and counts them in i64
sea-snake Sep 9, 2026
e1fd056
Merge branch 'feat/session-cap-per-identity' into feat/sign-in-create…
sea-snake Sep 9, 2026
d7be132
refactor(be): name what a session record answers
sea-snake Sep 9, 2026
fbfeed3
Merge branch 'feat/session-record-storage' into feat/session-devices-…
sea-snake Sep 9, 2026
1000beb
Merge branch 'feat/session-devices-registry' into feat/session-device…
sea-snake Sep 9, 2026
0e945b1
Merge branch 'feat/session-create' into feat/session-cap-per-identity
sea-snake Sep 9, 2026
d2276f9
chore: merge feat/session-device-key-proof
sea-snake Sep 9, 2026
3a3539c
chore: rename the session record accessors at their call sites
sea-snake Sep 9, 2026
669fe75
Merge branch 'feat/session-cap-per-identity' into feat/sign-in-create…
sea-snake Sep 9, 2026
7e047a8
chore: merge main
sea-snake Sep 9, 2026
fa1bf88
Merge branch 'feat/session-record-storage' into feat/session-devices-…
sea-snake Sep 9, 2026
1d5952a
Merge branch 'feat/session-devices-registry' into feat/session-device…
sea-snake Sep 9, 2026
226012e
chore: merge feat/session-device-key-proof
sea-snake Sep 9, 2026
a7d0b8d
Merge branch 'feat/session-create' into feat/session-cap-per-identity
sea-snake Sep 9, 2026
ca76344
Merge branch 'feat/session-cap-per-identity' into feat/sign-in-create…
sea-snake Sep 9, 2026
709ce21
refactor(session): name the session type Session
sea-snake Sep 9, 2026
a13f19e
Merge branch 'feat/session-record-storage' into feat/session-devices-…
sea-snake Sep 9, 2026
a727d29
refactor(browsers): the anchor decides what a browser reveals
sea-snake Sep 9, 2026
3c050de
Merge branch 'feat/session-devices-registry' into feat/session-device…
sea-snake Sep 9, 2026
6ef8323
feat(browser-key): verifying yields evidence, and one encoding per key
sea-snake Sep 9, 2026
185a381
Merge branch 'feat/session-device-key-proof' into feat/session-create
sea-snake Sep 9, 2026
dbe4a13
refactor(session): a locator, verified keys, and the illegal state sa…
sea-snake Sep 9, 2026
9c6abda
Merge branch 'feat/session-create' into feat/session-cap-per-identity
sea-snake Sep 9, 2026
d010c40
feat(session): scope the session credential, and refuse instead of tr…
sea-snake Sep 9, 2026
0d19439
chore(session): drop the scaffolding allowances the callers arrive with
sea-snake Sep 9, 2026
f626fdd
chore(storage): drop the account-principal helper that grew a twin
sea-snake Sep 9, 2026
246e75e
Merge branch 'feat/session-create' into feat/session-cap-per-identity
sea-snake Sep 9, 2026
3b42ab6
Merge branch 'feat/session-cap-per-identity' into feat/sign-in-create…
sea-snake Sep 9, 2026
a105ec0
refactor(session): one name for one fact across both error types
sea-snake Sep 9, 2026
93628e2
Merge remote-tracking branch 'origin/main' into feat/sign-in-creates-…
sea-snake Sep 9, 2026
2699f79
fix(storage): an origin too long to store has nothing to read
sea-snake Sep 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ rsa = "0.9.10"
minicbor = "1.0.0"

# DNSSEC verifier deps (PR 1b on docs/ongoing/email-recovery.md §7)
p256 = { version = "0.13", default-features = false, features = ["ecdsa", "sha256"] }
p256 = { version = "0.13", default-features = false, features = ["ecdsa", "sha256", "pkcs8"] }
ed25519-dalek = { version = "2.2", default-features = false }

# Certification
Expand Down
2 changes: 2 additions & 0 deletions src/canister_tests/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ base64.workspace = true
flate2 = "1.0"
hex.workspace = true
lazy_static.workspace = true
# Signs the browser-key proof `prepare_account_session` requires.
p256.workspace = true
regex.workspace = true
serde.workspace = true
serde_cbor.workspace = true
Expand Down
26 changes: 26 additions & 0 deletions src/canister_tests/src/api/internet_identity/api_v2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -746,3 +746,29 @@ pub fn get_account_delegation_with_read_only(
)
.map(|(x,)| x)
}

pub fn prepare_account_session(
env: &PocketIc,
canister_id: CanisterId,
sender: Principal,
request: PrepareAccountSessionRequest,
) -> Result<Result<PrepareAccountSessionResponse, AccountSessionError>, RejectResponse> {
call_candid_as(
env,
canister_id,
RawEffectivePrincipal::None,
sender,
"prepare_account_session",
(request,),
)
.map(|(x,)| x)
}

pub fn get_account_session(
env: &PocketIc,
canister_id: CanisterId,
sender: Principal,
request: GetAccountSessionRequest,
) -> Result<Result<GetAccountSessionResponse, AccountSessionError>, RejectResponse> {
query_candid_as(env, canister_id, sender, "get_account_session", (request,)).map(|(x,)| x)
}
64 changes: 64 additions & 0 deletions src/canister_tests/src/framework.rs
Original file line number Diff line number Diff line change
Expand Up @@ -375,6 +375,70 @@ pub fn restore_compressed_stable_memory(env: &PocketIc, canister_id: CanisterId,
env.set_stable_memory(canister_id, buffer, BlobCompression::Gzip);
}

/// A browser key of the kind `prepare_account_session` demands a proof from.
///
/// The DER encoding and the domain prefix have to match what the canister verifies,
/// so both are spelled out here rather than derived.
pub struct BrowserKey {
signing_key: p256::ecdsa::SigningKey,
}

/// The SPKI header WebCrypto emits for an `ECDSA` P-256 public key, ahead of the 65-byte
/// uncompressed point.
const P256_SPKI_HEADER: [u8; 26] = [
0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a,
0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03, 0x42, 0x00,
];

const BROWSER_KEY_SIGNATURE_DOMAIN: &[u8] = b"ii-session-browser-key";
const SUCCESSOR_KEY_SIGNATURE_DOMAIN: &[u8] = b"ii-session-browser-successor";

impl BrowserKey {
pub fn new(seed: u8) -> Self {
Self {
signing_key: p256::ecdsa::SigningKey::from_bytes(&[seed; 32].into())
.expect("failed to build a browser key"),
}
}

/// The key a browser rotates to after `self`, so a test can walk the chain.
pub fn successor(&self) -> Self {
let mut seed = [0u8; 32];
seed.copy_from_slice(&self.signing_key.to_bytes());
seed[0] = seed[0].wrapping_add(1);
Self {
signing_key: p256::ecdsa::SigningKey::from_bytes(&seed.into())
.expect("failed to build a browser key"),
}
}

pub fn public_key(&self) -> PublicKey {
let point = p256::ecdsa::VerifyingKey::from(&self.signing_key).to_encoded_point(false);
let mut der = P256_SPKI_HEADER.to_vec();
der.extend_from_slice(point.as_bytes());
ByteBuf::from(der)
}

pub fn sign(&self, session_key: &SessionKey, next_browser_key: &PublicKey) -> ByteBuf {
self.sign_with(BROWSER_KEY_SIGNATURE_DOMAIN, session_key, next_browser_key)
}

/// The successor's own signature, proving the browser holds the key it announces.
pub fn sign_as_successor(&self, session_key: &SessionKey, device_key: &PublicKey) -> ByteBuf {
self.sign_with(SUCCESSOR_KEY_SIGNATURE_DOMAIN, session_key, device_key)
}

fn sign_with(&self, domain: &[u8], session_key: &SessionKey, other: &PublicKey) -> ByteBuf {
use p256::ecdsa::signature::Signer;

let mut message = domain.to_vec();
message.extend_from_slice(session_key);
message.extend_from_slice(other);
let signature: p256::ecdsa::Signature = self.signing_key.sign(&message);
ByteBuf::from(signature.to_bytes().to_vec())
}
}

pub const PUBKEY_1: &str = "test";
pub const PUBKEY_2: &str = "some other key";
pub const RECOVERY_PUBKEY_1: &str = "recovery 1";
Expand Down
99 changes: 99 additions & 0 deletions src/frontend/src/lib/generated/internet_identity_idl.js
Original file line number Diff line number Diff line change
Expand Up @@ -386,6 +386,25 @@ export const idlFactory = ({ IDL }) => {
'InternalCanisterError' : IDL.Text,
'Unauthorized' : IDL.Principal,
});
const GetAccountSessionRequest = IDL.Record({
'session_id' : IDL.Nat64,
'session_key' : SessionKey,
'origin' : FrontendHostname,
'account_number' : IDL.Opt(AccountNumber),
'expiration' : Timestamp,
'identity_number' : UserNumber,
});
const GetAccountSessionResponse = IDL.Record({
'signed_delegation' : SignedDelegation,
});
const AccountSessionError = IDL.Variant({
'InternalCanisterError' : IDL.Text,
'Unauthorized' : IDL.Principal,
'NoSuchSession' : IDL.Null,
'NoSuchAccount' : IDL.Null,
'InvalidBrowserKey' : IDL.Null,
'StaleBrowserKey' : IDL.Null,
});
const GetAccountsError = IDL.Variant({
'InternalCanisterError' : IDL.Text,
'Unauthorized' : IDL.Principal,
Expand Down Expand Up @@ -559,6 +578,44 @@ export const idlFactory = ({ IDL }) => {
'address' : IDL.Text,
'last_used' : IDL.Opt(Timestamp),
});
const OperatingSystem = IDL.Variant({
'Ios' : IDL.Null,
'Linux' : IDL.Null,
'Android' : IDL.Null,
'Macos' : IDL.Null,
'ChromeOs' : IDL.Null,
'Windows' : IDL.Null,
'Other' : IDL.Text,
'Ipados' : IDL.Null,
});
const FormFactor = IDL.Variant({
'Unknown' : IDL.Null,
'Tablet' : IDL.Null,
'Desktop' : IDL.Null,
'Mobile' : IDL.Null,
});
const BrowserBrand = IDL.Variant({
'Edge' : IDL.Null,
'Firefox' : IDL.Null,
'Safari' : IDL.Null,
'SamsungInternet' : IDL.Null,
'Opera' : IDL.Null,
'Other' : IDL.Text,
'Chrome' : IDL.Null,
});
const BrowserDescription = IDL.Record({
'os' : OperatingSystem,
'model' : IDL.Opt(IDL.Text),
'form_factor' : FormFactor,
'brand' : BrowserBrand,
});
const BrowserInfo = IDL.Record({
'id' : IDL.Nat32,
'session_count' : IDL.Nat32,
'description' : BrowserDescription,
'created_at' : Timestamp,
'last_used' : Timestamp,
});
const McpConfig = IDL.Record({
'url' : IDL.Opt(IDL.Text),
'enabled' : IDL.Bool,
Expand All @@ -575,6 +632,7 @@ export const idlFactory = ({ IDL }) => {
'name' : IDL.Opt(IDL.Text),
'email_recovery' : IDL.Opt(IDL.Vec(EmailRecoveryCredential)),
'created_at' : IDL.Opt(Timestamp),
'browsers' : IDL.Opt(IDL.Vec(BrowserInfo)),
'mcp_config' : IDL.Opt(McpConfig),
'authn_method_registration' : IDL.Opt(AuthnMethodRegistrationInfo),
'openid_credentials' : IDL.Opt(IDL.Vec(OpenIdCredential)),
Expand Down Expand Up @@ -679,6 +737,27 @@ export const idlFactory = ({ IDL }) => {
'user_key' : UserKey,
'expiration' : Timestamp,
});
const PrepareAccountSessionRequest = IDL.Record({
'permissions' : IDL.Opt(Permissions),
'max_idle' : IDL.Opt(IDL.Nat64),
'current_browser_key' : PublicKey,
'session_key' : SessionKey,
'valid_for' : IDL.Opt(IDL.Nat64),
'origin' : FrontendHostname,
'current_browser_key_signature' : IDL.Vec(IDL.Nat8),
'browser_description' : BrowserDescription,
'account_number' : IDL.Opt(AccountNumber),
'identity_number' : UserNumber,
'next_browser_key' : PublicKey,
'next_browser_key_signature' : IDL.Vec(IDL.Nat8),
});
const PrepareAccountSessionResponse = IDL.Record({
'user_key' : PublicKey,
'session_id' : IDL.Nat64,
'browser_id' : IDL.Nat32,
'expiration' : Timestamp,
'account_principal' : IDL.Principal,
});
const PrepareAttributeRequest = IDL.Record({
'origin' : FrontendHostname,
'attribute_keys' : IDL.Vec(IDL.Text),
Expand Down Expand Up @@ -1032,6 +1111,16 @@ export const idlFactory = ({ IDL }) => {
],
['query'],
),
'get_account_session' : IDL.Func(
[GetAccountSessionRequest],
[
IDL.Variant({
'Ok' : GetAccountSessionResponse,
'Err' : AccountSessionError,
}),
],
['query'],
),
'get_accounts' : IDL.Func(
[UserNumber, FrontendHostname],
[
Expand Down Expand Up @@ -1288,6 +1377,16 @@ export const idlFactory = ({ IDL }) => {
],
[],
),
'prepare_account_session' : IDL.Func(
[PrepareAccountSessionRequest],
[
IDL.Variant({
'Ok' : PrepareAccountSessionResponse,
'Err' : AccountSessionError,
}),
],
[],
),
'prepare_attributes' : IDL.Func(
[PrepareAttributeRequest],
[
Expand Down
Loading
Loading