Ошибка при генерации ключа с помощью GPGME

Я пытаюсь сгенерировать новый ключ с помощью GPGME, но, к сожалению, не могу заставить работать следующий код:

 std::string def = "<GnupgKeyParms format='internal'>"" Key-Type: default "" Subkey-Type: default"" Name-Real: Joe Tester"" Name-Comment: with stupid passphrase"" Name-Email: [email protected]"" 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: [email protected] \n"" Expire-Date: 0 \n"" Passphrase: abc \n"" </GnupgKeyParms>";

Но приложение висит на gpgme_op_genkey,

0

Решение

Если вы посмотрите на документация ты находишь это gpgme_errot_t невозможно скопировать с кодом ошибки:

… значение ошибки нельзя напрямую сравнить с кодом ошибки, но должны использоваться функции доступа, описанные ниже. Однако гарантируется, что только 0 используется для указания успеха (GPG_ERR_NO_ERROR), и что в этом случае все остальные части значения ошибки также устанавливаются в 0.

Все еще ценность error должно быть ноль. С этим я не могу тебе помочь

Вы можете попробовать использовать gpgme_err_code чтобы выяснить, какая ошибка произошла.

1

Другие решения

Программа остановилась во время генерации ключа, потому что в системе было слишком мало энтропии (это виртуальная машина Debian). Для других, которые могут наткнуться на этот вопрос: вы можете увидеть, сколько энтропии доступно в Debian (и других дистрибутивах Linux), посмотрев / proc / sys / kernel / random / entropy_avail. Я установил hasged (доступно в диспетчере пакетов) и перезапустил код. Все работало нормально Большое спасибо список рассылки GnuPG, что помогло мне разобраться в этом решении.

1

По вопросам рекламы [email protected]