Я пытаюсь сгенерировать новый ключ с помощью 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?
УДАПТЕ:
Благодаря ответу 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
.