Merge tag 'microblaze-v5.11' of git://git.monstr.eu/linux-2.6-microblaze
[linux-2.6-microblaze.git] / net / tls / tls_sw.c
index 845c628..01d933a 100644 (file)
@@ -505,7 +505,7 @@ static int tls_do_encryption(struct sock *sk,
        memcpy(&rec->iv_data[iv_offset], tls_ctx->tx.iv,
               prot->iv_size + prot->salt_size);
 
-       xor_iv_with_seq(prot->version, rec->iv_data, tls_ctx->tx.rec_seq);
+       xor_iv_with_seq(prot, rec->iv_data, tls_ctx->tx.rec_seq);
 
        sge->offset += prot->prepend_size;
        sge->length -= prot->prepend_size;
@@ -748,14 +748,13 @@ static int tls_push_record(struct sock *sk, int flags,
        sg_chain(rec->sg_aead_out, 2, &msg_en->sg.data[i]);
 
        tls_make_aad(rec->aad_space, msg_pl->sg.size + prot->tail_size,
-                    tls_ctx->tx.rec_seq, prot->rec_seq_size,
-                    record_type, prot->version);
+                    tls_ctx->tx.rec_seq, record_type, prot);
 
        tls_fill_prepend(tls_ctx,
                         page_address(sg_page(&msg_en->sg.data[i])) +
                         msg_en->sg.data[i].offset,
                         msg_pl->sg.size + prot->tail_size,
-                        record_type, prot->version);
+                        record_type);
 
        tls_ctx->pending_open_record_frags = false;
 
@@ -1471,19 +1470,19 @@ static int decrypt_internal(struct sock *sk, struct sk_buff *skb,
                kfree(mem);
                return err;
        }
-       if (prot->version == TLS_1_3_VERSION)
+       if (prot->version == TLS_1_3_VERSION ||
+           prot->cipher_type == TLS_CIPHER_CHACHA20_POLY1305)
                memcpy(iv + iv_offset, tls_ctx->rx.iv,
                       crypto_aead_ivsize(ctx->aead_recv));
        else
                memcpy(iv + iv_offset, tls_ctx->rx.iv, prot->salt_size);
 
-       xor_iv_with_seq(prot->version, iv, tls_ctx->rx.rec_seq);
+       xor_iv_with_seq(prot, iv, tls_ctx->rx.rec_seq);
 
        /* Prepare AAD */
        tls_make_aad(aad, rxm->full_len - prot->overhead_size +
                     prot->tail_size,
-                    tls_ctx->rx.rec_seq, prot->rec_seq_size,
-                    ctx->control, prot->version);
+                    tls_ctx->rx.rec_seq, ctx->control, prot);
 
        /* Prepare sgin */
        sg_init_table(sgin, n_sgin);
@@ -2076,7 +2075,8 @@ static int tls_read_size(struct strparser *strp, struct sk_buff *skb)
        data_len = ((header[4] & 0xFF) | (header[3] << 8));
 
        cipher_overhead = prot->tag_size;
-       if (prot->version != TLS_1_3_VERSION)
+       if (prot->version != TLS_1_3_VERSION &&
+           prot->cipher_type != TLS_CIPHER_CHACHA20_POLY1305)
                cipher_overhead += prot->iv_size;
 
        if (data_len > TLS_MAX_PAYLOAD_SIZE + cipher_overhead +
@@ -2296,6 +2296,7 @@ int tls_set_sw_offload(struct sock *sk, struct tls_context *ctx, int tx)
        struct tls12_crypto_info_aes_gcm_128 *gcm_128_info;
        struct tls12_crypto_info_aes_gcm_256 *gcm_256_info;
        struct tls12_crypto_info_aes_ccm_128 *ccm_128_info;
+       struct tls12_crypto_info_chacha20_poly1305 *chacha20_poly1305_info;
        struct tls_sw_context_tx *sw_ctx_tx = NULL;
        struct tls_sw_context_rx *sw_ctx_rx = NULL;
        struct cipher_context *cctx;
@@ -2408,6 +2409,21 @@ int tls_set_sw_offload(struct sock *sk, struct tls_context *ctx, int tx)
                cipher_name = "ccm(aes)";
                break;
        }
+       case TLS_CIPHER_CHACHA20_POLY1305: {
+               chacha20_poly1305_info = (void *)crypto_info;
+               nonce_size = 0;
+               tag_size = TLS_CIPHER_CHACHA20_POLY1305_TAG_SIZE;
+               iv_size = TLS_CIPHER_CHACHA20_POLY1305_IV_SIZE;
+               iv = chacha20_poly1305_info->iv;
+               rec_seq_size = TLS_CIPHER_CHACHA20_POLY1305_REC_SEQ_SIZE;
+               rec_seq = chacha20_poly1305_info->rec_seq;
+               keysize = TLS_CIPHER_CHACHA20_POLY1305_KEY_SIZE;
+               key = chacha20_poly1305_info->key;
+               salt = chacha20_poly1305_info->salt;
+               salt_size = TLS_CIPHER_CHACHA20_POLY1305_SALT_SIZE;
+               cipher_name = "rfc7539(chacha20,poly1305)";
+               break;
+       }
        default:
                rc = -EINVAL;
                goto free_priv;