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
で、param 文字列の形式が正しくないという意味であることがわかりました。しかし、なぜ?空白以上のもので値を区切る必要がありますか?
アップデート
内部の引用符を変更しました
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
ます。