PR feedback: add WC_PK_TYPE_PQC_SIG_KEYGEN_SEED, matching pattern in MLDSA PR

pull/11055/head
Paul Adelsbach 2026-09-08 15:18:39 -07:00
parent 82467fb505
commit c8db2e1816
4 changed files with 26 additions and 6 deletions

View File

@ -631,6 +631,7 @@ static int swdev_pqc_sig(wc_CryptoInfo* info, int type, int pkType)
switch (pkType) {
#ifndef WOLFSSL_SLHDSA_VERIFY_ONLY
case WC_PK_TYPE_PQC_SIG_KEYGEN:
case WC_PK_TYPE_PQC_SIG_KEYGEN_SEED:
return swdev_slhdsa_keygen(info);
case WC_PK_TYPE_PQC_SIG_SIGN:
return swdev_slhdsa_sign(info);
@ -1380,6 +1381,7 @@ WC_SWDEV_EXPORT int wc_SwDev_Callback(int devId, wc_CryptoInfo* info,
#ifdef WOLFSSL_HAVE_SLHDSA
#ifndef WOLFSSL_SLHDSA_VERIFY_ONLY
case WC_PK_TYPE_PQC_SIG_KEYGEN:
case WC_PK_TYPE_PQC_SIG_KEYGEN_SEED:
return swdev_pqc_sig(info, info->pk.pqc_sig_kg.type,
info->pk.type);
case WC_PK_TYPE_PQC_SIG_SIGN:

View File

@ -194,6 +194,7 @@ static const char* GetPkTypeStr(int pk)
#if defined(WOLFSSL_HAVE_MLDSA) || defined(HAVE_FALCON) || \
defined(WOLFSSL_HAVE_SLHDSA)
case WC_PK_TYPE_PQC_SIG_KEYGEN: return "PQC Sig KeyGen";
case WC_PK_TYPE_PQC_SIG_KEYGEN_SEED: return "PQC Sig KeyGen Seed";
case WC_PK_TYPE_PQC_SIG_SIGN: return "PQC Sig Sign";
case WC_PK_TYPE_PQC_SIG_VERIFY: return "PQC Sig Verify";
case WC_PK_TYPE_PQC_SIG_CHECK_PRIV_KEY: return "PQC Sig CheckPrivKey";
@ -2010,14 +2011,22 @@ int wc_CryptoCb_MakePqcSignatureKeyEx(WC_RNG* rng, int type, int keySize,
/* get devId; an unbound key still goes through the find callback */
devId = wc_CryptoCb_PqcSigGetDevId(type, key);
#ifndef WOLF_CRYPTO_CB_FIND
if (devId == INVALID_DEVID)
return ret;
#endif
/* locate registered callback */
/* locate registered callback. A slot sits at INVALID_DEVID while it is
* being registered or retired, so never dispatch through one. */
dev = wc_CryptoCb_FindDevice(devId, WC_ALGO_TYPE_PK);
if (dev && dev->cb) {
if (dev && dev->cb && (dev->devId != INVALID_DEVID)) {
wc_CryptoInfo cryptoInfo;
XMEMSET(&cryptoInfo, 0, sizeof(cryptoInfo));
cryptoInfo.algo_type = WC_ALGO_TYPE_PK;
cryptoInfo.pk.type = WC_PK_TYPE_PQC_SIG_KEYGEN;
/* Seeded generation is a different operation: a device that does not
* know this type declines and the caller keeps the seed. */
cryptoInfo.pk.type = (seed != NULL) ? WC_PK_TYPE_PQC_SIG_KEYGEN_SEED :
WC_PK_TYPE_PQC_SIG_KEYGEN;
cryptoInfo.pk.pqc_sig_kg.rng = rng;
cryptoInfo.pk.pqc_sig_kg.size = keySize;
cryptoInfo.pk.pqc_sig_kg.key = key;

View File

@ -82788,14 +82788,20 @@ static int myCryptoDevCb(int devIdArg, wc_CryptoInfo* info, void* ctx)
#endif /* WOLFSSL_HAVE_LMS || WOLFSSL_HAVE_XMSS */
#if defined(WOLFSSL_HAVE_SLHDSA)
#ifndef WOLFSSL_SLHDSA_VERIFY_ONLY
if (info->pk.type == WC_PK_TYPE_PQC_SIG_KEYGEN) {
if ((info->pk.type == WC_PK_TYPE_PQC_SIG_KEYGEN) ||
(info->pk.type == WC_PK_TYPE_PQC_SIG_KEYGEN_SEED)) {
int pqcType = info->pk.pqc_sig_kg.type;
(void)pqcType;
if (pqcType == WC_PQC_SIG_TYPE_SLHDSA) {
SlhDsaKey* sk = (SlhDsaKey*)info->pk.pqc_sig_kg.key;
const byte* seed = info->pk.pqc_sig_kg.seed;
sk->devId = INVALID_DEVID;
if (seed != NULL) {
/* The seed must travel with the type that announces it. */
if ((seed != NULL) !=
(info->pk.type == WC_PK_TYPE_PQC_SIG_KEYGEN_SEED)) {
ret = WC_NO_ERR_TRACE(BAD_STATE_E);
}
else if (seed != NULL) {
/* SK.seed || SK.prf || PK.seed, each of n bytes. */
word32 n = info->pk.pqc_sig_kg.seedSz / 3;
ret = wc_SlhDsaKey_MakeKeyWithRandom(sk, seed, n,

View File

@ -1717,8 +1717,11 @@ enum wc_PkType {
* representative rather than message and context. */
WC_PK_TYPE_PQC_SIG_SIGN_MSG = 47,
WC_PK_TYPE_PQC_SIG_VERIFY_MSG = 48,
/* Seeded key generation. Its own type so a device that cannot derive
* from a seed declines instead of generating an unrelated key. */
WC_PK_TYPE_PQC_SIG_KEYGEN_SEED = 49,
#undef _WC_PK_TYPE_MAX
#define _WC_PK_TYPE_MAX WC_PK_TYPE_PQC_SIG_VERIFY_MSG
#define _WC_PK_TYPE_MAX WC_PK_TYPE_PQC_SIG_KEYGEN_SEED
#endif
WC_PK_TYPE_MAX = _WC_PK_TYPE_MAX
};