答案1
GnuPG 使用基于文本的协议“Assuan IPC”与 pinentry 交互。整体格式与 gpg-agent、scdaemon 和其他 GnuPG 组件使用的格式完全相同。
要实现它,您的程序需要能够通过 stdin 接收命令并通过 stdout 接收响应。Assuan IPC 协议完全基于文本,每行一个命令,并且使用百分比编码值(如 URL 中一样,但空格除外)不是转换为 +)。
pinentry 使用的命令记录在info "(pinentry)Protocol"
信息页面。您的程序需要接受诸如 OPTION、SETPROMPT、SETTITLE、SETDESC 等命令并返回 OK/ERR 响应。
*/usr/bin/pinentry is started*
Pinentry: OK Carlos' React-based Pinentry Ready!
GnuPG: OPTION display=:0
Pinentry: OK
GnuPG: SETDESC Please%20unlock%20the%20card
Pinentry: OK
GnuPG: GETPIN
*the GUI window shows up*
*user enters "secret password"*
Pinentry: D secret%20password
Pinentry: OK
一旦您收到GETPIN
或CONFIRM
命令,您就可以显示相应的窗口,并且一旦您有了输入,您就必须通过 stdout 将其作为“数据”响应返回(“OK”之前的“D”)。
最后,配置~/.gnupg/gpg-agent.conf
使用自定义的“pinentry-program”而不是标准程序。