Skip to content

Commit 767ff52

Browse files
saturnericCopilot
andcommitted
fix(keygen): stabilize algo lookup and sorting
* Replaces index-based algorithm references with id/type lookup to prevent mismatches when the algorithm lists change * Adds missing ECDSA (NIST and Brainpool) subkey variants for sign/auth to align capability coverage across curves * Improves supported-algorithm sorting for deterministic ordering * Tightens algorithm equality to include type/length and adds `!=` to avoid incorrect deduplication/comparisons Co-authored-by: Copilot <copilot@github.com>
1 parent 7a06690 commit 767ff52

2 files changed

Lines changed: 102 additions & 22 deletions

File tree

src/core/model/GpgKeyGenerateInfo.cpp

Lines changed: 100 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,29 @@
3535

3636
namespace GpgFrontend {
3737

38+
namespace {
39+
40+
auto FindAlgoByIdAndType(const QContainer<KeyAlgo> &algos, const QString &id,
41+
const QString &type) -> KeyAlgo {
42+
const auto it =
43+
std::find_if(algos.cbegin(), algos.cend(), [&](const KeyAlgo &algo) {
44+
return algo.Id() == id && algo.Type() == type;
45+
});
46+
47+
assert(it != algos.cend());
48+
return it != algos.cend() ? *it : KeyAlgo{};
49+
}
50+
51+
auto FindSubAlgo(const QString &id, const QString &type) -> KeyAlgo {
52+
return FindAlgoByIdAndType(KeyGenerateInfo::kSubKeyAlgos, id, type);
53+
}
54+
55+
auto FindPrimaryAlgo(const QString &id, const QString &type) -> KeyAlgo {
56+
return FindAlgoByIdAndType(KeyGenerateInfo::kPrimaryKeyAlgos, id, type);
57+
}
58+
59+
} // namespace
60+
3861
const KeyAlgo KeyGenerateInfo::kNoneAlgo = {
3962
"none",
4063
KeyGenerateInfo::tr("None"),
@@ -216,7 +239,7 @@ const QContainer<KeyAlgo> KeyGenerateInfo::kHybridPrimaryKeyAlgo = {
216239
{{OpenPGPEngine::kRPGP, "0.1.2"}},
217240
{
218241
{
219-
kPrimaryKeyAlgos[8], // ed25519
242+
FindPrimaryAlgo("ed25519", "EdDSA"), // ed25519
220243
{
221244
{OpenPGPEngine::kRPGP, "0.1.2"},
222245
},
@@ -230,7 +253,7 @@ const QContainer<KeyAlgo> KeyGenerateInfo::kHybridPrimaryKeyAlgo = {
230253
{{OpenPGPEngine::kRPGP, "0.1.2"}},
231254
{
232255
{
233-
kPrimaryKeyAlgos[15], // ed448
256+
FindPrimaryAlgo("ed448", "EdDSA"), // ed448
234257
{
235258
{OpenPGPEngine::kRPGP, "0.1.2"},
236259
},
@@ -337,6 +360,30 @@ const QContainer<KeyAlgo> KeyGenerateInfo::kSubKeyAlgos = {
337360
kENCRYPT,
338361
{{OpenPGPEngine::kGNUPG, "2.2.0"}, {OpenPGPEngine::kRPGP, "0.1.0"}},
339362
},
363+
{
364+
"nistp256",
365+
"NIST",
366+
"ECDSA",
367+
256,
368+
kSIGN | kAUTH,
369+
{{OpenPGPEngine::kGNUPG, "2.2.0"}, {OpenPGPEngine::kRPGP, "0.1.0"}},
370+
},
371+
{
372+
"nistp384",
373+
"NIST",
374+
"ECDSA",
375+
384,
376+
kSIGN | kAUTH,
377+
{{OpenPGPEngine::kGNUPG, "2.2.0"}, {OpenPGPEngine::kRPGP, "0.1.0"}},
378+
},
379+
{
380+
"nistp521",
381+
"NIST",
382+
"ECDSA",
383+
521,
384+
kSIGN | kAUTH,
385+
{{OpenPGPEngine::kGNUPG, "2.2.0"}, {OpenPGPEngine::kRPGP, "0.1.0"}},
386+
},
340387
{
341388
"brainpoolp256r1",
342389
"BrainPooL",
@@ -361,6 +408,30 @@ const QContainer<KeyAlgo> KeyGenerateInfo::kSubKeyAlgos = {
361408
kENCRYPT,
362409
{{OpenPGPEngine::kGNUPG, "2.3.0"}},
363410
},
411+
{
412+
"brainpoolp256r1",
413+
"BrainPooL",
414+
"ECDSA",
415+
256,
416+
kSIGN | kAUTH,
417+
{{OpenPGPEngine::kGNUPG, "2.3.0"}},
418+
},
419+
{
420+
"brainpoolp384r1",
421+
"BrainPooL",
422+
"ECDSA",
423+
384,
424+
kSIGN | kAUTH,
425+
{{OpenPGPEngine::kGNUPG, "2.3.0"}},
426+
},
427+
{
428+
"brainpoolp512r1",
429+
"BrainPooL",
430+
"ECDSA",
431+
512,
432+
kSIGN | kAUTH,
433+
{{OpenPGPEngine::kGNUPG, "2.3.0"}},
434+
},
364435
{
365436
"x448",
366437
"X448",
@@ -461,50 +532,50 @@ const QContainer<KeyAlgo> KeyGenerateInfo::kHybridSubKeyAlgos = {
461532
{{OpenPGPEngine::kGNUPG, "2.5.0"}, {OpenPGPEngine::kRPGP, "0.1.2"}},
462533
{
463534
{
464-
kSubKeyAlgos[9], // cv25519
535+
FindSubAlgo("cv25519", "ECDH"), // cv25519
465536
{
466537
{OpenPGPEngine::kGNUPG, "2.5.0"},
467538
{OpenPGPEngine::kRPGP, "0.1.2"},
468539
},
469540
},
470541
{
471-
kSubKeyAlgos[10], // nistp256
542+
FindSubAlgo("nistp256", "ECDH"), // nistp256
472543
{
473544
{OpenPGPEngine::kGNUPG, "2.5.0"},
474545
},
475546
},
476547
{
477-
kSubKeyAlgos[11], // nistp384
548+
FindSubAlgo("nistp384", "ECDH"), // nistp384
478549
{
479550
{OpenPGPEngine::kGNUPG, "2.5.0"},
480551
},
481552
},
482553
{
483-
kSubKeyAlgos[12], // nistp521
554+
FindSubAlgo("nistp521", "ECDH"), // nistp521
484555
{
485556
{OpenPGPEngine::kGNUPG, "2.5.0"},
486557
},
487558
},
488559
{
489-
kSubKeyAlgos[13], // brainpoolp256r1
560+
FindSubAlgo("brainpoolp256r1", "ECDH"), // brainpoolp256r1
490561
{
491562
{OpenPGPEngine::kGNUPG, "2.5.0"},
492563
},
493564
},
494565
{
495-
kSubKeyAlgos[14], // brainpoolp384r1
566+
FindSubAlgo("brainpoolp384r1", "ECDH"), // brainpoolp384r1
496567
{
497568
{OpenPGPEngine::kGNUPG, "2.5.0"},
498569
},
499570
},
500571
{
501-
kSubKeyAlgos[15], // brainpoolp512r1
572+
FindSubAlgo("brainpoolp512r1", "ECDH"), // brainpoolp512r1
502573
{
503574
{OpenPGPEngine::kGNUPG, "2.5.0"},
504575
},
505576
},
506577
{
507-
kSubKeyAlgos[16], // x448
578+
FindSubAlgo("x448", "ECDH"), // x448
508579
{{OpenPGPEngine::kGNUPG, "2.5.0"}},
509580
},
510581
}},
@@ -516,49 +587,49 @@ const QContainer<KeyAlgo> KeyGenerateInfo::kHybridSubKeyAlgos = {
516587
{{OpenPGPEngine::kGNUPG, "2.5.0"}, {OpenPGPEngine::kRPGP, "0.1.2"}},
517588
{
518589
{
519-
kSubKeyAlgos[9], // cv25519
590+
FindSubAlgo("cv25519", "ECDH"), // cv25519
520591
{
521592
{OpenPGPEngine::kGNUPG, "2.5.0"},
522593
},
523594
},
524595
{
525-
kSubKeyAlgos[10], // nistp256
596+
FindSubAlgo("nistp256", "ECDH"), // nistp256
526597
{
527598
{OpenPGPEngine::kGNUPG, "2.5.0"},
528599
},
529600
},
530601
{
531-
kSubKeyAlgos[11], // nistp384
602+
FindSubAlgo("nistp384", "ECDH"), // nistp384
532603
{
533604
{OpenPGPEngine::kGNUPG, "2.5.0"},
534605
},
535606
},
536607
{
537-
kSubKeyAlgos[12], // nistp521
608+
FindSubAlgo("nistp521", "ECDH"), // nistp521
538609
{
539610
{OpenPGPEngine::kGNUPG, "2.5.0"},
540611
},
541612
},
542613
{
543-
kSubKeyAlgos[13], // brainpoolp256r1
614+
FindSubAlgo("brainpoolp256r1", "ECDH"), // brainpoolp256r1
544615
{
545616
{OpenPGPEngine::kGNUPG, "2.5.0"},
546617
},
547618
},
548619
{
549-
kSubKeyAlgos[14], // brainpoolp384r1
620+
FindSubAlgo("brainpoolp384r1", "ECDH"), // brainpoolp384r1
550621
{
551622
{OpenPGPEngine::kGNUPG, "2.5.0"},
552623
},
553624
},
554625
{
555-
kSubKeyAlgos[15], // brainpoolp512r1
626+
FindSubAlgo("brainpoolp512r1", "ECDH"), // brainpoolp512r1
556627
{
557628
{OpenPGPEngine::kGNUPG, "2.5.0"},
558629
},
559630
},
560631
{
561-
kSubKeyAlgos[16], // x448
632+
FindSubAlgo("x448", "ECDH"), // x448
562633
{
563634
{OpenPGPEngine::kGNUPG, "2.5.0"},
564635
{OpenPGPEngine::kRPGP, "0.1.2"},
@@ -573,7 +644,7 @@ const QContainer<KeyAlgo> KeyGenerateInfo::kHybridSubKeyAlgos = {
573644
{{OpenPGPEngine::kRPGP, "0.1.2"}},
574645
{
575646
{
576-
kSubKeyAlgos[8], // ed25519
647+
FindSubAlgo("ed25519", "EdDSA"), // ed25519
577648
{
578649
{OpenPGPEngine::kRPGP, "0.1.2"},
579650
},
@@ -587,7 +658,7 @@ const QContainer<KeyAlgo> KeyGenerateInfo::kHybridSubKeyAlgos = {
587658
{{OpenPGPEngine::kRPGP, "0.1.2"}},
588659
{
589660
{
590-
kSubKeyAlgos[22], // ed448
661+
FindSubAlgo("ed448", "EdDSA"), // ed448
591662
{
592663
{OpenPGPEngine::kRPGP, "0.1.2"},
593664
},
@@ -628,7 +699,10 @@ auto KeyGenerateInfo::GetSupportedKeyAlgo(int channel) -> QContainer<KeyAlgo> {
628699
}
629700

630701
std::sort(algos.begin(), algos.end(), [](const KeyAlgo &a, const KeyAlgo &b) {
631-
return a.Name() < b.Name() && a.KeyLength() < b.KeyLength();
702+
if (a.Name() != b.Name()) return a.Name() < b.Name();
703+
if (a.KeyLength() != b.KeyLength()) return a.KeyLength() < b.KeyLength();
704+
if (a.Type() != b.Type()) return a.Type() < b.Type();
705+
return a.Id() < b.Id();
632706
});
633707

634708
return algos;
@@ -1030,7 +1104,11 @@ auto KeyAlgo::SupportedVersion() const -> QContainer<EngineSupportIf> {
10301104
}
10311105

10321106
auto KeyAlgo::operator==(const KeyAlgo &o) const -> bool {
1033-
return this->id_ == o.id_;
1107+
return id_ == o.id_ && type_ == o.type_ && length_ == o.length_;
1108+
}
1109+
1110+
auto KeyAlgo::operator!=(const KeyAlgo &o) const -> bool {
1111+
return !(*this == o);
10341112
}
10351113

10361114
[[nodiscard]] auto KeyAlgo::SubAlgos(int channel) const -> QContainer<KeyAlgo> {

src/core/model/GpgKeyGenerateInfo.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ class GF_CORE_EXPORT KeyAlgo {
4646

4747
auto operator==(const KeyAlgo &o) const -> bool;
4848

49+
auto operator!=(const KeyAlgo &o) const -> bool;
50+
4951
[[nodiscard]] auto Id() const -> QString;
5052

5153
[[nodiscard]] auto Name() const -> QString;

0 commit comments

Comments
 (0)