docs(adr): signing up in one call, the password's own proof key, changes with a fresh SimpleLogin sign-in (ADR 0020)

D18 to D20, the developer's, before step 3: the device makes the handle,
the keys and the recovery phrase before one `simpleLogin.signUp`, so no
account is ever unfinished; a third subkey of the password's Argon2id
seeds an Ed25519 key the register checks, and a new device gets the
wrapped keys only after proving the password with it; a new password, a
new phrase and deleting the account take the password's proof and a
SimpleLogin sign-in of the last ten minutes. Step 2's deviations from the
proposal are noted as accepted.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-10-23 21:19:31 +02:00
commit b4c93e03de
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -1,7 +1,7 @@
# ADR 0020: Signing in with SimpleLogin only
- **Status:** decided 23 Oct 2026, by the developer (D1–D17 below), the *Proposal*
with it (D15).
- **Status:** decided 23 Oct 2026, by the developer (D1–D20 below), the *Proposal*
with it (D15), as D18 to D20 change it.
- **Built (23 Oct 2026), step 1:** the forwarding page (3),
`/simplelogin-callback` on the register's web server (halkyon_base's
`addSimpleLoginCallbackRoute`, Caddy forwarding the path), ahead of the sign-in, so
@ -28,7 +28,8 @@
them; GitHub links nobody more where SimpleLogin is offered, as where passwords are
(ADR 0017); `SIGN_IN_WAYS` counts on the register, which members ask, and stops any
server with a name it doesn't know as it starts; sessions name the method
`simplelogin`. Someone new gets no account yet: their identity waits (D16), with a
`simplelogin` (these deviations accepted by the developer, 23 Oct). Someone new gets
no account yet: their identity waits (D16), with a
handle suggested (D17), for the sign-up of step 3. halkyon_oidc's `testing.dart` gives
hosts a fake SimpleLogin signing real ID tokens, which the module's tests use too.
- **Builds on:** ADR 0010 (email sign-in), ADR 0011 (profile pages), ADR 0016 (the
@ -130,6 +131,25 @@ against app.simplelogin.io on 23 Oct:
cut to 30 characters, and where the handle is taken (whatever its case) or kept by the
instance, a number from 2 to 99 after it. None where nothing of the name is left (a
name in another script): the person types one.
- **D18 Signing up in one call** (23 Oct, night, recommended, over the proposal's two
steps): the device takes the handle, makes the keys, asks the password twice and shows
the recovery phrase (three of its words typed back), then `simpleLogin.signUp` makes
the account and its session together, the newcomer's identity taken once. No account is
ever unfinished, so D11's deletion after a day has nothing left to delete.
- **D19 The password proven with a proof key of its own, the keys only after it** (23
Oct, night, recommended, over the keys coming with the session, as Bitwarden's SSO
has it, and over keeping SRP): a third subkey of the password's Argon2id seeds an
Ed25519 key, whose public half the register keeps; the device signs a one-time nonce
with it as it signs with the recovery phrase's (ADR 0017, the same challenges and
message). A new device gets the wrapped keys once it has proven the password, so
someone who took over a SimpleLogin account can only guess the password online,
against the limits, never offline. SimpleLogin accounts keep no SRP verifier.
- **D20 Changes take the password and a fresh SimpleLogin sign-in** (23 Oct, night,
recommended, over the password's proof alone): a new password, a new recovery phrase
and deleting the account take the password's proof (the phrase's, for a lost
password) and a SimpleLogin sign-in of the last ten minutes, the two factors of ADR
0017's third reading with SimpleLogin's and Proton's own second factor in TOTP's
place.
- **Also (23 Oct):** the developer's own account moves by adding SimpleLogin to it while
signed in with GitHub; the instance's SimpleLogin app goes up for approval once
halkyon.app/learn exists, before learn.halkyon.eu switches.