@@ -16109,6 +16109,118 @@ static int DecodeDsaAsn1Sig(const byte* sig, word32 sigSz, byte* sigCpy,
1610916109}
1611016110#endif
1611116111
16112+ /* The certificate's signatureAlgorithm (sigOID) must match the issuer's
16113+ * key type (keyOID). sigOID picks the pre-hash; keyOID picks the
16114+ * verifier. They need to agree or the verifier gets the wrong input. */
16115+ static int SigOidMatchesKeyOid(word32 sigOID, word32 keyOID)
16116+ {
16117+ switch (keyOID) {
16118+ #ifndef NO_RSA
16119+ case RSAk:
16120+ switch (sigOID) {
16121+ case CTC_MD2wRSA:
16122+ case CTC_MD5wRSA:
16123+ case CTC_SHAwRSA:
16124+ case CTC_SHA224wRSA:
16125+ case CTC_SHA256wRSA:
16126+ case CTC_SHA384wRSA:
16127+ case CTC_SHA512wRSA:
16128+ case CTC_SHA3_224wRSA:
16129+ case CTC_SHA3_256wRSA:
16130+ case CTC_SHA3_384wRSA:
16131+ case CTC_SHA3_512wRSA:
16132+ case CTC_RSASSAPSS:
16133+ return 1;
16134+ }
16135+ return 0;
16136+ #ifdef WC_RSA_PSS
16137+ case RSAPSSk:
16138+ return (sigOID == CTC_RSASSAPSS);
16139+ #endif
16140+ #endif
16141+ #if !defined(NO_DSA) && !defined(HAVE_SELFTEST)
16142+ case DSAk:
16143+ switch (sigOID) {
16144+ case CTC_SHAwDSA:
16145+ case CTC_SHA256wDSA:
16146+ return 1;
16147+ }
16148+ return 0;
16149+ #endif
16150+ #if defined(HAVE_ECC) && defined(HAVE_ECC_VERIFY)
16151+ case ECDSAk:
16152+ #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
16153+ case SM2k:
16154+ #endif
16155+ switch (sigOID) {
16156+ case CTC_SHAwECDSA:
16157+ case CTC_SHA224wECDSA:
16158+ case CTC_SHA256wECDSA:
16159+ case CTC_SHA384wECDSA:
16160+ case CTC_SHA512wECDSA:
16161+ case CTC_SHA3_224wECDSA:
16162+ case CTC_SHA3_256wECDSA:
16163+ case CTC_SHA3_384wECDSA:
16164+ case CTC_SHA3_512wECDSA:
16165+ #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
16166+ case CTC_SM3wSM2:
16167+ #endif
16168+ return 1;
16169+ }
16170+ return 0;
16171+ #endif
16172+ #if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_IMPORT)
16173+ case ED25519k:
16174+ return (sigOID == CTC_ED25519);
16175+ #endif
16176+ #if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT)
16177+ case ED448k:
16178+ return (sigOID == CTC_ED448);
16179+ #endif
16180+ #if defined(HAVE_FALCON)
16181+ case FALCON_LEVEL1k:
16182+ return (sigOID == CTC_FALCON_LEVEL1);
16183+ case FALCON_LEVEL5k:
16184+ return (sigOID == CTC_FALCON_LEVEL5);
16185+ #endif
16186+ #if defined(HAVE_DILITHIUM) && !defined(WOLFSSL_DILITHIUM_NO_VERIFY) && \
16187+ !defined(WOLFSSL_DILITHIUM_NO_ASN1)
16188+ #ifdef WOLFSSL_DILITHIUM_FIPS204_DRAFT
16189+ case DILITHIUM_LEVEL2k:
16190+ return (sigOID == CTC_DILITHIUM_LEVEL2);
16191+ case DILITHIUM_LEVEL3k:
16192+ return (sigOID == CTC_DILITHIUM_LEVEL3);
16193+ case DILITHIUM_LEVEL5k:
16194+ return (sigOID == CTC_DILITHIUM_LEVEL5);
16195+ #endif
16196+ case ML_DSA_LEVEL2k:
16197+ return (sigOID == CTC_ML_DSA_LEVEL2);
16198+ case ML_DSA_LEVEL3k:
16199+ return (sigOID == CTC_ML_DSA_LEVEL3);
16200+ case ML_DSA_LEVEL5k:
16201+ return (sigOID == CTC_ML_DSA_LEVEL5);
16202+ #endif
16203+ #if defined(HAVE_SPHINCS)
16204+ case SPHINCS_FAST_LEVEL1k:
16205+ return (sigOID == CTC_SPHINCS_FAST_LEVEL1);
16206+ case SPHINCS_FAST_LEVEL3k:
16207+ return (sigOID == CTC_SPHINCS_FAST_LEVEL3);
16208+ case SPHINCS_FAST_LEVEL5k:
16209+ return (sigOID == CTC_SPHINCS_FAST_LEVEL5);
16210+ case SPHINCS_SMALL_LEVEL1k:
16211+ return (sigOID == CTC_SPHINCS_SMALL_LEVEL1);
16212+ case SPHINCS_SMALL_LEVEL3k:
16213+ return (sigOID == CTC_SPHINCS_SMALL_LEVEL3);
16214+ case SPHINCS_SMALL_LEVEL5k:
16215+ return (sigOID == CTC_SPHINCS_SMALL_LEVEL5);
16216+ #endif
16217+ }
16218+
16219+ /* Default to reject unknown key types */
16220+ (void)sigOID;
16221+ return 0;
16222+ }
16223+
1611216224/* Return codes: 0=Success, Negative (see error-crypt.h), ASN_SIG_CONFIRM_E */
1611316225int ConfirmSignature(SignatureCtx* sigCtx,
1611416226 const byte* buf, word32 bufSz,
@@ -16177,6 +16289,11 @@ int ConfirmSignature(SignatureCtx* sigCtx,
1617716289
1617816290 case SIG_STATE_HASH:
1617916291 {
16292+ if (!SigOidMatchesKeyOid(sigOID, keyOID)) {
16293+ WOLFSSL_MSG("sigOID incompatible with issuer keyOID");
16294+ ERROR_OUT(ASN_SIG_OID_E, exit_cs);
16295+ }
16296+
1618016297 #if !defined(NO_RSA) && defined(WC_RSA_PSS)
1618116298 if (sigOID == RSAPSSk) {
1618216299 word32 fakeSigOID = 0;
0 commit comments