| /* SPDX-License-Identifier: GPL-2.0-only */ | 
 | /* | 
 |  * Generic netlink HANDSHAKE service. | 
 |  * | 
 |  * Author: Chuck Lever <chuck.lever@oracle.com> | 
 |  * | 
 |  * Copyright (c) 2023, Oracle and/or its affiliates. | 
 |  */ | 
 |  | 
 | #ifndef _NET_HANDSHAKE_H | 
 | #define _NET_HANDSHAKE_H | 
 |  | 
 | enum { | 
 | 	TLS_NO_KEYRING = 0, | 
 | 	TLS_NO_PEERID = 0, | 
 | 	TLS_NO_CERT = 0, | 
 | 	TLS_NO_PRIVKEY = 0, | 
 | }; | 
 |  | 
 | typedef void	(*tls_done_func_t)(void *data, int status, | 
 | 				   key_serial_t peerid); | 
 |  | 
 | struct tls_handshake_args { | 
 | 	struct socket		*ta_sock; | 
 | 	tls_done_func_t		ta_done; | 
 | 	void			*ta_data; | 
 | 	const char		*ta_peername; | 
 | 	unsigned int		ta_timeout_ms; | 
 | 	key_serial_t		ta_keyring; | 
 | 	key_serial_t		ta_my_cert; | 
 | 	key_serial_t		ta_my_privkey; | 
 | 	unsigned int		ta_num_peerids; | 
 | 	key_serial_t		ta_my_peerids[5]; | 
 | }; | 
 |  | 
 | int tls_client_hello_anon(const struct tls_handshake_args *args, gfp_t flags); | 
 | int tls_client_hello_x509(const struct tls_handshake_args *args, gfp_t flags); | 
 | int tls_client_hello_psk(const struct tls_handshake_args *args, gfp_t flags); | 
 | int tls_server_hello_x509(const struct tls_handshake_args *args, gfp_t flags); | 
 | int tls_server_hello_psk(const struct tls_handshake_args *args, gfp_t flags); | 
 |  | 
 | bool tls_handshake_cancel(struct sock *sk); | 
 | void tls_handshake_close(struct socket *sock); | 
 |  | 
 | u8 tls_get_record_type(const struct sock *sk, const struct cmsghdr *msg); | 
 | void tls_alert_recv(const struct sock *sk, const struct msghdr *msg, | 
 | 		    u8 *level, u8 *description); | 
 |  | 
 | #endif /* _NET_HANDSHAKE_H */ |