Your pattern goes through the phone's security chip first, then through a memory-hard function. The chip step is what stops offline guessing; the Argon2id step makes each guess expensive.
// 32 random bytes made at setup (not secret)
device_salt = random(32)
challenge = SHA-256("…/hw-challenge" ‖ device_salt ‖ pattern)
// HMAC with a key that can never leave StrongBox / the secure environment
hw_tag = HMAC-SHA256(chip_key, challenge)
master = Argon2id(pattern, secret = hw_tag, salt = device_salt,
memory = 128 MiB, passes = 3, lanes = 1)
slot_key = HKDF(master, "…/slot/pattern/key")
// the pattern and anything that verifies it are never stored
Compare: many vault apps use PBKDF2 with a salt anyone can read, so a copy of the files can be attacked on a fast computer. Brikwall's chip step means a copy can't be attacked at all without the phone.