]> git.ipfire.org Git - thirdparty/linux.git/blame - include/net/tls.h
Merge git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next
[thirdparty/linux.git] / include / net / tls.h
CommitLineData
3c4d7559
DW
1/*
2 * Copyright (c) 2016-2017, Mellanox Technologies. All rights reserved.
3 * Copyright (c) 2016-2017, Dave Watson <davejwatson@fb.com>. All rights reserved.
4 *
5 * This software is available to you under a choice of one of two
6 * licenses. You may choose to be licensed under the terms of the GNU
7 * General Public License (GPL) Version 2, available from the file
8 * COPYING in the main directory of this source tree, or the
9 * OpenIB.org BSD license below:
10 *
11 * Redistribution and use in source and binary forms, with or
12 * without modification, are permitted provided that the following
13 * conditions are met:
14 *
15 * - Redistributions of source code must retain the above
16 * copyright notice, this list of conditions and the following
17 * disclaimer.
18 *
19 * - Redistributions in binary form must reproduce the above
20 * copyright notice, this list of conditions and the following
21 * disclaimer in the documentation and/or other materials
22 * provided with the distribution.
23 *
24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
28 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
29 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
30 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
31 * SOFTWARE.
32 */
33
34#ifndef _TLS_OFFLOAD_H
35#define _TLS_OFFLOAD_H
36
37#include <linux/types.h>
b9f3eb49 38#include <asm/byteorder.h>
a54667f6 39#include <linux/crypto.h>
b9f3eb49
DL
40#include <linux/socket.h>
41#include <linux/tcp.h>
42#include <net/tcp.h>
c46234eb 43#include <net/strparser.h>
3c4d7559
DW
44
45#include <uapi/linux/tls.h>
46
47
48/* Maximum data size carried in a TLS record */
49#define TLS_MAX_PAYLOAD_SIZE ((size_t)1 << 14)
50
51#define TLS_HEADER_SIZE 5
52#define TLS_NONCE_OFFSET TLS_HEADER_SIZE
53
54#define TLS_CRYPTO_INFO_READY(info) ((info)->cipher_type)
55
56#define TLS_RECORD_TYPE_DATA 0x17
57
58#define TLS_AAD_SPACE_SIZE 13
59
60struct tls_sw_context {
61 struct crypto_aead *aead_send;
c46234eb 62 struct crypto_aead *aead_recv;
a54667f6 63 struct crypto_wait async_wait;
3c4d7559 64
c46234eb
DW
65 /* Receive context */
66 struct strparser strp;
67 void (*saved_data_ready)(struct sock *sk);
68 unsigned int (*sk_poll)(struct file *file, struct socket *sock,
69 struct poll_table_struct *wait);
70 struct sk_buff *recv_pkt;
71 u8 control;
72 bool decrypted;
73
3c4d7559
DW
74 /* Sending context */
75 char aad_space[TLS_AAD_SPACE_SIZE];
76
77 unsigned int sg_plaintext_size;
78 int sg_plaintext_num_elem;
79 struct scatterlist sg_plaintext_data[MAX_SKB_FRAGS];
80
81 unsigned int sg_encrypted_size;
82 int sg_encrypted_num_elem;
83 struct scatterlist sg_encrypted_data[MAX_SKB_FRAGS];
84
85 /* AAD | sg_plaintext_data | sg_tag */
86 struct scatterlist sg_aead_in[2];
87 /* AAD | sg_encrypted_data (data contain overhead for hdr&iv&tag) */
88 struct scatterlist sg_aead_out[2];
89};
90
91enum {
92 TLS_PENDING_CLOSED_RECORD
93};
94
dbe42559
DW
95struct cipher_context {
96 u16 prepend_size;
97 u16 tag_size;
98 u16 overhead_size;
99 u16 iv_size;
100 char *iv;
101 u16 rec_seq_size;
102 char *rec_seq;
103};
104
3c4d7559
DW
105struct tls_context {
106 union {
107 struct tls_crypto_info crypto_send;
108 struct tls12_crypto_info_aes_gcm_128 crypto_send_aes_gcm_128;
109 };
c46234eb
DW
110 union {
111 struct tls_crypto_info crypto_recv;
112 struct tls12_crypto_info_aes_gcm_128 crypto_recv_aes_gcm_128;
113 };
3c4d7559
DW
114
115 void *priv_ctx;
116
58371585 117 u8 conf:2;
6d88207f 118
dbe42559 119 struct cipher_context tx;
c46234eb 120 struct cipher_context rx;
3c4d7559
DW
121
122 struct scatterlist *partially_sent_record;
123 u16 partially_sent_offset;
124 unsigned long flags;
125
126 u16 pending_open_record_frags;
127 int (*push_pending_record)(struct sock *sk, int flags);
3c4d7559
DW
128
129 void (*sk_write_space)(struct sock *sk);
130 void (*sk_proto_close)(struct sock *sk, long timeout);
131
132 int (*setsockopt)(struct sock *sk, int level,
133 int optname, char __user *optval,
134 unsigned int optlen);
135 int (*getsockopt)(struct sock *sk, int level,
136 int optname, char __user *optval,
137 int __user *optlen);
138};
139
140int wait_on_pending_writer(struct sock *sk, long *timeo);
141int tls_sk_query(struct sock *sk, int optname, char __user *optval,
142 int __user *optlen);
143int tls_sk_attach(struct sock *sk, int optname, char __user *optval,
144 unsigned int optlen);
145
146
c46234eb 147int tls_set_sw_offload(struct sock *sk, struct tls_context *ctx, int tx);
3c4d7559
DW
148int tls_sw_sendmsg(struct sock *sk, struct msghdr *msg, size_t size);
149int tls_sw_sendpage(struct sock *sk, struct page *page,
150 int offset, size_t size, int flags);
151void tls_sw_close(struct sock *sk, long timeout);
c46234eb
DW
152void tls_sw_free_resources(struct sock *sk);
153int tls_sw_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
154 int nonblock, int flags, int *addr_len);
155unsigned int tls_sw_poll(struct file *file, struct socket *sock,
156 struct poll_table_struct *wait);
157ssize_t tls_sw_splice_read(struct socket *sock, loff_t *ppos,
158 struct pipe_inode_info *pipe,
159 size_t len, unsigned int flags);
3c4d7559
DW
160
161void tls_sk_destruct(struct sock *sk, struct tls_context *ctx);
162void tls_icsk_clean_acked(struct sock *sk);
163
164int tls_push_sg(struct sock *sk, struct tls_context *ctx,
165 struct scatterlist *sg, u16 first_offset,
166 int flags);
167int tls_push_pending_closed_record(struct sock *sk, struct tls_context *ctx,
168 int flags, long *timeo);
169
170static inline bool tls_is_pending_closed_record(struct tls_context *ctx)
171{
172 return test_bit(TLS_PENDING_CLOSED_RECORD, &ctx->flags);
173}
174
175static inline int tls_complete_pending_work(struct sock *sk,
176 struct tls_context *ctx,
177 int flags, long *timeo)
178{
179 int rc = 0;
180
181 if (unlikely(sk->sk_write_pending))
182 rc = wait_on_pending_writer(sk, timeo);
183
184 if (!rc && tls_is_pending_closed_record(ctx))
185 rc = tls_push_pending_closed_record(sk, ctx, flags, timeo);
186
187 return rc;
188}
189
190static inline bool tls_is_partially_sent_record(struct tls_context *ctx)
191{
192 return !!ctx->partially_sent_record;
193}
194
195static inline bool tls_is_pending_open_record(struct tls_context *tls_ctx)
196{
197 return tls_ctx->pending_open_record_frags;
198}
199
f4a8e43f 200static inline void tls_err_abort(struct sock *sk, int err)
3c4d7559 201{
f4a8e43f 202 sk->sk_err = err;
3c4d7559
DW
203 sk->sk_error_report(sk);
204}
205
206static inline bool tls_bigint_increment(unsigned char *seq, int len)
207{
208 int i;
209
210 for (i = len - 1; i >= 0; i--) {
211 ++seq[i];
212 if (seq[i] != 0)
213 break;
214 }
215
216 return (i == -1);
217}
218
219static inline void tls_advance_record_sn(struct sock *sk,
dbe42559 220 struct cipher_context *ctx)
3c4d7559
DW
221{
222 if (tls_bigint_increment(ctx->rec_seq, ctx->rec_seq_size))
f4a8e43f 223 tls_err_abort(sk, EBADMSG);
3c4d7559
DW
224 tls_bigint_increment(ctx->iv + TLS_CIPHER_AES_GCM_128_SALT_SIZE,
225 ctx->iv_size);
226}
227
228static inline void tls_fill_prepend(struct tls_context *ctx,
229 char *buf,
230 size_t plaintext_len,
231 unsigned char record_type)
232{
dbe42559 233 size_t pkt_len, iv_size = ctx->tx.iv_size;
3c4d7559 234
dbe42559 235 pkt_len = plaintext_len + iv_size + ctx->tx.tag_size;
3c4d7559
DW
236
237 /* we cover nonce explicit here as well, so buf should be of
238 * size KTLS_DTLS_HEADER_SIZE + KTLS_DTLS_NONCE_EXPLICIT_SIZE
239 */
240 buf[0] = record_type;
241 buf[1] = TLS_VERSION_MINOR(ctx->crypto_send.version);
242 buf[2] = TLS_VERSION_MAJOR(ctx->crypto_send.version);
243 /* we can use IV for nonce explicit according to spec */
244 buf[3] = pkt_len >> 8;
245 buf[4] = pkt_len & 0xFF;
246 memcpy(buf + TLS_NONCE_OFFSET,
dbe42559 247 ctx->tx.iv + TLS_CIPHER_AES_GCM_128_SALT_SIZE, iv_size);
3c4d7559
DW
248}
249
213ef6e7
IL
250static inline void tls_make_aad(char *buf,
251 size_t size,
252 char *record_sequence,
253 int record_sequence_size,
254 unsigned char record_type)
255{
256 memcpy(buf, record_sequence, record_sequence_size);
257
258 buf[8] = record_type;
259 buf[9] = TLS_1_2_VERSION_MAJOR;
260 buf[10] = TLS_1_2_VERSION_MINOR;
261 buf[11] = size >> 8;
262 buf[12] = size & 0xFF;
263}
264
3c4d7559
DW
265static inline struct tls_context *tls_get_ctx(const struct sock *sk)
266{
267 struct inet_connection_sock *icsk = inet_csk(sk);
268
269 return icsk->icsk_ulp_data;
270}
271
272static inline struct tls_sw_context *tls_sw_ctx(
273 const struct tls_context *tls_ctx)
274{
275 return (struct tls_sw_context *)tls_ctx->priv_ctx;
276}
277
278static inline struct tls_offload_context *tls_offload_ctx(
279 const struct tls_context *tls_ctx)
280{
281 return (struct tls_offload_context *)tls_ctx->priv_ctx;
282}
283
284int tls_proccess_cmsg(struct sock *sk, struct msghdr *msg,
285 unsigned char *record_type);
286
287#endif /* _TLS_OFFLOAD_H */