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