git-subtree-dir: fiscal git-subtree-mainline:d95165fc8fgit-subtree-split:102ba84500
66 lines
2.7 KiB
Python
66 lines
2.7 KiB
Python
"""Installation code (install_code) for the Windows installer EXE flow.
|
|
|
|
Covers central/app/enrollment.py install-code functions: Crockford Base32
|
|
generation, normalization (case + hyphen), hashing, and the grouped display
|
|
format. Never stores the plaintext code.
|
|
"""
|
|
import re
|
|
|
|
import pytest
|
|
|
|
from central.app import enrollment
|
|
|
|
|
|
def test_generated_code_is_16_crockford_chars_in_4_groups():
|
|
for _ in range(50):
|
|
code = enrollment.generate_install_code()
|
|
assert re.fullmatch(r"[0-9A-HJKMNP-TV-Z]{4}-[0-9A-HJKMNP-TV-Z]{4}-[0-9A-HJKMNP-TV-Z]{4}-[0-9A-HJKMNP-TV-Z]{4}", code)
|
|
|
|
|
|
def test_generated_code_has_good_entropy():
|
|
seen = {enrollment.generate_install_code() for _ in range(2000)}
|
|
assert len(seen) > 1900 # 80 bits of entropy: collisions essentially impossible
|
|
|
|
|
|
def test_crockford_alphabet_excludes_ambiguous_chars():
|
|
alphabet = set(enrollment.INSTALL_CODE_ALPHABET)
|
|
for ambiguous in "ILOU":
|
|
assert ambiguous not in alphabet
|
|
|
|
|
|
def test_normalization_uppercases_and_strips_separators():
|
|
assert enrollment.normalize_install_code("abcd-efgh-jkmn-pqrz") == "ABCDEFGHJKMNPQRZ"
|
|
assert enrollment.normalize_install_code(" abcd efgh jkmn pqrz ") == "ABCDEFGHJKMNPQRZ"
|
|
assert enrollment.normalize_install_code("ABCD-EFGH-JKMN-PQRZ") == "ABCDEFGHJKMNPQRZ"
|
|
|
|
|
|
def test_normalization_maps_crockford_lookalikes():
|
|
# Crockford Base32 treats 0/O and 1/I/L as transliterations; a human
|
|
# retyping "O" and "I/L" means "0" and "1".
|
|
assert enrollment.normalize_install_code("OOOI-LLLL-0000-0001") == "0001111100000001"
|
|
assert enrollment.normalize_install_code("0O0O-1L1I-0000-0001") == enrollment.normalize_install_code("0000-1111-0000-0001")
|
|
|
|
|
|
def test_digest_is_sha256_hex_and_deterministic():
|
|
code = enrollment.generate_install_code()
|
|
normalized = enrollment.normalize_install_code(code)
|
|
assert enrollment.install_code_digest(code) == enrollment.install_code_digest(normalized)
|
|
assert enrollment.install_code_digest(code) == enrollment.install_code_digest(code.lower().replace("-", ""))
|
|
assert len(enrollment.install_code_digest(code)) == 64
|
|
|
|
|
|
def test_hashes_cannot_be_reversed_into_plaintext():
|
|
code = enrollment.generate_install_code()
|
|
digest = enrollment.install_code_digest(code)
|
|
assert digest != code
|
|
assert code not in digest
|
|
|
|
|
|
def test_valid_install_code():
|
|
code = enrollment.generate_install_code()
|
|
assert enrollment.valid_install_code(code)
|
|
assert enrollment.valid_install_code(code.lower().replace("-", ""))
|
|
assert not enrollment.valid_install_code("")
|
|
assert not enrollment.valid_install_code("ABCD-EFGH-JKMN-PQRU") # U excluded from Crockford
|
|
assert not enrollment.valid_install_code("ABCD")
|
|
assert not enrollment.valid_install_code("!BCD-EFGH-JKMN-PQRZ") |