Skip to content

Commit d9a6ca1

Browse files
qsnkuba-moo
authored andcommitted
tls: use tls_cipher_desc to get per-cipher sizes in tls_set_sw_offload
We can get rid of some local variables, but we have to keep nonce_size because tls1.3 uses nonce_size = 0 for all ciphers. We can also drop the runtime sanity checks on iv/rec_seq/tag size, since we have compile time checks on those values. Signed-off-by: Sabrina Dubroca <sd@queasysnail.net> Link: https://lore.kernel.org/r/deed9c4430a62c31751a72b8c03ad66ffe710717.1692977948.git.sd@queasysnail.net Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1 parent 077e05d commit d9a6ca1

1 file changed

Lines changed: 16 additions & 63 deletions

File tree

net/tls/tls_sw.c

Lines changed: 16 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -2590,10 +2590,10 @@ int tls_set_sw_offload(struct sock *sk, struct tls_context *ctx, int tx)
25902590
struct tls_sw_context_rx *sw_ctx_rx = NULL;
25912591
struct cipher_context *cctx;
25922592
struct crypto_aead **aead;
2593-
u16 nonce_size, tag_size, iv_size, rec_seq_size, salt_size;
25942593
struct crypto_tfm *tfm;
25952594
char *iv, *rec_seq, *key, *salt, *cipher_name;
2596-
size_t keysize;
2595+
const struct tls_cipher_desc *cipher_desc;
2596+
u16 nonce_size;
25972597
int rc = 0;
25982598

