The behaviour Attesto uses to obtain signing and verification keys.
A keystore answers two questions:
What key do we sign new tokens with?
signing_pem/0returns the private RSA key PEM. Attesto derives the public half and thekidfrom it (Attesto.Key), so the keystore never has to compute a thumbprint.What keys may verify a presented token?
verification_pems/0returns a list of PEMs (private or public) whose public halves are trusted. With a single key this is just[signing_pem()]. During a key rotation it carries both the outgoing and incoming keys so tokens minted under either verify, andAttesto.Token.verify/3selects the right one by the JWS headerkid.
Implementations decide where keys come from - an environment variable, a secrets manager, a file, a hardware module. Attesto only consumes the PEMs, so the security-sensitive resolution and any fail-fast boot checks stay in the host application.
Attesto.Keystore.Static is a ready-made implementation for the common
single-key (or manually-rotated) case.
Summary
Callbacks
The private RSA key PEM used to sign newly issued tokens.
The PEMs (private or public) whose public halves are trusted to verify
a presented token. MUST include the public half of whatever
signing_pem/0 currently returns.
Callbacks
@callback signing_pem() :: String.t()
The private RSA key PEM used to sign newly issued tokens.
@callback verification_pems() :: [String.t()]
The PEMs (private or public) whose public halves are trusted to verify
a presented token. MUST include the public half of whatever
signing_pem/0 currently returns.