我正在尝试使用 GPGME 生成一个新密钥,但不幸的是我无法使以下代码工作:
std::string def = "<GnupgKeyParms format='internal'>"
" Key-Type: default "
" Subkey-Type: default"
" Name-Real: Joe Tester"
" Name-Comment: with stupid passphrase"
" Name-Email: joe2@foo.bar"
" Expire-Date: 0"
" Passphrase: abc"
" </GnupgKeyParms>";
gpgme_error_t error = gpgme_op_genkey(mContext, def.c_str(), NULL, NULL);
if(GPG_ERR_INV_VALUE == error){
std::cout << "Value error";
}
if(GPG_ERR_NOT_SUPPORTED == error){
std::cout << "Not supported error";
}
if(GPG_ERR_GENERAL == error){
std::cout << "general error";
}
if(error == GPG_ERR_NO_ERROR){
gpgme_genkey_result_t res = gpgme_op_genkey_result(mContext);
if(res->primary && res->sub){
result = true;
}
}
}
条件error == GPG_ERR_NO_ERROR
不成立。事实上,没有一个错误检查条件是。我的调试器只是告诉我 error
的值是 117440567。初始化如下所示:
gpgme_engine_info_t info;
gpgme_error_t error;
const char * CONFIG_DIR = "/";
// Initializes gpgme
gpgme_check_version(NULL);
// Initialize the locale environment.
setlocale(LC_ALL, "");
gpgme_set_locale(NULL, LC_CTYPE, setlocale(LC_CTYPE, NULL));
#ifdef LC_MESSAGES
gpgme_set_locale(NULL, LC_MESSAGES, setlocale(LC_MESSAGES, NULL));
#endif
error = gpgme_set_engine_info(GPGME_PROTOCOL_OpenPGP, NULL,
CONFIG_DIR);
if(error)
return false;
error = gpgme_new(&mContext);
if(error)
return false;
// Check OpenPGP
error = gpgme_engine_check_version(GPGME_PROTOCOL_OpenPGP);
if(error)
return false;
// load engine info
error = gpgme_get_engine_info(&info);
if(error)
return false;
while(info && info->protocol != gpgme_get_protocol(mContext)) {
info = info->next;
}
if(error)
return false;
我在这里没有任何错误。我完全能够使用 GnuPG 命令行创建密钥。那么,使用 GPGME 创建密钥时出现的这个奇怪错误是什么意思呢?
UDAPTE:
多亏了 Auges 的回答,我现在可以看出这是一个GPG_ERR_INV_VALUE
,这意味着参数字符串格式不正确。但。。。为什么?我是否必须用比空白以外的内容分隔值?
更新
我更改了内部的引号
GnupgKeyParms format="internal"
但现在我得到了一个GPG_ERR_GENERAL
.
更新:
字符串现在如下所示:
std::string def = "<GnupgKeyParms format="internal"> n"
" Key-Type: default n"
" Subkey-Type: default n"
" Name-Real: Joe Tester3 n"
" Name-Comment: with stupid passphrase n"
" Name-Email: joe3@foo.bar n"
" Expire-Date: 0 n"
" Passphrase: abc n"
" </GnupgKeyParms>";
但是该应用程序挂在gpgme_op_genkey
.
如果您查看文档,您会发现gpgme_errot_t
无法与错误代码进行比较:
。错误值不能直接与错误代码进行比较,但必须使用下面描述的访问器函数。但是,可以保证仅使用 0 表示成功 (GPG_ERR_NO_ERROR),并且在这种情况下,错误值的所有其他部分也设置为 0。
error
的值仍应为零。有了那个我帮不了你
您可以尝试使用gpgme_err_code
来找出发生的错误。
程序在生成密钥时停止,因为系统上可用的熵太少(它是一个 debian VM)。对于其他可能偶然发现这个问题的人:您可以通过查看/proc/sys/kernel/random/entropy_avail 来查看 debian(和其他 linux 发行版)中有多少熵可用。我安装了haveged(在包管理器中可用)并重新运行代码。一切都很好。非常感谢 GnuPG 的邮件列表,它帮助我找到了这个解决方案。