PASS base32 "foobar" PASS base32 "fooba" PASS base32 decode round-trip PASS base32 decode ignores spaces/case PASS base32 rejects bad characters PASS RFC 6238 vector at t=59 PASS RFC 6238 vector at t=1111111109 PASS RFC 6238 vector at t=1111111111 PASS RFC 6238 vector at t=1234567890 PASS RFC 6238 vector at t=2000000000 PASS RFC 6238 vector at t=20000000000 PASS RFC 4226 HOTP counter 0 PASS RFC 4226 HOTP counter 1 PASS RFC 4226 HOTP counter 2 PASS RFC 4226 HOTP counter 3 PASS RFC 4226 HOTP counter 4 PASS generated secret is 32 base32 chars PASS verify accepts current code PASS verify accepts spaced code PASS verify accepts previous step (clock drift) PASS verify accepts next step (clock drift) PASS verify rejects 2 steps old PASS verify rejects wrong code PASS verify rejects non-numeric PASS verify rejects short code PASS replay of the same code is rejected PASS older step also rejected after use PASS provisioning URI scheme and label PASS provisioning URI has secret and issuer PASS phone '08012345678' PASS phone '0801 234 5678' PASS phone '8012345678' PASS phone '2348012345678' PASS phone '+234 801 234 5678' PASS phone '+234-801-234-5678' PASS phone '002348012345678' PASS phone '09012345678' PASS phone '07012345678' PASS phone '0811 000 0000' PASS phone '12345' PASS phone '0801234567' PASS phone '080123456789' PASS phone '+14155550123' PASS phone '06012345678' PASS phone 'abc' PASS phone '' PASS looksLikePhone: number PASS looksLikePhone: email is not a phone PASS looksLikePhone: username is not a phone PASS valid: avantgreen PASS valid: Ada_9 PASS valid: exactly 30 chars PASS invalid: too short PASS invalid: 31 chars PASS invalid: space PASS invalid: dash PASS invalid: only digits PASS invalid: leading underscore PASS invalid: trailing underscore PASS invalid: double underscore PASS invalid: non-ASCII letter PASS normalize lowercases and trims PASS suggestions: five returned PASS suggestions: none are taken PASS suggestions: all valid PASS suggestions: all unique PASS suggestions: sanitise odd input PASS suggestions: tiny base gets a prefix PASS suggestions: gives up gracefully when everything is taken PASS primary admin can create the second admin PASS primary admin cannot create a third admin PASS second admin cannot create an admin PASS admin can create manager PASS admin can create supervisor PASS admin can create finance officer PASS admin can create legal officer PASS manager can create supervisor PASS manager cannot create manager PASS manager cannot create admin PASS manager cannot create finance officer PASS supervisor cannot create anyone PASS unknown role rejected PASS nobody can update the primary admin (second admin) PASS nobody can update the primary admin (manager) PASS nobody can suspend the primary admin (second admin) PASS nobody can suspend the primary admin (manager) PASS nobody can delete the primary admin (second admin) PASS nobody can delete the primary admin (manager) PASS nobody can restore the primary admin (second admin) PASS nobody can restore the primary admin (manager) PASS nobody can reset_password the primary admin (second admin) PASS nobody can reset_password the primary admin (manager) PASS primary admin can delete the second admin PASS primary admin can suspend the second admin PASS second admin cannot delete the primary admin PASS second admin cannot suspend another non-primary admin PASS second admin can delete a manager PASS admin can suspend a supervisor PASS admin can reset a finance officer password PASS manager can suspend a supervisor PASS manager can delete a supervisor PASS manager can restore a supervisor PASS manager can update a supervisor PASS manager cannot touch another manager PASS manager cannot touch an admin PASS manager cannot touch a finance officer PASS supervisor cannot touch anyone PASS nobody can delete themselves PASS nobody can suspend themselves PASS manager cannot use staff management on their own account PASS unknown action rejected PASS ten recovery codes PASS codes are unique PASS codes match XXXX-XXXX PASS no look-alike characters PASS normalize tolerates case/spaces/dash PASS same hash for formatted and raw PASS different key, different hash PASS looksLikeRecoveryCode yes PASS looksLikeRecoveryCode rejects 6-digit totp 120 passed, 0 failed