Added
piv testworks on a slot with a key but no certificate. It tested
only against the slot's certificate, so an X25519 key (which can't sign
one) or a freshly generated key couldn't be tested at all. Such a slot is
now tested against the public key the card reports for it (GET METADATA,
e.g. a YubiKey 5.3 or later), and the result says no certificate was
part of the test;
--jsonaddscert_tested. Slots with a certificate are tested as
before. The app's Test button follows. (#243)fido infonames the key's model and its FIDO certification, as the
app's metadata card does: "Model", "Certification" (with the date it took
effect) and "Protocol family" rows, and ametadataobject in--json.
The model table and the bundled FIDO metadata moved into a library the
CLI and the app share, so both read the same data, including a
mds_data.jsonyou place to refresh it. (#251)- Setting a PIV management key back to the factory default is one step.
piv mgmt-key change --new-mgmt-key defaultsets the default keyroost
knows for that key (a Token2's isn't YubiKey's), and the app's change
dialog has a "Use the factory default" link next to "Generate random
key". (#251) - Imported codes can require a touch. The app's import dialog has
"Require touch for every code" and a box on each code's row;oath importandotp importtake--touch(every code they write) or
--touch-for NAME, repeated, for the codes named as the preview shows
them. The preview marks them "(touch)" and--jsonhas a
touch_requiredfield per entry. A Nitrokey 3 asks for a touch to save
each such code, and the import says so. (#252) - After generating one OpenPGP key or importing a bare RSA key file,
keyroost says how to get its public key. Those leave a key on the card
but no public key file; the CLI and the app now point at GnuPG's
"Existing key from card", which builds the matching public key from the
fingerprint and time keyroost recorded. (#254) oath listshows which accounts need a touch. It marks them
"(touch)", asotp listdoes, and--jsongainstouch_requiredper
account, so anoath import --touch-forcan be checked from the
command line. It isnullwhere the key doesn't say: a YubiKey doesn't
for an HOTP account, sooath codefor one now says to touch the key
if it blinks. (#256)
Changed
- The trace covers every connection.
--debugnow also traces FIDO2
through a smart-card reader, and the app's APDU trace now includes FIDO2
traffic over USB and through a reader, plus keyroost's notes on how it
found and paired each key. In those notes, the serial numbers the reader
probe reports and the ones some systems put in a reader's name are
shortened to their first and last two characters. (#230) - The activity log covers every tab. Changes and their errors in the
Authenticator, On-device OTP, FIDO2 and OpenPGP tabs, a FIDO2 reset on
its own, and an import that wrote nothing now write a line, as the PIV
and Molto2 tabs' changes already did. A change whose re-read afterwards
fails is still logged as made. Lines name no Authenticator account, and
show your home folder as~. A failure an automatic refresh keeps
hitting is logged once. With APDU trace on, a read or refresh that
writes no line of its own, such as reading Authenticator codes, gets one
named after it, so its traffic is never dropped; the checkbox explains
this when you hover it.fido configandfido fingerprintsay "this
key does not support" like the other settings commands. (#231) - A key keeps its full model name once read. Opening a key reads its
model ("YubiKey 5 Series with NFC") and firmware; until now the sidebar
and header went back to the shorter USB name ("YubiKey") after another
key was selected and the list refreshed. The name and firmware now stay
with the key until it is unplugged. The activity log also stops repeating
"device scan: N devices found" on every refresh when nothing changed.
(#236) openpgp infoshows a YubiKey's or Nitrokey's serial as the key
names it. It read the card's four serial bytes as one number:
931162176 (0x37806840)for YubiKey 37806840,1114124023 (0x42682EF7)for Nitrokey 3 42682EF7. It now shows those bytes the way
GnuPG does, which is the key's own serial; the app's OpenPGP tab, the
reset message and--json'sserialfield (a string, as before) follow.
A Token2 key still shows its full serial when its OTP applet answers.
(#237)- Building from source needs Rust 1.89 (was 1.87) for the libraries
and the CLI (the app's minimum is in the egui 0.37 entry below).
Packaged builds are unaffected.
The crypto libraries keyroost uses moved to their current generation
together (AES, SHA-2, HMAC, AES-GCM, PBKDF2, scrypt, 3DES, RC2, the OS
random source, Ed25519 and X25519), and they now raise their own
minimum Rust in patch releases. Keys, backups and imports work as
before. If the operating system can't supply random numbers while
keyroost makes an OpenPGP key (other than RSA) or a backup, it now
reports an error instead of crashing. (#245) fido pin status --jsonsays whether a PIN is set. It printed only
pin_retries: a key with no FIDO2 PIN showed a count anyway (a Nitrokey
3 said 8), as if one were set, or failed outright (a Token2 PIN+). It
now printspin_settoo, named as inotp pin status --json, with
pin_retriesnull when no PIN is set. (#245)- More security keys show their FIDO metadata. The app's bundled list
of certified authenticators now covers every hardware key in the FIDO
Alliance's list instead of a few vendors, so the FIDO2 overview shows the
model, certification level and logo for many more keys. Logos published
only as SVG, or labeled as the wrong format, now show too. (#246) - The app moves to egui 0.37 (from 0.35), the GUI toolkit it is built
on. Building the app from source now needs Rust 1.95 (was 1.92); the CLI
and libraries stay at 1.89, and packaged builds are unaffected. (#249) - The CLI names a FIDO2 key by its model, as the app does. A key
showed as "YubiKey" on keyroostctl's→line and inlistwhile the
app said "YubiKey 5 Series with NFC". The CLI now reads the targeted
key's FIDO2 info (one quick read, no PIN) and names it by the model that
info identifies;listand--jsonuse the same names. Where the key
can't be read (Windows without administrator rights) both keep its USB
name. (#251) - Hex serials show in capitals everywhere. A Nitrokey's serial read
42682ef7in the CLI's key line, the app header and the factory-reset
question, but42682EF7inopenpgp info; all now show capitals, as
GnuPG does.-d serial:still matches either case. (#251) - A PIV reset says what the PIN, PUK and management key went back to.
piv reset, setting retry counts and the app's Reset applet said only
"factory defaults", which cost tries on keys whose defaults aren't
YubiKey's: a Token2 PIN+ goes back to PIN 865362 and PUK 86536286. They
now name the defaults when keyroost knows them. (#251) - A PIV self-test refused for want of a PIN suggests giving one.
piv testasks for no PIN of its own, and its error didn't say why the card
refused; it now says the card may want the slot's PIN and points at
--pinwhen none was given. The app's Test dialog points at its PIN box
the same way. (#251) - A status bar along the bottom of the app says what is running. It
showed in one small gray line in the top bar, which a narrow window cut
off first. The bar shows the running step with a spinner, its seconds
once it has run 3 s, an import's progress, then what just happened for
a few seconds (an error a little longer). Clicking it opens the
Activity log. A touch wait still shows in its banner. (#253) - A click never just vanishes while the key is busy. Buttons that
would start another key operation show disabled while one runs, and
hovering one says what it waits for; a click that still arrives says
"Still working on: …" in the status bar. (#253) - Making RSA-4096 OpenPGP keys says it can take a minute in
openpgp key createtoo, as the app already did. (#253)
Fixed
- Every key says the same when an Authenticator account isn't there.
oath deleteandoath codefor a name the key doesn't hold now stop with
no OATH credential named "…" on this keybefore anything is sent. A
YubiKey used to answer with a bare status word, and a Solo 2 reported the
delete as done. In the app, deleting an account, or reading its code,
after it was removed elsewhere says so and refreshes the list. And
oath codeworks on a password-protected Solo 2, which keeps its unlock
for one command only; it was refused with6985. (#232) - The idle lock also wipes a pasted otpauth:// link. The Molto2's
"Paste an otpauth:// URI" box holds the account's secret but wasn't on the
idle lock's list, because the box isn't masked. Each form now keeps one
list of its secret fields, which both its own wipe and the idle lock use,
so a field can't be wiped in one place and missed in the other. (#233) - A Token2 key with an OTP PIN set stays reachable over USB. Once a PIN
was set, every on-device OTP command over USB failed with0x0105,
otp pin clearandotp pin statusincluded, in the CLI and the app,
andfido infoand the app's key header showed its firmware as unknown:
the check keyroost runs to pick the key's USB channel used a command that
a PIN-protected key refuses. keyroost now follows that refusal with the
key's documented PIN-state read, which tells a protected key from one
that declines the channel. Tested end to end on a PIN+ Dual Ace R3.4
(set, wrong PIN, codes and adds under the PIN, change, clear). (#235) - A PIN typed into the FIDO2 tab is wiped when the tab's state is
replaced (switching keys, for instance), as the other tabs' secrets
already were. (#236) - Opening the Authenticator tab on a password-protected key no longer
says "wrong OATH password". The app lists the accounts before you type
anything, and the key's refusal of that first, password-less request was
shown as a wrong password. The tab now just shows the locked box; "wrong
OATH password" appears only after a password was sent and refused, and
adding an account on a locked key says to unlock it first.
(#236) - Resetting the Authenticator asks for a touch only on keys that want
one.oath reset, the app's Reset applet and a whole-key factory reset
said "touch the key if it blinks" on every key; now on keys whose
Authenticator app confirms a reset with a touch, such as a Nitrokey 3. A
YubiKey resets without one. (#236) - A Token2 key or YubiKey seen only over USB shows its serial, and its
name. Where nothing pairs a key's USB side with a smart-card reader (a
Token2 PIN+ on Linux, whose card side has no reader there; a YubiKey with
its smart-card interface off), its row had no serial, so a name given to
it by serial didn't show either, though a Token2's firmware release was
worked out from that same serial. A device scan now asks such a key for
its serial: once per plug-in on Linux and macOS; on Windows, where a
key's USB position can't tell two identical keys apart, at each scan,
keeping the last answer through a scan the key misses so it doesn't
vanish from the row. (#236) fido pin statussays when no FIDO2 PIN is set. It printed the
retry counter, "8 PIN attempt(s) remaining", on a key with no PIN (a
Nitrokey 3), and on a key that refuses that question without one (a
Token2 PIN+) it failed withCTAP2_ERR_PIN_NOT_SET. It now says no PIN
is set, as the app's "No PIN configured" does.--jsonaddspin_set
(see Changed). (#237)piv cert generate --generate-keyandpiv cert request --generate-keycheck the key type first, aspiv key generatedoes.
They skipped keyroost's support list, so asking a YubiKey for an ECC
P-521 key went to the card and came back asSW=6A80; now it stops
before the management key is sent or anything is generated, says the
key doesn't support it, and takes--forcelikepiv key generate. The
PIN- and touch-policy checks apply too. (#237)- PIV slots can be typed in capitals.
piv infoshows slots as9Aor
8A;--slot 8Awas refused and only8aworked. Both work now.
(#237) - PIV and OpenPGP ask for a touch only where the key may want one. The
CLI's "touch the key if it blinks" lines and the app's touch banner came
up for every PIV and OpenPGP key operation. Signing, decrypting,
authenticating, changing a key's expiry, certificate requests,
self-signed certificates and the PIV self-test now ask only when the
key's touch setting isn't off (or the card doesn't report one).
Generating and importing keys no longer ask on a YubiKey, nor for
OpenPGP on a Nitrokey 3; a PIV import still asks when its self-test uses
a touch-protected key. A Nitrokey 3 with firmware 1.9.1 or later doesn't
ask for PIV at all. The app's banner for these steps says "Touch the key
if it blinks…"; "Touch your key to continue…" stays for a key that
reports it is waiting. (#244) - A PIV step that timed out waiting for a touch says so. The error read
"needs a management-key auth or PIN that wasn't satisfied" even when the
PIN was accepted and only the touch was missing; it now names the touch
too. (#244) otp infoover USB shows a Token2 PIN+ R3.4's whole configuration.
Over USB the key answered with one byte, so OTP and touch-HOTP support
read as "unknown". keyroost sends Token2's documented request first and,
when the answer is that short, the form Token2's own app uses. (#249)- A Token2 OTP PIN the key refuses for its rules says so. Setting or
changing the OTP PIN to one the key won't accept reported "entry not
found"; it now says the PIN doesn't meet the key's rules. (#249) - A Token2 PIN+ R3.4 shows the serial printed on it on Windows. Its
row, the app header andlistshowed an 8-digit number taken from its
OpenPGP applet, because Windows doesn't let keyroost reach the key's
FIDO side through its reader. keyroost now reads the full serial from
the key's OTP applet; names saved under the old number still apply.
(#249) - The app shows keyroost's icon on the title bar, the taskbar and the
Dock instead of the GUI toolkit's default logo. (#249) - On Windows, file dialogs open in front of the app. They had no owner
window and could open behind keyroost. (#249) - keyroostctl's piped output reads cleanly in PowerShell. PowerShell
decodes a program's piped or redirected output in the console's legacy
code page, so keyroost's arrows, dashes and dots arrived as→,—
and┬╖. When its output goes to a pipe or a file on Windows,
keyroostctl now writes those few characters in ASCII (->,-,|),
in names too; the console, JSON and files it writes are unchanged.
(#249) - Reading a key's FIDO2 storage no longer freezes the app. The Storage
tab read the large-blob store on the window's own thread, so a slow key
froze the app until it answered, and the read left nothing in the
Activity log's APDU trace. It now runs in the background like every
other read. (#251) listnames every applet a reader answered. Its per-reader line
left out FIDO2 and OTP (a Token2 PIN+ answers both through its reader);
the matched rows below it already showed them. (#251)- The app's metadata card dates a status correctly. It labeled the date
of any published status "Certified since", including "Not FIDO
Certified" and advisories; those now say "Status since". (#251) - Deleting an Authenticator account that was already gone says so in the
pane. Only the Activity log mentioned it; the pane now shows "That
account was no longer on the key; nothing was deleted.", as reading its
code already did. (#251) - One Refresh is one "device scan" line in the Activity log. With
"APDU trace" on, each rescan of a Refresh's burst added its own line;
their traffic now goes under one line. (#251) - The app's PIV retry boxes say they're the count to set. They read
"PIN tries 3 / PUK tries 3" on every key, which looked like the key's
current counts (a Token2 PIN+ has 6). They're now "New PIN tries" and
"New PUK tries", with a note that setting them resets both. (#251) - Importing a P-256 key into a Token2 PIN+ no longer warns. keyroost's
support list had no entry for it, sopiv key importand the app said
"keyroost's list has no entry for this key yet"; a PIN+ Dual Ace R3.4
imports P-256 keys and passes the self-test. Other algorithms' imports
on Token2 stay unverified. (#251) - A Token2 key's serial no longer appears in full in
--debugtraces.
The OTP layer printed it while the layer below it, and keyroost's own
probe notes, kept it out; it's now redacted there too. (#251) - A request that failed below the card shows its error in the trace.
When PC/SC itself refused a command (Windows' "access is denied", a
removed card),--debugand the Activity log showed the request and no
answer; the answer line now reads "PC/SC error: …". (#251) - Long APDU trace lines in the Activity log wrap under their own
column. A long request continued at the left margin, under the labels;
it now continues under its hex, broken every 4 bytes. Copy still copies
each line whole. (#253) - Changing a key's expiry on a card that records no fingerprint says
so.openpgp key expiry(and the app's Change expiry) called such a
card's signature key a different key; it now says the card records no
fingerprint for it, so keyroost can't tell whether it is that key.
(#254) - OpenPGP help no longer says a YubiKey always needs a touch.
openpgp sign,decrypt,authenticate,key generateand
key expirysaid so; a touch is needed when the slot's touch setting
is on. (#254) - A key selected while another was busy no longer stays on "Reading
key…". Its first read was refused while the other key's step ran, and
only the FIDO2 tab tried again, so the Overview kept "Reading key…"
until the next scan. The read now starts as soon as nothing else runs,
on any tab. (#254) - SSH certificates stored with
fido2-tokenexport again.
fido2-token -S -bstores the-cert.pubfile's text, whilefido ssh export,fido ssh listand the app's export only recognized OpenSSH's
binary form, so they reported no certificate. Both forms are read now,
and a stored-cert.publine is written back as it was, comment
included.
Certificates an older libfido2 stored zlib-wrapped are read too, as
libfido2 itself reads them. (#254) - App details from the Windows test round. The window no longer opens
larger than a small screen with display scaling (1280×800 at 125%) or
under the taskbar; it shrinks or moves to fit (where the system says
where the window is: not on Wayland). The import dialog draws
again until its size settles, instead of leaving its buttons cut off
until the mouse moved. The PIV reset confirmation no longer says it
only works with the PIN and PUK already blocked: keyroost blocks them
first where the key needs that. In the dark theme, an unticked checkbox
in a dialog ("Require touch", "Use default management key") shows its
box. The "touch your key" banner sits under the key's name and tabs
instead of over them. The On-device OTP tab's PIN cards span the pane
like its other cards, and removing the OTP PIN no longer shows advice
for choosing one. (#256) - A PIV change that finishes after you select another key is reported
under its own key. An RSA-4096 key generation on one key, say, was
logged and shown under the key selected by the time it ended. (#256) keyroostctl liston Windows shows a key's serial on its FIDO line.
Windows reports an empty USB serial for a key that has none, andlist
printed a bareserial=instead of the serial read over the key's
smart-card side. The app now matches a YubiKey's FIDO side by that
serial too, as it already did on Linux. (#256)
Deprecated
piv --json infonames the firmwarefirmware, like
fido --json info. Its old name,version_firmware, still carries the
same value for now but is deprecated; scripts should readfirmware.
fido --json info'sctap2.firmware_versionkeeps its name: it is the
FIDO spec's raw getInfo number, named after the spec like the rest of
that block. (#233)
Removed
fido blob export --as-certis gone. It only recognized an SSH
certificate stored unencrypted, but FIDO2 clients such asfido2-token
store it encrypted under its credential, as the standard specifies, so
it failed on the certificates they store. Save one withfido ssh export(in the app, "Save certificate…" on the Passkeys tab);
--as-certnow says so.fido blob exportand the Storage tab's Export
save the stored bytes as they are, the Storage tab no longer shows
certificate details, andfido blob list/showand their--json
no longer have anssh-certkind orssh_certfield.
(#256)
Full changelog: https://github.com/framefilter/keyroost/blob/v0.16.0/CHANGELOG.md