summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIngo Klöcker <dev@ingo-kloecker.de>2022-10-24 12:21:41 +0200
committerIngo Klöcker <dev@ingo-kloecker.de>2022-10-24 12:22:09 +0200
commitd9ac1385950217893be6f0d6fdb3324b8647d16b (patch)
treeaaa3699a5799c2864376a4f629d6fd0c67497e68
parentd36905bb80c43987f2ca6980d3973d2111f89991 (diff)
downloadgpgme-d9ac1385950217893be6f0d6fdb3324b8647d16b.tar.gz
cpp: Allow setting the curve to use when generating ECC keys
lang/cpp/src/gpggencardkeyinteractor.h (class GpgGenCardKeyInteractor): Add enum Curve. Add member function setCurve. lang/cpp/src/gpggencardkeyinteractor.cpp (class GpgGenCardKeyInteractor::Private): Initialize simple members in-class. Add member curve. (GpgGenCardKeyInteractor::~GpgGenCardKeyInteractor): Use default d'tor. (GpgGenCardKeyInteractor::setCurve): New. (GpgGenCardKeyInteractor::action): Return curve defaulting to Curve25519. -- This enables users of this interactor to request the generation of ECC keys with a specific curve as smart card keys. It's up to the user to specify a curve that is actually supported by the smart card. GnuPG-bug-id: 4429
-rw-r--r--NEWS9
-rw-r--r--lang/cpp/src/gpggencardkeyinteractor.cpp22
-rw-r--r--lang/cpp/src/gpggencardkeyinteractor.h19
3 files changed, 43 insertions, 7 deletions
diff --git a/NEWS b/NEWS
index f9cd8651..fc434647 100644
--- a/NEWS
+++ b/NEWS
@@ -10,6 +10,15 @@ Noteworthy changes in version 1.18.1 (unreleased)
* qt: Fix problem with expiration dates after 2038-01-19 on 32-bit systems
when adding an existing subkey to another key. [T6137]
+ * cpp: Allow setting the curve to use when generating ECC keys
+ for smart cards. [T4429]
+
+ * Interface changes relative to the 1.18.0 release:
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ cpp: GpgGenCardKeyInteractor::Curve NEW.
+ cpp: GpgGenCardKeyInteractor::setCurve NEW.
+
+
Noteworthy changes in version 1.18.0 (2022-08-10)
-------------------------------------------------
diff --git a/lang/cpp/src/gpggencardkeyinteractor.cpp b/lang/cpp/src/gpggencardkeyinteractor.cpp
index 4d90aa0b..a28169ec 100644
--- a/lang/cpp/src/gpggencardkeyinteractor.cpp
+++ b/lang/cpp/src/gpggencardkeyinteractor.cpp
@@ -36,16 +36,17 @@ using namespace GpgME;
class GpgGenCardKeyInteractor::Private
{
public:
- Private() : keysize("2048"), backup(false), algo(RSA)
+ Private() : keysize("2048")
{
-
}
+
std::string name, email, backupFileName, expiry, serial, keysize;
- bool backup;
- Algo algo;
+ bool backup = false;
+ Algo algo = RSA;
+ std::string curve;
};
-GpgGenCardKeyInteractor::~GpgGenCardKeyInteractor() {}
+GpgGenCardKeyInteractor::~GpgGenCardKeyInteractor() = default;
GpgGenCardKeyInteractor::GpgGenCardKeyInteractor(const std::string &serial):
d(new Private)
@@ -88,6 +89,15 @@ void GpgGenCardKeyInteractor::setAlgo(Algo algo)
d->algo = algo;
}
+void GpgGenCardKeyInteractor::setCurve(Curve curve)
+{
+ if (curve == DefaultCurve) {
+ d->curve.clear();
+ } else if (curve >= 1 && curve <= LastCurve) {
+ d->curve = std::to_string(static_cast<int>(curve));
+ }
+}
+
namespace GpgGenCardKeyInteractor_Private
{
enum {
@@ -141,7 +151,7 @@ const char *GpgGenCardKeyInteractor::action(Error &err) const
case KEY_CURVE1:
case KEY_CURVE2:
case KEY_CURVE3:
- return "1"; // Only cv25519 supported.
+ return d->curve.empty() ? "1" : d->curve.c_str(); // default is Curve25519
case NAME:
return d->name.c_str();
case EMAIL:
diff --git a/lang/cpp/src/gpggencardkeyinteractor.h b/lang/cpp/src/gpggencardkeyinteractor.h
index 3d9c7136..09a73b6a 100644
--- a/lang/cpp/src/gpggencardkeyinteractor.h
+++ b/lang/cpp/src/gpggencardkeyinteractor.h
@@ -58,10 +58,27 @@ public:
enum Algo {
RSA = 1,
- ECC = 2
+ ECC = 2,
};
void setAlgo(Algo algo);
+ // the enum values minus 1 have to match the indexes of the curves used by
+ // ask_curve() in gnupg's g10/keygen.c
+ enum Curve {
+ DefaultCurve = 0, // currently Curve25519
+ Curve25519 = 1,
+ Curve448,
+ NISTP256,
+ NISTP384,
+ NISTP521,
+ BrainpoolP256,
+ BrainpoolP384,
+ BrainpoolP512,
+ Secp256k1,
+ LastCurve = Secp256k1,
+ };
+ void setCurve(Curve curve);
+
std::string backupFileName() const;
private: