aboutsummaryrefslogtreecommitdiffstats
path: root/src/core/function/gpg/GpgKeyOpera.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/function/gpg/GpgKeyOpera.cpp')
-rw-r--r--src/core/function/gpg/GpgKeyOpera.cpp411
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");
}