tls: RX path for ktls
authorDave Watson <davejwatson@fb.com>
Thu, 22 Mar 2018 17:10:35 +0000 (10:10 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 23 Mar 2018 16:25:54 +0000 (12:25 -0400)
commitc46234ebb4d1eee5e09819f49169e51cfc6eb909
tree6f1fbbe3cd74ec939633db5a9e2d6b80ffffaf16
parent583715853a25b4f2720b847e4fb8e37727299152
tls: RX path for ktls

Add rx path for tls software implementation.

recvmsg, splice_read, and poll implemented.

An additional sockopt TLS_RX is added, with the same interface as
TLS_TX.  Either TLX_RX or TLX_TX may be provided separately, or
together (with two different setsockopt calls with appropriate keys).

Control messages are passed via CMSG in a similar way to transmit.
If no cmsg buffer is passed, then only application data records
will be passed to userspace, and EIO is returned for other types of
alerts.

EBADMSG is passed for decryption errors, and EMSGSIZE is passed for
framing too big, and EBADMSG for framing too small (matching openssl
semantics). EINVAL is returned for TLS versions that do not match the
original setsockopt call.  All are unrecoverable.

strparser is used to parse TLS framing.   Decryption is done directly
in to userspace buffers if they are large enough to support it, otherwise
sk_cow_data is called (similar to ipsec), and buffers are decrypted in
place and copied.  splice_read always decrypts in place, since no
buffers are provided to decrypt in to.

sk_poll is overridden, and only returns POLLIN if a full TLS message is
received.  Otherwise we wait for strparser to finish reading a full frame.
Actual decryption is only done during recvmsg or splice_read calls.

Signed-off-by: Dave Watson <davejwatson@fb.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/tls.h
include/uapi/linux/tls.h
net/tls/Kconfig
net/tls/tls_main.c
net/tls/tls_sw.c