This page moves ceremony files by animated QR codes between this computer or phone and a 7F SeedSigner, or another computer running this page. It runs entirely in this browser: nothing is uploaded.
Fill most of the camera view with the device's QR and hold steady. Parts arrive in any order; the grid turns green as they do.
Compare what the page shows with the device's screen: the subject key id and, for a Root key, the root pin.
Press Save. The page names the folder sf-wallet-gov uses, ~/7fchain/<network>/governance/root/outbox or …/devfund/outbox; keep Root and dev-fund files apart. NOT SAVED means the file name did not match the content: scan again, never rename by hand.
Save summary (optional) writes <ski>.txt, a record for you. Send the file, not the summary.
Device menu
Saves
Folder
7F: Self-Certify Root
root-<ski>.pem, then the Root <ski>.vk (no separate Root enrollment)
On the device, open the menu below and go on to its scan step.
Open To device and choose the file, or drop it on the page. It stays in this browser.
Read the fields the page shows: the device will show the same ones on its review pages. Compare them with what the coordinator told you.
Press Show QR to the device, turn the screen brightness up, and point the device's camera at it. If the device misses parts, press Slower, or Pause and step with the arrows. Done closes the player.
Check every review page on the device. The device is the authority, not this page: its Canonical digest must match the coordinator's digest for the file. If it does not, stop and call.
File
Device menu
Compare
genesis-unsigned.json
7F: Sign Genesis Config
Every field, and the Canonical digest
devfund-unsigned.json
7F: Sign Devfund Config
The recipient (it receives the entire genesis reward), and the Canonical digest
root-<ski>.pem
7F: Cross-Certify Deputy, first scan
Your own Root ski
Deputy CSR .pem
7F: Cross-Certify Deputy, second scan
The Deputy ski, confirmed with the Deputy by voice
Anything else is refused, including a Deputy certificate offered in place of a Root certificate.
Between two computers
For CentCom and the registrar, while they sign with sf-wallet-gov on a laptop instead of a SeedSigner. Open this page on both computers.
Sending computer: open To device, choose Another computer, pick the file and press Show QR to the other computer.
Receiving computer: open From device and point its camera at that screen.
Check that both screens show the same subject key id (for a request, also check it with its holder by voice), then Save.
File
From → to
Then
centcom-<Deputy ski>.pem
Airgap → online
Made by sign-centcom-cert. Send it to the coordinator for the public repo.
registrar-csr.pem
Registrar server → airgap
CentCom signs it with sign-issuer-cert --purpose miner.
x509-miner-issuing-ca.pem
Airgap → registrar server
sf-registrar install on the server.
Root and Deputy certificates and any 7fchain request travel the same way. The page refuses a file whose name does not match its content; sf-wallet-gov and sf-registrar check the signatures.
How the root pin and the subject key id are made
Verification key (vk)
The public half of an ML-DSA-65 key: 1952 bytes. A .vk file holds it as 3904 lowercase hex characters and a newline.
Root pin
SHA-256 of the 1952 key bytes (the decoded bytes, not the hex text): 64 hex. For a Root key only, as sf-wallet-gov prints it. Read it aloud by phone from the device's screen and compare it with the coordinator's record. A pin written in a file proves nothing: whoever could change the file could change the pin.
Subject key id (ski)
The first 20 bytes of the same hash, its first 40 hex (RFC 7093 method 1), for every key, shown in groups of four. It names every file. A certificate's ski is that of the key it certifies. These are the values sf-wallet-gov prints.
Seed label
The device names a loaded phrase by the first 8 hex of its testnet Root ski at index 0. Check it before each step.
To recompute both from a .vk file:
xxd -r -p <ski>.vk | sha256sum
The output is the hash (for a Root key, its root pin). Its first 40 hex characters are the ski, and must equal the file name.
Which key names each file
<ski>.vk: the key itself.
root-<ski>.pem: the Root key it certifies (it signs its own certificate).
<ski>.genesis, <ski>.devfund: the Root key that signed. The dev-fund definition is signed by the Root key, not the dev-fund key.
deputy-<ski>.pem: the Root that issued it, not the Deputy. Each Root's certificate for the same Deputy has a different name.
centcom-<ski>.pem: the Deputy that issued it.
<role>-<ski>-csr.pem: the key asking to be certified. A registrar's request is registrar-csr.pem, and its certificate x509-<purpose>-issuing-ca.pem.
Key index
Every Root and dev-fund step on the device asks for the key index, sf-wallet-gov's --index. Choose Index 0 (default). The key is derived at root/<network>/<index>/ml-dsa/v1 (dev-fund: devfund/<network>/<index>/ml-dsa/v1), so another index is a different key with a different ski. Use Other index only for a key that was made at that index; the device warns once and shows the index under the ski. Keep one phrase per Root key.
How a file travels as QR
To the device: a JSON config goes byte for byte; a .pem goes as its DER bytes (the decoded base64).
From the device, or between two computers: each file is a small JSON envelope naming its kind, its file name and its content. The page checks the name against the content before it saves.
Both ways, the bytes are compressed and split into BBQr parts of at most 300 characters, one QR each. The player shows each for 1.2 s and loops, so a missed part comes round again.
Before a ceremony
The footer shows this page's version, the commit it was built from. Record it, and check it is the one you were told to expect. The 7fchain ceremony runbooks are the source of truth: if this page disagrees with them, they win.
Point the camera at the device's QR. Saves what the device exports: <ski>.vk, root-<ski>.pem, <ski>.genesis, <ski>.devfund, deputy-<ski>.pem; from another computer, also CentCom and registrar files. How it works
How the ids below are derived: root pin = SHA-256 of the raw vk bytes
(hex-decoded, not the hex text), 64 hex; subject key id = the first 20 bytes of that
hash (the pin's first 40 hex), RFC 7093 method 1. Same values sf-wallet-gov prints.
Pick the file the device must scan: genesis-unsigned.json, devfund-unsigned.json, root-<ski>.pem or a Deputy CSR .pem. For another computer: a certificate or request .pem. Nothing is uploaded; the file stays in this browser. How it works