net: tls: Support 256 bit keys
Wire up support for 256 bit keys from the setsockopt to the crypto framework Signed-off-by: Dave Watson <davejwatson@fb.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
d3a5fd3c98
commit
fb99bce712
@@ -1999,6 +1999,7 @@ int tls_set_sw_offload(struct sock *sk, struct tls_context *ctx, int tx)
|
||||
{
|
||||
struct tls_crypto_info *crypto_info;
|
||||
struct tls12_crypto_info_aes_gcm_128 *gcm_128_info;
|
||||
struct tls12_crypto_info_aes_gcm_256 *gcm_256_info;
|
||||
struct tls_sw_context_tx *sw_ctx_tx = NULL;
|
||||
struct tls_sw_context_rx *sw_ctx_rx = NULL;
|
||||
struct cipher_context *cctx;
|
||||
@@ -2006,7 +2007,8 @@ int tls_set_sw_offload(struct sock *sk, struct tls_context *ctx, int tx)
|
||||
struct strp_callbacks cb;
|
||||
u16 nonce_size, tag_size, iv_size, rec_seq_size;
|
||||
struct crypto_tfm *tfm;
|
||||
char *iv, *rec_seq;
|
||||
char *iv, *rec_seq, *key, *salt;
|
||||
size_t keysize;
|
||||
int rc = 0;
|
||||
|
||||
if (!ctx) {
|
||||
@@ -2067,6 +2069,24 @@ int tls_set_sw_offload(struct sock *sk, struct tls_context *ctx, int tx)
|
||||
((struct tls12_crypto_info_aes_gcm_128 *)crypto_info)->rec_seq;
|
||||
gcm_128_info =
|
||||
(struct tls12_crypto_info_aes_gcm_128 *)crypto_info;
|
||||
keysize = TLS_CIPHER_AES_GCM_128_KEY_SIZE;
|
||||
key = gcm_128_info->key;
|
||||
salt = gcm_128_info->salt;
|
||||
break;
|
||||
}
|
||||
case TLS_CIPHER_AES_GCM_256: {
|
||||
nonce_size = TLS_CIPHER_AES_GCM_256_IV_SIZE;
|
||||
tag_size = TLS_CIPHER_AES_GCM_256_TAG_SIZE;
|
||||
iv_size = TLS_CIPHER_AES_GCM_256_IV_SIZE;
|
||||
iv = ((struct tls12_crypto_info_aes_gcm_256 *)crypto_info)->iv;
|
||||
rec_seq_size = TLS_CIPHER_AES_GCM_256_REC_SEQ_SIZE;
|
||||
rec_seq =
|
||||
((struct tls12_crypto_info_aes_gcm_256 *)crypto_info)->rec_seq;
|
||||
gcm_256_info =
|
||||
(struct tls12_crypto_info_aes_gcm_256 *)crypto_info;
|
||||
keysize = TLS_CIPHER_AES_GCM_256_KEY_SIZE;
|
||||
key = gcm_256_info->key;
|
||||
salt = gcm_256_info->salt;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
@@ -2090,7 +2110,8 @@ int tls_set_sw_offload(struct sock *sk, struct tls_context *ctx, int tx)
|
||||
rc = -ENOMEM;
|
||||
goto free_priv;
|
||||
}
|
||||
memcpy(cctx->iv, gcm_128_info->salt, TLS_CIPHER_AES_GCM_128_SALT_SIZE);
|
||||
/* Note: 128 & 256 bit salt are the same size */
|
||||
memcpy(cctx->iv, salt, TLS_CIPHER_AES_GCM_128_SALT_SIZE);
|
||||
memcpy(cctx->iv + TLS_CIPHER_AES_GCM_128_SALT_SIZE, iv, iv_size);
|
||||
cctx->rec_seq_size = rec_seq_size;
|
||||
cctx->rec_seq = kmemdup(rec_seq, rec_seq_size, GFP_KERNEL);
|
||||
@@ -2110,8 +2131,8 @@ int tls_set_sw_offload(struct sock *sk, struct tls_context *ctx, int tx)
|
||||
|
||||
ctx->push_pending_record = tls_sw_push_pending_record;
|
||||
|
||||
rc = crypto_aead_setkey(*aead, gcm_128_info->key,
|
||||
TLS_CIPHER_AES_GCM_128_KEY_SIZE);
|
||||
rc = crypto_aead_setkey(*aead, key, keysize);
|
||||
|
||||
if (rc)
|
||||
goto free_aead;
|
||||
|
||||
|
Reference in New Issue
Block a user