@@ -16109,6 +16109,116 @@ 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+ #ifdef WC_RSA_PSS
16121+ case RSAPSSk:
16122+ #endif
16123+ switch (sigOID) {
16124+ case CTC_MD2wRSA:
16125+ case CTC_MD5wRSA:
16126+ case CTC_SHAwRSA:
16127+ case CTC_SHA224wRSA:
16128+ case CTC_SHA256wRSA:
16129+ case CTC_SHA384wRSA:
16130+ case CTC_SHA512wRSA:
16131+ case CTC_SHA3_224wRSA:
16132+ case CTC_SHA3_256wRSA:
16133+ case CTC_SHA3_384wRSA:
16134+ case CTC_SHA3_512wRSA:
16135+ case CTC_RSASSAPSS:
16136+ return 1;
16137+ }
16138+ return 0;
16139+ #endif
16140+ #if !defined(NO_DSA) && !defined(HAVE_SELFTEST)
16141+ case DSAk:
16142+ switch (sigOID) {
16143+ case CTC_SHAwDSA:
16144+ case CTC_SHA256wDSA:
16145+ return 1;
16146+ }
16147+ return 0;
16148+ #endif
16149+ #if defined(HAVE_ECC) && defined(HAVE_ECC_VERIFY)
16150+ case ECDSAk:
16151+ #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
16152+ case SM2k:
16153+ #endif
16154+ switch (sigOID) {
16155+ case CTC_SHAwECDSA:
16156+ case CTC_SHA224wECDSA:
16157+ case CTC_SHA256wECDSA:
16158+ case CTC_SHA384wECDSA:
16159+ case CTC_SHA512wECDSA:
16160+ case CTC_SHA3_224wECDSA:
16161+ case CTC_SHA3_256wECDSA:
16162+ case CTC_SHA3_384wECDSA:
16163+ case CTC_SHA3_512wECDSA:
16164+ #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
16165+ case CTC_SM3wSM2:
16166+ #endif
16167+ return 1;
16168+ }
16169+ return 0;
16170+ #endif
16171+ #if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_IMPORT)
16172+ case ED25519k:
16173+ return (sigOID == CTC_ED25519);
16174+ #endif
16175+ #if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT)
16176+ case ED448k:
16177+ return (sigOID == CTC_ED448);
16178+ #endif
16179+ #if defined(HAVE_FALCON)
16180+ case FALCON_LEVEL1k:
16181+ return (sigOID == CTC_FALCON_LEVEL1);
16182+ case FALCON_LEVEL5k:
16183+ return (sigOID == CTC_FALCON_LEVEL5);
16184+ #endif
16185+ #if defined(HAVE_DILITHIUM) && !defined(WOLFSSL_DILITHIUM_NO_VERIFY) && \
16186+ !defined(WOLFSSL_DILITHIUM_NO_ASN1)
16187+ #ifdef WOLFSSL_DILITHIUM_FIPS204_DRAFT
16188+ case DILITHIUM_LEVEL2k:
16189+ return (sigOID == CTC_DILITHIUM_LEVEL2);
16190+ case DILITHIUM_LEVEL3k:
16191+ return (sigOID == CTC_DILITHIUM_LEVEL3);
16192+ case DILITHIUM_LEVEL5k:
16193+ return (sigOID == CTC_DILITHIUM_LEVEL5);
16194+ #endif
16195+ case ML_DSA_LEVEL2k:
16196+ return (sigOID == CTC_ML_DSA_LEVEL2);
16197+ case ML_DSA_LEVEL3k:
16198+ return (sigOID == CTC_ML_DSA_LEVEL3);
16199+ case ML_DSA_LEVEL5k:
16200+ return (sigOID == CTC_ML_DSA_LEVEL5);
16201+ #endif
16202+ #if defined(HAVE_SPHINCS)
16203+ case SPHINCS_FAST_LEVEL1k:
16204+ return (sigOID == CTC_SPHINCS_FAST_LEVEL1);
16205+ case SPHINCS_FAST_LEVEL3k:
16206+ return (sigOID == CTC_SPHINCS_FAST_LEVEL3);
16207+ case SPHINCS_FAST_LEVEL5k:
16208+ return (sigOID == CTC_SPHINCS_FAST_LEVEL5);
16209+ case SPHINCS_SMALL_LEVEL1k:
16210+ return (sigOID == CTC_SPHINCS_SMALL_LEVEL1);
16211+ case SPHINCS_SMALL_LEVEL3k:
16212+ return (sigOID == CTC_SPHINCS_SMALL_LEVEL3);
16213+ case SPHINCS_SMALL_LEVEL5k:
16214+ return (sigOID == CTC_SPHINCS_SMALL_LEVEL5);
16215+ #endif
16216+ }
16217+
16218+ /* Default to reject unknown key types */
16219+ return 0;
16220+ }
16221+
1611216222/* Return codes: 0=Success, Negative (see error-crypt.h), ASN_SIG_CONFIRM_E */
1611316223int ConfirmSignature(SignatureCtx* sigCtx,
1611416224 const byte* buf, word32 bufSz,
@@ -16177,6 +16287,11 @@ int ConfirmSignature(SignatureCtx* sigCtx,
1617716287
1617816288 case SIG_STATE_HASH:
1617916289 {
16290+ if (!SigOidMatchesKeyOid(sigOID, keyOID)) {
16291+ WOLFSSL_MSG("sigOID incompatible with issuer keyOID");
16292+ ERROR_OUT(ASN_SIG_OID_E, exit_cs);
16293+ }
16294+
1618016295 #if !defined(NO_RSA) && defined(WC_RSA_PSS)
1618116296 if (sigOID == RSAPSSk) {
1618216297 word32 fakeSigOID = 0;
0 commit comments