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