if (tls_bigint_increment(ctx->rec_seq, prot->rec_seq_size))
                tls_err_abort(sk, EBADMSG);
 
-       if (prot->version != TLS_1_3_VERSION)
+       if (prot->version != TLS_1_3_VERSION &&
+           prot->cipher_type != TLS_CIPHER_CHACHA20_POLY1305)
                tls_bigint_increment(ctx->iv + prot->salt_size,
                                     prot->iv_size);
 }
        size_t pkt_len, iv_size = prot->iv_size;
 
        pkt_len = plaintext_len + prot->tag_size;
-       if (prot->version != TLS_1_3_VERSION) {
+       if (prot->version != TLS_1_3_VERSION &&
+           prot->cipher_type != TLS_CIPHER_CHACHA20_POLY1305) {
                pkt_len += iv_size;
 
                memcpy(buf + TLS_NONCE_OFFSET,
 {
        int i;
 
-       if (prot->version == TLS_1_3_VERSION) {
+       if (prot->version == TLS_1_3_VERSION ||
+           prot->cipher_type == TLS_CIPHER_CHACHA20_POLY1305) {
                for (i = 0; i < 8; i++)
                        iv[i + 4] ^= seq[i];
        }
 
                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
        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 +