25992599
if (!ctx) {
@@ -2652,135 +2652,87 @@ int tls_set_sw_offload(struct sock *sk, struct tls_context *ctx, int tx)
26522652
struct tls12_crypto_info_aes_gcm_128 *gcm_128_info;
26532653

26542654
gcm_128_info = (void *)crypto_info;
2655-
nonce_size = TLS_CIPHER_AES_GCM_128_IV_SIZE;
2656-
tag_size = TLS_CIPHER_AES_GCM_128_TAG_SIZE;
2657-
iv_size = TLS_CIPHER_AES_GCM_128_IV_SIZE;
26582655
iv = gcm_128_info->iv;
2659-
rec_seq_size = TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE;
26602656
rec_seq = gcm_128_info->rec_seq;
2661-
keysize = TLS_CIPHER_AES_GCM_128_KEY_SIZE;
26622657
key = gcm_128_info->key;
26632658
salt = gcm_128_info->salt;
2664-
salt_size = TLS_CIPHER_AES_GCM_128_SALT_SIZE;
26652659
cipher_name = "gcm(aes)";
26662660
break;
26672661
}
26682662
case TLS_CIPHER_AES_GCM_256: {
26692663
struct tls12_crypto_info_aes_gcm_256 *gcm_256_info;
26702664

26712665
gcm_256_info = (void *)crypto_info;
2672-
nonce_size = TLS_CIPHER_AES_GCM_256_IV_SIZE;
2673-
tag_size = TLS_CIPHER_AES_GCM_256_TAG_SIZE;
2674-
iv_size = TLS_CIPHER_AES_GCM_256_IV_SIZE;
26752666
iv = gcm_256_info->iv;
2676-
rec_seq_size = TLS_CIPHER_AES_GCM_256_REC_SEQ_SIZE;
26772667
rec_seq = gcm_256_info->rec_seq;
2678-
keysize = TLS_CIPHER_AES_GCM_256_KEY_SIZE;
26792668
key = gcm_256_info->key;
26802669
salt = gcm_256_info->salt;
2681-
salt_size = TLS_CIPHER_AES_GCM_256_SALT_SIZE;
26822670
cipher_name = "gcm(aes)";
26832671
break;
26842672
}
26852673
case TLS_CIPHER_AES_CCM_128: {
26862674
struct tls12_crypto_info_aes_ccm_128 *ccm_128_info;
26872675

26882676
ccm_128_info = (void *)crypto_info;
2689-
nonce_size = TLS_CIPHER_AES_CCM_128_IV_SIZE;
2690-
tag_size = TLS_CIPHER_AES_CCM_128_TAG_SIZE;
2691-
iv_size = TLS_CIPHER_AES_CCM_128_IV_SIZE;
26922677
iv = ccm_128_info->iv;
2693-
rec_seq_size = TLS_CIPHER_AES_CCM_128_REC_SEQ_SIZE;
26942678
rec_seq = ccm_128_info->rec_seq;
2695-
keysize = TLS_CIPHER_AES_CCM_128_KEY_SIZE;
26962679
key = ccm_128_info->key;
26972680
salt = ccm_128_info->salt;
2698-
salt_size = TLS_CIPHER_AES_CCM_128_SALT_SIZE;
26992681
cipher_name = "ccm(aes)";
27002682
break;
27012683
}
27022684
case TLS_CIPHER_CHACHA20_POLY1305: {
27032685
struct tls12_crypto_info_chacha20_poly1305 *chacha20_poly1305_info;
27042686

27052687
chacha20_poly1305_info = (void *)crypto_info;
2706-
nonce_size = 0;
2707-
tag_size = TLS_CIPHER_CHACHA20_POLY1305_TAG_SIZE;
2708-
iv_size = TLS_CIPHER_CHACHA20_POLY1305_IV_SIZE;
27092688
iv = chacha20_poly1305_info->iv;
2710-
rec_seq_size = TLS_CIPHER_CHACHA20_POLY1305_REC_SEQ_SIZE;
27112689
rec_seq = chacha20_poly1305_info->rec_seq;
2712-
keysize = TLS_CIPHER_CHACHA20_POLY1305_KEY_SIZE;
27132690
key = chacha20_poly1305_info->key;
27142691
salt = chacha20_poly1305_info->salt;
2715-
salt_size = TLS_CIPHER_CHACHA20_POLY1305_SALT_SIZE;
27162692
cipher_name = "rfc7539(chacha20,poly1305)";
27172693
break;
27182694
}
27192695
case TLS_CIPHER_SM4_GCM: {
27202696
struct tls12_crypto_info_sm4_gcm *sm4_gcm_info;
27212697

27222698
sm4_gcm_info = (void *)crypto_info;
2723-
nonce_size = TLS_CIPHER_SM4_GCM_IV_SIZE;
2724-
tag_size = TLS_CIPHER_SM4_GCM_TAG_SIZE;
2725-
iv_size = TLS_CIPHER_SM4_GCM_IV_SIZE;
27262699
iv = sm4_gcm_info->iv;
2727-
rec_seq_size = TLS_CIPHER_SM4_GCM_REC_SEQ_SIZE;
27282700
rec_seq = sm4_gcm_info->rec_seq;
2729-
keysize = TLS_CIPHER_SM4_GCM_KEY_SIZE;
27302701
key = sm4_gcm_info->key;
27312702
salt = sm4_gcm_info->salt;
2732-
salt_size = TLS_CIPHER_SM4_GCM_SALT_SIZE;
27332703
cipher_name = "gcm(sm4)";
27342704
break;
27352705
}
27362706
case TLS_CIPHER_SM4_CCM: {
27372707
struct tls12_crypto_info_sm4_ccm *sm4_ccm_info;
27382708

27392709
sm4_ccm_info = (void *)crypto_info;
2740-
nonce_size = TLS_CIPHER_SM4_CCM_IV_SIZE;
2741-
tag_size = TLS_CIPHER_SM4_CCM_TAG_SIZE;
2742-
iv_size = TLS_CIPHER_SM4_CCM_IV_SIZE;
27432710
iv = sm4_ccm_info->iv;
2744-
rec_seq_size = TLS_CIPHER_SM4_CCM_REC_SEQ_SIZE;
27452711
rec_seq = sm4_ccm_info->rec_seq;
2746-
keysize = TLS_CIPHER_SM4_CCM_KEY_SIZE;
27472712
key = sm4_ccm_info->key;
27482713
salt = sm4_ccm_info->salt;
2749-
salt_size = TLS_CIPHER_SM4_CCM_SALT_SIZE;
27502714
cipher_name = "ccm(sm4)";
27512715
break;
27522716
}
27532717
case TLS_CIPHER_ARIA_GCM_128: {
27542718
struct tls12_crypto_info_aria_gcm_128 *aria_gcm_128_info;
27552719

27562720
aria_gcm_128_info = (void *)crypto_info;
2757-
nonce_size = TLS_CIPHER_ARIA_GCM_128_IV_SIZE;
2758-
tag_size = TLS_CIPHER_ARIA_GCM_128_TAG_SIZE;
2759-
iv_size = TLS_CIPHER_ARIA_GCM_128_IV_SIZE;
27602721
iv = aria_gcm_128_info->iv;
2761-
rec_seq_size = TLS_CIPHER_ARIA_GCM_128_REC_SEQ_SIZE;
27622722
rec_seq = aria_gcm_128_info->rec_seq;
2763-
keysize = TLS_CIPHER_ARIA_GCM_128_KEY_SIZE;
27642723
key = aria_gcm_128_info->key;
27652724
salt = aria_gcm_128_info->salt;
2766-
salt_size = TLS_CIPHER_ARIA_GCM_128_SALT_SIZE;
27672725
cipher_name = "gcm(aria)";
27682726
break;
27692727
}
27702728
case TLS_CIPHER_ARIA_GCM_256: {
27712729
struct tls12_crypto_info_aria_gcm_256 *gcm_256_info;
27722730

27732731
gcm_256_info = (void *)crypto_info;
2774-
nonce_size = TLS_CIPHER_ARIA_GCM_256_IV_SIZE;
2775-
tag_size = TLS_CIPHER_ARIA_GCM_256_TAG_SIZE;
2776-
iv_size = TLS_CIPHER_ARIA_GCM_256_IV_SIZE;
27772732
iv = gcm_256_info->iv;
2778-
rec_seq_size = TLS_CIPHER_ARIA_GCM_256_REC_SEQ_SIZE;
27792733
rec_seq = gcm_256_info->rec_seq;
2780-
keysize = TLS_CIPHER_ARIA_GCM_256_KEY_SIZE;
27812734
key = gcm_256_info->key;
27822735
salt = gcm_256_info->salt;
2783-
salt_size = TLS_CIPHER_ARIA_GCM_256_SALT_SIZE;
27842736
cipher_name = "gcm(aria)";
27852737
break;
27862738
}
@@ -2789,6 +2741,9 @@ int tls_set_sw_offload(struct sock *sk, struct tls_context *ctx, int tx)
27892741
goto free_priv;
27902742
}
27912743

