88#include <linux/init.h>
99#include <linux/slab.h>
1010#include <linux/err.h>
11+ #include <linux/key.h>
1112#include <linux/nvme-tcp.h>
13+ #include <linux/nvme-keyring.h>
1214#include <net/sock.h>
1315#include <net/tcp.h>
16+ #include <net/tls.h>
17+ #include <net/handshake.h>
1418#include <linux/blk-mq.h>
1519#include <crypto/hash.h>
1620#include <net/busy_poll.h>
@@ -31,6 +35,16 @@ static int so_priority;
3135module_param (so_priority , int , 0644 );
3236MODULE_PARM_DESC (so_priority , "nvme tcp socket optimize priority" );
3337
38+ #ifdef CONFIG_NVME_TCP_TLS
39+ /*
40+ * TLS handshake timeout
41+ */
42+ static int tls_handshake_timeout = 10 ;
43+ module_param (tls_handshake_timeout , int , 0644 );
44+ MODULE_PARM_DESC (tls_handshake_timeout ,
45+ "nvme TLS handshake timeout in seconds (default 10)" );
46+ #endif
47+
3448#ifdef CONFIG_DEBUG_LOCK_ALLOC
3549/* lockdep can detect a circular dependency of the form
3650 * sk_lock -> mmap_lock (page fault) -> fs locks -> sk_lock
@@ -146,7 +160,10 @@ struct nvme_tcp_queue {
146160 struct ahash_request * snd_hash ;
147161 __le32 exp_ddgst ;
148162 __le32 recv_ddgst ;
149-
163+ #ifdef CONFIG_NVME_TCP_TLS
164+ struct completion tls_complete ;
165+ int tls_err ;
166+ #endif
150167 struct page_frag_cache pf_cache ;
151168
152169 void (* state_change )(struct sock * );
@@ -1509,7 +1526,92 @@ static void nvme_tcp_set_queue_io_cpu(struct nvme_tcp_queue *queue)
15091526 queue -> io_cpu = cpumask_next_wrap (n - 1 , cpu_online_mask , -1 , false);
15101527}
15111528
1512- static int nvme_tcp_alloc_queue (struct nvme_ctrl * nctrl , int qid )
1529+ #ifdef CONFIG_NVME_TCP_TLS
1530+ static void nvme_tcp_tls_done (void * data , int status , key_serial_t pskid )
1531+ {
1532+ struct nvme_tcp_queue * queue = data ;
1533+ struct nvme_tcp_ctrl * ctrl = queue -> ctrl ;
1534+ int qid = nvme_tcp_queue_id (queue );
1535+ struct key * tls_key ;
1536+
1537+ dev_dbg (ctrl -> ctrl .device , "queue %d: TLS handshake done, key %x, status %d\n" ,
1538+ qid , pskid , status );
1539+
1540+ if (status ) {
1541+ queue -> tls_err = - status ;
1542+ goto out_complete ;
1543+ }
1544+
1545+ tls_key = key_lookup (pskid );
1546+ if (IS_ERR (tls_key )) {
1547+ dev_warn (ctrl -> ctrl .device , "queue %d: Invalid key %x\n" ,
1548+ qid , pskid );
1549+ queue -> tls_err = - ENOKEY ;
1550+ } else {
1551+ ctrl -> ctrl .tls_key = tls_key ;
1552+ queue -> tls_err = 0 ;
1553+ }
1554+
1555+ out_complete :
1556+ complete (& queue -> tls_complete );
1557+ }
1558+
1559+ static int nvme_tcp_start_tls (struct nvme_ctrl * nctrl ,
1560+ struct nvme_tcp_queue * queue ,
1561+ key_serial_t pskid )
1562+ {
1563+ int qid = nvme_tcp_queue_id (queue );
1564+ int ret ;
1565+ struct tls_handshake_args args ;
1566+ unsigned long tmo = tls_handshake_timeout * HZ ;
1567+ key_serial_t keyring = nvme_keyring_id ();
1568+
1569+ dev_dbg (nctrl -> device , "queue %d: start TLS with key %x\n" ,
1570+ qid , pskid );
1571+ memset (& args , 0 , sizeof (args ));
1572+ args .ta_sock = queue -> sock ;
1573+ args .ta_done = nvme_tcp_tls_done ;
1574+ args .ta_data = queue ;
1575+ args .ta_my_peerids [0 ] = pskid ;
1576+ args .ta_num_peerids = 1 ;
1577+ args .ta_keyring = keyring ;
1578+ args .ta_timeout_ms = tls_handshake_timeout * 1000 ;
1579+ queue -> tls_err = - EOPNOTSUPP ;
1580+ init_completion (& queue -> tls_complete );
1581+ ret = tls_client_hello_psk (& args , GFP_KERNEL );
1582+ if (ret ) {
1583+ dev_err (nctrl -> device , "queue %d: failed to start TLS: %d\n" ,
1584+ qid , ret );
1585+ return ret ;
1586+ }
1587+ ret = wait_for_completion_interruptible_timeout (& queue -> tls_complete , tmo );
1588+ if (ret <= 0 ) {
1589+ if (ret == 0 )
1590+ ret = - ETIMEDOUT ;
1591+
1592+ dev_err (nctrl -> device ,
1593+ "queue %d: TLS handshake failed, error %d\n" ,
1594+ qid , ret );
1595+ tls_handshake_cancel (queue -> sock -> sk );
1596+ } else {
1597+ dev_dbg (nctrl -> device ,
1598+ "queue %d: TLS handshake complete, error %d\n" ,
1599+ qid , queue -> tls_err );
1600+ ret = queue -> tls_err ;
1601+ }
1602+ return ret ;
1603+ }
1604+ #else
1605+ static int nvme_tcp_start_tls (struct nvme_ctrl * nctrl ,
1606+ struct nvme_tcp_queue * queue ,
1607+ key_serial_t pskid )
1608+ {
1609+ return - EPROTONOSUPPORT ;
1610+ }
1611+ #endif
1612+
1613+ static int nvme_tcp_alloc_queue (struct nvme_ctrl * nctrl , int qid ,
1614+ key_serial_t pskid )
15131615{
15141616 struct nvme_tcp_ctrl * ctrl = to_tcp_ctrl (nctrl );
15151617 struct nvme_tcp_queue * queue = & ctrl -> queues [qid ];
@@ -1632,6 +1734,13 @@ static int nvme_tcp_alloc_queue(struct nvme_ctrl *nctrl, int qid)
16321734 goto err_rcv_pdu ;
16331735 }
16341736
1737+ /* If PSKs are configured try to start TLS */
1738+ if (pskid ) {
1739+ ret = nvme_tcp_start_tls (nctrl , queue , pskid );
1740+ if (ret )
1741+ goto err_init_connect ;
1742+ }
1743+
16351744 ret = nvme_tcp_init_connection (queue );
16361745 if (ret )
16371746 goto err_init_connect ;
@@ -1781,10 +1890,22 @@ static int nvme_tcp_start_io_queues(struct nvme_ctrl *ctrl,
17811890static int nvme_tcp_alloc_admin_queue (struct nvme_ctrl * ctrl )
17821891{
17831892 int ret ;
1893+ key_serial_t pskid = 0 ;
1894+
1895+ if (ctrl -> opts -> tls ) {
1896+ pskid = nvme_tls_psk_default (NULL ,
1897+ ctrl -> opts -> host -> nqn ,
1898+ ctrl -> opts -> subsysnqn );
1899+ if (!pskid ) {
1900+ dev_err (ctrl -> device , "no valid PSK found\n" );
1901+ ret = - ENOKEY ;
1902+ goto out_free_queue ;
1903+ }
1904+ }
17841905
1785- ret = nvme_tcp_alloc_queue (ctrl , 0 );
1906+ ret = nvme_tcp_alloc_queue (ctrl , 0 , pskid );
17861907 if (ret )
1787- return ret ;
1908+ goto out_free_queue ;
17881909
17891910 ret = nvme_tcp_alloc_async_req (to_tcp_ctrl (ctrl ));
17901911 if (ret )
@@ -1801,8 +1922,13 @@ static int __nvme_tcp_alloc_io_queues(struct nvme_ctrl *ctrl)
18011922{
18021923 int i , ret ;
18031924
1925+ if (ctrl -> opts -> tls && !ctrl -> tls_key ) {
1926+ dev_err (ctrl -> device , "no PSK negotiated\n" );
1927+ return - ENOKEY ;
1928+ }
18041929 for (i = 1 ; i < ctrl -> queue_count ; i ++ ) {
1805- ret = nvme_tcp_alloc_queue (ctrl , i );
1930+ ret = nvme_tcp_alloc_queue (ctrl , i ,
1931+ key_serial (ctrl -> tls_key ));
18061932 if (ret )
18071933 goto out_free_queues ;
18081934 }
@@ -2630,7 +2756,7 @@ static struct nvmf_transport_ops nvme_tcp_transport = {
26302756 NVMF_OPT_HOST_TRADDR | NVMF_OPT_CTRL_LOSS_TMO |
26312757 NVMF_OPT_HDR_DIGEST | NVMF_OPT_DATA_DIGEST |
26322758 NVMF_OPT_NR_WRITE_QUEUES | NVMF_OPT_NR_POLL_QUEUES |
2633- NVMF_OPT_TOS | NVMF_OPT_HOST_IFACE ,
2759+ NVMF_OPT_TOS | NVMF_OPT_HOST_IFACE | NVMF_OPT_TLS ,
26342760 .create_ctrl = nvme_tcp_create_ctrl ,
26352761};
26362762
0 commit comments