xref: /freebsd/sys/dev/cxgbe/crypto/t4_keyctx.c (revision fdafd315ad0d0f28a11b9fb4476a9ab059c62b92)
1a1b2b6e1SJohn Baldwin /*-
2a1b2b6e1SJohn Baldwin  * Copyright (c) 2017-2019 Chelsio Communications, Inc.
3a1b2b6e1SJohn Baldwin  * All rights reserved.
4a1b2b6e1SJohn Baldwin  * Written by: John Baldwin <jhb@FreeBSD.org>
5a1b2b6e1SJohn Baldwin  *
6a1b2b6e1SJohn Baldwin  * Redistribution and use in source and binary forms, with or without
7a1b2b6e1SJohn Baldwin  * modification, are permitted provided that the following conditions
8a1b2b6e1SJohn Baldwin  * are met:
9a1b2b6e1SJohn Baldwin  * 1. Redistributions of source code must retain the above copyright
10a1b2b6e1SJohn Baldwin  *    notice, this list of conditions and the following disclaimer.
11a1b2b6e1SJohn Baldwin  * 2. Redistributions in binary form must reproduce the above copyright
12a1b2b6e1SJohn Baldwin  *    notice, this list of conditions and the following disclaimer in the
13a1b2b6e1SJohn Baldwin  *    documentation and/or other materials provided with the distribution.
14a1b2b6e1SJohn Baldwin  *
15a1b2b6e1SJohn Baldwin  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16a1b2b6e1SJohn Baldwin  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17a1b2b6e1SJohn Baldwin  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18a1b2b6e1SJohn Baldwin  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19a1b2b6e1SJohn Baldwin  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20a1b2b6e1SJohn Baldwin  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21a1b2b6e1SJohn Baldwin  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22a1b2b6e1SJohn Baldwin  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23a1b2b6e1SJohn Baldwin  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24a1b2b6e1SJohn Baldwin  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25a1b2b6e1SJohn Baldwin  * SUCH DAMAGE.
26a1b2b6e1SJohn Baldwin  */
27a1b2b6e1SJohn Baldwin 
2818c69734SJohn Baldwin #include "opt_kern_tls.h"
2918c69734SJohn Baldwin 
30a1b2b6e1SJohn Baldwin #include <sys/types.h>
3118c69734SJohn Baldwin #include <sys/ktls.h>
32a1b2b6e1SJohn Baldwin #include <sys/malloc.h>
33a1b2b6e1SJohn Baldwin 
34a1b2b6e1SJohn Baldwin #include <opencrypto/cryptodev.h>
35a1b2b6e1SJohn Baldwin #include <opencrypto/xform.h>
36a1b2b6e1SJohn Baldwin 
37a1b2b6e1SJohn Baldwin #include "common/common.h"
38a1b2b6e1SJohn Baldwin #include "crypto/t4_crypto.h"
39a1b2b6e1SJohn Baldwin 
40a1b2b6e1SJohn Baldwin /*
41a1b2b6e1SJohn Baldwin  * Crypto operations use a key context to store cipher keys and
42a1b2b6e1SJohn Baldwin  * partial hash digests.  They can either be passed inline as part of
43a1b2b6e1SJohn Baldwin  * a work request using crypto or they can be stored in card RAM.  For
44a1b2b6e1SJohn Baldwin  * the latter case, work requests must replace the inline key context
45a1b2b6e1SJohn Baldwin  * with a request to read the context from card RAM.
46a1b2b6e1SJohn Baldwin  *
47a1b2b6e1SJohn Baldwin  * The format of a key context:
48a1b2b6e1SJohn Baldwin  *
49a1b2b6e1SJohn Baldwin  * +-------------------------------+
50a1b2b6e1SJohn Baldwin  * | key context header            |
51a1b2b6e1SJohn Baldwin  * +-------------------------------+
52a1b2b6e1SJohn Baldwin  * | AES key                       |  ----- For requests with AES
53a1b2b6e1SJohn Baldwin  * +-------------------------------+
54a1b2b6e1SJohn Baldwin  * | Hash state                    |  ----- For hash-only requests
55a1b2b6e1SJohn Baldwin  * +-------------------------------+ -
56a1b2b6e1SJohn Baldwin  * | IPAD (16-byte aligned)        |  \
57a1b2b6e1SJohn Baldwin  * +-------------------------------+  +---- For requests with HMAC
58a1b2b6e1SJohn Baldwin  * | OPAD (16-byte aligned)        |  /
59a1b2b6e1SJohn Baldwin  * +-------------------------------+ -
60a1b2b6e1SJohn Baldwin  * | GMAC H                        |  ----- For AES-GCM
61a1b2b6e1SJohn Baldwin  * +-------------------------------+ -
62a1b2b6e1SJohn Baldwin  */
63a1b2b6e1SJohn Baldwin 
6418c69734SJohn Baldwin /* Fields in the key context header. */
6518c69734SJohn Baldwin #define S_TLS_KEYCTX_TX_WR_DUALCK    12
6618c69734SJohn Baldwin #define M_TLS_KEYCTX_TX_WR_DUALCK    0x1
6718c69734SJohn Baldwin #define V_TLS_KEYCTX_TX_WR_DUALCK(x) ((x) << S_TLS_KEYCTX_TX_WR_DUALCK)
6818c69734SJohn Baldwin #define G_TLS_KEYCTX_TX_WR_DUALCK(x) \
6918c69734SJohn Baldwin     (((x) >> S_TLS_KEYCTX_TX_WR_DUALCK) & M_TLS_KEYCTX_TX_WR_DUALCK)
7018c69734SJohn Baldwin #define F_TLS_KEYCTX_TX_WR_DUALCK    V_TLS_KEYCTX_TX_WR_DUALCK(1U)
7118c69734SJohn Baldwin 
7218c69734SJohn Baldwin #define S_TLS_KEYCTX_TX_WR_TXOPAD_PRESENT 11
7318c69734SJohn Baldwin #define M_TLS_KEYCTX_TX_WR_TXOPAD_PRESENT 0x1
7418c69734SJohn Baldwin #define V_TLS_KEYCTX_TX_WR_TXOPAD_PRESENT(x) \
7518c69734SJohn Baldwin     ((x) << S_TLS_KEYCTX_TX_WR_TXOPAD_PRESENT)
7618c69734SJohn Baldwin #define G_TLS_KEYCTX_TX_WR_TXOPAD_PRESENT(x) \
7718c69734SJohn Baldwin     (((x) >> S_TLS_KEYCTX_TX_WR_TXOPAD_PRESENT) & \
7818c69734SJohn Baldwin      M_TLS_KEYCTX_TX_WR_TXOPAD_PRESENT)
7918c69734SJohn Baldwin #define F_TLS_KEYCTX_TX_WR_TXOPAD_PRESENT \
8018c69734SJohn Baldwin     V_TLS_KEYCTX_TX_WR_TXOPAD_PRESENT(1U)
8118c69734SJohn Baldwin 
8218c69734SJohn Baldwin #define S_TLS_KEYCTX_TX_WR_SALT_PRESENT 10
8318c69734SJohn Baldwin #define M_TLS_KEYCTX_TX_WR_SALT_PRESENT 0x1
8418c69734SJohn Baldwin #define V_TLS_KEYCTX_TX_WR_SALT_PRESENT(x) \
8518c69734SJohn Baldwin     ((x) << S_TLS_KEYCTX_TX_WR_SALT_PRESENT)
8618c69734SJohn Baldwin #define G_TLS_KEYCTX_TX_WR_SALT_PRESENT(x) \
8718c69734SJohn Baldwin     (((x) >> S_TLS_KEYCTX_TX_WR_SALT_PRESENT) & \
8818c69734SJohn Baldwin      M_TLS_KEYCTX_TX_WR_SALT_PRESENT)
8918c69734SJohn Baldwin #define F_TLS_KEYCTX_TX_WR_SALT_PRESENT \
9018c69734SJohn Baldwin     V_TLS_KEYCTX_TX_WR_SALT_PRESENT(1U)
9118c69734SJohn Baldwin 
9218c69734SJohn Baldwin #define S_TLS_KEYCTX_TX_WR_TXCK_SIZE 6
9318c69734SJohn Baldwin #define M_TLS_KEYCTX_TX_WR_TXCK_SIZE 0xf
9418c69734SJohn Baldwin #define V_TLS_KEYCTX_TX_WR_TXCK_SIZE(x) \
9518c69734SJohn Baldwin     ((x) << S_TLS_KEYCTX_TX_WR_TXCK_SIZE)
9618c69734SJohn Baldwin #define G_TLS_KEYCTX_TX_WR_TXCK_SIZE(x) \
9718c69734SJohn Baldwin     (((x) >> S_TLS_KEYCTX_TX_WR_TXCK_SIZE) & \
9818c69734SJohn Baldwin      M_TLS_KEYCTX_TX_WR_TXCK_SIZE)
9918c69734SJohn Baldwin 
10018c69734SJohn Baldwin #define S_TLS_KEYCTX_TX_WR_TXMK_SIZE 2
10118c69734SJohn Baldwin #define M_TLS_KEYCTX_TX_WR_TXMK_SIZE 0xf
10218c69734SJohn Baldwin #define V_TLS_KEYCTX_TX_WR_TXMK_SIZE(x) \
10318c69734SJohn Baldwin     ((x) << S_TLS_KEYCTX_TX_WR_TXMK_SIZE)
10418c69734SJohn Baldwin #define G_TLS_KEYCTX_TX_WR_TXMK_SIZE(x) \
10518c69734SJohn Baldwin     (((x) >> S_TLS_KEYCTX_TX_WR_TXMK_SIZE) & \
10618c69734SJohn Baldwin      M_TLS_KEYCTX_TX_WR_TXMK_SIZE)
10718c69734SJohn Baldwin 
10818c69734SJohn Baldwin #define S_TLS_KEYCTX_TX_WR_TXVALID   0
10918c69734SJohn Baldwin #define M_TLS_KEYCTX_TX_WR_TXVALID   0x1
11018c69734SJohn Baldwin #define V_TLS_KEYCTX_TX_WR_TXVALID(x) \
11118c69734SJohn Baldwin     ((x) << S_TLS_KEYCTX_TX_WR_TXVALID)
11218c69734SJohn Baldwin #define G_TLS_KEYCTX_TX_WR_TXVALID(x) \
11318c69734SJohn Baldwin     (((x) >> S_TLS_KEYCTX_TX_WR_TXVALID) & M_TLS_KEYCTX_TX_WR_TXVALID)
11418c69734SJohn Baldwin #define F_TLS_KEYCTX_TX_WR_TXVALID   V_TLS_KEYCTX_TX_WR_TXVALID(1U)
11518c69734SJohn Baldwin 
11618c69734SJohn Baldwin #define S_TLS_KEYCTX_TX_WR_FLITCNT   3
11718c69734SJohn Baldwin #define M_TLS_KEYCTX_TX_WR_FLITCNT   0x1f
11818c69734SJohn Baldwin #define V_TLS_KEYCTX_TX_WR_FLITCNT(x) \
11918c69734SJohn Baldwin     ((x) << S_TLS_KEYCTX_TX_WR_FLITCNT)
12018c69734SJohn Baldwin #define G_TLS_KEYCTX_TX_WR_FLITCNT(x) \
12118c69734SJohn Baldwin     (((x) >> S_TLS_KEYCTX_TX_WR_FLITCNT) & M_TLS_KEYCTX_TX_WR_FLITCNT)
12218c69734SJohn Baldwin 
12318c69734SJohn Baldwin #define S_TLS_KEYCTX_TX_WR_HMACCTRL  0
12418c69734SJohn Baldwin #define M_TLS_KEYCTX_TX_WR_HMACCTRL  0x7
12518c69734SJohn Baldwin #define V_TLS_KEYCTX_TX_WR_HMACCTRL(x) \
12618c69734SJohn Baldwin     ((x) << S_TLS_KEYCTX_TX_WR_HMACCTRL)
12718c69734SJohn Baldwin #define G_TLS_KEYCTX_TX_WR_HMACCTRL(x) \
12818c69734SJohn Baldwin     (((x) >> S_TLS_KEYCTX_TX_WR_HMACCTRL) & M_TLS_KEYCTX_TX_WR_HMACCTRL)
12918c69734SJohn Baldwin 
13018c69734SJohn Baldwin #define S_TLS_KEYCTX_TX_WR_PROTOVER  4
13118c69734SJohn Baldwin #define M_TLS_KEYCTX_TX_WR_PROTOVER  0xf
13218c69734SJohn Baldwin #define V_TLS_KEYCTX_TX_WR_PROTOVER(x) \
13318c69734SJohn Baldwin     ((x) << S_TLS_KEYCTX_TX_WR_PROTOVER)
13418c69734SJohn Baldwin #define G_TLS_KEYCTX_TX_WR_PROTOVER(x) \
13518c69734SJohn Baldwin     (((x) >> S_TLS_KEYCTX_TX_WR_PROTOVER) & M_TLS_KEYCTX_TX_WR_PROTOVER)
13618c69734SJohn Baldwin 
13718c69734SJohn Baldwin #define S_TLS_KEYCTX_TX_WR_CIPHMODE  0
13818c69734SJohn Baldwin #define M_TLS_KEYCTX_TX_WR_CIPHMODE  0xf
13918c69734SJohn Baldwin #define V_TLS_KEYCTX_TX_WR_CIPHMODE(x) \
14018c69734SJohn Baldwin     ((x) << S_TLS_KEYCTX_TX_WR_CIPHMODE)
14118c69734SJohn Baldwin #define G_TLS_KEYCTX_TX_WR_CIPHMODE(x) \
14218c69734SJohn Baldwin     (((x) >> S_TLS_KEYCTX_TX_WR_CIPHMODE) & M_TLS_KEYCTX_TX_WR_CIPHMODE)
14318c69734SJohn Baldwin 
14418c69734SJohn Baldwin #define S_TLS_KEYCTX_TX_WR_AUTHMODE  4
14518c69734SJohn Baldwin #define M_TLS_KEYCTX_TX_WR_AUTHMODE  0xf
14618c69734SJohn Baldwin #define V_TLS_KEYCTX_TX_WR_AUTHMODE(x) \
14718c69734SJohn Baldwin     ((x) << S_TLS_KEYCTX_TX_WR_AUTHMODE)
14818c69734SJohn Baldwin #define G_TLS_KEYCTX_TX_WR_AUTHMODE(x) \
14918c69734SJohn Baldwin     (((x) >> S_TLS_KEYCTX_TX_WR_AUTHMODE) & M_TLS_KEYCTX_TX_WR_AUTHMODE)
15018c69734SJohn Baldwin 
15118c69734SJohn Baldwin #define S_TLS_KEYCTX_TX_WR_CIPHAUTHSEQCTRL 3
15218c69734SJohn Baldwin #define M_TLS_KEYCTX_TX_WR_CIPHAUTHSEQCTRL 0x1
15318c69734SJohn Baldwin #define V_TLS_KEYCTX_TX_WR_CIPHAUTHSEQCTRL(x) \
15418c69734SJohn Baldwin     ((x) << S_TLS_KEYCTX_TX_WR_CIPHAUTHSEQCTRL)
15518c69734SJohn Baldwin #define G_TLS_KEYCTX_TX_WR_CIPHAUTHSEQCTRL(x) \
15618c69734SJohn Baldwin     (((x) >> S_TLS_KEYCTX_TX_WR_CIPHAUTHSEQCTRL) & \
15718c69734SJohn Baldwin      M_TLS_KEYCTX_TX_WR_CIPHAUTHSEQCTRL)
15818c69734SJohn Baldwin #define F_TLS_KEYCTX_TX_WR_CIPHAUTHSEQCTRL \
15918c69734SJohn Baldwin     V_TLS_KEYCTX_TX_WR_CIPHAUTHSEQCTRL(1U)
16018c69734SJohn Baldwin 
16118c69734SJohn Baldwin #define S_TLS_KEYCTX_TX_WR_SEQNUMCTRL 1
16218c69734SJohn Baldwin #define M_TLS_KEYCTX_TX_WR_SEQNUMCTRL 0x3
16318c69734SJohn Baldwin #define V_TLS_KEYCTX_TX_WR_SEQNUMCTRL(x) \
16418c69734SJohn Baldwin     ((x) << S_TLS_KEYCTX_TX_WR_SEQNUMCTRL)
16518c69734SJohn Baldwin #define G_TLS_KEYCTX_TX_WR_SEQNUMCTRL(x) \
16618c69734SJohn Baldwin     (((x) >> S_TLS_KEYCTX_TX_WR_SEQNUMCTRL) & \
16718c69734SJohn Baldwin      M_TLS_KEYCTX_TX_WR_SEQNUMCTRL)
16818c69734SJohn Baldwin 
16918c69734SJohn Baldwin #define S_TLS_KEYCTX_TX_WR_RXVALID   0
17018c69734SJohn Baldwin #define M_TLS_KEYCTX_TX_WR_RXVALID   0x1
17118c69734SJohn Baldwin #define V_TLS_KEYCTX_TX_WR_RXVALID(x) \
17218c69734SJohn Baldwin     ((x) << S_TLS_KEYCTX_TX_WR_RXVALID)
17318c69734SJohn Baldwin #define G_TLS_KEYCTX_TX_WR_RXVALID(x) \
17418c69734SJohn Baldwin     (((x) >> S_TLS_KEYCTX_TX_WR_RXVALID) & M_TLS_KEYCTX_TX_WR_RXVALID)
17518c69734SJohn Baldwin #define F_TLS_KEYCTX_TX_WR_RXVALID   V_TLS_KEYCTX_TX_WR_RXVALID(1U)
17618c69734SJohn Baldwin 
17718c69734SJohn Baldwin #define S_TLS_KEYCTX_TX_WR_IVPRESENT 7
17818c69734SJohn Baldwin #define M_TLS_KEYCTX_TX_WR_IVPRESENT 0x1
17918c69734SJohn Baldwin #define V_TLS_KEYCTX_TX_WR_IVPRESENT(x) \
18018c69734SJohn Baldwin     ((x) << S_TLS_KEYCTX_TX_WR_IVPRESENT)
18118c69734SJohn Baldwin #define G_TLS_KEYCTX_TX_WR_IVPRESENT(x) \
18218c69734SJohn Baldwin     (((x) >> S_TLS_KEYCTX_TX_WR_IVPRESENT) & \
18318c69734SJohn Baldwin      M_TLS_KEYCTX_TX_WR_IVPRESENT)
18418c69734SJohn Baldwin #define F_TLS_KEYCTX_TX_WR_IVPRESENT V_TLS_KEYCTX_TX_WR_IVPRESENT(1U)
18518c69734SJohn Baldwin 
18618c69734SJohn Baldwin #define S_TLS_KEYCTX_TX_WR_RXOPAD_PRESENT 6
18718c69734SJohn Baldwin #define M_TLS_KEYCTX_TX_WR_RXOPAD_PRESENT 0x1
18818c69734SJohn Baldwin #define V_TLS_KEYCTX_TX_WR_RXOPAD_PRESENT(x) \
18918c69734SJohn Baldwin     ((x) << S_TLS_KEYCTX_TX_WR_RXOPAD_PRESENT)
19018c69734SJohn Baldwin #define G_TLS_KEYCTX_TX_WR_RXOPAD_PRESENT(x) \
19118c69734SJohn Baldwin     (((x) >> S_TLS_KEYCTX_TX_WR_RXOPAD_PRESENT) & \
19218c69734SJohn Baldwin      M_TLS_KEYCTX_TX_WR_RXOPAD_PRESENT)
19318c69734SJohn Baldwin #define F_TLS_KEYCTX_TX_WR_RXOPAD_PRESENT \
19418c69734SJohn Baldwin     V_TLS_KEYCTX_TX_WR_RXOPAD_PRESENT(1U)
19518c69734SJohn Baldwin 
19618c69734SJohn Baldwin #define S_TLS_KEYCTX_TX_WR_RXCK_SIZE 3
19718c69734SJohn Baldwin #define M_TLS_KEYCTX_TX_WR_RXCK_SIZE 0x7
19818c69734SJohn Baldwin #define V_TLS_KEYCTX_TX_WR_RXCK_SIZE(x) \
19918c69734SJohn Baldwin     ((x) << S_TLS_KEYCTX_TX_WR_RXCK_SIZE)
20018c69734SJohn Baldwin #define G_TLS_KEYCTX_TX_WR_RXCK_SIZE(x) \
20118c69734SJohn Baldwin     (((x) >> S_TLS_KEYCTX_TX_WR_RXCK_SIZE) & \
20218c69734SJohn Baldwin      M_TLS_KEYCTX_TX_WR_RXCK_SIZE)
20318c69734SJohn Baldwin 
20418c69734SJohn Baldwin #define S_TLS_KEYCTX_TX_WR_RXMK_SIZE 0
20518c69734SJohn Baldwin #define M_TLS_KEYCTX_TX_WR_RXMK_SIZE 0x7
20618c69734SJohn Baldwin #define V_TLS_KEYCTX_TX_WR_RXMK_SIZE(x) \
20718c69734SJohn Baldwin     ((x) << S_TLS_KEYCTX_TX_WR_RXMK_SIZE)
20818c69734SJohn Baldwin #define G_TLS_KEYCTX_TX_WR_RXMK_SIZE(x) \
20918c69734SJohn Baldwin     (((x) >> S_TLS_KEYCTX_TX_WR_RXMK_SIZE) & \
21018c69734SJohn Baldwin      M_TLS_KEYCTX_TX_WR_RXMK_SIZE)
21118c69734SJohn Baldwin 
21218c69734SJohn Baldwin #define S_TLS_KEYCTX_TX_WR_IVINSERT  55
21318c69734SJohn Baldwin #define M_TLS_KEYCTX_TX_WR_IVINSERT  0x1ffULL
21418c69734SJohn Baldwin #define V_TLS_KEYCTX_TX_WR_IVINSERT(x) \
21518c69734SJohn Baldwin     ((x) << S_TLS_KEYCTX_TX_WR_IVINSERT)
21618c69734SJohn Baldwin #define G_TLS_KEYCTX_TX_WR_IVINSERT(x) \
21718c69734SJohn Baldwin     (((x) >> S_TLS_KEYCTX_TX_WR_IVINSERT) & M_TLS_KEYCTX_TX_WR_IVINSERT)
21818c69734SJohn Baldwin 
21918c69734SJohn Baldwin #define S_TLS_KEYCTX_TX_WR_AADSTRTOFST 47
22018c69734SJohn Baldwin #define M_TLS_KEYCTX_TX_WR_AADSTRTOFST 0xffULL
22118c69734SJohn Baldwin #define V_TLS_KEYCTX_TX_WR_AADSTRTOFST(x) \
22218c69734SJohn Baldwin     ((x) << S_TLS_KEYCTX_TX_WR_AADSTRTOFST)
22318c69734SJohn Baldwin #define G_TLS_KEYCTX_TX_WR_AADSTRTOFST(x) \
22418c69734SJohn Baldwin     (((x) >> S_TLS_KEYCTX_TX_WR_AADSTRTOFST) & \
22518c69734SJohn Baldwin      M_TLS_KEYCTX_TX_WR_AADSTRTOFST)
22618c69734SJohn Baldwin 
22718c69734SJohn Baldwin #define S_TLS_KEYCTX_TX_WR_AADSTOPOFST 39
22818c69734SJohn Baldwin #define M_TLS_KEYCTX_TX_WR_AADSTOPOFST 0xffULL
22918c69734SJohn Baldwin #define V_TLS_KEYCTX_TX_WR_AADSTOPOFST(x) \
23018c69734SJohn Baldwin     ((x) << S_TLS_KEYCTX_TX_WR_AADSTOPOFST)
23118c69734SJohn Baldwin #define G_TLS_KEYCTX_TX_WR_AADSTOPOFST(x) \
23218c69734SJohn Baldwin     (((x) >> S_TLS_KEYCTX_TX_WR_AADSTOPOFST) & \
23318c69734SJohn Baldwin      M_TLS_KEYCTX_TX_WR_AADSTOPOFST)
23418c69734SJohn Baldwin 
23518c69734SJohn Baldwin #define S_TLS_KEYCTX_TX_WR_CIPHERSRTOFST 30
23618c69734SJohn Baldwin #define M_TLS_KEYCTX_TX_WR_CIPHERSRTOFST 0x1ffULL
23718c69734SJohn Baldwin #define V_TLS_KEYCTX_TX_WR_CIPHERSRTOFST(x) \
23818c69734SJohn Baldwin     ((x) << S_TLS_KEYCTX_TX_WR_CIPHERSRTOFST)
23918c69734SJohn Baldwin #define G_TLS_KEYCTX_TX_WR_CIPHERSRTOFST(x) \
24018c69734SJohn Baldwin     (((x) >> S_TLS_KEYCTX_TX_WR_CIPHERSRTOFST) & \
24118c69734SJohn Baldwin      M_TLS_KEYCTX_TX_WR_CIPHERSRTOFST)
24218c69734SJohn Baldwin 
24318c69734SJohn Baldwin #define S_TLS_KEYCTX_TX_WR_CIPHERSTOPOFST 23
24418c69734SJohn Baldwin #define M_TLS_KEYCTX_TX_WR_CIPHERSTOPOFST 0x7f
24518c69734SJohn Baldwin #define V_TLS_KEYCTX_TX_WR_CIPHERSTOPOFST(x) \
24618c69734SJohn Baldwin     ((x) << S_TLS_KEYCTX_TX_WR_CIPHERSTOPOFST)
24718c69734SJohn Baldwin #define G_TLS_KEYCTX_TX_WR_CIPHERSTOPOFST(x) \
24818c69734SJohn Baldwin     (((x) >> S_TLS_KEYCTX_TX_WR_CIPHERSTOPOFST) & \
24918c69734SJohn Baldwin      M_TLS_KEYCTX_TX_WR_CIPHERSTOPOFST)
25018c69734SJohn Baldwin 
25118c69734SJohn Baldwin #define S_TLS_KEYCTX_TX_WR_AUTHSRTOFST 14
25218c69734SJohn Baldwin #define M_TLS_KEYCTX_TX_WR_AUTHSRTOFST 0x1ff
25318c69734SJohn Baldwin #define V_TLS_KEYCTX_TX_WR_AUTHSRTOFST(x) \
25418c69734SJohn Baldwin     ((x) << S_TLS_KEYCTX_TX_WR_AUTHSRTOFST)
25518c69734SJohn Baldwin #define G_TLS_KEYCTX_TX_WR_AUTHSRTOFST(x) \
25618c69734SJohn Baldwin     (((x) >> S_TLS_KEYCTX_TX_WR_AUTHSRTOFST) & \
25718c69734SJohn Baldwin      M_TLS_KEYCTX_TX_WR_AUTHSRTOFST)
25818c69734SJohn Baldwin 
25918c69734SJohn Baldwin #define S_TLS_KEYCTX_TX_WR_AUTHSTOPOFST 7
26018c69734SJohn Baldwin #define M_TLS_KEYCTX_TX_WR_AUTHSTOPOFST 0x7f
26118c69734SJohn Baldwin #define V_TLS_KEYCTX_TX_WR_AUTHSTOPOFST(x) \
26218c69734SJohn Baldwin     ((x) << S_TLS_KEYCTX_TX_WR_AUTHSTOPOFST)
26318c69734SJohn Baldwin #define G_TLS_KEYCTX_TX_WR_AUTHSTOPOFST(x) \
26418c69734SJohn Baldwin     (((x) >> S_TLS_KEYCTX_TX_WR_AUTHSTOPOFST) & \
26518c69734SJohn Baldwin      M_TLS_KEYCTX_TX_WR_AUTHSTOPOFST)
26618c69734SJohn Baldwin 
26718c69734SJohn Baldwin #define S_TLS_KEYCTX_TX_WR_AUTHINSRT 0
26818c69734SJohn Baldwin #define M_TLS_KEYCTX_TX_WR_AUTHINSRT 0x7f
26918c69734SJohn Baldwin #define V_TLS_KEYCTX_TX_WR_AUTHINSRT(x) \
27018c69734SJohn Baldwin     ((x) << S_TLS_KEYCTX_TX_WR_AUTHINSRT)
27118c69734SJohn Baldwin #define G_TLS_KEYCTX_TX_WR_AUTHINSRT(x) \
27218c69734SJohn Baldwin     (((x) >> S_TLS_KEYCTX_TX_WR_AUTHINSRT) & \
27318c69734SJohn Baldwin      M_TLS_KEYCTX_TX_WR_AUTHINSRT)
27418c69734SJohn Baldwin 
27518c69734SJohn Baldwin /* Key Context Programming Operation type */
27618c69734SJohn Baldwin #define KEY_WRITE_RX			0x1
27718c69734SJohn Baldwin #define KEY_WRITE_TX			0x2
27818c69734SJohn Baldwin #define KEY_DELETE_RX			0x4
27918c69734SJohn Baldwin #define KEY_DELETE_TX			0x8
28018c69734SJohn Baldwin 
28118c69734SJohn Baldwin #define S_KEY_CLR_LOC		4
28218c69734SJohn Baldwin #define M_KEY_CLR_LOC		0xf
28318c69734SJohn Baldwin #define V_KEY_CLR_LOC(x)	((x) << S_KEY_CLR_LOC)
28418c69734SJohn Baldwin #define G_KEY_CLR_LOC(x)	(((x) >> S_KEY_CLR_LOC) & M_KEY_CLR_LOC)
28518c69734SJohn Baldwin #define F_KEY_CLR_LOC		V_KEY_CLR_LOC(1U)
28618c69734SJohn Baldwin 
28718c69734SJohn Baldwin #define S_KEY_GET_LOC           0
28818c69734SJohn Baldwin #define M_KEY_GET_LOC           0xf
28918c69734SJohn Baldwin #define V_KEY_GET_LOC(x)        ((x) << S_KEY_GET_LOC)
29018c69734SJohn Baldwin #define G_KEY_GET_LOC(x)        (((x) >> S_KEY_GET_LOC) & M_KEY_GET_LOC)
29118c69734SJohn Baldwin 
292a1b2b6e1SJohn Baldwin /*
293a1b2b6e1SJohn Baldwin  * Generate the initial GMAC hash state for a AES-GCM key.
294a1b2b6e1SJohn Baldwin  *
295a1b2b6e1SJohn Baldwin  * Borrowed from AES_GMAC_Setkey().
296a1b2b6e1SJohn Baldwin  */
297a1b2b6e1SJohn Baldwin void
t4_init_gmac_hash(const char * key,int klen,char * ghash)298a1b2b6e1SJohn Baldwin t4_init_gmac_hash(const char *key, int klen, char *ghash)
299a1b2b6e1SJohn Baldwin {
300a1b2b6e1SJohn Baldwin 	static char zeroes[GMAC_BLOCK_LEN];
301a1b2b6e1SJohn Baldwin 	uint32_t keysched[4 * (RIJNDAEL_MAXNR + 1)];
302a1b2b6e1SJohn Baldwin 	int rounds;
303a1b2b6e1SJohn Baldwin 
304c0341432SJohn Baldwin 	rounds = rijndaelKeySetupEnc(keysched, key, klen * 8);
305a1b2b6e1SJohn Baldwin 	rijndaelEncrypt(keysched, rounds, zeroes, ghash);
3060065d9a4SJohn Baldwin 	explicit_bzero(keysched, sizeof(keysched));
307a1b2b6e1SJohn Baldwin }
308a1b2b6e1SJohn Baldwin 
309a1b2b6e1SJohn Baldwin /* Copy out the partial hash state from a software hash implementation. */
310a1b2b6e1SJohn Baldwin void
t4_copy_partial_hash(int alg,union authctx * auth_ctx,void * dst)311a1b2b6e1SJohn Baldwin t4_copy_partial_hash(int alg, union authctx *auth_ctx, void *dst)
312a1b2b6e1SJohn Baldwin {
313a1b2b6e1SJohn Baldwin 	uint32_t *u32;
314a1b2b6e1SJohn Baldwin 	uint64_t *u64;
315a1b2b6e1SJohn Baldwin 	u_int i;
316a1b2b6e1SJohn Baldwin 
317a1b2b6e1SJohn Baldwin 	u32 = (uint32_t *)dst;
318a1b2b6e1SJohn Baldwin 	u64 = (uint64_t *)dst;
319a1b2b6e1SJohn Baldwin 	switch (alg) {
320a1b2b6e1SJohn Baldwin 	case CRYPTO_SHA1:
321a1b2b6e1SJohn Baldwin 	case CRYPTO_SHA1_HMAC:
322a1b2b6e1SJohn Baldwin 		for (i = 0; i < SHA1_HASH_LEN / 4; i++)
323a1b2b6e1SJohn Baldwin 			u32[i] = htobe32(auth_ctx->sha1ctx.h.b32[i]);
324a1b2b6e1SJohn Baldwin 		break;
325a1b2b6e1SJohn Baldwin 	case CRYPTO_SHA2_224:
326a1b2b6e1SJohn Baldwin 	case CRYPTO_SHA2_224_HMAC:
327a1b2b6e1SJohn Baldwin 		for (i = 0; i < SHA2_256_HASH_LEN / 4; i++)
328a1b2b6e1SJohn Baldwin 			u32[i] = htobe32(auth_ctx->sha224ctx.state[i]);
329a1b2b6e1SJohn Baldwin 		break;
330a1b2b6e1SJohn Baldwin 	case CRYPTO_SHA2_256:
331a1b2b6e1SJohn Baldwin 	case CRYPTO_SHA2_256_HMAC:
332a1b2b6e1SJohn Baldwin 		for (i = 0; i < SHA2_256_HASH_LEN / 4; i++)
333a1b2b6e1SJohn Baldwin 			u32[i] = htobe32(auth_ctx->sha256ctx.state[i]);
334a1b2b6e1SJohn Baldwin 		break;
335a1b2b6e1SJohn Baldwin 	case CRYPTO_SHA2_384:
336a1b2b6e1SJohn Baldwin 	case CRYPTO_SHA2_384_HMAC:
337a1b2b6e1SJohn Baldwin 		for (i = 0; i < SHA2_512_HASH_LEN / 8; i++)
338a1b2b6e1SJohn Baldwin 			u64[i] = htobe64(auth_ctx->sha384ctx.state[i]);
339a1b2b6e1SJohn Baldwin 		break;
340a1b2b6e1SJohn Baldwin 	case CRYPTO_SHA2_512:
341a1b2b6e1SJohn Baldwin 	case CRYPTO_SHA2_512_HMAC:
342a1b2b6e1SJohn Baldwin 		for (i = 0; i < SHA2_512_HASH_LEN / 8; i++)
343a1b2b6e1SJohn Baldwin 			u64[i] = htobe64(auth_ctx->sha512ctx.state[i]);
344a1b2b6e1SJohn Baldwin 		break;
345a1b2b6e1SJohn Baldwin 	}
346a1b2b6e1SJohn Baldwin }
347a1b2b6e1SJohn Baldwin 
348a1b2b6e1SJohn Baldwin void
t4_init_hmac_digest(const struct auth_hash * axf,u_int partial_digest_len,const char * key,int klen,char * dst)349d8787d4fSMark Johnston t4_init_hmac_digest(const struct auth_hash *axf, u_int partial_digest_len,
350c0341432SJohn Baldwin     const char *key, int klen, char *dst)
351a1b2b6e1SJohn Baldwin {
352a1b2b6e1SJohn Baldwin 	union authctx auth_ctx;
353a1b2b6e1SJohn Baldwin 
354c0341432SJohn Baldwin 	hmac_init_ipad(axf, key, klen, &auth_ctx);
355a1b2b6e1SJohn Baldwin 	t4_copy_partial_hash(axf->type, &auth_ctx, dst);
356a1b2b6e1SJohn Baldwin 
357a1b2b6e1SJohn Baldwin 	dst += roundup2(partial_digest_len, 16);
358c0341432SJohn Baldwin 
359c0341432SJohn Baldwin 	hmac_init_opad(axf, key, klen, &auth_ctx);
360a1b2b6e1SJohn Baldwin 	t4_copy_partial_hash(axf->type, &auth_ctx, dst);
361c0341432SJohn Baldwin 
362c0341432SJohn Baldwin 	explicit_bzero(&auth_ctx, sizeof(auth_ctx));
363a1b2b6e1SJohn Baldwin }
364a1b2b6e1SJohn Baldwin 
365a1b2b6e1SJohn Baldwin /*
366a1b2b6e1SJohn Baldwin  * Borrowed from cesa_prep_aes_key().
367a1b2b6e1SJohn Baldwin  *
368a1b2b6e1SJohn Baldwin  * NB: The crypto engine wants the words in the decryption key in reverse
369a1b2b6e1SJohn Baldwin  * order.
370a1b2b6e1SJohn Baldwin  */
371a1b2b6e1SJohn Baldwin void
t4_aes_getdeckey(void * dec_key,const void * enc_key,unsigned int kbits)372a1b2b6e1SJohn Baldwin t4_aes_getdeckey(void *dec_key, const void *enc_key, unsigned int kbits)
373a1b2b6e1SJohn Baldwin {
374a1b2b6e1SJohn Baldwin 	uint32_t ek[4 * (RIJNDAEL_MAXNR + 1)];
375a1b2b6e1SJohn Baldwin 	uint32_t *dkey;
376a1b2b6e1SJohn Baldwin 	int i;
377a1b2b6e1SJohn Baldwin 
378a1b2b6e1SJohn Baldwin 	rijndaelKeySetupEnc(ek, enc_key, kbits);
379a1b2b6e1SJohn Baldwin 	dkey = dec_key;
380a1b2b6e1SJohn Baldwin 	dkey += (kbits / 8) / 4;
381a1b2b6e1SJohn Baldwin 
382a1b2b6e1SJohn Baldwin 	switch (kbits) {
383a1b2b6e1SJohn Baldwin 	case 128:
384a1b2b6e1SJohn Baldwin 		for (i = 0; i < 4; i++)
385a1b2b6e1SJohn Baldwin 			*--dkey = htobe32(ek[4 * 10 + i]);
386a1b2b6e1SJohn Baldwin 		break;
387a1b2b6e1SJohn Baldwin 	case 192:
388a1b2b6e1SJohn Baldwin 		for (i = 0; i < 2; i++)
389a1b2b6e1SJohn Baldwin 			*--dkey = htobe32(ek[4 * 11 + 2 + i]);
390a1b2b6e1SJohn Baldwin 		for (i = 0; i < 4; i++)
391a1b2b6e1SJohn Baldwin 			*--dkey = htobe32(ek[4 * 12 + i]);
392a1b2b6e1SJohn Baldwin 		break;
393a1b2b6e1SJohn Baldwin 	case 256:
394a1b2b6e1SJohn Baldwin 		for (i = 0; i < 4; i++)
395a1b2b6e1SJohn Baldwin 			*--dkey = htobe32(ek[4 * 13 + i]);
396a1b2b6e1SJohn Baldwin 		for (i = 0; i < 4; i++)
397a1b2b6e1SJohn Baldwin 			*--dkey = htobe32(ek[4 * 14 + i]);
398a1b2b6e1SJohn Baldwin 		break;
399a1b2b6e1SJohn Baldwin 	}
400a1b2b6e1SJohn Baldwin 	MPASS(dkey == dec_key);
4010065d9a4SJohn Baldwin 	explicit_bzero(ek, sizeof(ek));
402a1b2b6e1SJohn Baldwin }
40318c69734SJohn Baldwin 
40418c69734SJohn Baldwin #ifdef KERN_TLS
40518c69734SJohn Baldwin /*
40618c69734SJohn Baldwin  * - keyid management
40718c69734SJohn Baldwin  * - request to program key?
40818c69734SJohn Baldwin  */
40918c69734SJohn Baldwin u_int
t4_tls_key_info_size(const struct ktls_session * tls)41018c69734SJohn Baldwin t4_tls_key_info_size(const struct ktls_session *tls)
41118c69734SJohn Baldwin {
41218c69734SJohn Baldwin 	u_int key_info_size, mac_key_size;
41318c69734SJohn Baldwin 
41418c69734SJohn Baldwin 	key_info_size = sizeof(struct tx_keyctx_hdr) +
41518c69734SJohn Baldwin 	    tls->params.cipher_key_len;
41618c69734SJohn Baldwin 	if (tls->params.cipher_algorithm == CRYPTO_AES_NIST_GCM_16) {
41718c69734SJohn Baldwin 		key_info_size += GMAC_BLOCK_LEN;
41818c69734SJohn Baldwin 	} else {
41918c69734SJohn Baldwin 		switch (tls->params.auth_algorithm) {
42018c69734SJohn Baldwin 		case CRYPTO_SHA1_HMAC:
42118c69734SJohn Baldwin 			mac_key_size = SHA1_HASH_LEN;
42218c69734SJohn Baldwin 			break;
42318c69734SJohn Baldwin 		case CRYPTO_SHA2_256_HMAC:
42418c69734SJohn Baldwin 			mac_key_size = SHA2_256_HASH_LEN;
42518c69734SJohn Baldwin 			break;
42618c69734SJohn Baldwin 		case CRYPTO_SHA2_384_HMAC:
42718c69734SJohn Baldwin 			mac_key_size = SHA2_512_HASH_LEN;
42818c69734SJohn Baldwin 			break;
42918c69734SJohn Baldwin 		default:
43018c69734SJohn Baldwin 			__assert_unreachable();
43118c69734SJohn Baldwin 		}
43218c69734SJohn Baldwin 		key_info_size += roundup2(mac_key_size, 16) * 2;
43318c69734SJohn Baldwin 	}
43418c69734SJohn Baldwin 	return (key_info_size);
43518c69734SJohn Baldwin }
43618c69734SJohn Baldwin 
43718c69734SJohn Baldwin int
t4_tls_proto_ver(const struct ktls_session * tls)43818c69734SJohn Baldwin t4_tls_proto_ver(const struct ktls_session *tls)
43918c69734SJohn Baldwin {
44018c69734SJohn Baldwin 	if (tls->params.tls_vminor == TLS_MINOR_VER_ONE)
44118c69734SJohn Baldwin 		return (SCMD_PROTO_VERSION_TLS_1_1);
44218c69734SJohn Baldwin 	else
44318c69734SJohn Baldwin 		return (SCMD_PROTO_VERSION_TLS_1_2);
44418c69734SJohn Baldwin }
44518c69734SJohn Baldwin 
44618c69734SJohn Baldwin int
t4_tls_cipher_mode(const struct ktls_session * tls)44718c69734SJohn Baldwin t4_tls_cipher_mode(const struct ktls_session *tls)
44818c69734SJohn Baldwin {
44918c69734SJohn Baldwin 	switch (tls->params.cipher_algorithm) {
45018c69734SJohn Baldwin 	case CRYPTO_AES_CBC:
45118c69734SJohn Baldwin 		return (SCMD_CIPH_MODE_AES_CBC);
45218c69734SJohn Baldwin 	case CRYPTO_AES_NIST_GCM_16:
45318c69734SJohn Baldwin 		return (SCMD_CIPH_MODE_AES_GCM);
45418c69734SJohn Baldwin 	default:
45518c69734SJohn Baldwin 		return (SCMD_CIPH_MODE_NOP);
45618c69734SJohn Baldwin 	}
45718c69734SJohn Baldwin }
45818c69734SJohn Baldwin 
45918c69734SJohn Baldwin int
t4_tls_auth_mode(const struct ktls_session * tls)46018c69734SJohn Baldwin t4_tls_auth_mode(const struct ktls_session *tls)
46118c69734SJohn Baldwin {
46218c69734SJohn Baldwin 	switch (tls->params.cipher_algorithm) {
46318c69734SJohn Baldwin 	case CRYPTO_AES_CBC:
46418c69734SJohn Baldwin 		switch (tls->params.auth_algorithm) {
46518c69734SJohn Baldwin 		case CRYPTO_SHA1_HMAC:
46618c69734SJohn Baldwin 			return (SCMD_AUTH_MODE_SHA1);
46718c69734SJohn Baldwin 		case CRYPTO_SHA2_256_HMAC:
46818c69734SJohn Baldwin 			return (SCMD_AUTH_MODE_SHA256);
46918c69734SJohn Baldwin 		case CRYPTO_SHA2_384_HMAC:
47018c69734SJohn Baldwin 			return (SCMD_AUTH_MODE_SHA512_384);
47118c69734SJohn Baldwin 		default:
47218c69734SJohn Baldwin 			return (SCMD_AUTH_MODE_NOP);
47318c69734SJohn Baldwin 		}
47418c69734SJohn Baldwin 	case CRYPTO_AES_NIST_GCM_16:
47518c69734SJohn Baldwin 		return (SCMD_AUTH_MODE_GHASH);
47618c69734SJohn Baldwin 	default:
47718c69734SJohn Baldwin 		return (SCMD_AUTH_MODE_NOP);
47818c69734SJohn Baldwin 	}
47918c69734SJohn Baldwin }
48018c69734SJohn Baldwin 
48118c69734SJohn Baldwin int
t4_tls_hmac_ctrl(const struct ktls_session * tls)48218c69734SJohn Baldwin t4_tls_hmac_ctrl(const struct ktls_session *tls)
48318c69734SJohn Baldwin {
48418c69734SJohn Baldwin 	switch (tls->params.cipher_algorithm) {
48518c69734SJohn Baldwin 	case CRYPTO_AES_CBC:
48618c69734SJohn Baldwin 		return (SCMD_HMAC_CTRL_NO_TRUNC);
48718c69734SJohn Baldwin 	case CRYPTO_AES_NIST_GCM_16:
48818c69734SJohn Baldwin 		return (SCMD_HMAC_CTRL_NOP);
48918c69734SJohn Baldwin 	default:
49018c69734SJohn Baldwin 		return (SCMD_HMAC_CTRL_NOP);
49118c69734SJohn Baldwin 	}
49218c69734SJohn Baldwin }
49318c69734SJohn Baldwin 
49418c69734SJohn Baldwin static int
tls_cipher_key_size(const struct ktls_session * tls)49518c69734SJohn Baldwin tls_cipher_key_size(const struct ktls_session *tls)
49618c69734SJohn Baldwin {
49718c69734SJohn Baldwin 	switch (tls->params.cipher_key_len) {
49818c69734SJohn Baldwin 	case 128 / 8:
49918c69734SJohn Baldwin 		return (CHCR_KEYCTX_CIPHER_KEY_SIZE_128);
50018c69734SJohn Baldwin 	case 192 / 8:
50118c69734SJohn Baldwin 		return (CHCR_KEYCTX_CIPHER_KEY_SIZE_192);
50218c69734SJohn Baldwin 	case 256 / 8:
50318c69734SJohn Baldwin 		return (CHCR_KEYCTX_CIPHER_KEY_SIZE_256);
50418c69734SJohn Baldwin 	default:
50518c69734SJohn Baldwin 		__assert_unreachable();
50618c69734SJohn Baldwin 	}
50718c69734SJohn Baldwin }
50818c69734SJohn Baldwin 
50918c69734SJohn Baldwin static int
tls_mac_key_size(const struct ktls_session * tls)51018c69734SJohn Baldwin tls_mac_key_size(const struct ktls_session *tls)
51118c69734SJohn Baldwin {
51218c69734SJohn Baldwin 	if (tls->params.cipher_algorithm == CRYPTO_AES_NIST_GCM_16)
51318c69734SJohn Baldwin 		return (CHCR_KEYCTX_MAC_KEY_SIZE_512);
51418c69734SJohn Baldwin 	else {
51518c69734SJohn Baldwin 		switch (tls->params.auth_algorithm) {
51618c69734SJohn Baldwin 		case CRYPTO_SHA1_HMAC:
51718c69734SJohn Baldwin 			return (CHCR_KEYCTX_MAC_KEY_SIZE_160);
51818c69734SJohn Baldwin 		case CRYPTO_SHA2_256_HMAC:
51918c69734SJohn Baldwin 			return (CHCR_KEYCTX_MAC_KEY_SIZE_256);
52018c69734SJohn Baldwin 		case CRYPTO_SHA2_384_HMAC:
52118c69734SJohn Baldwin 			return (CHCR_KEYCTX_MAC_KEY_SIZE_512);
52218c69734SJohn Baldwin 		default:
52318c69734SJohn Baldwin 			__assert_unreachable();
52418c69734SJohn Baldwin 		}
52518c69734SJohn Baldwin 	}
52618c69734SJohn Baldwin }
52718c69734SJohn Baldwin 
52818c69734SJohn Baldwin void
t4_tls_key_ctx(const struct ktls_session * tls,int direction,struct tls_keyctx * kctx)52918c69734SJohn Baldwin t4_tls_key_ctx(const struct ktls_session *tls, int direction,
53018c69734SJohn Baldwin     struct tls_keyctx *kctx)
53118c69734SJohn Baldwin {
532d8787d4fSMark Johnston 	const struct auth_hash *axf;
53318c69734SJohn Baldwin 	u_int mac_key_size;
53418c69734SJohn Baldwin 	char *hash;
53518c69734SJohn Baldwin 
53618c69734SJohn Baldwin 	/* Key context header. */
53718c69734SJohn Baldwin 	if (direction == KTLS_TX) {
53818c69734SJohn Baldwin 		kctx->u.txhdr.ctxlen = t4_tls_key_info_size(tls) / 16;
53918c69734SJohn Baldwin 		kctx->u.txhdr.dualck_to_txvalid =
54018c69734SJohn Baldwin 		    V_TLS_KEYCTX_TX_WR_SALT_PRESENT(1) |
54118c69734SJohn Baldwin 		    V_TLS_KEYCTX_TX_WR_TXCK_SIZE(tls_cipher_key_size(tls)) |
54218c69734SJohn Baldwin 		    V_TLS_KEYCTX_TX_WR_TXMK_SIZE(tls_mac_key_size(tls)) |
54318c69734SJohn Baldwin 		    V_TLS_KEYCTX_TX_WR_TXVALID(1);
54418c69734SJohn Baldwin 		if (tls->params.cipher_algorithm == CRYPTO_AES_CBC)
54518c69734SJohn Baldwin 			kctx->u.txhdr.dualck_to_txvalid |=
54618c69734SJohn Baldwin 			    V_TLS_KEYCTX_TX_WR_TXOPAD_PRESENT(1);
54718c69734SJohn Baldwin 		kctx->u.txhdr.dualck_to_txvalid =
54818c69734SJohn Baldwin 		    htobe16(kctx->u.txhdr.dualck_to_txvalid);
54918c69734SJohn Baldwin 	} else {
55018c69734SJohn Baldwin 		kctx->u.rxhdr.flitcnt_hmacctrl =
55118c69734SJohn Baldwin 		    V_TLS_KEYCTX_TX_WR_FLITCNT(t4_tls_key_info_size(tls) / 16) |
55218c69734SJohn Baldwin 		    V_TLS_KEYCTX_TX_WR_HMACCTRL(t4_tls_hmac_ctrl(tls));
55318c69734SJohn Baldwin 
55418c69734SJohn Baldwin 		kctx->u.rxhdr.protover_ciphmode =
55518c69734SJohn Baldwin 		    V_TLS_KEYCTX_TX_WR_PROTOVER(t4_tls_proto_ver(tls)) |
55618c69734SJohn Baldwin 		    V_TLS_KEYCTX_TX_WR_CIPHMODE(t4_tls_cipher_mode(tls));
55718c69734SJohn Baldwin 
55818c69734SJohn Baldwin 		kctx->u.rxhdr.authmode_to_rxvalid =
55918c69734SJohn Baldwin 		    V_TLS_KEYCTX_TX_WR_AUTHMODE(t4_tls_auth_mode(tls)) |
56018c69734SJohn Baldwin 		    V_TLS_KEYCTX_TX_WR_SEQNUMCTRL(3) |
56118c69734SJohn Baldwin 		    V_TLS_KEYCTX_TX_WR_RXVALID(1);
56218c69734SJohn Baldwin 
56318c69734SJohn Baldwin 		kctx->u.rxhdr.ivpresent_to_rxmk_size =
56418c69734SJohn Baldwin 		    V_TLS_KEYCTX_TX_WR_IVPRESENT(0) |
56518c69734SJohn Baldwin 		    V_TLS_KEYCTX_TX_WR_RXCK_SIZE(tls_cipher_key_size(tls)) |
56618c69734SJohn Baldwin 		    V_TLS_KEYCTX_TX_WR_RXMK_SIZE(tls_mac_key_size(tls));
56718c69734SJohn Baldwin 
56818c69734SJohn Baldwin 		if (tls->params.cipher_algorithm == CRYPTO_AES_NIST_GCM_16) {
56918c69734SJohn Baldwin 			kctx->u.rxhdr.ivinsert_to_authinsrt =
57018c69734SJohn Baldwin 			    htobe64(V_TLS_KEYCTX_TX_WR_IVINSERT(6ULL) |
57118c69734SJohn Baldwin 				V_TLS_KEYCTX_TX_WR_AADSTRTOFST(1ULL) |
57218c69734SJohn Baldwin 				V_TLS_KEYCTX_TX_WR_AADSTOPOFST(5ULL) |
57318c69734SJohn Baldwin 				V_TLS_KEYCTX_TX_WR_AUTHSRTOFST(14ULL) |
57418c69734SJohn Baldwin 				V_TLS_KEYCTX_TX_WR_AUTHSTOPOFST(16ULL) |
57518c69734SJohn Baldwin 				V_TLS_KEYCTX_TX_WR_CIPHERSRTOFST(14ULL) |
57618c69734SJohn Baldwin 				V_TLS_KEYCTX_TX_WR_CIPHERSTOPOFST(0ULL) |
57718c69734SJohn Baldwin 				V_TLS_KEYCTX_TX_WR_AUTHINSRT(16ULL));
57818c69734SJohn Baldwin 		} else {
57918c69734SJohn Baldwin 			kctx->u.rxhdr.authmode_to_rxvalid |=
58018c69734SJohn Baldwin 			    V_TLS_KEYCTX_TX_WR_CIPHAUTHSEQCTRL(1);
58118c69734SJohn Baldwin 			kctx->u.rxhdr.ivpresent_to_rxmk_size |=
58218c69734SJohn Baldwin 			    V_TLS_KEYCTX_TX_WR_RXOPAD_PRESENT(1);
58318c69734SJohn Baldwin 			kctx->u.rxhdr.ivinsert_to_authinsrt =
58418c69734SJohn Baldwin 			    htobe64(V_TLS_KEYCTX_TX_WR_IVINSERT(6ULL) |
58518c69734SJohn Baldwin 				V_TLS_KEYCTX_TX_WR_AADSTRTOFST(1ULL) |
58618c69734SJohn Baldwin 				V_TLS_KEYCTX_TX_WR_AADSTOPOFST(5ULL) |
58718c69734SJohn Baldwin 				V_TLS_KEYCTX_TX_WR_AUTHSRTOFST(22ULL) |
58818c69734SJohn Baldwin 				V_TLS_KEYCTX_TX_WR_AUTHSTOPOFST(0ULL) |
58918c69734SJohn Baldwin 				V_TLS_KEYCTX_TX_WR_CIPHERSRTOFST(22ULL) |
59018c69734SJohn Baldwin 				V_TLS_KEYCTX_TX_WR_CIPHERSTOPOFST(0ULL) |
59118c69734SJohn Baldwin 				V_TLS_KEYCTX_TX_WR_AUTHINSRT(0ULL));
59218c69734SJohn Baldwin 		}
59318c69734SJohn Baldwin 	}
59418c69734SJohn Baldwin 
59518c69734SJohn Baldwin 	/* Key. */
59618c69734SJohn Baldwin 	if (direction == KTLS_RX &&
59718c69734SJohn Baldwin 	    tls->params.cipher_algorithm == CRYPTO_AES_CBC)
59818c69734SJohn Baldwin 		t4_aes_getdeckey(kctx->keys.edkey, tls->params.cipher_key,
59918c69734SJohn Baldwin 		    tls->params.cipher_key_len * 8);
60018c69734SJohn Baldwin 	else
60118c69734SJohn Baldwin 		memcpy(kctx->keys.edkey, tls->params.cipher_key,
60218c69734SJohn Baldwin 		    tls->params.cipher_key_len);
60318c69734SJohn Baldwin 
60418c69734SJohn Baldwin 	/* Auth state and implicit IV (salt). */
60518c69734SJohn Baldwin 	hash = kctx->keys.edkey + tls->params.cipher_key_len;
60618c69734SJohn Baldwin 	if (tls->params.cipher_algorithm == CRYPTO_AES_NIST_GCM_16) {
60718c69734SJohn Baldwin 		_Static_assert(offsetof(struct tx_keyctx_hdr, txsalt) ==
60818c69734SJohn Baldwin 		    offsetof(struct rx_keyctx_hdr, rxsalt),
60918c69734SJohn Baldwin 		    "salt offset mismatch");
61018c69734SJohn Baldwin 		memcpy(kctx->u.txhdr.txsalt, tls->params.iv, SALT_SIZE);
61118c69734SJohn Baldwin 		t4_init_gmac_hash(tls->params.cipher_key,
61218c69734SJohn Baldwin 		    tls->params.cipher_key_len, hash);
61318c69734SJohn Baldwin 	} else {
61418c69734SJohn Baldwin 		switch (tls->params.auth_algorithm) {
61518c69734SJohn Baldwin 		case CRYPTO_SHA1_HMAC:
61618c69734SJohn Baldwin 			axf = &auth_hash_hmac_sha1;
61718c69734SJohn Baldwin 			mac_key_size = SHA1_HASH_LEN;
61818c69734SJohn Baldwin 			break;
61918c69734SJohn Baldwin 		case CRYPTO_SHA2_256_HMAC:
62018c69734SJohn Baldwin 			axf = &auth_hash_hmac_sha2_256;
62118c69734SJohn Baldwin 			mac_key_size = SHA2_256_HASH_LEN;
62218c69734SJohn Baldwin 			break;
62318c69734SJohn Baldwin 		case CRYPTO_SHA2_384_HMAC:
62418c69734SJohn Baldwin 			axf = &auth_hash_hmac_sha2_384;
62518c69734SJohn Baldwin 			mac_key_size = SHA2_512_HASH_LEN;
62618c69734SJohn Baldwin 			break;
62718c69734SJohn Baldwin 		default:
62818c69734SJohn Baldwin 			__assert_unreachable();
62918c69734SJohn Baldwin 		}
63018c69734SJohn Baldwin 		t4_init_hmac_digest(axf, mac_key_size, tls->params.auth_key,
63118c69734SJohn Baldwin 		    tls->params.auth_key_len, hash);
63218c69734SJohn Baldwin 	}
63318c69734SJohn Baldwin }
63418c69734SJohn Baldwin 
63518c69734SJohn Baldwin int
t4_alloc_tls_keyid(struct adapter * sc)63618c69734SJohn Baldwin t4_alloc_tls_keyid(struct adapter *sc)
63718c69734SJohn Baldwin {
63818c69734SJohn Baldwin 	vmem_addr_t addr;
63918c69734SJohn Baldwin 
640*1ca4f45eSJohn Baldwin 	if (sc->vres.key.size == 0)
641*1ca4f45eSJohn Baldwin 		return (-1);
642*1ca4f45eSJohn Baldwin 
64318c69734SJohn Baldwin 	if (vmem_alloc(sc->key_map, TLS_KEY_CONTEXT_SZ, M_NOWAIT | M_FIRSTFIT,
64418c69734SJohn Baldwin 	    &addr) != 0)
64518c69734SJohn Baldwin 		return (-1);
64618c69734SJohn Baldwin 
64718c69734SJohn Baldwin 	return (addr);
64818c69734SJohn Baldwin }
64918c69734SJohn Baldwin 
65018c69734SJohn Baldwin void
t4_free_tls_keyid(struct adapter * sc,int keyid)65118c69734SJohn Baldwin t4_free_tls_keyid(struct adapter *sc, int keyid)
65218c69734SJohn Baldwin {
65318c69734SJohn Baldwin 	vmem_free(sc->key_map, keyid, TLS_KEY_CONTEXT_SZ);
65418c69734SJohn Baldwin }
65518c69734SJohn Baldwin 
65618c69734SJohn Baldwin void
t4_write_tlskey_wr(const struct ktls_session * tls,int direction,int tid,int flags,int keyid,struct tls_key_req * kwr)65718c69734SJohn Baldwin t4_write_tlskey_wr(const struct ktls_session *tls, int direction, int tid,
65818c69734SJohn Baldwin     int flags, int keyid, struct tls_key_req *kwr)
65918c69734SJohn Baldwin {
66018c69734SJohn Baldwin 	kwr->wr_hi = htobe32(V_FW_WR_OP(FW_ULPTX_WR) | F_FW_WR_ATOMIC | flags);
66118c69734SJohn Baldwin 	kwr->wr_mid = htobe32(V_FW_WR_LEN16(DIV_ROUND_UP(TLS_KEY_WR_SZ, 16)) |
66218c69734SJohn Baldwin 	    V_FW_WR_FLOWID(tid));
66318c69734SJohn Baldwin 	kwr->protocol = t4_tls_proto_ver(tls);
66418c69734SJohn Baldwin 	kwr->mfs = htobe16(tls->params.max_frame_len);
66518c69734SJohn Baldwin 	kwr->reneg_to_write_rx = V_KEY_GET_LOC(direction == KTLS_TX ?
66618c69734SJohn Baldwin 	    KEY_WRITE_TX : KEY_WRITE_RX);
66718c69734SJohn Baldwin 
66818c69734SJohn Baldwin 	/* master command */
66918c69734SJohn Baldwin 	kwr->cmd = htobe32(V_ULPTX_CMD(ULP_TX_MEM_WRITE) |
67018c69734SJohn Baldwin 	    V_T5_ULP_MEMIO_ORDER(1) | V_T5_ULP_MEMIO_IMM(1));
67118c69734SJohn Baldwin 	kwr->dlen = htobe32(V_ULP_MEMIO_DATA_LEN(TLS_KEY_CONTEXT_SZ >> 5));
67218c69734SJohn Baldwin 	kwr->len16 = htobe32((tid << 8) |
67318c69734SJohn Baldwin 	    DIV_ROUND_UP(TLS_KEY_WR_SZ - sizeof(struct work_request_hdr), 16));
67418c69734SJohn Baldwin 	kwr->kaddr = htobe32(V_ULP_MEMIO_ADDR(keyid >> 5));
67518c69734SJohn Baldwin 
67618c69734SJohn Baldwin 	/* sub command */
67718c69734SJohn Baldwin 	kwr->sc_more = htobe32(V_ULPTX_CMD(ULP_TX_SC_IMM));
67818c69734SJohn Baldwin 	kwr->sc_len = htobe32(TLS_KEY_CONTEXT_SZ);
67918c69734SJohn Baldwin }
68018c69734SJohn Baldwin #endif
681