Skip to content

Commit 4e37d99

Browse files
committed
Fix OCSP key-based responder ID lookup when SM2/SM3 is enabled.
When WOLFSSL_SM2 and WOLFSSL_SM3 are both defined, KEYID_SIZE becomes 32 (WC_SM3_DIGEST_SIZE) but OCSP_RESPONDER_ID_KEY_SZ remains 20 (SHA-1 per RFC 6960). The guard (int)KEYID_SIZE == OCSP_RESPONDER_ID_KEY_SZ in OcspFindSigner() and OcspRespIdMatch() evaluated to false (32 != 20), completely disabling key-based OCSP responder ID matching. This caused OCSP stapling to fail with BAD_CERTIFICATE_STATUS_ERROR (-406) against any server using a key-based responder ID (e.g. login.live.com). Fix by comparing only OCSP_RESPONDER_ID_KEY_SZ bytes for the responder ID match, and zero-padding the 20-byte key hash to KEYID_SIZE before passing to CA lookup functions that compare the full KEYID_SIZE.
1 parent 7305192 commit 4e37d99

2 files changed

Lines changed: 19 additions & 7 deletions

File tree

src/ocsp.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -950,7 +950,8 @@ static int OcspRespIdMatches(OcspResponse* resp, const byte* NameHash,
950950
SIGNER_DIGEST_SIZE) == 0;
951951
}
952952
else if (resp->responderIdType == OCSP_RESPONDER_ID_KEY) {
953-
return XMEMCMP(keyHash, resp->responderId.keyHash, KEYID_SIZE) == 0;
953+
return XMEMCMP(keyHash, resp->responderId.keyHash,
954+
OCSP_RESPONDER_ID_KEY_SZ) == 0;
954955
}
955956

956957
return 0;

wolfcrypt/src/asn.c

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39573,8 +39573,9 @@ static int OcspRespIdMatch(OcspResponse *resp, const byte *NameHash,
3957339573
return XMEMCMP(NameHash, resp->responderId.nameHash,
3957439574
SIGNER_DIGEST_SIZE) == 0;
3957539575
/* OCSP_RESPONDER_ID_KEY */
39576-
return ((int)KEYID_SIZE == OCSP_RESPONDER_ID_KEY_SZ) &&
39577-
XMEMCMP(keyHash, resp->responderId.keyHash, KEYID_SIZE) == 0;
39576+
return (KEYID_SIZE >= OCSP_RESPONDER_ID_KEY_SZ) &&
39577+
XMEMCMP(keyHash, resp->responderId.keyHash,
39578+
OCSP_RESPONDER_ID_KEY_SZ) == 0;
3957839579
}
3957939580

3958039581
#ifndef WOLFSSL_NO_OCSP_ISSUER_CHECK
@@ -39613,8 +39614,15 @@ static Signer *OcspFindSigner(OcspResponse *resp, WOLFSSL_CERT_MANAGER *cm)
3961339614
if (s)
3961439615
return s;
3961539616
}
39616-
else if ((int)KEYID_SIZE == OCSP_RESPONDER_ID_KEY_SZ) {
39617-
s = GetCAByKeyHash(cm, resp->responderId.keyHash);
39617+
else if (KEYID_SIZE >= OCSP_RESPONDER_ID_KEY_SZ) {
39618+
/* Responder key hash is OCSP_RESPONDER_ID_KEY_SZ bytes (SHA-1 per
39619+
* RFC 6960) but lookup functions compare KEYID_SIZE bytes. Zero-pad
39620+
* to avoid buffer over-read when KEYID_SIZE > OCSP_RESPONDER_ID_KEY_SZ
39621+
* (e.g. when SM2/SM3 is enabled). */
39622+
byte keyHash[KEYID_SIZE];
39623+
XMEMSET(keyHash, 0, KEYID_SIZE);
39624+
XMEMCPY(keyHash, resp->responderId.keyHash, OCSP_RESPONDER_ID_KEY_SZ);
39625+
s = GetCAByKeyHash(cm, keyHash);
3961839626
if (s)
3961939627
return s;
3962039628
}
@@ -39627,8 +39635,11 @@ static Signer *OcspFindSigner(OcspResponse *resp, WOLFSSL_CERT_MANAGER *cm)
3962739635
if (s)
3962839636
return s;
3962939637
}
39630-
else {
39631-
s = findSignerByKeyHash(resp->pendingCAs, resp->responderId.keyHash);
39638+
else if (KEYID_SIZE >= OCSP_RESPONDER_ID_KEY_SZ) {
39639+
byte keyHash[KEYID_SIZE];
39640+
XMEMSET(keyHash, 0, KEYID_SIZE);
39641+
XMEMCPY(keyHash, resp->responderId.keyHash, OCSP_RESPONDER_ID_KEY_SZ);
39642+
s = findSignerByKeyHash(resp->pendingCAs, keyHash);
3963239643
if (s)
3963339644
return s;
3963439645
}

0 commit comments

Comments
 (0)