2744+
cipher_desc = get_cipher_desc(crypto_info->cipher_type);
2745+
nonce_size = cipher_desc->nonce;
2746+
27922747
if (crypto_info->version == TLS_1_3_VERSION) {
27932748
nonce_size = 0;
27942749
prot->aad_size = TLS_HEADER_SIZE;
@@ -2799,31 +2754,30 @@ int tls_set_sw_offload(struct sock *sk, struct tls_context *ctx, int tx)
27992754
}
28002755

28012756
/* Sanity-check the sizes for stack allocations. */
2802-
if (iv_size > MAX_IV_SIZE || nonce_size > MAX_IV_SIZE ||
2803-
rec_seq_size > TLS_MAX_REC_SEQ_SIZE || tag_size != TLS_TAG_SIZE ||
2804-
prot->aad_size > TLS_MAX_AAD_SIZE) {
2757+
if (nonce_size > MAX_IV_SIZE || prot->aad_size > TLS_MAX_AAD_SIZE) {
28052758
rc = -EINVAL;
28062759
goto free_priv;
28072760
}
28082761

28092762
prot->version = crypto_info->version;
28102763
prot->cipher_type = crypto_info->cipher_type;
28112764
prot->prepend_size = TLS_HEADER_SIZE + nonce_size;
2812-
prot->tag_size = tag_size;
2765+
prot->tag_size = cipher_desc->tag;
28132766
prot->overhead_size = prot->prepend_size +
28142767
prot->tag_size + prot->tail_size;
2815-
prot->iv_size = iv_size;
2816-
prot->salt_size = salt_size;
2817-
cctx->iv = kmalloc(iv_size + salt_size, GFP_KERNEL);
2768+
prot->iv_size = cipher_desc->iv;
2769+
prot->salt_size = cipher_desc->salt;
2770+
cctx->iv = kmalloc(cipher_desc->iv + cipher_desc->salt, GFP_KERNEL);
28182771
if (!cctx->iv) {
28192772
rc = -ENOMEM;
28202773
goto free_priv;
28212774
}
28222775
/* Note: 128 & 256 bit salt are the same size */
2823-
prot->rec_seq_size = rec_seq_size;
2824-
memcpy(cctx->iv, salt, salt_size);
2825-
memcpy(cctx->iv + salt_size, iv, iv_size);
2826-
cctx->rec_seq = kmemdup(rec_seq, rec_seq_size, GFP_KERNEL);
2776+
prot->rec_seq_size = cipher_desc->rec_seq;
2777+
memcpy(cctx->iv, salt, cipher_desc->salt);
2778+
memcpy(cctx->iv + cipher_desc->salt, iv, cipher_desc->iv);
2779+
2780+
cctx->rec_seq = kmemdup(rec_seq, cipher_desc->rec_seq, GFP_KERNEL);
28272781
if (!cctx->rec_seq) {
28282782
rc = -ENOMEM;
28292783
goto free_iv;
@@ -2840,8 +2794,7 @@ int tls_set_sw_offload(struct sock *sk, struct tls_context *ctx, int tx)
28402794

28412795
ctx->push_pending_record = tls_sw_push_pending_record;
28422796

2843-
rc = crypto_aead_setkey(*aead, key, keysize);
2844-
2797+
rc = crypto_aead_setkey(*aead, key, cipher_desc->key);
28452798
if (rc)
28462799
goto free_aead;
28472800

0 commit comments

Comments
 (0)