@@ -42,6 +42,39 @@ KeygenParams::check_defaults() noexcept
4242 if (hash_ == PGP_HASH_UNKNOWN) {
4343 hash_ = alg_ == PGP_PKA_SM2 ? PGP_HASH_SM3 : DEFAULT_PGP_HASH_ALG;
4444 }
45+ #if defined(ENABLE_PQC)
46+ // ensure PQC key hash binding
47+ switch (alg_) {
48+ case PGP_PKA_DILITHIUM3_ED25519:
49+ FALLTHROUGH_STATEMENT;
50+ case PGP_PKA_DILITHIUM5_ED448:
51+ FALLTHROUGH_STATEMENT;
52+ case PGP_PKA_DILITHIUM3_P256:
53+ FALLTHROUGH_STATEMENT;
54+ case PGP_PKA_DILITHIUM5_P384:
55+ FALLTHROUGH_STATEMENT;
56+ case PGP_PKA_DILITHIUM3_BP256:
57+ FALLTHROUGH_STATEMENT;
58+ case PGP_PKA_DILITHIUM5_BP384:
59+ if (!dilithium_hash_allowed (alg_, hash_)) {
60+ hash_ = dilithium_default_hash_alg (alg_);
61+ }
62+ break ;
63+
64+ case PGP_PKA_SPHINCSPLUS_SHAKE_128f:
65+ FALLTHROUGH_STATEMENT;
66+ case PGP_PKA_SPHINCSPLUS_SHAKE_128s:
67+ FALLTHROUGH_STATEMENT;
68+ case PGP_PKA_SPHINCSPLUS_SHAKE_256s:
69+ if (!sphincsplus_hash_allowed (alg_, hash_)) {
70+ hash_ = sphincsplus_default_hash_alg (alg_);
71+ }
72+ break ;
73+ default :
74+ break ;
75+ }
76+ #endif
77+
4578 pgp_hash_alg_t min_hash = key_params_->min_hash ();
4679 if (Hash::size (hash_) < Hash::size (min_hash)) {
4780 hash_ = min_hash;
@@ -66,15 +99,16 @@ KeygenParams::validate() const noexcept
6699 break ;
67100 case PGP_PKA_DILITHIUM3_ED25519:
68101 FALLTHROUGH_STATEMENT;
69- // TODO: add case PGP_PKA_DILITHIUM5_ED448: FALLTHROUGH_STATEMENT;
102+ case PGP_PKA_DILITHIUM5_ED448:
103+ FALLTHROUGH_STATEMENT;
70104 case PGP_PKA_DILITHIUM3_P256:
71105 FALLTHROUGH_STATEMENT;
72106 case PGP_PKA_DILITHIUM5_P384:
73107 FALLTHROUGH_STATEMENT;
74108 case PGP_PKA_DILITHIUM3_BP256:
75109 FALLTHROUGH_STATEMENT;
76110 case PGP_PKA_DILITHIUM5_BP384:
77- if (!dilithium_hash_allowed (hash ())) {
111+ if (!dilithium_hash_allowed (alg (), hash ())) {
78112 RNP_LOG (" invalid hash algorithm for the dilithium key" );
79113 return false ;
80114 }
@@ -132,37 +166,38 @@ KeygenParams::validate(const BindingParams &binding) const noexcept
132166 return validate ();
133167}
134168
135- static const id_str_pair pubkey_alg_map[] = {{PGP_PKA_RSA, " RSA (Encrypt or Sign)" },
136- {PGP_PKA_RSA_ENCRYPT_ONLY, " RSA Encrypt-Only" },
137- {PGP_PKA_RSA_SIGN_ONLY, " RSA Sign-Only" },
138- {PGP_PKA_ELGAMAL, " Elgamal (Encrypt-Only)" },
139- {PGP_PKA_DSA, " DSA" },
140- {PGP_PKA_ECDH, " ECDH" },
141- {PGP_PKA_ECDSA, " ECDSA" },
142- {PGP_PKA_EDDSA, " EdDSA" },
143- {PGP_PKA_SM2, " SM2" },
169+ static const id_str_pair pubkey_alg_map[] = {
170+ {PGP_PKA_RSA, " RSA (Encrypt or Sign)" },
171+ {PGP_PKA_RSA_ENCRYPT_ONLY, " RSA Encrypt-Only" },
172+ {PGP_PKA_RSA_SIGN_ONLY, " RSA Sign-Only" },
173+ {PGP_PKA_ELGAMAL, " Elgamal (Encrypt-Only)" },
174+ {PGP_PKA_DSA, " DSA" },
175+ {PGP_PKA_ECDH, " ECDH" },
176+ {PGP_PKA_ECDSA, " ECDSA" },
177+ {PGP_PKA_EDDSA, " EdDSA" },
178+ {PGP_PKA_SM2, " SM2" },
144179#if defined(ENABLE_CRYPTO_REFRESH)
145- {PGP_PKA_ED25519, " ED25519" },
146- {PGP_PKA_X25519, " X25519" },
180+ {PGP_PKA_ED25519, " ED25519" },
181+ {PGP_PKA_X25519, " X25519" },
147182#endif
148183#if defined(ENABLE_PQC)
149- {PGP_PKA_KYBER768_X25519, " ML-KEM-768_X25519" },
150- // {PGP_PKA_KYBER1024_X448, "Kyber-X448"},
151- {PGP_PKA_KYBER768_P256, " ML-KEM-768_P256" },
152- {PGP_PKA_KYBER1024_P384, " ML-KEM-1024_P384" },
153- {PGP_PKA_KYBER768_BP256, " ML-KEM-768_BP256" },
154- {PGP_PKA_KYBER1024_BP384, " ML-KEM-1024_BP384" },
155- {PGP_PKA_DILITHIUM3_ED25519, " ML-DSA-65_ED25519" },
156- // {PGP_PKA_DILITHIUM5_ED448, "Dilithium-ED448"},
157- {PGP_PKA_DILITHIUM3_P256, " ML-DSA-65_P256" },
158- {PGP_PKA_DILITHIUM5_P384, " ML-DSA-87_P384" },
159- {PGP_PKA_DILITHIUM3_BP256, " ML-DSA-65_BP256" },
160- {PGP_PKA_DILITHIUM5_BP384, " ML-DSA-87_BP384" },
161- {PGP_PKA_SPHINCSPLUS_SHAKE_128f, " SLH-DSA-SHAKE-128f" },
162- {PGP_PKA_SPHINCSPLUS_SHAKE_128s, " SLH-DSA-SHAKE-128s" },
163- {PGP_PKA_SPHINCSPLUS_SHAKE_256s, " SLH-DSA-SHAKE-256s" },
184+ {PGP_PKA_KYBER768_X25519, " ML-KEM-768_X25519" },
185+ // {PGP_PKA_KYBER1024_X448, "Kyber-X448"},
186+ {PGP_PKA_KYBER768_P256, " ML-KEM-768_P256" },
187+ {PGP_PKA_KYBER1024_P384, " ML-KEM-1024_P384" },
188+ {PGP_PKA_KYBER768_BP256, " ML-KEM-768_BP256" },
189+ {PGP_PKA_KYBER1024_BP384, " ML-KEM-1024_BP384" },
190+ {PGP_PKA_DILITHIUM3_ED25519, " ML-DSA-65_ED25519" },
191+ // {PGP_PKA_DILITHIUM5_ED448, "Dilithium-ED448"},
192+ {PGP_PKA_DILITHIUM3_P256, " ML-DSA-65_P256" },
193+ {PGP_PKA_DILITHIUM5_P384, " ML-DSA-87_P384" },
194+ {PGP_PKA_DILITHIUM3_BP256, " ML-DSA-65_BP256" },
195+ {PGP_PKA_DILITHIUM5_BP384, " ML-DSA-87_BP384" },
196+ {PGP_PKA_SPHINCSPLUS_SHAKE_128f, " SLH-DSA-SHAKE-128f" },
197+ {PGP_PKA_SPHINCSPLUS_SHAKE_128s, " SLH-DSA-SHAKE-128s" },
198+ {PGP_PKA_SPHINCSPLUS_SHAKE_256s, " SLH-DSA-SHAKE-256s" },
164199#endif
165- {0 , NULL }};
200+ {0 , NULL }};
166201
167202bool
168203KeygenParams::generate (pgp_key_pkt_t &seckey, bool primary)
0 commit comments