@@ -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