Skip to content

Commit 7758567

Browse files
committed
protect input length checks against overflow
1 parent af3a67a commit 7758567

File tree

2 files changed

+42
-16
lines changed

2 files changed

+42
-16
lines changed

src/wh_server_cert.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,7 @@ int wh_Server_HandleCertRequest(whServerContext* server, uint16_t magic,
401401
magic, (whMessageCert_AddTrustedRequest*)req_packet, &req);
402402

403403
/* Validate certificate data fits within request */
404-
if (req_size < sizeof(req) + req.cert_len) {
404+
if (req.cert_len > req_size - sizeof(req)) {
405405
resp.rc = WH_ERROR_BADARGS;
406406
wh_MessageCert_TranslateSimpleResponse(
407407
magic, &resp, (whMessageCert_SimpleResponse*)resp_packet);

src/wh_server_crypto.c

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -980,8 +980,7 @@ static int _HandleEccSign(whServerContext* ctx, uint16_t magic,
980980
}
981981

982982
/* Validate variable-length fields fit within inSize */
983-
uint32_t required_size = sizeof(whMessageCrypto_EccSignRequest) + req.sz;
984-
if (inSize < required_size) {
983+
if (req.sz > inSize - sizeof(whMessageCrypto_EccSignRequest)) {
985984
return WH_ERROR_BADARGS;
986985
}
987986

@@ -1071,9 +1070,12 @@ static int _HandleEccVerify(whServerContext* ctx, uint16_t magic,
10711070
}
10721071

10731072
/* Validate variable-length fields fit within inSize */
1074-
uint32_t required_size =
1075-
sizeof(whMessageCrypto_EccVerifyRequest) + req.sigSz + req.hashSz;
1076-
if (inSize < required_size) {
1073+
uint32_t available = inSize - sizeof(whMessageCrypto_EccVerifyRequest);
1074+
if (req.sigSz > available) {
1075+
return WH_ERROR_BADARGS;
1076+
}
1077+
available -= req.sigSz;
1078+
if (req.hashSz > available) {
10771079
return WH_ERROR_BADARGS;
10781080
}
10791081

@@ -2065,9 +2067,16 @@ static int _HandleAesCbc(whServerContext* ctx, uint16_t magic, const void* crypt
20652067
uint32_t enc = req.enc;
20662068
uint32_t key_len = req.keyLen;
20672069
uint32_t len = req.sz;
2068-
uint32_t required_size =
2069-
sizeof(whMessageCrypto_AesCbcRequest) + len + key_len + AES_BLOCK_SIZE;
2070-
if (inSize < required_size) {
2070+
uint32_t available = inSize - sizeof(whMessageCrypto_AesCbcRequest);
2071+
if (len > available) {
2072+
return WH_ERROR_BADARGS;
2073+
}
2074+
available -= len;
2075+
if (key_len > available) {
2076+
return WH_ERROR_BADARGS;
2077+
}
2078+
available -= key_len;
2079+
if (AES_BLOCK_SIZE > available) {
20712080
return WH_ERROR_BADARGS;
20722081
}
20732082

@@ -2178,10 +2187,24 @@ static int _HandleAesGcm(whServerContext* ctx, uint16_t magic,
21782187
}
21792188

21802189
/* Validate variable-length fields fit within inSize */
2181-
uint32_t required_size = sizeof(whMessageCrypto_AesGcmRequest) + req.sz +
2182-
req.keyLen + req.ivSz + req.authInSz +
2183-
((req.enc == 0) ? req.authTagSz : 0);
2184-
if (inSize < required_size) {
2190+
uint32_t available = inSize - sizeof(whMessageCrypto_AesGcmRequest);
2191+
if (req.sz > available) {
2192+
return WH_ERROR_BADARGS;
2193+
}
2194+
available -= req.sz;
2195+
if (req.keyLen > available) {
2196+
return WH_ERROR_BADARGS;
2197+
}
2198+
available -= req.keyLen;
2199+
if (req.ivSz > available) {
2200+
return WH_ERROR_BADARGS;
2201+
}
2202+
available -= req.ivSz;
2203+
if (req.authInSz > available) {
2204+
return WH_ERROR_BADARGS;
2205+
}
2206+
available -= req.authInSz;
2207+
if (req.enc == 0 && req.authTagSz > available) {
21852208
return WH_ERROR_BADARGS;
21862209
}
21872210

@@ -2523,9 +2546,12 @@ static int _HandleCmac(whServerContext* ctx, uint16_t magic, uint16_t seq,
25232546
}
25242547

25252548
/* Validate variable-length fields fit within inSize */
2526-
uint32_t required_size =
2527-
sizeof(whMessageCrypto_CmacRequest) + req.inSz + req.keySz;
2528-
if (inSize < required_size) {
2549+
uint32_t available = inSize - sizeof(whMessageCrypto_CmacRequest);
2550+
if (req.inSz > available) {
2551+
return WH_ERROR_BADARGS;
2552+
}
2553+
available -= req.inSz;
2554+
if (req.keySz > available) {
25292555
return WH_ERROR_BADARGS;
25302556
}
25312557

0 commit comments

Comments
 (0)