Я пытаюсь сгенерировать новый ключ с помощью 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
,
Если вы посмотрите на документация ты находишь это gpgme_errot_t
невозможно скопировать с кодом ошибки:
… значение ошибки нельзя напрямую сравнить с кодом ошибки, но должны использоваться функции доступа, описанные ниже. Однако гарантируется, что только 0 используется для указания успеха (GPG_ERR_NO_ERROR), и что в этом случае все остальные части значения ошибки также устанавливаются в 0.
Все еще ценность error
должно быть ноль. С этим я не могу тебе помочь
Вы можете попробовать использовать gpgme_err_code
чтобы выяснить, какая ошибка произошла.
Программа остановилась во время генерации ключа, потому что в системе было слишком мало энтропии (это виртуальная машина Debian). Для других, которые могут наткнуться на этот вопрос: вы можете увидеть, сколько энтропии доступно в Debian (и других дистрибутивах Linux), посмотрев / proc / sys / kernel / random / entropy_avail. Я установил hasged (доступно в диспетчере пакетов) и перезапустил код. Все работало нормально Большое спасибо список рассылки GnuPG, что помогло мне разобраться в этом решении.