首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用GPGME生成密钥时出错

使用GPGME生成密钥时出错
EN

Stack Overflow用户
提问于 2016-01-25 13:48:50
回答 2查看 549关注 0票数 2

我试图用GPGME生成一个新的密钥,但不幸的是,我无法使以下代码工作:

代码语言:javascript
复制
 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。初始化如下:

代码语言:javascript
复制
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,意思是param字符串格式错误。但是..。为什么?我是否需要用一些比空白更多的东西来分隔这些值呢?

更新

我改变了内部的引号

代码语言:javascript
复制
GnupgKeyParms format=\"internal\"

但是现在我得到了一个GPG_ERR_GENERAL**.**

更新:

字符串现在看起来如下:

代码语言:javascript
复制
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上。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-27 12:06:21

程序在生成密钥时停止,因为系统上可用的熵太少(这是一个debian )。对于可能会遇到这个问题的其他人,您可以通过查看/proc/sys/内核/随机/熵_效用来查看debian (和其他linux发行版)中有多少熵。我安装了haveged (在包管理器中可用)并重新运行代码。一切都很好。非常感谢GnuPG邮件列表,它帮助我找到了这个解决方案。

票数 1
EN

Stack Overflow用户

发布于 2016-01-25 14:02:44

如果您查看文档,您会发现gpgme_errot_t无法对错误代码进行处理:

..。错误值不能与错误代码直接比较,但必须使用下面描述的访问器函数。但是,可以保证只使用0来表示成功(GPG_ERR_NO_ERROR),而且在本例中,错误值的所有其他部分也被设置为0。

不过,error的值应该是零。所以我帮不了你

您可以尝试使用gpgme_err_code来找出发生了哪些错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34994224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档