diff options
Diffstat (limited to 'src/core/function/gpg/GpgKeyOpera.cpp')
-rw-r--r-- | src/core/function/gpg/GpgKeyOpera.cpp | 411 |
1 files changed, 121 insertions, 290 deletions
diff --git a/src/core/function/gpg/GpgKeyOpera.cpp b/src/core/function/gpg/GpgKeyOpera.cpp index 800a6708..cf4d1e3b 100644 --- a/src/core/function/gpg/GpgKeyOpera.cpp +++ b/src/core/function/gpg/GpgKeyOpera.cpp @@ -163,337 +163,168 @@ void GpgKeyOpera::GenerateRevokeCert(const GpgKey& key, }}); } +auto GenerateKeyImpl(GpgContext& ctx, const QSharedPointer<GenKeyInfo>& params, + const DataObjectPtr& data_object) -> GpgError { + const auto userid = params->GetUserid(); + const auto algo = params->GetAlgo().Id(); + + unsigned long expires = + QDateTime::currentDateTime().secsTo(params->GetExpireTime()); + + GpgError err; + unsigned int flags = 0; + + if (!params->IsSubKey()) flags |= GPGME_CREATE_CERT; + if (params->IsAllowEncryption()) flags |= GPGME_CREATE_ENCR; + if (params->IsAllowSigning()) flags |= GPGME_CREATE_SIGN; + if (params->IsAllowAuthentication()) flags |= GPGME_CREATE_AUTH; + if (params->IsNonExpired()) flags |= GPGME_CREATE_NOEXPIRE; + if (params->IsNoPassPhrase()) flags |= GPGME_CREATE_NOPASSWD; + + LOG_D() << "key generation args: " << userid << algo << expires << flags; + LOG_D() << "key generation flags" << params->IsAllowEncryption() + << params->IsAllowSigning() << params->IsAllowAuthentication() + << !params->IsSubKey(); + + err = gpgme_op_createkey(ctx.DefaultContext(), userid.toUtf8(), algo.toUtf8(), + 0, expires, nullptr, flags); + + if (CheckGpgError(err) == GPG_ERR_NO_ERROR) { + data_object->Swap( + {GpgGenerateKeyResult{gpgme_op_genkey_result(ctx.DefaultContext())}}); + } else { + data_object->Swap({GpgGenerateKeyResult{}}); + } + + return CheckGpgError(err); +} + /** * Generate a new key pair * @param params key generation args * @return error information */ -void GpgKeyOpera::GenerateKey(const std::shared_ptr<GenKeyInfo>& params, +void GpgKeyOpera::GenerateKey(const QSharedPointer<GenKeyInfo>& params, const GpgOperationCallback& callback) { RunGpgOperaAsync( - [&ctx = ctx_, params](const DataObjectPtr& data_object) -> GpgError { - auto userid = params->GetUserid(); - auto algo = params->GetAlgo() + params->GetKeySizeStr(); - - LOG_D() << "params: " << params->GetAlgo() << params->GetKeySizeStr(); - - unsigned long expires = - QDateTime::currentDateTime().secsTo(params->GetExpireTime()); - - GpgError err; - unsigned int flags = 0; - - if (!params->IsSubKey()) flags |= GPGME_CREATE_CERT; - if (params->IsAllowEncryption()) flags |= GPGME_CREATE_ENCR; - if (params->IsAllowSigning()) flags |= GPGME_CREATE_SIGN; - if (params->IsAllowAuthentication()) flags |= GPGME_CREATE_AUTH; - if (params->IsNonExpired()) flags |= GPGME_CREATE_NOEXPIRE; - if (params->IsNoPassPhrase()) flags |= GPGME_CREATE_NOPASSWD; - - LOG_D() << "key generation args: " << userid << algo << expires - << flags; - - err = gpgme_op_createkey(ctx.DefaultContext(), userid.toUtf8(), - algo.toUtf8(), 0, expires, nullptr, flags); - assert(gpg_err_code(err) == GPG_ERR_NO_ERROR); - - if (CheckGpgError(err) == GPG_ERR_NO_ERROR) { - data_object->Swap({GpgGenerateKeyResult{ - gpgme_op_genkey_result(ctx.DefaultContext())}}); - } else { - data_object->Swap({GpgGenerateKeyResult{}}); - } - - return CheckGpgError(err); + [=](const DataObjectPtr& data_object) -> GpgError { + return GenerateKeyImpl(ctx_, params, data_object); }, callback, "gpgme_op_createkey", "2.1.0"); } -auto GpgKeyOpera::GenerateKeySync(const std::shared_ptr<GenKeyInfo>& params) +auto GpgKeyOpera::GenerateKeySync(const QSharedPointer<GenKeyInfo>& params) -> std::tuple<GpgError, DataObjectPtr> { return RunGpgOperaSync( - [=, &ctx = ctx_](const DataObjectPtr& data_object) -> GpgError { - auto userid = params->GetUserid(); - auto algo = params->GetAlgo() + params->GetKeySizeStr(); - - LOG_D() << "params: " << params->GetAlgo() << params->GetKeySizeStr(); - - unsigned long expires = - QDateTime::currentDateTime().secsTo(params->GetExpireTime()); - - GpgError err; - unsigned int flags = 0; - - if (!params->IsSubKey()) flags |= GPGME_CREATE_CERT; - if (params->IsAllowEncryption()) flags |= GPGME_CREATE_ENCR; - if (params->IsAllowSigning()) flags |= GPGME_CREATE_SIGN; - if (params->IsAllowAuthentication()) flags |= GPGME_CREATE_AUTH; - if (params->IsNonExpired()) flags |= GPGME_CREATE_NOEXPIRE; - if (params->IsNoPassPhrase()) flags |= GPGME_CREATE_NOPASSWD; - - LOG_D() << "key generation args: " << userid << algo << expires - << flags; - - err = gpgme_op_createkey(ctx.DefaultContext(), userid.toUtf8(), - algo.toUtf8(), 0, expires, nullptr, flags); - assert(gpg_err_code(err) == GPG_ERR_NO_ERROR); - - if (CheckGpgError(err) == GPG_ERR_NO_ERROR) { - data_object->Swap({GpgGenerateKeyResult{ - gpgme_op_genkey_result(ctx.DefaultContext())}}); - } else { - data_object->Swap({GpgGenerateKeyResult{}}); - } - - return CheckGpgError(err); + [=](const DataObjectPtr& data_object) -> GpgError { + return GenerateKeyImpl(ctx_, params, data_object); }, "gpgme_op_createkey", "2.1.0"); } +auto GenerateSubKeyImpl(GpgContext& ctx, const GpgKey& key, + const QSharedPointer<GenKeyInfo>& params, + const DataObjectPtr& data_object) -> GpgError { + if (!params->IsSubKey()) return GPG_ERR_CANCELED; + + LOG_D() << "generate subkey algo: " << params->GetAlgo().Name() + << "key size: " << params->GetKeyLength(); + + auto algo = params->GetAlgo().Id(); + unsigned long expires = + QDateTime::currentDateTime().secsTo(params->GetExpireTime()); + unsigned int flags = 0; + + if (!params->IsSubKey()) flags |= GPGME_CREATE_CERT; + if (params->IsAllowEncryption()) flags |= GPGME_CREATE_ENCR; + if (params->IsAllowSigning()) flags |= GPGME_CREATE_SIGN; + if (params->IsAllowAuthentication()) flags |= GPGME_CREATE_AUTH; + if (params->IsNonExpired()) flags |= GPGME_CREATE_NOEXPIRE; + if (params->IsNoPassPhrase()) flags |= GPGME_CREATE_NOPASSWD; + + LOG_D() << "subkey generation args: " << key.GetId() << algo << expires + << flags; + + auto err = + gpgme_op_createsubkey(ctx.DefaultContext(), static_cast<gpgme_key_t>(key), + algo.toLatin1(), 0, expires, flags); + if (CheckGpgError(err) != GPG_ERR_NO_ERROR) { + data_object->Swap({GpgGenerateKeyResult{}}); + return err; + } + + data_object->Swap( + {GpgGenerateKeyResult{gpgme_op_genkey_result(ctx.DefaultContext())}}); + return CheckGpgError(err); +} + void GpgKeyOpera::GenerateSubkey(const GpgKey& key, - const std::shared_ptr<GenKeyInfo>& params, + const QSharedPointer<GenKeyInfo>& params, const GpgOperationCallback& callback) { RunGpgOperaAsync( - [key, &ctx = ctx_, params](const DataObjectPtr& data_object) -> GpgError { - if (!params->IsSubKey()) return GPG_ERR_CANCELED; - - LOG_D() << "generate subkey algo: " << params->GetAlgo() - << "key size: " << params->GetKeySizeStr(); - - auto algo = params->GetAlgo() + params->GetKeySizeStr(); - unsigned long expires = - QDateTime::currentDateTime().secsTo(params->GetExpireTime()); - unsigned int flags = 0; - - if (!params->IsSubKey()) flags |= GPGME_CREATE_CERT; - if (params->IsAllowEncryption()) flags |= GPGME_CREATE_ENCR; - if (params->IsAllowSigning()) flags |= GPGME_CREATE_SIGN; - if (params->IsAllowAuthentication()) flags |= GPGME_CREATE_AUTH; - if (params->IsNonExpired()) flags |= GPGME_CREATE_NOEXPIRE; - if (params->IsNoPassPhrase()) flags |= GPGME_CREATE_NOPASSWD; - - LOG_D() << "subkey generation args: " << key.GetId() << algo << expires - << flags; - - auto err = gpgme_op_createsubkey(ctx.DefaultContext(), - static_cast<gpgme_key_t>(key), - algo.toLatin1(), 0, expires, flags); - if (CheckGpgError(err) != GPG_ERR_NO_ERROR) { - data_object->Swap({GpgGenerateKeyResult{}}); - return err; - } - - data_object->Swap({GpgGenerateKeyResult{ - gpgme_op_genkey_result(ctx.DefaultContext())}}); - return CheckGpgError(err); + [=](const DataObjectPtr& data_object) -> GpgError { + return GenerateSubKeyImpl(ctx_, key, params, data_object); }, callback, "gpgme_op_createsubkey", "2.1.13"); } auto GpgKeyOpera::GenerateSubkeySync(const GpgKey& key, - const std::shared_ptr<GenKeyInfo>& params) + const QSharedPointer<GenKeyInfo>& params) -> std::tuple<GpgError, DataObjectPtr> { return RunGpgOperaSync( - [key, &ctx = ctx_, params](const DataObjectPtr& data_object) -> GpgError { - if (!params->IsSubKey()) return GPG_ERR_CANCELED; - - LOG_D() << "generate subkey algo: " << params->GetAlgo() - << " key size: " << params->GetKeySizeStr(); - - auto algo = params->GetAlgo() + params->GetKeySizeStr(); - unsigned long expires = - QDateTime::currentDateTime().secsTo(params->GetExpireTime()); - unsigned int flags = 0; - - if (!params->IsSubKey()) flags |= GPGME_CREATE_CERT; - if (params->IsAllowEncryption()) flags |= GPGME_CREATE_ENCR; - if (params->IsAllowSigning()) flags |= GPGME_CREATE_SIGN; - if (params->IsAllowAuthentication()) flags |= GPGME_CREATE_AUTH; - if (params->IsNonExpired()) flags |= GPGME_CREATE_NOEXPIRE; - if (params->IsNoPassPhrase()) flags |= GPGME_CREATE_NOPASSWD; - - LOG_D() << " args: " << key.GetId() << algo << expires << flags; - - auto err = gpgme_op_createsubkey(ctx.DefaultContext(), - static_cast<gpgme_key_t>(key), - algo.toLatin1(), 0, expires, flags); - - if (CheckGpgError(err) != GPG_ERR_NO_ERROR) { - data_object->Swap({GpgGenerateKeyResult{}}); - return err; - } - - data_object->Swap({GpgGenerateKeyResult{ - gpgme_op_genkey_result(ctx.DefaultContext())}}); - return CheckGpgError(err); + [=](const DataObjectPtr& data_object) -> GpgError { + return GenerateSubKeyImpl(ctx_, key, params, data_object); }, "gpgme_op_createsubkey", "2.1.13"); } +auto GenerateKeyWithSubkeyImpl(GpgContext& ctx, GpgKeyGetter& key_getter, + const QSharedPointer<GenKeyInfo>& p_params, + const QSharedPointer<GenKeyInfo>& s_params, + const DataObjectPtr& data_object) -> GpgError { + auto err = GenerateKeyImpl(ctx, p_params, data_object); + + if (err != GPG_ERR_NO_ERROR) return err; + if (!data_object->Check<GpgGenerateKeyResult>()) return GPG_ERR_CANCELED; + + auto result = ExtractParams<GpgGenerateKeyResult>(data_object, 0); + auto key = key_getter.GetKey(result.GetFingerprint()); + if (!key.IsGood()) { + LOG_W() << "cannot get key which has been generated, fpr: " + << result.GetFingerprint(); + return GPG_ERR_CANCELED; + } + + if (s_params == nullptr) return err; + + data_object->Swap({}); + err = GenerateSubKeyImpl(ctx, key, s_params, data_object); + auto s_result = ExtractParams<GpgGenerateKeyResult>(data_object, 0); + + data_object->Swap({result, s_result}); + return err; +} + void GpgKeyOpera::GenerateKeyWithSubkey( - const std::shared_ptr<GenKeyInfo>& params, - const std::shared_ptr<GenKeyInfo>& subkey_params, + const QSharedPointer<GenKeyInfo>& p_params, + const QSharedPointer<GenKeyInfo>& s_params, const GpgOperationCallback& callback) { RunGpgOperaAsync( - [&ctx = ctx_, params, subkey_params, - channel = GetChannel()](const DataObjectPtr& data_object) -> GpgError { - auto userid = params->GetUserid().toUtf8(); - auto algo = (params->GetAlgo() + params->GetKeySizeStr()).toUtf8(); - unsigned long expires = - QDateTime::currentDateTime().secsTo(params->GetExpireTime()); - - GpgError err; - unsigned int flags = 0; - - if (!params->IsSubKey()) flags |= GPGME_CREATE_CERT; - if (params->IsAllowEncryption()) flags |= GPGME_CREATE_ENCR; - if (params->IsAllowSigning()) flags |= GPGME_CREATE_SIGN; - if (params->IsAllowAuthentication()) flags |= GPGME_CREATE_AUTH; - if (params->IsNonExpired()) flags |= GPGME_CREATE_NOEXPIRE; - if (params->IsNoPassPhrase()) flags |= GPGME_CREATE_NOPASSWD; - - LOG_D() << "key generation args: " << userid << algo << expires - << flags; - - err = gpgme_op_createkey(ctx.DefaultContext(), userid, algo, 0, expires, - nullptr, flags); - assert(gpg_err_code(err) == GPG_ERR_NO_ERROR); - - if (CheckGpgError(err) != GPG_ERR_NO_ERROR) { - data_object->Swap({GpgGenerateKeyResult{}}); - return err; - } - - auto genkey_result = - GpgGenerateKeyResult{gpgme_op_genkey_result(ctx.DefaultContext())}; - - if (subkey_params == nullptr || !subkey_params->IsSubKey()) { - data_object->Swap({genkey_result}); - return err; - } - - auto key = GpgKeyGetter::GetInstance(channel).GetKey( - genkey_result.GetFingerprint()); - if (!key.IsGood()) { - LOG_W() << "cannot get key which has been generate, fpr: " - << genkey_result.GetFingerprint(); - return err; - } - - algo = (subkey_params->GetAlgo() + subkey_params->GetKeySizeStr()) - .toUtf8(); - expires = - QDateTime::currentDateTime().secsTo(subkey_params->GetExpireTime()); - - flags = 0; - if (subkey_params->IsAllowEncryption()) flags |= GPGME_CREATE_ENCR; - if (subkey_params->IsAllowSigning()) flags |= GPGME_CREATE_SIGN; - if (subkey_params->IsAllowAuthentication()) flags |= GPGME_CREATE_AUTH; - if (subkey_params->IsNonExpired()) flags |= GPGME_CREATE_NOEXPIRE; - if (subkey_params->IsNoPassPhrase()) flags |= GPGME_CREATE_NOPASSWD; - - LOG_D() << "subkey generation args: " << key.GetId() << algo << expires - << flags; - - err = gpgme_op_createsubkey(ctx.DefaultContext(), - static_cast<gpgme_key_t>(key), algo, 0, - expires, flags); - - if (CheckGpgError(err) == GPG_ERR_NO_ERROR) { - data_object->Swap( - {genkey_result, GpgGenerateKeyResult{gpgme_op_genkey_result( - ctx.DefaultContext())}}); - } else { - data_object->Swap({genkey_result, GpgGenerateKeyResult{}}); - } - - return CheckGpgError(err); + [=](const DataObjectPtr& data_object) -> GpgError { + return GenerateKeyWithSubkeyImpl(ctx_, key_getter_, p_params, s_params, + data_object); }, callback, "gpgme_op_createkey&gpgme_op_createsubkey", "2.1.0"); } auto GpgKeyOpera::GenerateKeyWithSubkeySync( - const std::shared_ptr<GenKeyInfo>& params, - const std::shared_ptr<GenKeyInfo>& subkey_params) + const QSharedPointer<GenKeyInfo>& p_params, + const QSharedPointer<GenKeyInfo>& s_params) -> std::tuple<GpgError, DataObjectPtr> { return RunGpgOperaSync( - [&ctx = ctx_, params, subkey_params, - channel = GetChannel()](const DataObjectPtr& data_object) -> GpgError { - auto userid = params->GetUserid().toUtf8(); - auto algo = (params->GetAlgo() + params->GetKeySizeStr()).toUtf8(); - unsigned long expires = - QDateTime::currentDateTime().secsTo(params->GetExpireTime()); - - GpgError err; - unsigned int flags = 0; - - if (!params->IsSubKey()) flags |= GPGME_CREATE_CERT; - if (params->IsAllowEncryption()) flags |= GPGME_CREATE_ENCR; - if (params->IsAllowSigning()) flags |= GPGME_CREATE_SIGN; - if (params->IsAllowAuthentication()) flags |= GPGME_CREATE_AUTH; - if (params->IsNonExpired()) flags |= GPGME_CREATE_NOEXPIRE; - if (params->IsNoPassPhrase()) flags |= GPGME_CREATE_NOPASSWD; - - LOG_D() << "key generation args: " << userid << algo << expires - << flags; - - err = gpgme_op_createkey(ctx.DefaultContext(), userid, algo, 0, expires, - nullptr, flags); - assert(gpg_err_code(err) == GPG_ERR_NO_ERROR); - - if (CheckGpgError(err) != GPG_ERR_NO_ERROR) { - data_object->Swap({GpgGenerateKeyResult{}}); - return err; - } - - auto genkey_result = - GpgGenerateKeyResult{gpgme_op_genkey_result(ctx.DefaultContext())}; - - if (subkey_params == nullptr || !subkey_params->IsSubKey()) { - data_object->Swap({genkey_result}); - return err; - } - - auto key = GpgKeyGetter::GetInstance(channel).GetKey( - genkey_result.GetFingerprint()); - if (!key.IsGood()) { - LOG_W() << "cannot get key which has been generate, fpr: " - << genkey_result.GetFingerprint(); - return err; - } - - LOG_D() << "try to generate subkey of key: " << key.GetId() - << ", algo :" << subkey_params->GetAlgo() - << ", key size: " << subkey_params->GetKeySizeStr(); - - algo = (subkey_params->GetAlgo() + subkey_params->GetKeySizeStr()) - .toUtf8(); - expires = - QDateTime::currentDateTime().secsTo(subkey_params->GetExpireTime()); - - flags = 0; - if (subkey_params->IsAllowEncryption()) flags |= GPGME_CREATE_ENCR; - if (subkey_params->IsAllowSigning()) flags |= GPGME_CREATE_SIGN; - if (subkey_params->IsAllowAuthentication()) flags |= GPGME_CREATE_AUTH; - if (subkey_params->IsNonExpired()) flags |= GPGME_CREATE_NOEXPIRE; - if (subkey_params->IsNoPassPhrase()) flags |= GPGME_CREATE_NOPASSWD; - - LOG_D() << "subkey generation args: " << key.GetId() << algo << expires - << flags; - - err = gpgme_op_createsubkey(ctx.DefaultContext(), - static_cast<gpgme_key_t>(key), algo, 0, - expires, flags); - - if (CheckGpgError(err) == GPG_ERR_NO_ERROR) { - data_object->Swap( - {genkey_result, GpgGenerateKeyResult{gpgme_op_genkey_result( - ctx.DefaultContext())}}); - } else { - data_object->Swap({genkey_result, GpgGenerateKeyResult{}}); - } - - return CheckGpgError(err); + [=](const DataObjectPtr& data_object) -> GpgError { + return GenerateKeyWithSubkeyImpl(ctx_, key_getter_, p_params, s_params, + data_object); }, "gpgme_op_createkey&gpgme_op_createsubkey", "2.1.0"); } |