Harden Sigil: tests/helpers.py
This commit is contained in:
parent
9cbc3f5122
commit
47abc7d717
54
tests/helpers.py
Normal file
54
tests/helpers.py
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
"""Shared test helpers.
|
||||||
|
|
||||||
|
issue_code() requires a live agent session, so tests that mint codes have to
|
||||||
|
prove key possession the same way production does rather than reaching past the
|
||||||
|
boundary. These helpers do that so the tests stay readable.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import base64
|
||||||
|
|
||||||
|
from sigil import identity, keys, viewcodes
|
||||||
|
from sigil.store import Store
|
||||||
|
|
||||||
|
|
||||||
|
def enrol(store, agent="bigpickle"):
|
||||||
|
"""Enrol agent with a fresh key. Returns (private, public)."""
|
||||||
|
private, public = keys.generate()
|
||||||
|
secret = identity.seed_bootstrap(store, agent)
|
||||||
|
identity.enrol(store, agent, keys.export_public_b64(public), secret)
|
||||||
|
return private, public
|
||||||
|
|
||||||
|
|
||||||
|
def sign(private, nonce):
|
||||||
|
return base64.b64encode(private.sign(nonce.encode())).decode()
|
||||||
|
|
||||||
|
|
||||||
|
def agent_token(store, private, agent="bigpickle", limit=5000, window=60):
|
||||||
|
"""Full challenge-response, ending in a live agent session token.
|
||||||
|
|
||||||
|
The rate limit is opened wide by default: tests that legitimately mint many
|
||||||
|
codes should not trip the production quota. The quota itself is asserted in
|
||||||
|
test_hardening.TestRateLimits.
|
||||||
|
"""
|
||||||
|
chal = identity.challenge(store, agent, limit=limit, window=window)
|
||||||
|
sig = sign(private, chal["nonce"])
|
||||||
|
return identity.verify(
|
||||||
|
store, chal["nonce"], sig, limit=limit, window=window
|
||||||
|
)["token"]
|
||||||
|
|
||||||
|
|
||||||
|
def issue(store, private, agent="bigpickle", **kw):
|
||||||
|
"""Mint a view code the way production does: authenticate, then ask.
|
||||||
|
|
||||||
|
`limit`/`window` tune both the challenge quota and the code quota, since a
|
||||||
|
test that mints many codes trips both.
|
||||||
|
"""
|
||||||
|
quota = {k: kw[k] for k in ("limit", "window") if k in kw}
|
||||||
|
token = agent_token(store, private, agent, **quota)
|
||||||
|
return viewcodes.issue_code(store, token, **kw)
|
||||||
|
|
||||||
|
|
||||||
|
def fresh(agent="bigpickle"):
|
||||||
|
store = Store(":memory:")
|
||||||
|
private, _ = enrol(store, agent)
|
||||||
|
return store, private
|
||||||
Loading…
x
Reference in New Issue
Block a user