chtls_hw.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  1. /*
  2. * Copyright (c) 2018 Chelsio Communications, Inc.
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License version 2 as
  6. * published by the Free Software Foundation.
  7. *
  8. * Written by: Atul Gupta (atul.gupta@chelsio.com)
  9. */
  10. #include <linux/module.h>
  11. #include <linux/list.h>
  12. #include <linux/workqueue.h>
  13. #include <linux/skbuff.h>
  14. #include <linux/timer.h>
  15. #include <linux/notifier.h>
  16. #include <linux/inetdevice.h>
  17. #include <linux/ip.h>
  18. #include <linux/tcp.h>
  19. #include <linux/tls.h>
  20. #include <net/tls.h>
  21. #include "chtls.h"
  22. #include "chtls_cm.h"
  23. static void __set_tcb_field_direct(struct chtls_sock *csk,
  24. struct cpl_set_tcb_field *req, u16 word,
  25. u64 mask, u64 val, u8 cookie, int no_reply)
  26. {
  27. struct ulptx_idata *sc;
  28. INIT_TP_WR_CPL(req, CPL_SET_TCB_FIELD, csk->tid);
  29. req->wr.wr_mid |= htonl(FW_WR_FLOWID_V(csk->tid));
  30. req->reply_ctrl = htons(NO_REPLY_V(no_reply) |
  31. QUEUENO_V(csk->rss_qid));
  32. req->word_cookie = htons(TCB_WORD_V(word) | TCB_COOKIE_V(cookie));
  33. req->mask = cpu_to_be64(mask);
  34. req->val = cpu_to_be64(val);
  35. sc = (struct ulptx_idata *)(req + 1);
  36. sc->cmd_more = htonl(ULPTX_CMD_V(ULP_TX_SC_NOOP));
  37. sc->len = htonl(0);
  38. }
  39. static void __set_tcb_field(struct sock *sk, struct sk_buff *skb, u16 word,
  40. u64 mask, u64 val, u8 cookie, int no_reply)
  41. {
  42. struct cpl_set_tcb_field *req;
  43. struct chtls_sock *csk;
  44. struct ulptx_idata *sc;
  45. unsigned int wrlen;
  46. wrlen = roundup(sizeof(*req) + sizeof(*sc), 16);
  47. csk = rcu_dereference_sk_user_data(sk);
  48. req = (struct cpl_set_tcb_field *)__skb_put(skb, wrlen);
  49. __set_tcb_field_direct(csk, req, word, mask, val, cookie, no_reply);
  50. set_wr_txq(skb, CPL_PRIORITY_CONTROL, csk->port_id);
  51. }
  52. /*
  53. * Send control message to HW, message go as immediate data and packet
  54. * is freed immediately.
  55. */
  56. static int chtls_set_tcb_field(struct sock *sk, u16 word, u64 mask, u64 val)
  57. {
  58. struct cpl_set_tcb_field *req;
  59. unsigned int credits_needed;
  60. struct chtls_sock *csk;
  61. struct ulptx_idata *sc;
  62. struct sk_buff *skb;
  63. unsigned int wrlen;
  64. int ret;
  65. wrlen = roundup(sizeof(*req) + sizeof(*sc), 16);
  66. skb = alloc_skb(wrlen, GFP_ATOMIC);
  67. if (!skb)
  68. return -ENOMEM;
  69. credits_needed = DIV_ROUND_UP(wrlen, 16);
  70. csk = rcu_dereference_sk_user_data(sk);
  71. __set_tcb_field(sk, skb, word, mask, val, 0, 1);
  72. skb_set_queue_mapping(skb, (csk->txq_idx << 1) | CPL_PRIORITY_DATA);
  73. csk->wr_credits -= credits_needed;
  74. csk->wr_unacked += credits_needed;
  75. enqueue_wr(csk, skb);
  76. ret = cxgb4_ofld_send(csk->egress_dev, skb);
  77. if (ret < 0)
  78. kfree_skb(skb);
  79. return ret < 0 ? ret : 0;
  80. }
  81. /*
  82. * Set one of the t_flags bits in the TCB.
  83. */
  84. int chtls_set_tcb_tflag(struct sock *sk, unsigned int bit_pos, int val)
  85. {
  86. return chtls_set_tcb_field(sk, 1, 1ULL << bit_pos,
  87. (u64)val << bit_pos);
  88. }
  89. static int chtls_set_tcb_keyid(struct sock *sk, int keyid)
  90. {
  91. return chtls_set_tcb_field(sk, 31, 0xFFFFFFFFULL, keyid);
  92. }
  93. static int chtls_set_tcb_seqno(struct sock *sk)
  94. {
  95. return chtls_set_tcb_field(sk, 28, ~0ULL, 0);
  96. }
  97. static int chtls_set_tcb_quiesce(struct sock *sk, int val)
  98. {
  99. return chtls_set_tcb_field(sk, 1, (1ULL << TF_RX_QUIESCE_S),
  100. TF_RX_QUIESCE_V(val));
  101. }
  102. /* TLS Key bitmap processing */
  103. int chtls_init_kmap(struct chtls_dev *cdev, struct cxgb4_lld_info *lldi)
  104. {
  105. unsigned int num_key_ctx, bsize;
  106. int ksize;
  107. num_key_ctx = (lldi->vr->key.size / TLS_KEY_CONTEXT_SZ);
  108. bsize = BITS_TO_LONGS(num_key_ctx);
  109. cdev->kmap.size = num_key_ctx;
  110. cdev->kmap.available = bsize;
  111. ksize = sizeof(*cdev->kmap.addr) * bsize;
  112. cdev->kmap.addr = kvzalloc(ksize, GFP_KERNEL);
  113. if (!cdev->kmap.addr)
  114. return -ENOMEM;
  115. cdev->kmap.start = lldi->vr->key.start;
  116. spin_lock_init(&cdev->kmap.lock);
  117. return 0;
  118. }
  119. static int get_new_keyid(struct chtls_sock *csk, u32 optname)
  120. {
  121. struct net_device *dev = csk->egress_dev;
  122. struct chtls_dev *cdev = csk->cdev;
  123. struct chtls_hws *hws;
  124. struct adapter *adap;
  125. int keyid;
  126. adap = netdev2adap(dev);
  127. hws = &csk->tlshws;
  128. spin_lock_bh(&cdev->kmap.lock);
  129. keyid = find_first_zero_bit(cdev->kmap.addr, cdev->kmap.size);
  130. if (keyid < cdev->kmap.size) {
  131. __set_bit(keyid, cdev->kmap.addr);
  132. if (optname == TLS_RX)
  133. hws->rxkey = keyid;
  134. else
  135. hws->txkey = keyid;
  136. atomic_inc(&adap->chcr_stats.tls_key);
  137. } else {
  138. keyid = -1;
  139. }
  140. spin_unlock_bh(&cdev->kmap.lock);
  141. return keyid;
  142. }
  143. void free_tls_keyid(struct sock *sk)
  144. {
  145. struct chtls_sock *csk = rcu_dereference_sk_user_data(sk);
  146. struct net_device *dev = csk->egress_dev;
  147. struct chtls_dev *cdev = csk->cdev;
  148. struct chtls_hws *hws;
  149. struct adapter *adap;
  150. if (!cdev->kmap.addr)
  151. return;
  152. adap = netdev2adap(dev);
  153. hws = &csk->tlshws;
  154. spin_lock_bh(&cdev->kmap.lock);
  155. if (hws->rxkey >= 0) {
  156. __clear_bit(hws->rxkey, cdev->kmap.addr);
  157. atomic_dec(&adap->chcr_stats.tls_key);
  158. hws->rxkey = -1;
  159. }
  160. if (hws->txkey >= 0) {
  161. __clear_bit(hws->txkey, cdev->kmap.addr);
  162. atomic_dec(&adap->chcr_stats.tls_key);
  163. hws->txkey = -1;
  164. }
  165. spin_unlock_bh(&cdev->kmap.lock);
  166. }
  167. unsigned int keyid_to_addr(int start_addr, int keyid)
  168. {
  169. return (start_addr + (keyid * TLS_KEY_CONTEXT_SZ)) >> 5;
  170. }
  171. static void chtls_rxkey_ivauth(struct _key_ctx *kctx)
  172. {
  173. kctx->iv_to_auth = cpu_to_be64(KEYCTX_TX_WR_IV_V(6ULL) |
  174. KEYCTX_TX_WR_AAD_V(1ULL) |
  175. KEYCTX_TX_WR_AADST_V(5ULL) |
  176. KEYCTX_TX_WR_CIPHER_V(14ULL) |
  177. KEYCTX_TX_WR_CIPHERST_V(0ULL) |
  178. KEYCTX_TX_WR_AUTH_V(14ULL) |
  179. KEYCTX_TX_WR_AUTHST_V(16ULL) |
  180. KEYCTX_TX_WR_AUTHIN_V(16ULL));
  181. }
  182. static int chtls_key_info(struct chtls_sock *csk,
  183. struct _key_ctx *kctx,
  184. u32 keylen, u32 optname)
  185. {
  186. unsigned char key[AES_KEYSIZE_128];
  187. struct tls12_crypto_info_aes_gcm_128 *gcm_ctx;
  188. unsigned char ghash_h[AEAD_H_SIZE];
  189. struct crypto_cipher *cipher;
  190. int ck_size, key_ctx_size;
  191. int ret;
  192. gcm_ctx = (struct tls12_crypto_info_aes_gcm_128 *)
  193. &csk->tlshws.crypto_info;
  194. key_ctx_size = sizeof(struct _key_ctx) +
  195. roundup(keylen, 16) + AEAD_H_SIZE;
  196. if (keylen == AES_KEYSIZE_128) {
  197. ck_size = CHCR_KEYCTX_CIPHER_KEY_SIZE_128;
  198. } else {
  199. pr_err("GCM: Invalid key length %d\n", keylen);
  200. return -EINVAL;
  201. }
  202. memcpy(key, gcm_ctx->key, keylen);
  203. /* Calculate the H = CIPH(K, 0 repeated 16 times).
  204. * It will go in key context
  205. */
  206. cipher = crypto_alloc_cipher("aes", 0, 0);
  207. if (IS_ERR(cipher)) {
  208. ret = -ENOMEM;
  209. goto out;
  210. }
  211. ret = crypto_cipher_setkey(cipher, key, keylen);
  212. if (ret)
  213. goto out1;
  214. memset(ghash_h, 0, AEAD_H_SIZE);
  215. crypto_cipher_encrypt_one(cipher, ghash_h, ghash_h);
  216. csk->tlshws.keylen = key_ctx_size;
  217. /* Copy the Key context */
  218. if (optname == TLS_RX) {
  219. int key_ctx;
  220. key_ctx = ((key_ctx_size >> 4) << 3);
  221. kctx->ctx_hdr = FILL_KEY_CRX_HDR(ck_size,
  222. CHCR_KEYCTX_MAC_KEY_SIZE_128,
  223. 0, 0, key_ctx);
  224. chtls_rxkey_ivauth(kctx);
  225. } else {
  226. kctx->ctx_hdr = FILL_KEY_CTX_HDR(ck_size,
  227. CHCR_KEYCTX_MAC_KEY_SIZE_128,
  228. 0, 0, key_ctx_size >> 4);
  229. }
  230. memcpy(kctx->salt, gcm_ctx->salt, TLS_CIPHER_AES_GCM_128_SALT_SIZE);
  231. memcpy(kctx->key, gcm_ctx->key, keylen);
  232. memcpy(kctx->key + keylen, ghash_h, AEAD_H_SIZE);
  233. /* erase key info from driver */
  234. memset(gcm_ctx->key, 0, keylen);
  235. out1:
  236. crypto_free_cipher(cipher);
  237. out:
  238. return ret;
  239. }
  240. static void chtls_set_scmd(struct chtls_sock *csk)
  241. {
  242. struct chtls_hws *hws = &csk->tlshws;
  243. hws->scmd.seqno_numivs =
  244. SCMD_SEQ_NO_CTRL_V(3) |
  245. SCMD_PROTO_VERSION_V(0) |
  246. SCMD_ENC_DEC_CTRL_V(0) |
  247. SCMD_CIPH_AUTH_SEQ_CTRL_V(1) |
  248. SCMD_CIPH_MODE_V(2) |
  249. SCMD_AUTH_MODE_V(4) |
  250. SCMD_HMAC_CTRL_V(0) |
  251. SCMD_IV_SIZE_V(4) |
  252. SCMD_NUM_IVS_V(1);
  253. hws->scmd.ivgen_hdrlen =
  254. SCMD_IV_GEN_CTRL_V(1) |
  255. SCMD_KEY_CTX_INLINE_V(0) |
  256. SCMD_TLS_FRAG_ENABLE_V(1);
  257. }
  258. int chtls_setkey(struct chtls_sock *csk, u32 keylen, u32 optname)
  259. {
  260. struct tls_key_req *kwr;
  261. struct chtls_dev *cdev;
  262. struct _key_ctx *kctx;
  263. int wrlen, klen, len;
  264. struct sk_buff *skb;
  265. struct sock *sk;
  266. int keyid;
  267. int kaddr;
  268. int ret;
  269. cdev = csk->cdev;
  270. sk = csk->sk;
  271. klen = roundup((keylen + AEAD_H_SIZE) + sizeof(*kctx), 32);
  272. wrlen = roundup(sizeof(*kwr), 16);
  273. len = klen + wrlen;
  274. /* Flush out-standing data before new key takes effect */
  275. if (optname == TLS_TX) {
  276. lock_sock(sk);
  277. if (skb_queue_len(&csk->txq))
  278. chtls_push_frames(csk, 0);
  279. release_sock(sk);
  280. }
  281. skb = alloc_skb(len, GFP_KERNEL);
  282. if (!skb)
  283. return -ENOMEM;
  284. keyid = get_new_keyid(csk, optname);
  285. if (keyid < 0) {
  286. ret = -ENOSPC;
  287. goto out_nokey;
  288. }
  289. kaddr = keyid_to_addr(cdev->kmap.start, keyid);
  290. kwr = (struct tls_key_req *)__skb_put_zero(skb, len);
  291. kwr->wr.op_to_compl =
  292. cpu_to_be32(FW_WR_OP_V(FW_ULPTX_WR) | FW_WR_COMPL_F |
  293. FW_WR_ATOMIC_V(1U));
  294. kwr->wr.flowid_len16 =
  295. cpu_to_be32(FW_WR_LEN16_V(DIV_ROUND_UP(len, 16) |
  296. FW_WR_FLOWID_V(csk->tid)));
  297. kwr->wr.protocol = 0;
  298. kwr->wr.mfs = htons(TLS_MFS);
  299. kwr->wr.reneg_to_write_rx = optname;
  300. /* ulptx command */
  301. kwr->req.cmd = cpu_to_be32(ULPTX_CMD_V(ULP_TX_MEM_WRITE) |
  302. T5_ULP_MEMIO_ORDER_V(1) |
  303. T5_ULP_MEMIO_IMM_V(1));
  304. kwr->req.len16 = cpu_to_be32((csk->tid << 8) |
  305. DIV_ROUND_UP(len - sizeof(kwr->wr), 16));
  306. kwr->req.dlen = cpu_to_be32(ULP_MEMIO_DATA_LEN_V(klen >> 5));
  307. kwr->req.lock_addr = cpu_to_be32(ULP_MEMIO_ADDR_V(kaddr));
  308. /* sub command */
  309. kwr->sc_imm.cmd_more = cpu_to_be32(ULPTX_CMD_V(ULP_TX_SC_IMM));
  310. kwr->sc_imm.len = cpu_to_be32(klen);
  311. /* key info */
  312. kctx = (struct _key_ctx *)(kwr + 1);
  313. ret = chtls_key_info(csk, kctx, keylen, optname);
  314. if (ret)
  315. goto out_notcb;
  316. set_wr_txq(skb, CPL_PRIORITY_DATA, csk->tlshws.txqid);
  317. csk->wr_credits -= DIV_ROUND_UP(len, 16);
  318. csk->wr_unacked += DIV_ROUND_UP(len, 16);
  319. enqueue_wr(csk, skb);
  320. cxgb4_ofld_send(csk->egress_dev, skb);
  321. chtls_set_scmd(csk);
  322. /* Clear quiesce for Rx key */
  323. if (optname == TLS_RX) {
  324. ret = chtls_set_tcb_keyid(sk, keyid);
  325. if (ret)
  326. goto out_notcb;
  327. ret = chtls_set_tcb_field(sk, 0,
  328. TCB_ULP_RAW_V(TCB_ULP_RAW_M),
  329. TCB_ULP_RAW_V((TF_TLS_KEY_SIZE_V(1) |
  330. TF_TLS_CONTROL_V(1) |
  331. TF_TLS_ACTIVE_V(1) |
  332. TF_TLS_ENABLE_V(1))));
  333. if (ret)
  334. goto out_notcb;
  335. ret = chtls_set_tcb_seqno(sk);
  336. if (ret)
  337. goto out_notcb;
  338. ret = chtls_set_tcb_quiesce(sk, 0);
  339. if (ret)
  340. goto out_notcb;
  341. csk->tlshws.rxkey = keyid;
  342. } else {
  343. csk->tlshws.tx_seq_no = 0;
  344. csk->tlshws.txkey = keyid;
  345. }
  346. return ret;
  347. out_notcb:
  348. free_tls_keyid(sk);
  349. out_nokey:
  350. kfree_skb(skb);
  351. return ret;
  352. }