Hello Atul Gupta,
The patch d25f2f71f653: "crypto: chtls - Program the TLS session Key"
from Mar 31, 2018, leads to the following static checker warning:
drivers/crypto/chelsio/chtls/chtls_hw.c:239 chtls_key_info()
error: '__memcpy()' 'key' too small (2 vs 32)
drivers/crypto/chelsio/chtls/chtls_hw.c
212 static int chtls_key_info(struct chtls_sock *csk,
213 struct _key_ctx *kctx,
214 u32 keylen, u32 optname)
215 {
216 unsigned char key[CHCR_KEYCTX_CIPHER_KEY_SIZE_256];
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
This is 2 bytes long. It was probably supposed to be
AES_KEYSIZE_256 (32 bytes).
217 struct tls12_crypto_info_aes_gcm_128 *gcm_ctx;
218 unsigned char ghash_h[AEAD_H_SIZE];
219 struct crypto_cipher *cipher;
220 int ck_size, key_ctx_size;
221 int ret;
222
223 gcm_ctx = (struct tls12_crypto_info_aes_gcm_128 *)
224 &csk->tlshws.crypto_info;
225
226 key_ctx_size = sizeof(struct _key_ctx) +
227 roundup(keylen, 16) + AEAD_H_SIZE;
228
229 if (keylen == AES_KEYSIZE_128) {
230 ck_size = CHCR_KEYCTX_CIPHER_KEY_SIZE_128;
231 } else if (keylen == AES_KEYSIZE_192) {
232 ck_size = CHCR_KEYCTX_CIPHER_KEY_SIZE_192;
233 } else if (keylen == AES_KEYSIZE_256) {
^^^^^^^^^^^^^^^^^^^^^^^^^
keylen is 32.
234 ck_size = CHCR_KEYCTX_CIPHER_KEY_SIZE_256;
235 } else {
236 pr_err("GCM: Invalid key length %d\n", keylen);
237 return -EINVAL;
238 }
239 memcpy(key, gcm_ctx->key, keylen);
^^^^^^^^^^^^^^^^^^^^^^^^^
Memory corruption. Smatch also complains that gcm_ctx->key is 16 bytes
instead of 32.
drivers/crypto/chelsio/chtls/chtls_hw.c:239 chtls_key_info()
error: '__memcpy()' 'gcm_ctx->key' too small (16 vs 32)
240
See also:
drivers/crypto/chelsio/chtls/chtls_hw.c:250 chtls_key_info() error:
'crypto_cipher_setkey()' 'key' too small (2 vs 32)
drivers/crypto/chelsio/chtls/chtls_hw.c:274 chtls_key_info() error:
'__memcpy()' 'gcm_ctx->key' too small (16 vs 32)
drivers/crypto/chelsio/chtls/chtls_hw.c:277 chtls_key_info() error:
'__memset()' 'gcm_ctx->key' too small (16 vs 32)
regards,
dan carpenter