Moved from MailCraft's crates/assuan at a44a45013d1c. The code is unchanged apart from the crate name and doc wording that named the app. The S-expression reader, socket-file reader, limits and all 60 tests come with it.
1.6 KiB
craft-assuan
The Assuan protocol and gpg-agent's operations, without sockets.
OpenPGP private keys stay in GnuPG (on disk or on a smartcard) and are used through gpg-agent,
which asks for the PIN or passphrase in its own pinentry. This crate speaks to the agent over any
Read + Write stream the caller opened.
Client: Assuan's line framing (lines of at mostMAX_LINEbytes, percent-escaping), the server'sOK,ERR,S,D,INQUIREand#lines, and answers to an inquiry (D…END, orCAN).GpgAgent: whether a key is there (HAVEKEY,KEYINFO,READKEY), signing a digest (SIGKEY,SETHASH,PKSIGN; SHA-256, SHA-384 and SHA-512 only), decrypting a session key (SETKEY,PKDECRYPT), and the hints that let the agent's pinentry show on the owner's screen.sexp: a bounded reader and writer of canonical S-expressions, the form the agent hands keys, signatures and session keys over in.socket_file: the two kinds of file that may stand where the agent's socket is named: a redirect, and (on Windows) the loopback port and nonce of Assuan's socket emulation.
Finding the agent and opening the socket is the caller's. Everything the agent sends is treated
as hostile: lines, data, status lines, inquiries and S-expressions are capped (MAX_LINE,
MAX_DATA, MAX_LINES, MAX_STATUS, MAX_INQUIRIES, MAX_INQUIRY_DATA, MAX_KEYS), and
nothing here panics on junk. A session key that comes back is wiped from memory when it is
dropped and is never shown by Debug.
Written from the public documentation of the Assuan protocol and of gpg-agent's commands. Moved
from MailCraft's mailcraft-assuan.