xref: /freebsd/sys/contrib/openzfs/module/zfs/zio_crypt.c (revision 34f9f5680c9d5d5138e427ba3aeab0138cec3882)
1*34f9f568SMartin Matuska // SPDX-License-Identifier: CDDL-1.0
2*34f9f568SMartin Matuska /*
3*34f9f568SMartin Matuska  * This file and its contents are supplied under the terms of the
4*34f9f568SMartin Matuska  * Common Development and Distribution License ("CDDL"), version 1.0.
5*34f9f568SMartin Matuska  * You may only use this file in accordance with the terms of version
6*34f9f568SMartin Matuska  * 1.0 of the CDDL.
7*34f9f568SMartin Matuska  *
8*34f9f568SMartin Matuska  * A full copy of the text of the CDDL should have accompanied this
9*34f9f568SMartin Matuska  * source.  A copy of the CDDL is also available via the Internet at
10*34f9f568SMartin Matuska  * https://opensource.org/license/CDDL-1.0.
11*34f9f568SMartin Matuska  */
12*34f9f568SMartin Matuska 
13*34f9f568SMartin Matuska /*
14*34f9f568SMartin Matuska  * Copyright (c) 2017, Datto, Inc. All rights reserved.
15*34f9f568SMartin Matuska  * Copyright (c) 2026, TrueNAS.
16*34f9f568SMartin Matuska  */
17*34f9f568SMartin Matuska 
18*34f9f568SMartin Matuska #include <sys/zio_crypt.h>
19*34f9f568SMartin Matuska #include <sys/dmu.h>
20*34f9f568SMartin Matuska #include <sys/dmu_objset.h>
21*34f9f568SMartin Matuska #include <sys/dnode.h>
22*34f9f568SMartin Matuska #include <sys/fs/zfs.h>
23*34f9f568SMartin Matuska #include <sys/zio.h>
24*34f9f568SMartin Matuska #include <sys/zil.h>
25*34f9f568SMartin Matuska #include <sys/sha2.h>
26*34f9f568SMartin Matuska #include <sys/hkdf.h>
27*34f9f568SMartin Matuska #include <sys/qat.h>
28*34f9f568SMartin Matuska 
29*34f9f568SMartin Matuska /*
30*34f9f568SMartin Matuska  * This file is responsible for handling all of the details of generating
31*34f9f568SMartin Matuska  * encryption parameters and performing encryption and authentication.
32*34f9f568SMartin Matuska  *
33*34f9f568SMartin Matuska  * BLOCK ENCRYPTION PARAMETERS:
34*34f9f568SMartin Matuska  * Encryption /Authentication Algorithm Suite (crypt):
35*34f9f568SMartin Matuska  * The encryption algorithm, mode, and key length we are going to use. We
36*34f9f568SMartin Matuska  * currently support AES in either GCM or CCM modes with 128, 192, and 256 bit
37*34f9f568SMartin Matuska  * keys. All authentication is currently done with SHA512-HMAC.
38*34f9f568SMartin Matuska  *
39*34f9f568SMartin Matuska  * Plaintext:
40*34f9f568SMartin Matuska  * The unencrypted data that we want to encrypt.
41*34f9f568SMartin Matuska  *
42*34f9f568SMartin Matuska  * Initialization Vector (IV):
43*34f9f568SMartin Matuska  * An initialization vector for the encryption algorithms. This is used to
44*34f9f568SMartin Matuska  * "tweak" the encryption algorithms so that two blocks of the same data are
45*34f9f568SMartin Matuska  * encrypted into different ciphertext outputs, thus obfuscating block patterns.
46*34f9f568SMartin Matuska  * The supported encryption modes (AES-GCM and AES-CCM) require that an IV is
47*34f9f568SMartin Matuska  * never reused with the same encryption key. This value is stored unencrypted
48*34f9f568SMartin Matuska  * and must simply be provided to the decryption function. We use a 96 bit IV
49*34f9f568SMartin Matuska  * (as recommended by NIST) for all block encryption. For non-dedup blocks we
50*34f9f568SMartin Matuska  * derive the IV randomly. The first 64 bits of the IV are stored in the second
51*34f9f568SMartin Matuska  * word of DVA[2] and the remaining 32 bits are stored in the upper 32 bits of
52*34f9f568SMartin Matuska  * blk_fill. This is safe because encrypted blocks can't use the upper 32 bits
53*34f9f568SMartin Matuska  * of blk_fill. We only encrypt level 0 blocks, which normally have a fill count
54*34f9f568SMartin Matuska  * of 1. The only exception is for DMU_OT_DNODE objects, where the fill count of
55*34f9f568SMartin Matuska  * level 0 blocks is the number of allocated dnodes in that block. The on-disk
56*34f9f568SMartin Matuska  * format supports at most 2^15 slots per L0 dnode block, because the maximum
57*34f9f568SMartin Matuska  * block size is 16MB (2^24). In either case, for level 0 blocks this number
58*34f9f568SMartin Matuska  * will still be smaller than UINT32_MAX so it is safe to store the IV in the
59*34f9f568SMartin Matuska  * top 32 bits of blk_fill, while leaving the bottom 32 bits of the fill count
60*34f9f568SMartin Matuska  * for the dnode code.
61*34f9f568SMartin Matuska  *
62*34f9f568SMartin Matuska  * Master key:
63*34f9f568SMartin Matuska  * This is the most important secret data of an encrypted dataset. It is used
64*34f9f568SMartin Matuska  * along with the salt to generate that actual encryption keys via HKDF. We
65*34f9f568SMartin Matuska  * do not use the master key to directly encrypt any data because there are
66*34f9f568SMartin Matuska  * theoretical limits on how much data can actually be safely encrypted with
67*34f9f568SMartin Matuska  * any encryption mode. The master key is stored encrypted on disk with the
68*34f9f568SMartin Matuska  * user's wrapping key. Its length is determined by the encryption algorithm.
69*34f9f568SMartin Matuska  * For details on how this is stored see the block comment in dsl_crypt.c
70*34f9f568SMartin Matuska  *
71*34f9f568SMartin Matuska  * Salt:
72*34f9f568SMartin Matuska  * Used as an input to the HKDF function, along with the master key. We use a
73*34f9f568SMartin Matuska  * 64 bit salt, stored unencrypted in the first word of DVA[2]. Any given salt
74*34f9f568SMartin Matuska  * can be used for encrypting many blocks, so we cache the current salt and the
75*34f9f568SMartin Matuska  * associated derived key in zio_crypt_t so we do not need to derive it again
76*34f9f568SMartin Matuska  * needlessly.
77*34f9f568SMartin Matuska  *
78*34f9f568SMartin Matuska  * Encryption Key:
79*34f9f568SMartin Matuska  * A secret binary key, generated from an HKDF function used to encrypt and
80*34f9f568SMartin Matuska  * decrypt data.
81*34f9f568SMartin Matuska  *
82*34f9f568SMartin Matuska  * Message Authentication Code (MAC)
83*34f9f568SMartin Matuska  * The MAC is an output of authenticated encryption modes such as AES-GCM and
84*34f9f568SMartin Matuska  * AES-CCM. Its purpose is to ensure that an attacker cannot modify encrypted
85*34f9f568SMartin Matuska  * data on disk and return garbage to the application. Effectively, it is a
86*34f9f568SMartin Matuska  * checksum that can not be reproduced by an attacker. We store the MAC in the
87*34f9f568SMartin Matuska  * second 128 bits of blk_cksum, leaving the first 128 bits for a truncated
88*34f9f568SMartin Matuska  * regular checksum of the ciphertext which can be used for scrubbing.
89*34f9f568SMartin Matuska  *
90*34f9f568SMartin Matuska  * OBJECT AUTHENTICATION:
91*34f9f568SMartin Matuska  * Some object types, such as DMU_OT_MASTER_NODE cannot be encrypted because
92*34f9f568SMartin Matuska  * they contain some info that always needs to be readable. To prevent this
93*34f9f568SMartin Matuska  * data from being altered, we authenticate this data using SHA512-HMAC. This
94*34f9f568SMartin Matuska  * will produce a MAC (similar to the one produced via encryption) which can
95*34f9f568SMartin Matuska  * be used to verify the object was not modified. HMACs do not require key
96*34f9f568SMartin Matuska  * rotation or IVs, so we can keep up to the full 3 copies of authenticated
97*34f9f568SMartin Matuska  * data.
98*34f9f568SMartin Matuska  *
99*34f9f568SMartin Matuska  * ZIL ENCRYPTION:
100*34f9f568SMartin Matuska  * ZIL blocks have their bp written to disk ahead of the associated data, so we
101*34f9f568SMartin Matuska  * cannot store the MAC there as we normally do. For these blocks the MAC is
102*34f9f568SMartin Matuska  * stored in the embedded checksum within the zil_chain_t header. The salt and
103*34f9f568SMartin Matuska  * IV are generated for the block on bp allocation instead of at encryption
104*34f9f568SMartin Matuska  * time. In addition, ZIL blocks have some pieces that must be left in plaintext
105*34f9f568SMartin Matuska  * for claiming even though all of the sensitive user data still needs to be
106*34f9f568SMartin Matuska  * encrypted. The function zio_crypt_init_uios_zil() handles parsing which
107*34f9f568SMartin Matuska  * pieces of the block need to be encrypted. All data that is not encrypted is
108*34f9f568SMartin Matuska  * authenticated using the AAD mechanisms that the supported encryption modes
109*34f9f568SMartin Matuska  * provide for. In order to preserve the semantics of the ZIL for encrypted
110*34f9f568SMartin Matuska  * datasets, the ZIL is not protected at the objset level as described below.
111*34f9f568SMartin Matuska  *
112*34f9f568SMartin Matuska  * DNODE ENCRYPTION:
113*34f9f568SMartin Matuska  * Similarly to ZIL blocks, the core part of each dnode_phys_t needs to be left
114*34f9f568SMartin Matuska  * in plaintext for scrubbing and claiming, but the bonus buffers might contain
115*34f9f568SMartin Matuska  * sensitive user data. The function zio_crypt_init_uios_dnode() handles parsing
116*34f9f568SMartin Matuska  * which pieces of the block need to be encrypted. For more details about
117*34f9f568SMartin Matuska  * dnode authentication and encryption, see zio_crypt_init_uios_dnode().
118*34f9f568SMartin Matuska  *
119*34f9f568SMartin Matuska  * OBJECT SET AUTHENTICATION:
120*34f9f568SMartin Matuska  * Up to this point, everything we have encrypted and authenticated has been
121*34f9f568SMartin Matuska  * at level 0 (or -2 for the ZIL). If we did not do any further work the
122*34f9f568SMartin Matuska  * on-disk format would be susceptible to attacks that deleted or rearranged
123*34f9f568SMartin Matuska  * the order of level 0 blocks. Ideally, the cleanest solution would be to
124*34f9f568SMartin Matuska  * maintain a tree of authentication MACs going up the bp tree. However, this
125*34f9f568SMartin Matuska  * presents a problem for raw sends. Send files do not send information about
126*34f9f568SMartin Matuska  * indirect blocks so there would be no convenient way to transfer the MACs and
127*34f9f568SMartin Matuska  * they cannot be recalculated on the receive side without the master key which
128*34f9f568SMartin Matuska  * would defeat one of the purposes of raw sends in the first place. Instead,
129*34f9f568SMartin Matuska  * for the indirect levels of the bp tree, we use a regular SHA512 of the MACs
130*34f9f568SMartin Matuska  * from the level below. We also include some portable fields from blk_prop such
131*34f9f568SMartin Matuska  * as the lsize and compression algorithm to prevent the data from being
132*34f9f568SMartin Matuska  * misinterpreted.
133*34f9f568SMartin Matuska  *
134*34f9f568SMartin Matuska  * At the objset level, we maintain 2 separate 256 bit MACs in the
135*34f9f568SMartin Matuska  * objset_phys_t. The first one is "portable" and is the logical root of the
136*34f9f568SMartin Matuska  * MAC tree maintained in the metadnode's bps. The second, is "local" and is
137*34f9f568SMartin Matuska  * used as the root MAC for the user accounting objects, which are also not
138*34f9f568SMartin Matuska  * transferred via "zfs send". The portable MAC is sent in the DRR_BEGIN payload
139*34f9f568SMartin Matuska  * of the send file. The useraccounting code ensures that the useraccounting
140*34f9f568SMartin Matuska  * info is not present upon a receive, so the local MAC can simply be cleared
141*34f9f568SMartin Matuska  * out at that time. For more info about objset_phys_t authentication, see
142*34f9f568SMartin Matuska  * zio_crypt_do_objset_hmacs().
143*34f9f568SMartin Matuska  *
144*34f9f568SMartin Matuska  * CONSIDERATIONS FOR DEDUP:
145*34f9f568SMartin Matuska  * In order for dedup to work, blocks that we want to dedup with one another
146*34f9f568SMartin Matuska  * need to use the same IV and encryption key, so that they will have the same
147*34f9f568SMartin Matuska  * ciphertext. Normally, one should never reuse an IV with the same encryption
148*34f9f568SMartin Matuska  * key or else AES-GCM and AES-CCM can both actually leak the plaintext of both
149*34f9f568SMartin Matuska  * blocks. In this case, however, since we are using the same plaintext as
150*34f9f568SMartin Matuska  * well all that we end up with is a duplicate of the original ciphertext we
151*34f9f568SMartin Matuska  * already had. As a result, an attacker with read access to the raw disk will
152*34f9f568SMartin Matuska  * be able to tell which blocks are the same but this information is given away
153*34f9f568SMartin Matuska  * by dedup anyway. In order to get the same IVs and encryption keys for
154*34f9f568SMartin Matuska  * equivalent blocks of data we use an HMAC of the plaintext. We use an HMAC
155*34f9f568SMartin Matuska  * here so that a reproducible checksum of the plaintext is never available to
156*34f9f568SMartin Matuska  * the attacker. The HMAC key is kept alongside the master key, encrypted on
157*34f9f568SMartin Matuska  * disk. The first 64 bits of the HMAC are used in place of the random salt, and
158*34f9f568SMartin Matuska  * the next 96 bits are used as the IV. As a result of this mechanism, dedup
159*34f9f568SMartin Matuska  * will only work within a clone family since encrypted dedup requires use of
160*34f9f568SMartin Matuska  * the same master and HMAC keys.
161*34f9f568SMartin Matuska  */
162*34f9f568SMartin Matuska 
163*34f9f568SMartin Matuska /*
164*34f9f568SMartin Matuska  * After encrypting many blocks with the same key we may start to run up
165*34f9f568SMartin Matuska  * against the theoretical limits of how much data can securely be encrypted
166*34f9f568SMartin Matuska  * with a single key using the supported encryption modes. The most obvious
167*34f9f568SMartin Matuska  * limitation is that our risk of generating 2 equivalent 96 bit IVs increases
168*34f9f568SMartin Matuska  * the more IVs we generate (which both GCM and CCM modes strictly forbid).
169*34f9f568SMartin Matuska  * This risk actually grows surprisingly quickly over time according to the
170*34f9f568SMartin Matuska  * Birthday Problem. With a total IV space of 2^(96 bits), and assuming we have
171*34f9f568SMartin Matuska  * generated n IVs with a cryptographically secure RNG, the approximate
172*34f9f568SMartin Matuska  * probability p(n) of a collision is given as:
173*34f9f568SMartin Matuska  *
174*34f9f568SMartin Matuska  * p(n) ~= e^(-n*(n-1)/(2*(2^96)))
175*34f9f568SMartin Matuska  *
176*34f9f568SMartin Matuska  * [http://www.math.cornell.edu/~mec/2008-2009/TianyiZheng/Birthday.html]
177*34f9f568SMartin Matuska  *
178*34f9f568SMartin Matuska  * Assuming that we want to ensure that p(n) never goes over 1 / 1 trillion
179*34f9f568SMartin Matuska  * we must not write more than 398,065,730 blocks with the same encryption key.
180*34f9f568SMartin Matuska  * Therefore, we rotate our keys after 400,000,000 blocks have been written by
181*34f9f568SMartin Matuska  * generating a new random 64 bit salt for our HKDF encryption key generation
182*34f9f568SMartin Matuska  * function.
183*34f9f568SMartin Matuska  */
184*34f9f568SMartin Matuska #define	ZFS_KEY_MAX_SALT_USES_DEFAULT	400000000
185*34f9f568SMartin Matuska #define	ZFS_CURRENT_MAX_SALT_USES	\
186*34f9f568SMartin Matuska 	(MIN(zfs_key_max_salt_uses, ZFS_KEY_MAX_SALT_USES_DEFAULT))
187*34f9f568SMartin Matuska uint64_t zfs_key_max_salt_uses = ZFS_KEY_MAX_SALT_USES_DEFAULT;
188*34f9f568SMartin Matuska 
189*34f9f568SMartin Matuska typedef struct blkptr_auth_buf {
190*34f9f568SMartin Matuska 	uint64_t bab_prop;			/* blk_prop - portable mask */
191*34f9f568SMartin Matuska 	uint8_t bab_mac[ZIO_DATA_MAC_LEN];	/* MAC from blk_cksum */
192*34f9f568SMartin Matuska 	uint64_t bab_pad;			/* reserved for future use */
193*34f9f568SMartin Matuska } blkptr_auth_buf_t;
194*34f9f568SMartin Matuska 
195*34f9f568SMartin Matuska const zio_crypt_info_t zio_crypt_table[ZIO_CRYPT_FUNCTIONS] = {
196*34f9f568SMartin Matuska 	{"",			ZC_TYPE_NONE,	0,	"inherit"},
197*34f9f568SMartin Matuska 	{"",			ZC_TYPE_NONE,	0,	"on"},
198*34f9f568SMartin Matuska 	{"",			ZC_TYPE_NONE,	0,	"off"},
199*34f9f568SMartin Matuska 	{SUN_CKM_AES_CCM,	ZC_TYPE_CCM,	16,	"aes-128-ccm"},
200*34f9f568SMartin Matuska 	{SUN_CKM_AES_CCM,	ZC_TYPE_CCM,	24,	"aes-192-ccm"},
201*34f9f568SMartin Matuska 	{SUN_CKM_AES_CCM,	ZC_TYPE_CCM,	32,	"aes-256-ccm"},
202*34f9f568SMartin Matuska 	{SUN_CKM_AES_GCM,	ZC_TYPE_GCM,	16,	"aes-128-gcm"},
203*34f9f568SMartin Matuska 	{SUN_CKM_AES_GCM,	ZC_TYPE_GCM,	24,	"aes-192-gcm"},
204*34f9f568SMartin Matuska 	{SUN_CKM_AES_GCM,	ZC_TYPE_GCM,	32,	"aes-256-gcm"}
205*34f9f568SMartin Matuska };
206*34f9f568SMartin Matuska 
207*34f9f568SMartin Matuska void
zio_crypt_key_destroy(zio_crypt_key_t * key)208*34f9f568SMartin Matuska zio_crypt_key_destroy(zio_crypt_key_t *key)
209*34f9f568SMartin Matuska {
210*34f9f568SMartin Matuska 	zio_crypt_key_close_os(key);
211*34f9f568SMartin Matuska 
212*34f9f568SMartin Matuska 	rw_destroy(&key->zk_salt_lock);
213*34f9f568SMartin Matuska 
214*34f9f568SMartin Matuska 	/* zero out sensitive data */
215*34f9f568SMartin Matuska 	memset(key, 0, sizeof (zio_crypt_key_t));
216*34f9f568SMartin Matuska }
217*34f9f568SMartin Matuska 
218*34f9f568SMartin Matuska int
zio_crypt_key_init(uint64_t crypt,zio_crypt_key_t * key)219*34f9f568SMartin Matuska zio_crypt_key_init(uint64_t crypt, zio_crypt_key_t *key)
220*34f9f568SMartin Matuska {
221*34f9f568SMartin Matuska 	int ret;
222*34f9f568SMartin Matuska 
223*34f9f568SMartin Matuska 	ASSERT3P(key, !=, NULL);
224*34f9f568SMartin Matuska 	ASSERT3U(crypt, <, ZIO_CRYPT_FUNCTIONS);
225*34f9f568SMartin Matuska 
226*34f9f568SMartin Matuska 	const zio_crypt_info_t *ci = &zio_crypt_table[crypt];
227*34f9f568SMartin Matuska 	if (ci->ci_crypt_type != ZC_TYPE_GCM &&
228*34f9f568SMartin Matuska 	    ci->ci_crypt_type != ZC_TYPE_CCM)
229*34f9f568SMartin Matuska 		return (ENOTSUP);
230*34f9f568SMartin Matuska 
231*34f9f568SMartin Matuska 	memset(key, 0, sizeof (zio_crypt_key_t));
232*34f9f568SMartin Matuska 
233*34f9f568SMartin Matuska 	/* fill keydata buffers and salt with random data */
234*34f9f568SMartin Matuska 	ret = random_get_bytes((uint8_t *)&key->zk_guid, sizeof (uint64_t));
235*34f9f568SMartin Matuska 	if (ret != 0)
236*34f9f568SMartin Matuska 		return (ret);
237*34f9f568SMartin Matuska 
238*34f9f568SMartin Matuska 	ret = random_get_bytes(key->zk_master_keydata, ci->ci_keylen);
239*34f9f568SMartin Matuska 	if (ret != 0)
240*34f9f568SMartin Matuska 		return (ret);
241*34f9f568SMartin Matuska 
242*34f9f568SMartin Matuska 	ret = random_get_bytes(key->zk_hmac_keydata, SHA512_HMAC_KEYLEN);
243*34f9f568SMartin Matuska 	if (ret != 0)
244*34f9f568SMartin Matuska 		return (ret);
245*34f9f568SMartin Matuska 
246*34f9f568SMartin Matuska 	ret = random_get_bytes(key->zk_salt, ZIO_DATA_SALT_LEN);
247*34f9f568SMartin Matuska 	if (ret != 0)
248*34f9f568SMartin Matuska 		return (ret);
249*34f9f568SMartin Matuska 
250*34f9f568SMartin Matuska 	/* derive the current key from the master key */
251*34f9f568SMartin Matuska 	ret = hkdf_sha512(key->zk_master_keydata, ci->ci_keylen, NULL, 0,
252*34f9f568SMartin Matuska 	    key->zk_salt, ZIO_DATA_SALT_LEN, key->zk_current_keydata,
253*34f9f568SMartin Matuska 	    ci->ci_keylen);
254*34f9f568SMartin Matuska 	if (ret != 0)
255*34f9f568SMartin Matuska 		return (ret);
256*34f9f568SMartin Matuska 
257*34f9f568SMartin Matuska 	/* initialize keys for the ICP */
258*34f9f568SMartin Matuska 	key->zk_current_key.ck_data = key->zk_current_keydata;
259*34f9f568SMartin Matuska 	key->zk_current_key.ck_length = CRYPTO_BYTES2BITS(ci->ci_keylen);
260*34f9f568SMartin Matuska 
261*34f9f568SMartin Matuska 	key->zk_hmac_key.ck_data = &key->zk_hmac_key;
262*34f9f568SMartin Matuska 	key->zk_hmac_key.ck_length = CRYPTO_BYTES2BITS(SHA512_HMAC_KEYLEN);
263*34f9f568SMartin Matuska 
264*34f9f568SMartin Matuska 	ret = zio_crypt_key_open_os(key, ci);
265*34f9f568SMartin Matuska 	if (ret != 0)
266*34f9f568SMartin Matuska 		return (ret);
267*34f9f568SMartin Matuska 
268*34f9f568SMartin Matuska 	rw_init(&key->zk_salt_lock, NULL, RW_DEFAULT, NULL);
269*34f9f568SMartin Matuska 	key->zk_crypt = crypt;
270*34f9f568SMartin Matuska 	key->zk_version = ZIO_CRYPT_KEY_CURRENT_VERSION;
271*34f9f568SMartin Matuska 	key->zk_salt_count = 0;
272*34f9f568SMartin Matuska 
273*34f9f568SMartin Matuska 	return (0);
274*34f9f568SMartin Matuska }
275*34f9f568SMartin Matuska 
276*34f9f568SMartin Matuska static int
zio_crypt_key_change_salt(zio_crypt_key_t * key)277*34f9f568SMartin Matuska zio_crypt_key_change_salt(zio_crypt_key_t *key)
278*34f9f568SMartin Matuska {
279*34f9f568SMartin Matuska 	int ret = 0;
280*34f9f568SMartin Matuska 	uint8_t salt[ZIO_DATA_SALT_LEN];
281*34f9f568SMartin Matuska 	const zio_crypt_info_t *ci = &zio_crypt_table[key->zk_crypt];
282*34f9f568SMartin Matuska 
283*34f9f568SMartin Matuska 	/* generate a new salt */
284*34f9f568SMartin Matuska 	ret = random_get_bytes(salt, ZIO_DATA_SALT_LEN);
285*34f9f568SMartin Matuska 	if (ret != 0)
286*34f9f568SMartin Matuska 		goto error;
287*34f9f568SMartin Matuska 
288*34f9f568SMartin Matuska 	rw_enter(&key->zk_salt_lock, RW_WRITER);
289*34f9f568SMartin Matuska 
290*34f9f568SMartin Matuska 	/* someone beat us to the salt rotation, just unlock and return */
291*34f9f568SMartin Matuska 	if (key->zk_salt_count < ZFS_CURRENT_MAX_SALT_USES)
292*34f9f568SMartin Matuska 		goto out_unlock;
293*34f9f568SMartin Matuska 
294*34f9f568SMartin Matuska 	/* derive the current key from the master key and the new salt */
295*34f9f568SMartin Matuska 	ret = hkdf_sha512(key->zk_master_keydata, ci->ci_keylen, NULL, 0,
296*34f9f568SMartin Matuska 	    salt, ZIO_DATA_SALT_LEN, key->zk_current_keydata, ci->ci_keylen);
297*34f9f568SMartin Matuska 	if (ret != 0)
298*34f9f568SMartin Matuska 		goto out_unlock;
299*34f9f568SMartin Matuska 
300*34f9f568SMartin Matuska 	/* assign the salt and reset the usage count */
301*34f9f568SMartin Matuska 	memcpy(key->zk_salt, salt, ZIO_DATA_SALT_LEN);
302*34f9f568SMartin Matuska 	key->zk_salt_count = 0;
303*34f9f568SMartin Matuska 
304*34f9f568SMartin Matuska 	ret = zio_crypt_key_reopen_os(key, ci);
305*34f9f568SMartin Matuska 	if (ret != 0)
306*34f9f568SMartin Matuska 		goto out_unlock;
307*34f9f568SMartin Matuska 
308*34f9f568SMartin Matuska 	rw_exit(&key->zk_salt_lock);
309*34f9f568SMartin Matuska 
310*34f9f568SMartin Matuska 	return (0);
311*34f9f568SMartin Matuska 
312*34f9f568SMartin Matuska out_unlock:
313*34f9f568SMartin Matuska 	rw_exit(&key->zk_salt_lock);
314*34f9f568SMartin Matuska error:
315*34f9f568SMartin Matuska 	return (ret);
316*34f9f568SMartin Matuska }
317*34f9f568SMartin Matuska 
318*34f9f568SMartin Matuska /* See comment above zfs_key_max_salt_uses definition for details */
319*34f9f568SMartin Matuska int
zio_crypt_key_get_salt(zio_crypt_key_t * key,uint8_t * salt)320*34f9f568SMartin Matuska zio_crypt_key_get_salt(zio_crypt_key_t *key, uint8_t *salt)
321*34f9f568SMartin Matuska {
322*34f9f568SMartin Matuska 	int ret;
323*34f9f568SMartin Matuska 	boolean_t salt_change;
324*34f9f568SMartin Matuska 
325*34f9f568SMartin Matuska 	rw_enter(&key->zk_salt_lock, RW_READER);
326*34f9f568SMartin Matuska 
327*34f9f568SMartin Matuska 	memcpy(salt, key->zk_salt, ZIO_DATA_SALT_LEN);
328*34f9f568SMartin Matuska 	salt_change = (atomic_inc_64_nv(&key->zk_salt_count) >=
329*34f9f568SMartin Matuska 	    ZFS_CURRENT_MAX_SALT_USES);
330*34f9f568SMartin Matuska 
331*34f9f568SMartin Matuska 	rw_exit(&key->zk_salt_lock);
332*34f9f568SMartin Matuska 
333*34f9f568SMartin Matuska 	if (salt_change) {
334*34f9f568SMartin Matuska 		ret = zio_crypt_key_change_salt(key);
335*34f9f568SMartin Matuska 		if (ret != 0)
336*34f9f568SMartin Matuska 			goto error;
337*34f9f568SMartin Matuska 	}
338*34f9f568SMartin Matuska 
339*34f9f568SMartin Matuska 	return (0);
340*34f9f568SMartin Matuska 
341*34f9f568SMartin Matuska error:
342*34f9f568SMartin Matuska 	return (ret);
343*34f9f568SMartin Matuska }
344*34f9f568SMartin Matuska 
345*34f9f568SMartin Matuska int
zio_crypt_key_wrap(crypto_key_t * cwkey,zio_crypt_key_t * key,uint8_t * iv,uint8_t * mac,uint8_t * keydata_out,uint8_t * hmac_keydata_out)346*34f9f568SMartin Matuska zio_crypt_key_wrap(crypto_key_t *cwkey, zio_crypt_key_t *key, uint8_t *iv,
347*34f9f568SMartin Matuska     uint8_t *mac, uint8_t *keydata_out, uint8_t *hmac_keydata_out)
348*34f9f568SMartin Matuska {
349*34f9f568SMartin Matuska 	int ret;
350*34f9f568SMartin Matuska 	uint64_t aad[3];
351*34f9f568SMartin Matuska 	uint_t aad_len;
352*34f9f568SMartin Matuska 	const zio_crypt_info_t *ci = &zio_crypt_table[key->zk_crypt];
353*34f9f568SMartin Matuska 
354*34f9f568SMartin Matuska 	/* generate iv for wrapping the master and hmac key */
355*34f9f568SMartin Matuska 	ret = random_get_pseudo_bytes(iv, WRAPPING_IV_LEN);
356*34f9f568SMartin Matuska 	if (ret != 0)
357*34f9f568SMartin Matuska 		return (ret);
358*34f9f568SMartin Matuska 
359*34f9f568SMartin Matuska 	/*
360*34f9f568SMartin Matuska 	 * Although we don't support writing to the old format, we do
361*34f9f568SMartin Matuska 	 * support rewrapping the key so that the user can move and
362*34f9f568SMartin Matuska 	 * quarantine datasets on the old format.
363*34f9f568SMartin Matuska 	 */
364*34f9f568SMartin Matuska 	if (key->zk_version == 0) {
365*34f9f568SMartin Matuska 		aad_len = sizeof (uint64_t);
366*34f9f568SMartin Matuska 		aad[0] = LE_64(key->zk_guid);
367*34f9f568SMartin Matuska 	} else {
368*34f9f568SMartin Matuska 		ASSERT3U(key->zk_version, ==, ZIO_CRYPT_KEY_CURRENT_VERSION);
369*34f9f568SMartin Matuska 		aad_len = sizeof (uint64_t) * 3;
370*34f9f568SMartin Matuska 		aad[0] = LE_64(key->zk_guid);
371*34f9f568SMartin Matuska 		aad[1] = LE_64(key->zk_crypt);
372*34f9f568SMartin Matuska 		aad[2] = LE_64(key->zk_version);
373*34f9f568SMartin Matuska 	}
374*34f9f568SMartin Matuska 
375*34f9f568SMartin Matuska 	zfs_uio_t puio, cuio;
376*34f9f568SMartin Matuska 	int idx;
377*34f9f568SMartin Matuska 	ret = zio_crypt_uios_init_os(&puio, &cuio, 2, &idx);
378*34f9f568SMartin Matuska 	if (ret != 0)
379*34f9f568SMartin Matuska 		return (ret);
380*34f9f568SMartin Matuska 
381*34f9f568SMartin Matuska 	zfs_uio_iovbase(&puio, idx) = key->zk_master_keydata;
382*34f9f568SMartin Matuska 	zfs_uio_iovlen(&puio, idx) = ci->ci_keylen;
383*34f9f568SMartin Matuska 	zfs_uio_iovbase(&puio, idx+1) = key->zk_hmac_keydata;
384*34f9f568SMartin Matuska 	zfs_uio_iovlen(&puio, idx+1) = SHA512_HMAC_KEYLEN;
385*34f9f568SMartin Matuska 
386*34f9f568SMartin Matuska 	zfs_uio_iovbase(&cuio, idx) = keydata_out;
387*34f9f568SMartin Matuska 	zfs_uio_iovlen(&cuio, idx) = ci->ci_keylen;
388*34f9f568SMartin Matuska 	zfs_uio_iovbase(&cuio, idx+1) = hmac_keydata_out;
389*34f9f568SMartin Matuska 	zfs_uio_iovlen(&cuio, idx+1) = SHA512_HMAC_KEYLEN;
390*34f9f568SMartin Matuska 
391*34f9f568SMartin Matuska 	/* encrypt the keys and store the resulting ciphertext and mac */
392*34f9f568SMartin Matuska 	ret = zio_encrypt_os(ci, cwkey, NULL,
393*34f9f568SMartin Matuska 	    &puio, &cuio, ci->ci_keylen + SHA512_HMAC_KEYLEN,
394*34f9f568SMartin Matuska 	    iv, (uint8_t *)aad, aad_len, mac);
395*34f9f568SMartin Matuska 
396*34f9f568SMartin Matuska 	zio_crypt_uios_fini_os(&puio, &cuio);
397*34f9f568SMartin Matuska 
398*34f9f568SMartin Matuska 	return (ret);
399*34f9f568SMartin Matuska }
400*34f9f568SMartin Matuska 
401*34f9f568SMartin Matuska int
zio_crypt_key_unwrap(crypto_key_t * cwkey,uint64_t crypt,uint64_t version,uint64_t guid,uint8_t * keydata,uint8_t * hmac_keydata,uint8_t * iv,uint8_t * mac,zio_crypt_key_t * key)402*34f9f568SMartin Matuska zio_crypt_key_unwrap(crypto_key_t *cwkey, uint64_t crypt, uint64_t version,
403*34f9f568SMartin Matuska     uint64_t guid, uint8_t *keydata, uint8_t *hmac_keydata, uint8_t *iv,
404*34f9f568SMartin Matuska     uint8_t *mac, zio_crypt_key_t *key)
405*34f9f568SMartin Matuska {
406*34f9f568SMartin Matuska 	int ret;
407*34f9f568SMartin Matuska 	uint64_t aad[3];
408*34f9f568SMartin Matuska 	uint_t aad_len;
409*34f9f568SMartin Matuska 	const zio_crypt_info_t *ci = &zio_crypt_table[crypt];
410*34f9f568SMartin Matuska 
411*34f9f568SMartin Matuska 	ASSERT3U(crypt, <, ZIO_CRYPT_FUNCTIONS);
412*34f9f568SMartin Matuska 
413*34f9f568SMartin Matuska 	if (version == 0) {
414*34f9f568SMartin Matuska 		aad_len = sizeof (uint64_t);
415*34f9f568SMartin Matuska 		aad[0] = LE_64(guid);
416*34f9f568SMartin Matuska 	} else {
417*34f9f568SMartin Matuska 		ASSERT3U(version, ==, ZIO_CRYPT_KEY_CURRENT_VERSION);
418*34f9f568SMartin Matuska 		aad_len = sizeof (uint64_t) * 3;
419*34f9f568SMartin Matuska 		aad[0] = LE_64(guid);
420*34f9f568SMartin Matuska 		aad[1] = LE_64(crypt);
421*34f9f568SMartin Matuska 		aad[2] = LE_64(version);
422*34f9f568SMartin Matuska 	}
423*34f9f568SMartin Matuska 
424*34f9f568SMartin Matuska 	zfs_uio_t cuio, puio;
425*34f9f568SMartin Matuska 	int idx;
426*34f9f568SMartin Matuska 	ret = zio_crypt_uios_init_os(&cuio, &puio, 2, &idx);
427*34f9f568SMartin Matuska 	if (ret != 0)
428*34f9f568SMartin Matuska 		goto error;
429*34f9f568SMartin Matuska 
430*34f9f568SMartin Matuska 	zfs_uio_iovbase(&cuio, idx) = keydata;
431*34f9f568SMartin Matuska 	zfs_uio_iovlen(&cuio, idx) = ci->ci_keylen;
432*34f9f568SMartin Matuska 	zfs_uio_iovbase(&cuio, idx+1) = hmac_keydata;
433*34f9f568SMartin Matuska 	zfs_uio_iovlen(&cuio, idx+1) = SHA512_HMAC_KEYLEN;
434*34f9f568SMartin Matuska 
435*34f9f568SMartin Matuska 	zfs_uio_iovbase(&puio, idx) = key->zk_master_keydata;
436*34f9f568SMartin Matuska 	zfs_uio_iovlen(&puio, idx) = ci->ci_keylen;
437*34f9f568SMartin Matuska 	zfs_uio_iovbase(&puio, idx+1) = key->zk_hmac_keydata;
438*34f9f568SMartin Matuska 	zfs_uio_iovlen(&puio, idx+1) = SHA512_HMAC_KEYLEN;
439*34f9f568SMartin Matuska 
440*34f9f568SMartin Matuska 	ret = zio_decrypt_os(ci, cwkey, NULL,
441*34f9f568SMartin Matuska 	    &cuio, &puio, ci->ci_keylen + SHA512_HMAC_KEYLEN,
442*34f9f568SMartin Matuska 	    iv, (uint8_t *)aad, aad_len, mac);
443*34f9f568SMartin Matuska 
444*34f9f568SMartin Matuska 	zio_crypt_uios_fini_os(&cuio, &puio);
445*34f9f568SMartin Matuska 
446*34f9f568SMartin Matuska 	if (ret != 0)
447*34f9f568SMartin Matuska 		goto error;
448*34f9f568SMartin Matuska 
449*34f9f568SMartin Matuska 	/* generate a fresh salt */
450*34f9f568SMartin Matuska 	ret = random_get_bytes(key->zk_salt, ZIO_DATA_SALT_LEN);
451*34f9f568SMartin Matuska 	if (ret != 0)
452*34f9f568SMartin Matuska 		goto error;
453*34f9f568SMartin Matuska 
454*34f9f568SMartin Matuska 	/* derive the current key from the master key */
455*34f9f568SMartin Matuska 	ret = hkdf_sha512(key->zk_master_keydata, ci->ci_keylen, NULL, 0,
456*34f9f568SMartin Matuska 	    key->zk_salt, ZIO_DATA_SALT_LEN, key->zk_current_keydata,
457*34f9f568SMartin Matuska 	    ci->ci_keylen);
458*34f9f568SMartin Matuska 	if (ret != 0)
459*34f9f568SMartin Matuska 		goto error;
460*34f9f568SMartin Matuska 
461*34f9f568SMartin Matuska 	/* initialize keys for ICP */
462*34f9f568SMartin Matuska 	key->zk_current_key.ck_data = key->zk_current_keydata;
463*34f9f568SMartin Matuska 	key->zk_current_key.ck_length = CRYPTO_BYTES2BITS(ci->ci_keylen);
464*34f9f568SMartin Matuska 
465*34f9f568SMartin Matuska 	key->zk_hmac_key.ck_data = key->zk_hmac_keydata;
466*34f9f568SMartin Matuska 	key->zk_hmac_key.ck_length = CRYPTO_BYTES2BITS(SHA512_HMAC_KEYLEN);
467*34f9f568SMartin Matuska 
468*34f9f568SMartin Matuska 	ret = zio_crypt_key_open_os(key, ci);
469*34f9f568SMartin Matuska 	if (ret != 0)
470*34f9f568SMartin Matuska 		goto error;
471*34f9f568SMartin Matuska 
472*34f9f568SMartin Matuska 	rw_init(&key->zk_salt_lock, NULL, RW_DEFAULT, NULL);
473*34f9f568SMartin Matuska 	key->zk_crypt = crypt;
474*34f9f568SMartin Matuska 	key->zk_version = version;
475*34f9f568SMartin Matuska 	key->zk_guid = guid;
476*34f9f568SMartin Matuska 	key->zk_salt_count = 0;
477*34f9f568SMartin Matuska 
478*34f9f568SMartin Matuska 	return (0);
479*34f9f568SMartin Matuska 
480*34f9f568SMartin Matuska error:
481*34f9f568SMartin Matuska 	memset(key, 0, sizeof (zio_crypt_key_t));
482*34f9f568SMartin Matuska 	return (ret);
483*34f9f568SMartin Matuska }
484*34f9f568SMartin Matuska 
485*34f9f568SMartin Matuska int
zio_crypt_generate_iv(uint8_t * ivbuf)486*34f9f568SMartin Matuska zio_crypt_generate_iv(uint8_t *ivbuf)
487*34f9f568SMartin Matuska {
488*34f9f568SMartin Matuska 	int ret;
489*34f9f568SMartin Matuska 
490*34f9f568SMartin Matuska 	/* randomly generate the IV */
491*34f9f568SMartin Matuska 	ret = random_get_pseudo_bytes(ivbuf, ZIO_DATA_IV_LEN);
492*34f9f568SMartin Matuska 	if (ret != 0)
493*34f9f568SMartin Matuska 		goto error;
494*34f9f568SMartin Matuska 
495*34f9f568SMartin Matuska 	return (0);
496*34f9f568SMartin Matuska 
497*34f9f568SMartin Matuska error:
498*34f9f568SMartin Matuska 	memset(ivbuf, 0, ZIO_DATA_IV_LEN);
499*34f9f568SMartin Matuska 	return (ret);
500*34f9f568SMartin Matuska }
501*34f9f568SMartin Matuska 
502*34f9f568SMartin Matuska int
zio_crypt_do_hmac(zio_crypt_key_t * key,uint8_t * data,uint_t datalen,uint8_t * digestbuf,uint_t digestlen)503*34f9f568SMartin Matuska zio_crypt_do_hmac(zio_crypt_key_t *key, uint8_t *data, uint_t datalen,
504*34f9f568SMartin Matuska     uint8_t *digestbuf, uint_t digestlen)
505*34f9f568SMartin Matuska {
506*34f9f568SMartin Matuska 	uint8_t raw_digestbuf[SHA512_HMAC_LEN];
507*34f9f568SMartin Matuska 
508*34f9f568SMartin Matuska 	ASSERT3U(digestlen, <=, SHA512_HMAC_LEN);
509*34f9f568SMartin Matuska 
510*34f9f568SMartin Matuska 	int err = zio_crypt_hmac_os(key, data, datalen, raw_digestbuf);
511*34f9f568SMartin Matuska 	if (err == 0)
512*34f9f568SMartin Matuska 		memcpy(digestbuf, raw_digestbuf, digestlen);
513*34f9f568SMartin Matuska 	else
514*34f9f568SMartin Matuska 		memset(digestbuf, 0, digestlen);
515*34f9f568SMartin Matuska 
516*34f9f568SMartin Matuska 	return (err);
517*34f9f568SMartin Matuska }
518*34f9f568SMartin Matuska 
519*34f9f568SMartin Matuska int
zio_crypt_generate_iv_salt_dedup(zio_crypt_key_t * key,uint8_t * data,uint_t datalen,uint8_t * ivbuf,uint8_t * salt)520*34f9f568SMartin Matuska zio_crypt_generate_iv_salt_dedup(zio_crypt_key_t *key, uint8_t *data,
521*34f9f568SMartin Matuska     uint_t datalen, uint8_t *ivbuf, uint8_t *salt)
522*34f9f568SMartin Matuska {
523*34f9f568SMartin Matuska 	int ret;
524*34f9f568SMartin Matuska 	uint8_t digestbuf[SHA512_HMAC_LEN];
525*34f9f568SMartin Matuska 
526*34f9f568SMartin Matuska 	ret = zio_crypt_hmac_os(key, data, datalen, digestbuf);
527*34f9f568SMartin Matuska 	if (ret != 0)
528*34f9f568SMartin Matuska 		return (ret);
529*34f9f568SMartin Matuska 
530*34f9f568SMartin Matuska 	memcpy(salt, digestbuf, ZIO_DATA_SALT_LEN);
531*34f9f568SMartin Matuska 	memcpy(ivbuf, digestbuf + ZIO_DATA_SALT_LEN, ZIO_DATA_IV_LEN);
532*34f9f568SMartin Matuska 
533*34f9f568SMartin Matuska 	return (0);
534*34f9f568SMartin Matuska }
535*34f9f568SMartin Matuska 
536*34f9f568SMartin Matuska /*
537*34f9f568SMartin Matuska  * The following functions are used to encode and decode encryption parameters
538*34f9f568SMartin Matuska  * into blkptr_t and zil_header_t. The ICP wants to use these parameters as
539*34f9f568SMartin Matuska  * byte strings, which normally means that these strings would not need to deal
540*34f9f568SMartin Matuska  * with byteswapping at all. However, both blkptr_t and zil_header_t may be
541*34f9f568SMartin Matuska  * byteswapped by lower layers and so we must "undo" that byteswap here upon
542*34f9f568SMartin Matuska  * decoding and encoding in a non-native byteorder. These functions require
543*34f9f568SMartin Matuska  * that the byteorder bit is correct before being called.
544*34f9f568SMartin Matuska  */
545*34f9f568SMartin Matuska void
zio_crypt_encode_params_bp(blkptr_t * bp,uint8_t * salt,uint8_t * iv)546*34f9f568SMartin Matuska zio_crypt_encode_params_bp(blkptr_t *bp, uint8_t *salt, uint8_t *iv)
547*34f9f568SMartin Matuska {
548*34f9f568SMartin Matuska 	uint64_t val64;
549*34f9f568SMartin Matuska 	uint32_t val32;
550*34f9f568SMartin Matuska 
551*34f9f568SMartin Matuska 	ASSERT(BP_IS_ENCRYPTED(bp));
552*34f9f568SMartin Matuska 
553*34f9f568SMartin Matuska 	if (!BP_SHOULD_BYTESWAP(bp)) {
554*34f9f568SMartin Matuska 		memcpy(&bp->blk_dva[2].dva_word[0], salt, sizeof (uint64_t));
555*34f9f568SMartin Matuska 		memcpy(&bp->blk_dva[2].dva_word[1], iv, sizeof (uint64_t));
556*34f9f568SMartin Matuska 		memcpy(&val32, iv + sizeof (uint64_t), sizeof (uint32_t));
557*34f9f568SMartin Matuska 		BP_SET_IV2(bp, val32);
558*34f9f568SMartin Matuska 	} else {
559*34f9f568SMartin Matuska 		memcpy(&val64, salt, sizeof (uint64_t));
560*34f9f568SMartin Matuska 		bp->blk_dva[2].dva_word[0] = BSWAP_64(val64);
561*34f9f568SMartin Matuska 
562*34f9f568SMartin Matuska 		memcpy(&val64, iv, sizeof (uint64_t));
563*34f9f568SMartin Matuska 		bp->blk_dva[2].dva_word[1] = BSWAP_64(val64);
564*34f9f568SMartin Matuska 
565*34f9f568SMartin Matuska 		memcpy(&val32, iv + sizeof (uint64_t), sizeof (uint32_t));
566*34f9f568SMartin Matuska 		BP_SET_IV2(bp, BSWAP_32(val32));
567*34f9f568SMartin Matuska 	}
568*34f9f568SMartin Matuska }
569*34f9f568SMartin Matuska 
570*34f9f568SMartin Matuska void
zio_crypt_decode_params_bp(const blkptr_t * bp,uint8_t * salt,uint8_t * iv)571*34f9f568SMartin Matuska zio_crypt_decode_params_bp(const blkptr_t *bp, uint8_t *salt, uint8_t *iv)
572*34f9f568SMartin Matuska {
573*34f9f568SMartin Matuska 	uint64_t val64;
574*34f9f568SMartin Matuska 	uint32_t val32;
575*34f9f568SMartin Matuska 
576*34f9f568SMartin Matuska 	ASSERT(BP_IS_PROTECTED(bp));
577*34f9f568SMartin Matuska 
578*34f9f568SMartin Matuska 	/* for convenience, so callers don't need to check */
579*34f9f568SMartin Matuska 	if (BP_IS_AUTHENTICATED(bp)) {
580*34f9f568SMartin Matuska 		memset(salt, 0, ZIO_DATA_SALT_LEN);
581*34f9f568SMartin Matuska 		memset(iv, 0, ZIO_DATA_IV_LEN);
582*34f9f568SMartin Matuska 		return;
583*34f9f568SMartin Matuska 	}
584*34f9f568SMartin Matuska 
585*34f9f568SMartin Matuska 	if (!BP_SHOULD_BYTESWAP(bp)) {
586*34f9f568SMartin Matuska 		memcpy(salt, &bp->blk_dva[2].dva_word[0], sizeof (uint64_t));
587*34f9f568SMartin Matuska 		memcpy(iv, &bp->blk_dva[2].dva_word[1], sizeof (uint64_t));
588*34f9f568SMartin Matuska 
589*34f9f568SMartin Matuska 		val32 = (uint32_t)BP_GET_IV2(bp);
590*34f9f568SMartin Matuska 		memcpy(iv + sizeof (uint64_t), &val32, sizeof (uint32_t));
591*34f9f568SMartin Matuska 	} else {
592*34f9f568SMartin Matuska 		val64 = BSWAP_64(bp->blk_dva[2].dva_word[0]);
593*34f9f568SMartin Matuska 		memcpy(salt, &val64, sizeof (uint64_t));
594*34f9f568SMartin Matuska 
595*34f9f568SMartin Matuska 		val64 = BSWAP_64(bp->blk_dva[2].dva_word[1]);
596*34f9f568SMartin Matuska 		memcpy(iv, &val64, sizeof (uint64_t));
597*34f9f568SMartin Matuska 
598*34f9f568SMartin Matuska 		val32 = BSWAP_32((uint32_t)BP_GET_IV2(bp));
599*34f9f568SMartin Matuska 		memcpy(iv + sizeof (uint64_t), &val32, sizeof (uint32_t));
600*34f9f568SMartin Matuska 	}
601*34f9f568SMartin Matuska }
602*34f9f568SMartin Matuska 
603*34f9f568SMartin Matuska void
zio_crypt_encode_mac_bp(blkptr_t * bp,uint8_t * mac)604*34f9f568SMartin Matuska zio_crypt_encode_mac_bp(blkptr_t *bp, uint8_t *mac)
605*34f9f568SMartin Matuska {
606*34f9f568SMartin Matuska 	uint64_t val64;
607*34f9f568SMartin Matuska 
608*34f9f568SMartin Matuska 	ASSERT(BP_USES_CRYPT(bp));
609*34f9f568SMartin Matuska 	ASSERT3U(BP_GET_TYPE(bp), !=, DMU_OT_OBJSET);
610*34f9f568SMartin Matuska 
611*34f9f568SMartin Matuska 	if (!BP_SHOULD_BYTESWAP(bp)) {
612*34f9f568SMartin Matuska 		memcpy(&bp->blk_cksum.zc_word[2], mac, sizeof (uint64_t));
613*34f9f568SMartin Matuska 		memcpy(&bp->blk_cksum.zc_word[3], mac + sizeof (uint64_t),
614*34f9f568SMartin Matuska 		    sizeof (uint64_t));
615*34f9f568SMartin Matuska 	} else {
616*34f9f568SMartin Matuska 		memcpy(&val64, mac, sizeof (uint64_t));
617*34f9f568SMartin Matuska 		bp->blk_cksum.zc_word[2] = BSWAP_64(val64);
618*34f9f568SMartin Matuska 
619*34f9f568SMartin Matuska 		memcpy(&val64, mac + sizeof (uint64_t), sizeof (uint64_t));
620*34f9f568SMartin Matuska 		bp->blk_cksum.zc_word[3] = BSWAP_64(val64);
621*34f9f568SMartin Matuska 	}
622*34f9f568SMartin Matuska }
623*34f9f568SMartin Matuska 
624*34f9f568SMartin Matuska void
zio_crypt_decode_mac_bp(const blkptr_t * bp,uint8_t * mac)625*34f9f568SMartin Matuska zio_crypt_decode_mac_bp(const blkptr_t *bp, uint8_t *mac)
626*34f9f568SMartin Matuska {
627*34f9f568SMartin Matuska 	uint64_t val64;
628*34f9f568SMartin Matuska 
629*34f9f568SMartin Matuska 	ASSERT(BP_USES_CRYPT(bp) || BP_IS_HOLE(bp));
630*34f9f568SMartin Matuska 
631*34f9f568SMartin Matuska 	/* for convenience, so callers don't need to check */
632*34f9f568SMartin Matuska 	if (BP_GET_TYPE(bp) == DMU_OT_OBJSET) {
633*34f9f568SMartin Matuska 		memset(mac, 0, ZIO_DATA_MAC_LEN);
634*34f9f568SMartin Matuska 		return;
635*34f9f568SMartin Matuska 	}
636*34f9f568SMartin Matuska 
637*34f9f568SMartin Matuska 	if (!BP_SHOULD_BYTESWAP(bp)) {
638*34f9f568SMartin Matuska 		memcpy(mac, &bp->blk_cksum.zc_word[2], sizeof (uint64_t));
639*34f9f568SMartin Matuska 		memcpy(mac + sizeof (uint64_t), &bp->blk_cksum.zc_word[3],
640*34f9f568SMartin Matuska 		    sizeof (uint64_t));
641*34f9f568SMartin Matuska 	} else {
642*34f9f568SMartin Matuska 		val64 = BSWAP_64(bp->blk_cksum.zc_word[2]);
643*34f9f568SMartin Matuska 		memcpy(mac, &val64, sizeof (uint64_t));
644*34f9f568SMartin Matuska 
645*34f9f568SMartin Matuska 		val64 = BSWAP_64(bp->blk_cksum.zc_word[3]);
646*34f9f568SMartin Matuska 		memcpy(mac + sizeof (uint64_t), &val64, sizeof (uint64_t));
647*34f9f568SMartin Matuska 	}
648*34f9f568SMartin Matuska }
649*34f9f568SMartin Matuska 
650*34f9f568SMartin Matuska void
zio_crypt_encode_mac_zil(void * data,uint8_t * mac)651*34f9f568SMartin Matuska zio_crypt_encode_mac_zil(void *data, uint8_t *mac)
652*34f9f568SMartin Matuska {
653*34f9f568SMartin Matuska 	zil_chain_t *zilc = data;
654*34f9f568SMartin Matuska 
655*34f9f568SMartin Matuska 	memcpy(&zilc->zc_eck.zec_cksum.zc_word[2], mac, sizeof (uint64_t));
656*34f9f568SMartin Matuska 	memcpy(&zilc->zc_eck.zec_cksum.zc_word[3], mac + sizeof (uint64_t),
657*34f9f568SMartin Matuska 	    sizeof (uint64_t));
658*34f9f568SMartin Matuska }
659*34f9f568SMartin Matuska 
660*34f9f568SMartin Matuska void
zio_crypt_decode_mac_zil(const void * data,uint8_t * mac)661*34f9f568SMartin Matuska zio_crypt_decode_mac_zil(const void *data, uint8_t *mac)
662*34f9f568SMartin Matuska {
663*34f9f568SMartin Matuska 	/*
664*34f9f568SMartin Matuska 	 * The ZIL MAC is embedded in the block it protects, which will
665*34f9f568SMartin Matuska 	 * not have been byteswapped by the time this function has been called.
666*34f9f568SMartin Matuska 	 * As a result, we don't need to worry about byteswapping the MAC.
667*34f9f568SMartin Matuska 	 */
668*34f9f568SMartin Matuska 	const zil_chain_t *zilc = data;
669*34f9f568SMartin Matuska 
670*34f9f568SMartin Matuska 	memcpy(mac, &zilc->zc_eck.zec_cksum.zc_word[2], sizeof (uint64_t));
671*34f9f568SMartin Matuska 	memcpy(mac + sizeof (uint64_t), &zilc->zc_eck.zec_cksum.zc_word[3],
672*34f9f568SMartin Matuska 	    sizeof (uint64_t));
673*34f9f568SMartin Matuska }
674*34f9f568SMartin Matuska 
675*34f9f568SMartin Matuska /*
676*34f9f568SMartin Matuska  * This routine takes a block of dnodes (src_abd) and copies only the bonus
677*34f9f568SMartin Matuska  * buffers to the same offsets in the dst buffer. datalen should be the size
678*34f9f568SMartin Matuska  * of both the src_abd and the dst buffer (not just the length of the bonus
679*34f9f568SMartin Matuska  * buffers).
680*34f9f568SMartin Matuska  */
681*34f9f568SMartin Matuska void
zio_crypt_copy_dnode_bonus(abd_t * src_abd,uint8_t * dst,uint_t datalen)682*34f9f568SMartin Matuska zio_crypt_copy_dnode_bonus(abd_t *src_abd, uint8_t *dst, uint_t datalen)
683*34f9f568SMartin Matuska {
684*34f9f568SMartin Matuska 	uint_t i, max_dnp = datalen >> DNODE_SHIFT;
685*34f9f568SMartin Matuska 	uint8_t *src;
686*34f9f568SMartin Matuska 	dnode_phys_t *dnp, *sdnp, *ddnp;
687*34f9f568SMartin Matuska 
688*34f9f568SMartin Matuska 	src = abd_borrow_buf_copy(src_abd, datalen);
689*34f9f568SMartin Matuska 
690*34f9f568SMartin Matuska 	sdnp = (dnode_phys_t *)src;
691*34f9f568SMartin Matuska 	ddnp = (dnode_phys_t *)dst;
692*34f9f568SMartin Matuska 
693*34f9f568SMartin Matuska 	for (i = 0; i < max_dnp; i += sdnp[i].dn_extra_slots + 1) {
694*34f9f568SMartin Matuska 		dnp = &sdnp[i];
695*34f9f568SMartin Matuska 		if (dnp->dn_type != DMU_OT_NONE &&
696*34f9f568SMartin Matuska 		    DMU_OT_IS_ENCRYPTED(dnp->dn_bonustype) &&
697*34f9f568SMartin Matuska 		    dnp->dn_bonuslen != 0) {
698*34f9f568SMartin Matuska 			memcpy(DN_BONUS(&ddnp[i]), DN_BONUS(dnp),
699*34f9f568SMartin Matuska 			    DN_MAX_BONUS_LEN(dnp));
700*34f9f568SMartin Matuska 		}
701*34f9f568SMartin Matuska 	}
702*34f9f568SMartin Matuska 
703*34f9f568SMartin Matuska 	abd_return_buf(src_abd, src, datalen);
704*34f9f568SMartin Matuska }
705*34f9f568SMartin Matuska 
706*34f9f568SMartin Matuska /*
707*34f9f568SMartin Matuska  * This function decides what fields from blk_prop are included in
708*34f9f568SMartin Matuska  * the on-disk various MAC algorithms.
709*34f9f568SMartin Matuska  */
710*34f9f568SMartin Matuska static void
zio_crypt_bp_zero_nonportable_blkprop(blkptr_t * bp,uint64_t version)711*34f9f568SMartin Matuska zio_crypt_bp_zero_nonportable_blkprop(blkptr_t *bp, uint64_t version)
712*34f9f568SMartin Matuska {
713*34f9f568SMartin Matuska 	/*
714*34f9f568SMartin Matuska 	 * Version 0 did not properly zero out all non-portable fields
715*34f9f568SMartin Matuska 	 * as it should have done. We maintain this code so that we can
716*34f9f568SMartin Matuska 	 * do read-only imports of pools on this version.
717*34f9f568SMartin Matuska 	 */
718*34f9f568SMartin Matuska 	if (version == 0) {
719*34f9f568SMartin Matuska 		BP_SET_DEDUP(bp, 0);
720*34f9f568SMartin Matuska 		BP_SET_CHECKSUM(bp, 0);
721*34f9f568SMartin Matuska 		BP_SET_PSIZE(bp, SPA_MINBLOCKSIZE);
722*34f9f568SMartin Matuska 		return;
723*34f9f568SMartin Matuska 	}
724*34f9f568SMartin Matuska 
725*34f9f568SMartin Matuska 	ASSERT3U(version, ==, ZIO_CRYPT_KEY_CURRENT_VERSION);
726*34f9f568SMartin Matuska 
727*34f9f568SMartin Matuska 	/*
728*34f9f568SMartin Matuska 	 * The hole_birth feature might set these fields even if this bp
729*34f9f568SMartin Matuska 	 * is a hole. We zero them out here to guarantee that raw sends
730*34f9f568SMartin Matuska 	 * will function with or without the feature.
731*34f9f568SMartin Matuska 	 */
732*34f9f568SMartin Matuska 	if (BP_IS_HOLE(bp)) {
733*34f9f568SMartin Matuska 		bp->blk_prop = 0ULL;
734*34f9f568SMartin Matuska 		return;
735*34f9f568SMartin Matuska 	}
736*34f9f568SMartin Matuska 
737*34f9f568SMartin Matuska 	/*
738*34f9f568SMartin Matuska 	 * At L0 we want to verify these fields to ensure that data blocks
739*34f9f568SMartin Matuska 	 * can not be reinterpreted. For instance, we do not want an attacker
740*34f9f568SMartin Matuska 	 * to trick us into returning raw lz4 compressed data to the user
741*34f9f568SMartin Matuska 	 * by modifying the compression bits. At higher levels, we cannot
742*34f9f568SMartin Matuska 	 * enforce this policy since raw sends do not convey any information
743*34f9f568SMartin Matuska 	 * about indirect blocks, so these values might be different on the
744*34f9f568SMartin Matuska 	 * receive side. Fortunately, this does not open any new attack
745*34f9f568SMartin Matuska 	 * vectors, since any alterations that can be made to a higher level
746*34f9f568SMartin Matuska 	 * bp must still verify the correct order of the layer below it.
747*34f9f568SMartin Matuska 	 */
748*34f9f568SMartin Matuska 	if (BP_GET_LEVEL(bp) != 0) {
749*34f9f568SMartin Matuska 		BP_SET_BYTEORDER(bp, 0);
750*34f9f568SMartin Matuska 		BP_SET_COMPRESS(bp, 0);
751*34f9f568SMartin Matuska 
752*34f9f568SMartin Matuska 		/*
753*34f9f568SMartin Matuska 		 * psize cannot be set to zero or it will trigger
754*34f9f568SMartin Matuska 		 * asserts, but the value doesn't really matter as
755*34f9f568SMartin Matuska 		 * long as it is constant.
756*34f9f568SMartin Matuska 		 */
757*34f9f568SMartin Matuska 		BP_SET_PSIZE(bp, SPA_MINBLOCKSIZE);
758*34f9f568SMartin Matuska 	}
759*34f9f568SMartin Matuska 
760*34f9f568SMartin Matuska 	BP_SET_DEDUP(bp, 0);
761*34f9f568SMartin Matuska 	BP_SET_CHECKSUM(bp, 0);
762*34f9f568SMartin Matuska }
763*34f9f568SMartin Matuska 
764*34f9f568SMartin Matuska static void
zio_crypt_bp_auth_init(uint64_t version,boolean_t should_bswap,blkptr_t * bp,blkptr_auth_buf_t * bab,uint_t * bab_len)765*34f9f568SMartin Matuska zio_crypt_bp_auth_init(uint64_t version, boolean_t should_bswap, blkptr_t *bp,
766*34f9f568SMartin Matuska     blkptr_auth_buf_t *bab, uint_t *bab_len)
767*34f9f568SMartin Matuska {
768*34f9f568SMartin Matuska 	blkptr_t tmpbp = *bp;
769*34f9f568SMartin Matuska 
770*34f9f568SMartin Matuska 	if (should_bswap)
771*34f9f568SMartin Matuska 		byteswap_uint64_array(&tmpbp, sizeof (blkptr_t));
772*34f9f568SMartin Matuska 
773*34f9f568SMartin Matuska 	ASSERT(BP_USES_CRYPT(&tmpbp) || BP_IS_HOLE(&tmpbp));
774*34f9f568SMartin Matuska 	ASSERT0(BP_IS_EMBEDDED(&tmpbp));
775*34f9f568SMartin Matuska 
776*34f9f568SMartin Matuska 	zio_crypt_decode_mac_bp(&tmpbp, bab->bab_mac);
777*34f9f568SMartin Matuska 
778*34f9f568SMartin Matuska 	/*
779*34f9f568SMartin Matuska 	 * We always MAC blk_prop in LE to ensure portability. This
780*34f9f568SMartin Matuska 	 * must be done after decoding the mac, since the endianness
781*34f9f568SMartin Matuska 	 * will get zero'd out here.
782*34f9f568SMartin Matuska 	 */
783*34f9f568SMartin Matuska 	zio_crypt_bp_zero_nonportable_blkprop(&tmpbp, version);
784*34f9f568SMartin Matuska 	bab->bab_prop = LE_64(tmpbp.blk_prop);
785*34f9f568SMartin Matuska 	bab->bab_pad = 0ULL;
786*34f9f568SMartin Matuska 
787*34f9f568SMartin Matuska 	/* version 0 did not include the padding */
788*34f9f568SMartin Matuska 	*bab_len = sizeof (blkptr_auth_buf_t);
789*34f9f568SMartin Matuska 	if (version == 0)
790*34f9f568SMartin Matuska 		*bab_len -= sizeof (uint64_t);
791*34f9f568SMartin Matuska }
792*34f9f568SMartin Matuska 
793*34f9f568SMartin Matuska static int
zio_crypt_bp_do_hmac_updates(zio_crypt_hmac_t * hmac,uint64_t version,boolean_t should_bswap,blkptr_t * bp)794*34f9f568SMartin Matuska zio_crypt_bp_do_hmac_updates(zio_crypt_hmac_t *hmac, uint64_t version,
795*34f9f568SMartin Matuska     boolean_t should_bswap, blkptr_t *bp)
796*34f9f568SMartin Matuska {
797*34f9f568SMartin Matuska 	uint_t bab_len;
798*34f9f568SMartin Matuska 	blkptr_auth_buf_t bab;
799*34f9f568SMartin Matuska 
800*34f9f568SMartin Matuska 	zio_crypt_bp_auth_init(version, should_bswap, bp, &bab, &bab_len);
801*34f9f568SMartin Matuska 	return (zio_crypt_hmac_update_os(hmac, (uint8_t *)&bab, bab_len));
802*34f9f568SMartin Matuska }
803*34f9f568SMartin Matuska 
804*34f9f568SMartin Matuska static void
zio_crypt_bp_do_indrect_checksum_updates(SHA2_CTX * ctx,uint64_t version,boolean_t should_bswap,blkptr_t * bp)805*34f9f568SMartin Matuska zio_crypt_bp_do_indrect_checksum_updates(SHA2_CTX *ctx, uint64_t version,
806*34f9f568SMartin Matuska     boolean_t should_bswap, blkptr_t *bp)
807*34f9f568SMartin Matuska {
808*34f9f568SMartin Matuska 	uint_t bab_len;
809*34f9f568SMartin Matuska 	blkptr_auth_buf_t bab;
810*34f9f568SMartin Matuska 
811*34f9f568SMartin Matuska 	zio_crypt_bp_auth_init(version, should_bswap, bp, &bab, &bab_len);
812*34f9f568SMartin Matuska 	SHA2Update(ctx, &bab, bab_len);
813*34f9f568SMartin Matuska }
814*34f9f568SMartin Matuska 
815*34f9f568SMartin Matuska static void
zio_crypt_bp_do_aad_updates(uint8_t ** aadp,uint_t * aad_len,uint64_t version,boolean_t should_bswap,blkptr_t * bp)816*34f9f568SMartin Matuska zio_crypt_bp_do_aad_updates(uint8_t **aadp, uint_t *aad_len, uint64_t version,
817*34f9f568SMartin Matuska     boolean_t should_bswap, blkptr_t *bp)
818*34f9f568SMartin Matuska {
819*34f9f568SMartin Matuska 	uint_t bab_len;
820*34f9f568SMartin Matuska 	blkptr_auth_buf_t bab;
821*34f9f568SMartin Matuska 
822*34f9f568SMartin Matuska 	zio_crypt_bp_auth_init(version, should_bswap, bp, &bab, &bab_len);
823*34f9f568SMartin Matuska 	memcpy(*aadp, &bab, bab_len);
824*34f9f568SMartin Matuska 	*aadp += bab_len;
825*34f9f568SMartin Matuska 	*aad_len += bab_len;
826*34f9f568SMartin Matuska }
827*34f9f568SMartin Matuska 
828*34f9f568SMartin Matuska static int
zio_crypt_do_dnode_hmac_updates(zio_crypt_hmac_t * hmac,uint64_t version,boolean_t should_bswap,dnode_phys_t * dnp)829*34f9f568SMartin Matuska zio_crypt_do_dnode_hmac_updates(zio_crypt_hmac_t *hmac, uint64_t version,
830*34f9f568SMartin Matuska     boolean_t should_bswap, dnode_phys_t *dnp)
831*34f9f568SMartin Matuska {
832*34f9f568SMartin Matuska 	int ret, i;
833*34f9f568SMartin Matuska 	dnode_phys_t *adnp, tmp_dncore;
834*34f9f568SMartin Matuska 	size_t dn_core_size = offsetof(dnode_phys_t, dn_blkptr);
835*34f9f568SMartin Matuska 	boolean_t le_bswap = (should_bswap == ZFS_HOST_BYTEORDER);
836*34f9f568SMartin Matuska 
837*34f9f568SMartin Matuska 	/*
838*34f9f568SMartin Matuska 	 * Authenticate the core dnode (masking out non-portable bits).
839*34f9f568SMartin Matuska 	 * We only copy the first 64 bytes we operate on to avoid the overhead
840*34f9f568SMartin Matuska 	 * of copying 512-64 unneeded bytes. The compiler seems to be fine
841*34f9f568SMartin Matuska 	 * with that.
842*34f9f568SMartin Matuska 	 */
843*34f9f568SMartin Matuska 	memcpy(&tmp_dncore, dnp, dn_core_size);
844*34f9f568SMartin Matuska 	adnp = &tmp_dncore;
845*34f9f568SMartin Matuska 
846*34f9f568SMartin Matuska 	if (le_bswap) {
847*34f9f568SMartin Matuska 		adnp->dn_datablkszsec = BSWAP_16(adnp->dn_datablkszsec);
848*34f9f568SMartin Matuska 		adnp->dn_bonuslen = BSWAP_16(adnp->dn_bonuslen);
849*34f9f568SMartin Matuska 		adnp->dn_maxblkid = BSWAP_64(adnp->dn_maxblkid);
850*34f9f568SMartin Matuska 		adnp->dn_used = BSWAP_64(adnp->dn_used);
851*34f9f568SMartin Matuska 	}
852*34f9f568SMartin Matuska 	adnp->dn_flags &= DNODE_CRYPT_PORTABLE_FLAGS_MASK;
853*34f9f568SMartin Matuska 	adnp->dn_used = 0;
854*34f9f568SMartin Matuska 
855*34f9f568SMartin Matuska 	ret = zio_crypt_hmac_update_os(hmac, (uint8_t *)adnp, dn_core_size);
856*34f9f568SMartin Matuska 	if (ret != 0)
857*34f9f568SMartin Matuska 		goto error;
858*34f9f568SMartin Matuska 
859*34f9f568SMartin Matuska 	for (i = 0; i < dnp->dn_nblkptr; i++) {
860*34f9f568SMartin Matuska 		ret = zio_crypt_bp_do_hmac_updates(hmac, version,
861*34f9f568SMartin Matuska 		    should_bswap, &dnp->dn_blkptr[i]);
862*34f9f568SMartin Matuska 		if (ret != 0)
863*34f9f568SMartin Matuska 			goto error;
864*34f9f568SMartin Matuska 	}
865*34f9f568SMartin Matuska 
866*34f9f568SMartin Matuska 	if (dnp->dn_flags & DNODE_FLAG_SPILL_BLKPTR) {
867*34f9f568SMartin Matuska 		ret = zio_crypt_bp_do_hmac_updates(hmac, version,
868*34f9f568SMartin Matuska 		    should_bswap, DN_SPILL_BLKPTR(dnp));
869*34f9f568SMartin Matuska 		if (ret != 0)
870*34f9f568SMartin Matuska 			goto error;
871*34f9f568SMartin Matuska 	}
872*34f9f568SMartin Matuska 
873*34f9f568SMartin Matuska 	return (0);
874*34f9f568SMartin Matuska 
875*34f9f568SMartin Matuska error:
876*34f9f568SMartin Matuska 	return (ret);
877*34f9f568SMartin Matuska }
878*34f9f568SMartin Matuska 
879*34f9f568SMartin Matuska /*
880*34f9f568SMartin Matuska  * objset_phys_t blocks introduce a number of exceptions to the normal
881*34f9f568SMartin Matuska  * authentication process. objset_phys_t's contain 2 separate HMACS for
882*34f9f568SMartin Matuska  * protecting the integrity of their data. The portable_mac protects the
883*34f9f568SMartin Matuska  * metadnode. This MAC can be sent with a raw send and protects against
884*34f9f568SMartin Matuska  * reordering of data within the metadnode. The local_mac protects the user
885*34f9f568SMartin Matuska  * accounting objects which are not sent from one system to another.
886*34f9f568SMartin Matuska  *
887*34f9f568SMartin Matuska  * In addition, objset blocks are the only blocks that can be modified and
888*34f9f568SMartin Matuska  * written to disk without the key loaded under certain circumstances. During
889*34f9f568SMartin Matuska  * zil_claim() we need to be able to update the zil_header_t to complete
890*34f9f568SMartin Matuska  * claiming log blocks and during raw receives we need to write out the
891*34f9f568SMartin Matuska  * portable_mac from the send file. Both of these actions are possible
892*34f9f568SMartin Matuska  * because these fields are not protected by either MAC so neither one will
893*34f9f568SMartin Matuska  * need to modify the MACs without the key. However, when the modified blocks
894*34f9f568SMartin Matuska  * are written out they will be byteswapped into the host machine's native
895*34f9f568SMartin Matuska  * endianness which will modify fields protected by the MAC. As a result, MAC
896*34f9f568SMartin Matuska  * calculation for objset blocks works slightly differently from other block
897*34f9f568SMartin Matuska  * types. Where other block types MAC the data in whatever endianness is
898*34f9f568SMartin Matuska  * written to disk, objset blocks always MAC little endian version of their
899*34f9f568SMartin Matuska  * values. In the code, should_bswap is the value from BP_SHOULD_BYTESWAP()
900*34f9f568SMartin Matuska  * and le_bswap indicates whether a byteswap is needed to get this block
901*34f9f568SMartin Matuska  * into little endian format.
902*34f9f568SMartin Matuska  */
903*34f9f568SMartin Matuska int
zio_crypt_do_objset_hmacs(zio_crypt_key_t * key,void * data,uint_t datalen,boolean_t should_bswap,uint8_t * portable_mac,uint8_t * local_mac)904*34f9f568SMartin Matuska zio_crypt_do_objset_hmacs(zio_crypt_key_t *key, void *data, uint_t datalen,
905*34f9f568SMartin Matuska     boolean_t should_bswap, uint8_t *portable_mac, uint8_t *local_mac)
906*34f9f568SMartin Matuska {
907*34f9f568SMartin Matuska 	int err;
908*34f9f568SMartin Matuska 	zio_crypt_hmac_t hmac;
909*34f9f568SMartin Matuska 	objset_phys_t *osp = data;
910*34f9f568SMartin Matuska 	uint64_t intval;
911*34f9f568SMartin Matuska 	boolean_t le_bswap = (should_bswap == ZFS_HOST_BYTEORDER);
912*34f9f568SMartin Matuska 	uint8_t raw_portable_mac[SHA512_HMAC_LEN];
913*34f9f568SMartin Matuska 	uint8_t raw_local_mac[SHA512_HMAC_LEN];
914*34f9f568SMartin Matuska 
915*34f9f568SMartin Matuska 	/* calculate the portable MAC from the portable fields and metadnode */
916*34f9f568SMartin Matuska 	err = zio_crypt_hmac_init_os(&hmac, key);
917*34f9f568SMartin Matuska 	if (err)
918*34f9f568SMartin Matuska 		goto error;
919*34f9f568SMartin Matuska 
920*34f9f568SMartin Matuska 	/* add in the os_type */
921*34f9f568SMartin Matuska 	intval = (le_bswap) ? osp->os_type : BSWAP_64(osp->os_type);
922*34f9f568SMartin Matuska 	err = zio_crypt_hmac_update_os(&hmac, (const uint8_t *)&intval,
923*34f9f568SMartin Matuska 	    sizeof (intval));
924*34f9f568SMartin Matuska 	if (err)
925*34f9f568SMartin Matuska 		goto error;
926*34f9f568SMartin Matuska 
927*34f9f568SMartin Matuska 	/* add in the portable os_flags */
928*34f9f568SMartin Matuska 	intval = osp->os_flags;
929*34f9f568SMartin Matuska 	if (should_bswap)
930*34f9f568SMartin Matuska 		intval = BSWAP_64(intval);
931*34f9f568SMartin Matuska 	intval &= OBJSET_CRYPT_PORTABLE_FLAGS_MASK;
932*34f9f568SMartin Matuska 	if (!ZFS_HOST_BYTEORDER)
933*34f9f568SMartin Matuska 		intval = BSWAP_64(intval);
934*34f9f568SMartin Matuska 
935*34f9f568SMartin Matuska 	err = zio_crypt_hmac_update_os(&hmac, (const uint8_t *)&intval,
936*34f9f568SMartin Matuska 	    sizeof (intval));
937*34f9f568SMartin Matuska 	if (err)
938*34f9f568SMartin Matuska 		goto error;
939*34f9f568SMartin Matuska 
940*34f9f568SMartin Matuska 	/* add in fields from the metadnode */
941*34f9f568SMartin Matuska 	err = zio_crypt_do_dnode_hmac_updates(&hmac, key->zk_version,
942*34f9f568SMartin Matuska 	    should_bswap, &osp->os_meta_dnode);
943*34f9f568SMartin Matuska 	if (err)
944*34f9f568SMartin Matuska 		goto error;
945*34f9f568SMartin Matuska 
946*34f9f568SMartin Matuska 	/* store the final digest in a temporary buffer and copy what we need */
947*34f9f568SMartin Matuska 	err = zio_crypt_hmac_final_os(&hmac, raw_portable_mac);
948*34f9f568SMartin Matuska 	if (err)
949*34f9f568SMartin Matuska 		goto error;
950*34f9f568SMartin Matuska 
951*34f9f568SMartin Matuska 	memcpy(portable_mac, raw_portable_mac, ZIO_OBJSET_MAC_LEN);
952*34f9f568SMartin Matuska 
953*34f9f568SMartin Matuska 	/*
954*34f9f568SMartin Matuska 	 * This is necessary here as we check next whether
955*34f9f568SMartin Matuska 	 * OBJSET_FLAG_USERACCOUNTING_COMPLETE is set in order to
956*34f9f568SMartin Matuska 	 * decide if the local_mac should be zeroed out. That flag will always
957*34f9f568SMartin Matuska 	 * be set by dmu_objset_id_quota_upgrade_cb() and
958*34f9f568SMartin Matuska 	 * dmu_objset_userspace_upgrade_cb() if useraccounting has been
959*34f9f568SMartin Matuska 	 * completed.
960*34f9f568SMartin Matuska 	 */
961*34f9f568SMartin Matuska 	intval = osp->os_flags;
962*34f9f568SMartin Matuska 	if (should_bswap)
963*34f9f568SMartin Matuska 		intval = BSWAP_64(intval);
964*34f9f568SMartin Matuska 	boolean_t uacct_incomplete =
965*34f9f568SMartin Matuska 	    !(intval & OBJSET_FLAG_USERACCOUNTING_COMPLETE);
966*34f9f568SMartin Matuska 
967*34f9f568SMartin Matuska 	/*
968*34f9f568SMartin Matuska 	 * The local MAC protects the user, group and project accounting.
969*34f9f568SMartin Matuska 	 * If these objects are not present, the local MAC is zeroed out.
970*34f9f568SMartin Matuska 	 */
971*34f9f568SMartin Matuska 	if (uacct_incomplete ||
972*34f9f568SMartin Matuska 	    (datalen >= OBJSET_PHYS_SIZE_V3 &&
973*34f9f568SMartin Matuska 	    osp->os_userused_dnode.dn_type == DMU_OT_NONE &&
974*34f9f568SMartin Matuska 	    osp->os_groupused_dnode.dn_type == DMU_OT_NONE &&
975*34f9f568SMartin Matuska 	    osp->os_projectused_dnode.dn_type == DMU_OT_NONE) ||
976*34f9f568SMartin Matuska 	    (datalen >= OBJSET_PHYS_SIZE_V2 &&
977*34f9f568SMartin Matuska 	    osp->os_userused_dnode.dn_type == DMU_OT_NONE &&
978*34f9f568SMartin Matuska 	    osp->os_groupused_dnode.dn_type == DMU_OT_NONE) ||
979*34f9f568SMartin Matuska 	    (datalen <= OBJSET_PHYS_SIZE_V1)) {
980*34f9f568SMartin Matuska 		memset(local_mac, 0, ZIO_OBJSET_MAC_LEN);
981*34f9f568SMartin Matuska 		return (0);
982*34f9f568SMartin Matuska 	}
983*34f9f568SMartin Matuska 
984*34f9f568SMartin Matuska 	/* calculate the local MAC from the userused and groupused dnodes */
985*34f9f568SMartin Matuska 	err = zio_crypt_hmac_init_os(&hmac, key);
986*34f9f568SMartin Matuska 	if (err)
987*34f9f568SMartin Matuska 		goto error;
988*34f9f568SMartin Matuska 
989*34f9f568SMartin Matuska 	/* add in the non-portable os_flags */
990*34f9f568SMartin Matuska 	intval = osp->os_flags;
991*34f9f568SMartin Matuska 	if (should_bswap)
992*34f9f568SMartin Matuska 		intval = BSWAP_64(intval);
993*34f9f568SMartin Matuska 	intval &= ~OBJSET_CRYPT_PORTABLE_FLAGS_MASK;
994*34f9f568SMartin Matuska 	if (!ZFS_HOST_BYTEORDER)
995*34f9f568SMartin Matuska 		intval = BSWAP_64(intval);
996*34f9f568SMartin Matuska 
997*34f9f568SMartin Matuska 	err = zio_crypt_hmac_update_os(&hmac, (const uint8_t *)&intval,
998*34f9f568SMartin Matuska 	    sizeof (intval));
999*34f9f568SMartin Matuska 	if (err)
1000*34f9f568SMartin Matuska 		goto error;
1001*34f9f568SMartin Matuska 
1002*34f9f568SMartin Matuska 	/* add in fields from the user accounting dnodes */
1003*34f9f568SMartin Matuska 	if (osp->os_userused_dnode.dn_type != DMU_OT_NONE) {
1004*34f9f568SMartin Matuska 		err = zio_crypt_do_dnode_hmac_updates(&hmac, key->zk_version,
1005*34f9f568SMartin Matuska 		    should_bswap, &osp->os_userused_dnode);
1006*34f9f568SMartin Matuska 		if (err)
1007*34f9f568SMartin Matuska 			goto error;
1008*34f9f568SMartin Matuska 	}
1009*34f9f568SMartin Matuska 
1010*34f9f568SMartin Matuska 	if (osp->os_groupused_dnode.dn_type != DMU_OT_NONE) {
1011*34f9f568SMartin Matuska 		err = zio_crypt_do_dnode_hmac_updates(&hmac, key->zk_version,
1012*34f9f568SMartin Matuska 		    should_bswap, &osp->os_groupused_dnode);
1013*34f9f568SMartin Matuska 		if (err)
1014*34f9f568SMartin Matuska 			goto error;
1015*34f9f568SMartin Matuska 	}
1016*34f9f568SMartin Matuska 
1017*34f9f568SMartin Matuska 	if (osp->os_projectused_dnode.dn_type != DMU_OT_NONE &&
1018*34f9f568SMartin Matuska 	    datalen >= OBJSET_PHYS_SIZE_V3) {
1019*34f9f568SMartin Matuska 		err = zio_crypt_do_dnode_hmac_updates(&hmac, key->zk_version,
1020*34f9f568SMartin Matuska 		    should_bswap, &osp->os_projectused_dnode);
1021*34f9f568SMartin Matuska 		if (err)
1022*34f9f568SMartin Matuska 			goto error;
1023*34f9f568SMartin Matuska 	}
1024*34f9f568SMartin Matuska 
1025*34f9f568SMartin Matuska 	/* store the final digest in a temporary buffer and copy what we need */
1026*34f9f568SMartin Matuska 	err = zio_crypt_hmac_final_os(&hmac, raw_local_mac);
1027*34f9f568SMartin Matuska 	if (err)
1028*34f9f568SMartin Matuska 		goto error;
1029*34f9f568SMartin Matuska 
1030*34f9f568SMartin Matuska 	memcpy(local_mac, raw_local_mac, ZIO_OBJSET_MAC_LEN);
1031*34f9f568SMartin Matuska 
1032*34f9f568SMartin Matuska 	return (0);
1033*34f9f568SMartin Matuska 
1034*34f9f568SMartin Matuska error:
1035*34f9f568SMartin Matuska 	memset(portable_mac, 0, ZIO_OBJSET_MAC_LEN);
1036*34f9f568SMartin Matuska 	memset(local_mac, 0, ZIO_OBJSET_MAC_LEN);
1037*34f9f568SMartin Matuska 	return (err);
1038*34f9f568SMartin Matuska }
1039*34f9f568SMartin Matuska 
1040*34f9f568SMartin Matuska /*
1041*34f9f568SMartin Matuska  * This function parses an uncompressed indirect block and returns a checksum
1042*34f9f568SMartin Matuska  * of all the portable fields from all of the contained bps. The portable
1043*34f9f568SMartin Matuska  * fields are the MAC and all of the fields from blk_prop except for the dedup,
1044*34f9f568SMartin Matuska  * checksum, and psize bits. For an explanation of the purpose of this, see
1045*34f9f568SMartin Matuska  * the comment block on object set authentication.
1046*34f9f568SMartin Matuska  */
1047*34f9f568SMartin Matuska static int
zio_crypt_do_indirect_mac_checksum_impl(boolean_t generate,void * buf,uint_t datalen,uint64_t version,boolean_t byteswap,uint8_t * cksum)1048*34f9f568SMartin Matuska zio_crypt_do_indirect_mac_checksum_impl(boolean_t generate, void *buf,
1049*34f9f568SMartin Matuska     uint_t datalen, uint64_t version, boolean_t byteswap, uint8_t *cksum)
1050*34f9f568SMartin Matuska {
1051*34f9f568SMartin Matuska 	blkptr_t *bp;
1052*34f9f568SMartin Matuska 	int i, epb = datalen >> SPA_BLKPTRSHIFT;
1053*34f9f568SMartin Matuska 	SHA2_CTX ctx;
1054*34f9f568SMartin Matuska 	uint8_t digestbuf[SHA512_HMAC_LEN];
1055*34f9f568SMartin Matuska 
1056*34f9f568SMartin Matuska 	/* checksum all of the MACs from the layer below */
1057*34f9f568SMartin Matuska 	SHA2Init(SHA512, &ctx);
1058*34f9f568SMartin Matuska 	for (i = 0, bp = buf; i < epb; i++, bp++) {
1059*34f9f568SMartin Matuska 		zio_crypt_bp_do_indrect_checksum_updates(&ctx, version,
1060*34f9f568SMartin Matuska 		    byteswap, bp);
1061*34f9f568SMartin Matuska 	}
1062*34f9f568SMartin Matuska 	SHA2Final(digestbuf, &ctx);
1063*34f9f568SMartin Matuska 
1064*34f9f568SMartin Matuska 	if (generate) {
1065*34f9f568SMartin Matuska 		memcpy(cksum, digestbuf, ZIO_DATA_MAC_LEN);
1066*34f9f568SMartin Matuska 		return (0);
1067*34f9f568SMartin Matuska 	}
1068*34f9f568SMartin Matuska 
1069*34f9f568SMartin Matuska 	if (memcmp(digestbuf, cksum, ZIO_DATA_MAC_LEN) != 0)
1070*34f9f568SMartin Matuska 		return (SET_ERROR(ECKSUM));
1071*34f9f568SMartin Matuska 
1072*34f9f568SMartin Matuska 	return (0);
1073*34f9f568SMartin Matuska }
1074*34f9f568SMartin Matuska 
1075*34f9f568SMartin Matuska int
zio_crypt_do_indirect_mac_checksum(boolean_t generate,void * buf,uint_t datalen,boolean_t byteswap,uint8_t * cksum)1076*34f9f568SMartin Matuska zio_crypt_do_indirect_mac_checksum(boolean_t generate, void *buf,
1077*34f9f568SMartin Matuska     uint_t datalen, boolean_t byteswap, uint8_t *cksum)
1078*34f9f568SMartin Matuska {
1079*34f9f568SMartin Matuska 	int ret;
1080*34f9f568SMartin Matuska 
1081*34f9f568SMartin Matuska 	/*
1082*34f9f568SMartin Matuska 	 * Unfortunately, callers of this function will not always have
1083*34f9f568SMartin Matuska 	 * easy access to the on-disk format version. This info is
1084*34f9f568SMartin Matuska 	 * normally found in the DSL Crypto Key, but the checksum-of-MACs
1085*34f9f568SMartin Matuska 	 * is expected to be verifiable even when the key isn't loaded.
1086*34f9f568SMartin Matuska 	 * Here, instead of doing a ZAP lookup for the version for each
1087*34f9f568SMartin Matuska 	 * zio, we simply try both existing formats.
1088*34f9f568SMartin Matuska 	 */
1089*34f9f568SMartin Matuska 	ret = zio_crypt_do_indirect_mac_checksum_impl(generate, buf,
1090*34f9f568SMartin Matuska 	    datalen, ZIO_CRYPT_KEY_CURRENT_VERSION, byteswap, cksum);
1091*34f9f568SMartin Matuska 	if (ret == ECKSUM) {
1092*34f9f568SMartin Matuska 		ASSERT(!generate);
1093*34f9f568SMartin Matuska 		ret = zio_crypt_do_indirect_mac_checksum_impl(generate,
1094*34f9f568SMartin Matuska 		    buf, datalen, 0, byteswap, cksum);
1095*34f9f568SMartin Matuska 	}
1096*34f9f568SMartin Matuska 
1097*34f9f568SMartin Matuska 	return (ret);
1098*34f9f568SMartin Matuska }
1099*34f9f568SMartin Matuska 
1100*34f9f568SMartin Matuska int
zio_crypt_do_indirect_mac_checksum_abd(boolean_t generate,abd_t * abd,uint_t datalen,boolean_t byteswap,uint8_t * cksum)1101*34f9f568SMartin Matuska zio_crypt_do_indirect_mac_checksum_abd(boolean_t generate, abd_t *abd,
1102*34f9f568SMartin Matuska     uint_t datalen, boolean_t byteswap, uint8_t *cksum)
1103*34f9f568SMartin Matuska {
1104*34f9f568SMartin Matuska 	int ret;
1105*34f9f568SMartin Matuska 	void *buf;
1106*34f9f568SMartin Matuska 
1107*34f9f568SMartin Matuska 	buf = abd_borrow_buf_copy(abd, datalen);
1108*34f9f568SMartin Matuska 	ret = zio_crypt_do_indirect_mac_checksum(generate, buf, datalen,
1109*34f9f568SMartin Matuska 	    byteswap, cksum);
1110*34f9f568SMartin Matuska 	abd_return_buf(abd, buf, datalen);
1111*34f9f568SMartin Matuska 
1112*34f9f568SMartin Matuska 	return (ret);
1113*34f9f568SMartin Matuska }
1114*34f9f568SMartin Matuska 
1115*34f9f568SMartin Matuska /*
1116*34f9f568SMartin Matuska  * Special case handling routine for encrypting / decrypting ZIL blocks.
1117*34f9f568SMartin Matuska  * We do not check for the older ZIL chain because the encryption feature
1118*34f9f568SMartin Matuska  * was not available before the newer ZIL chain was introduced. The goal
1119*34f9f568SMartin Matuska  * here is to encrypt everything except the blkptr_t of a lr_write_t and
1120*34f9f568SMartin Matuska  * the zil_chain_t header. Everything that is not encrypted is authenticated.
1121*34f9f568SMartin Matuska  */
1122*34f9f568SMartin Matuska static int
zio_crypt_init_uios_zil(boolean_t encrypt,uint8_t * plainbuf,uint8_t * cipherbuf,uint_t datalen,boolean_t byteswap,zfs_uio_t * puio,zfs_uio_t * cuio,uint_t * enc_len,uint8_t ** authbuf,uint_t * auth_len,boolean_t * no_crypt)1123*34f9f568SMartin Matuska zio_crypt_init_uios_zil(boolean_t encrypt, uint8_t *plainbuf,
1124*34f9f568SMartin Matuska     uint8_t *cipherbuf, uint_t datalen, boolean_t byteswap, zfs_uio_t *puio,
1125*34f9f568SMartin Matuska     zfs_uio_t *cuio, uint_t *enc_len, uint8_t **authbuf, uint_t *auth_len,
1126*34f9f568SMartin Matuska     boolean_t *no_crypt)
1127*34f9f568SMartin Matuska {
1128*34f9f568SMartin Matuska 	uint64_t txtype, lr_len, nused;
1129*34f9f568SMartin Matuska 	uint_t crypt_len;
1130*34f9f568SMartin Matuska 	uint_t aad_len = 0, nr_iovecs = 0, total_len = 0;
1131*34f9f568SMartin Matuska 	uint8_t *src, *dst, *slrp, *dlrp, *blkend, *aadp;
1132*34f9f568SMartin Matuska 	int idx;
1133*34f9f568SMartin Matuska 	iovec_t *src_iovecs, *dst_iovecs;
1134*34f9f568SMartin Matuska 	zil_chain_t *zilc;
1135*34f9f568SMartin Matuska 	lr_t *lr;
1136*34f9f568SMartin Matuska 
1137*34f9f568SMartin Matuska 	if (encrypt) {
1138*34f9f568SMartin Matuska 		src = plainbuf;
1139*34f9f568SMartin Matuska 		dst = cipherbuf;
1140*34f9f568SMartin Matuska 	} else {
1141*34f9f568SMartin Matuska 		src = cipherbuf;
1142*34f9f568SMartin Matuska 		dst = plainbuf;
1143*34f9f568SMartin Matuska 	}
1144*34f9f568SMartin Matuska 	memset(dst, 0, datalen);
1145*34f9f568SMartin Matuska 
1146*34f9f568SMartin Matuska 	/* find the start and end record of the log block */
1147*34f9f568SMartin Matuska 	zilc = (zil_chain_t *)src;
1148*34f9f568SMartin Matuska 	slrp = src + sizeof (zil_chain_t);
1149*34f9f568SMartin Matuska 	nused = ((byteswap) ? BSWAP_64(zilc->zc_nused) : zilc->zc_nused);
1150*34f9f568SMartin Matuska 	ASSERT3U(nused, >=, sizeof (zil_chain_t));
1151*34f9f568SMartin Matuska 	ASSERT3U(nused, <=, datalen);
1152*34f9f568SMartin Matuska 	blkend = src + nused;
1153*34f9f568SMartin Matuska 
1154*34f9f568SMartin Matuska 	/* calculate the number of encrypted iovecs we will need */
1155*34f9f568SMartin Matuska 	for (; slrp < blkend; slrp += lr_len) {
1156*34f9f568SMartin Matuska 		lr = (lr_t *)slrp;
1157*34f9f568SMartin Matuska 
1158*34f9f568SMartin Matuska 		if (!byteswap) {
1159*34f9f568SMartin Matuska 			txtype = lr->lrc_txtype;
1160*34f9f568SMartin Matuska 			lr_len = lr->lrc_reclen;
1161*34f9f568SMartin Matuska 		} else {
1162*34f9f568SMartin Matuska 			txtype = BSWAP_64(lr->lrc_txtype);
1163*34f9f568SMartin Matuska 			lr_len = BSWAP_64(lr->lrc_reclen);
1164*34f9f568SMartin Matuska 		}
1165*34f9f568SMartin Matuska 		ASSERT3U(lr_len, >=, sizeof (lr_t));
1166*34f9f568SMartin Matuska 		ASSERT3U(lr_len, <=, blkend - slrp);
1167*34f9f568SMartin Matuska 
1168*34f9f568SMartin Matuska 		nr_iovecs++;
1169*34f9f568SMartin Matuska 		if (txtype == TX_WRITE && lr_len != sizeof (lr_write_t))
1170*34f9f568SMartin Matuska 			nr_iovecs++;
1171*34f9f568SMartin Matuska 	}
1172*34f9f568SMartin Matuska 
1173*34f9f568SMartin Matuska 	int err = zio_crypt_uios_init_os(puio, cuio, nr_iovecs, &idx);
1174*34f9f568SMartin Matuska 	if (err != 0)
1175*34f9f568SMartin Matuska 		return (err);
1176*34f9f568SMartin Matuska 
1177*34f9f568SMartin Matuska 	if (encrypt) {
1178*34f9f568SMartin Matuska 		src_iovecs = zfs_uio_iov(puio);
1179*34f9f568SMartin Matuska 		dst_iovecs = zfs_uio_iov(cuio);
1180*34f9f568SMartin Matuska 	} else {
1181*34f9f568SMartin Matuska 		src_iovecs = zfs_uio_iov(cuio);
1182*34f9f568SMartin Matuska 		dst_iovecs = zfs_uio_iov(puio);
1183*34f9f568SMartin Matuska 	}
1184*34f9f568SMartin Matuska 
1185*34f9f568SMartin Matuska 	/*
1186*34f9f568SMartin Matuska 	 * Copy the plain zil header over and authenticate everything except
1187*34f9f568SMartin Matuska 	 * the checksum that will store our MAC. If we are writing the data
1188*34f9f568SMartin Matuska 	 * the embedded checksum will not have been calculated yet, so we don't
1189*34f9f568SMartin Matuska 	 * authenticate that.
1190*34f9f568SMartin Matuska 	 */
1191*34f9f568SMartin Matuska 	uint8_t *aadbuf = zio_buf_alloc(datalen);
1192*34f9f568SMartin Matuska 	aadp = aadbuf;
1193*34f9f568SMartin Matuska 	memcpy(dst, src, sizeof (zil_chain_t));
1194*34f9f568SMartin Matuska 	memcpy(aadp, src, sizeof (zil_chain_t) - sizeof (zio_eck_t));
1195*34f9f568SMartin Matuska 	aadp += sizeof (zil_chain_t) - sizeof (zio_eck_t);
1196*34f9f568SMartin Matuska 	aad_len += sizeof (zil_chain_t) - sizeof (zio_eck_t);
1197*34f9f568SMartin Matuska 
1198*34f9f568SMartin Matuska 	/* loop over records again, filling in iovecs */
1199*34f9f568SMartin Matuska 	nr_iovecs = 0;
1200*34f9f568SMartin Matuska 	slrp = src + sizeof (zil_chain_t);
1201*34f9f568SMartin Matuska 	dlrp = dst + sizeof (zil_chain_t);
1202*34f9f568SMartin Matuska 
1203*34f9f568SMartin Matuska 	for (; slrp < blkend; slrp += lr_len, dlrp += lr_len) {
1204*34f9f568SMartin Matuska 		lr = (lr_t *)slrp;
1205*34f9f568SMartin Matuska 
1206*34f9f568SMartin Matuska 		if (!byteswap) {
1207*34f9f568SMartin Matuska 			txtype = lr->lrc_txtype;
1208*34f9f568SMartin Matuska 			lr_len = lr->lrc_reclen;
1209*34f9f568SMartin Matuska 		} else {
1210*34f9f568SMartin Matuska 			txtype = BSWAP_64(lr->lrc_txtype);
1211*34f9f568SMartin Matuska 			lr_len = BSWAP_64(lr->lrc_reclen);
1212*34f9f568SMartin Matuska 		}
1213*34f9f568SMartin Matuska 
1214*34f9f568SMartin Matuska 		/* copy the common lr_t */
1215*34f9f568SMartin Matuska 		memcpy(dlrp, slrp, sizeof (lr_t));
1216*34f9f568SMartin Matuska 		memcpy(aadp, slrp, sizeof (lr_t));
1217*34f9f568SMartin Matuska 		aadp += sizeof (lr_t);
1218*34f9f568SMartin Matuska 		aad_len += sizeof (lr_t);
1219*34f9f568SMartin Matuska 
1220*34f9f568SMartin Matuska 		ASSERT3P(src_iovecs, !=, NULL);
1221*34f9f568SMartin Matuska 		ASSERT3P(dst_iovecs, !=, NULL);
1222*34f9f568SMartin Matuska 
1223*34f9f568SMartin Matuska 		/*
1224*34f9f568SMartin Matuska 		 * If this is a TX_WRITE record we want to encrypt everything
1225*34f9f568SMartin Matuska 		 * except the bp if exists. If the bp does exist we want to
1226*34f9f568SMartin Matuska 		 * authenticate it.
1227*34f9f568SMartin Matuska 		 */
1228*34f9f568SMartin Matuska 		if (txtype == TX_WRITE) {
1229*34f9f568SMartin Matuska 			const size_t o = offsetof(lr_write_t, lr_blkptr);
1230*34f9f568SMartin Matuska 			crypt_len = o - sizeof (lr_t);
1231*34f9f568SMartin Matuska 			src_iovecs[idx].iov_base = slrp + sizeof (lr_t);
1232*34f9f568SMartin Matuska 			src_iovecs[idx].iov_len = crypt_len;
1233*34f9f568SMartin Matuska 			dst_iovecs[idx].iov_base = dlrp + sizeof (lr_t);
1234*34f9f568SMartin Matuska 			dst_iovecs[idx].iov_len = crypt_len;
1235*34f9f568SMartin Matuska 			idx++;
1236*34f9f568SMartin Matuska 
1237*34f9f568SMartin Matuska 			/* copy the bp now since it will not be encrypted */
1238*34f9f568SMartin Matuska 			memcpy(dlrp + o, slrp + o, sizeof (blkptr_t));
1239*34f9f568SMartin Matuska 			memcpy(aadp, slrp + o, sizeof (blkptr_t));
1240*34f9f568SMartin Matuska 			aadp += sizeof (blkptr_t);
1241*34f9f568SMartin Matuska 			aad_len += sizeof (blkptr_t);
1242*34f9f568SMartin Matuska 			nr_iovecs++;
1243*34f9f568SMartin Matuska 			total_len += crypt_len;
1244*34f9f568SMartin Matuska 
1245*34f9f568SMartin Matuska 			if (lr_len != sizeof (lr_write_t)) {
1246*34f9f568SMartin Matuska 				crypt_len = lr_len - sizeof (lr_write_t);
1247*34f9f568SMartin Matuska 				src_iovecs[idx].iov_base =
1248*34f9f568SMartin Matuska 				    slrp + sizeof (lr_write_t);
1249*34f9f568SMartin Matuska 				src_iovecs[idx].iov_len = crypt_len;
1250*34f9f568SMartin Matuska 				dst_iovecs[idx].iov_base =
1251*34f9f568SMartin Matuska 				    dlrp + sizeof (lr_write_t);
1252*34f9f568SMartin Matuska 				dst_iovecs[idx].iov_len = crypt_len;
1253*34f9f568SMartin Matuska 				idx++;
1254*34f9f568SMartin Matuska 				nr_iovecs++;
1255*34f9f568SMartin Matuska 				total_len += crypt_len;
1256*34f9f568SMartin Matuska 			}
1257*34f9f568SMartin Matuska 		} else if (txtype == TX_CLONE_RANGE) {
1258*34f9f568SMartin Matuska 			const size_t o = offsetof(lr_clone_range_t, lr_nbps);
1259*34f9f568SMartin Matuska 			crypt_len = o - sizeof (lr_t);
1260*34f9f568SMartin Matuska 			src_iovecs[idx].iov_base = slrp + sizeof (lr_t);
1261*34f9f568SMartin Matuska 			src_iovecs[idx].iov_len = crypt_len;
1262*34f9f568SMartin Matuska 			dst_iovecs[idx].iov_base = dlrp + sizeof (lr_t);
1263*34f9f568SMartin Matuska 			dst_iovecs[idx].iov_len = crypt_len;
1264*34f9f568SMartin Matuska 			idx++;
1265*34f9f568SMartin Matuska 
1266*34f9f568SMartin Matuska 			/* copy the bps now since they will not be encrypted */
1267*34f9f568SMartin Matuska 			memcpy(dlrp + o, slrp + o, lr_len - o);
1268*34f9f568SMartin Matuska 			memcpy(aadp, slrp + o, lr_len - o);
1269*34f9f568SMartin Matuska 			aadp += lr_len - o;
1270*34f9f568SMartin Matuska 			aad_len += lr_len - o;
1271*34f9f568SMartin Matuska 			nr_iovecs++;
1272*34f9f568SMartin Matuska 			total_len += crypt_len;
1273*34f9f568SMartin Matuska 		} else {
1274*34f9f568SMartin Matuska 			crypt_len = lr_len - sizeof (lr_t);
1275*34f9f568SMartin Matuska 			src_iovecs[idx].iov_base = slrp + sizeof (lr_t);
1276*34f9f568SMartin Matuska 			src_iovecs[idx].iov_len = crypt_len;
1277*34f9f568SMartin Matuska 			dst_iovecs[idx].iov_base = dlrp + sizeof (lr_t);
1278*34f9f568SMartin Matuska 			dst_iovecs[idx].iov_len = crypt_len;
1279*34f9f568SMartin Matuska 			idx++;
1280*34f9f568SMartin Matuska 			nr_iovecs++;
1281*34f9f568SMartin Matuska 			total_len += crypt_len;
1282*34f9f568SMartin Matuska 		}
1283*34f9f568SMartin Matuska 	}
1284*34f9f568SMartin Matuska 
1285*34f9f568SMartin Matuska 	*no_crypt = (nr_iovecs == 0);
1286*34f9f568SMartin Matuska 	*enc_len = total_len;
1287*34f9f568SMartin Matuska 	*authbuf = aadbuf;
1288*34f9f568SMartin Matuska 	*auth_len = aad_len;
1289*34f9f568SMartin Matuska 
1290*34f9f568SMartin Matuska 	return (0);
1291*34f9f568SMartin Matuska }
1292*34f9f568SMartin Matuska 
1293*34f9f568SMartin Matuska /*
1294*34f9f568SMartin Matuska  * Special case handling routine for encrypting / decrypting dnode blocks.
1295*34f9f568SMartin Matuska  */
1296*34f9f568SMartin Matuska static int
zio_crypt_init_uios_dnode(boolean_t encrypt,uint64_t version,uint8_t * plainbuf,uint8_t * cipherbuf,uint_t datalen,boolean_t byteswap,zfs_uio_t * puio,zfs_uio_t * cuio,uint_t * enc_len,uint8_t ** authbuf,uint_t * auth_len,boolean_t * no_crypt)1297*34f9f568SMartin Matuska zio_crypt_init_uios_dnode(boolean_t encrypt, uint64_t version,
1298*34f9f568SMartin Matuska     uint8_t *plainbuf, uint8_t *cipherbuf, uint_t datalen, boolean_t byteswap,
1299*34f9f568SMartin Matuska     zfs_uio_t *puio, zfs_uio_t *cuio, uint_t *enc_len, uint8_t **authbuf,
1300*34f9f568SMartin Matuska     uint_t *auth_len, boolean_t *no_crypt)
1301*34f9f568SMartin Matuska {
1302*34f9f568SMartin Matuska 	uint_t crypt_len;
1303*34f9f568SMartin Matuska 	uint_t aad_len = 0, nr_iovecs = 0, total_len = 0;
1304*34f9f568SMartin Matuska 	uint_t i, j, max_dnp = datalen >> DNODE_SHIFT;
1305*34f9f568SMartin Matuska 	uint8_t *src, *dst, *aadp;
1306*34f9f568SMartin Matuska 	int idx;
1307*34f9f568SMartin Matuska 	iovec_t *src_iovecs, *dst_iovecs;
1308*34f9f568SMartin Matuska 	dnode_phys_t *dnp, *adnp, *sdnp, *ddnp;
1309*34f9f568SMartin Matuska 
1310*34f9f568SMartin Matuska 	if (encrypt) {
1311*34f9f568SMartin Matuska 		src = plainbuf;
1312*34f9f568SMartin Matuska 		dst = cipherbuf;
1313*34f9f568SMartin Matuska 	} else {
1314*34f9f568SMartin Matuska 		src = cipherbuf;
1315*34f9f568SMartin Matuska 		dst = plainbuf;
1316*34f9f568SMartin Matuska 	}
1317*34f9f568SMartin Matuska 
1318*34f9f568SMartin Matuska 	sdnp = (dnode_phys_t *)src;
1319*34f9f568SMartin Matuska 	ddnp = (dnode_phys_t *)dst;
1320*34f9f568SMartin Matuska 
1321*34f9f568SMartin Matuska 	/*
1322*34f9f568SMartin Matuska 	 * Count the number of iovecs we will need to do the encryption by
1323*34f9f568SMartin Matuska 	 * counting the number of bonus buffers that need to be encrypted.
1324*34f9f568SMartin Matuska 	 */
1325*34f9f568SMartin Matuska 	for (i = 0; i < max_dnp; i += sdnp[i].dn_extra_slots + 1) {
1326*34f9f568SMartin Matuska 		/*
1327*34f9f568SMartin Matuska 		 * This block may still be byteswapped. However, all of the
1328*34f9f568SMartin Matuska 		 * values we use are either uint8_t's (for which byteswapping
1329*34f9f568SMartin Matuska 		 * is a noop) or a * != 0 check, which will work regardless
1330*34f9f568SMartin Matuska 		 * of whether or not we byteswap.
1331*34f9f568SMartin Matuska 		 */
1332*34f9f568SMartin Matuska 		if (sdnp[i].dn_type != DMU_OT_NONE &&
1333*34f9f568SMartin Matuska 		    DMU_OT_IS_ENCRYPTED(sdnp[i].dn_bonustype) &&
1334*34f9f568SMartin Matuska 		    sdnp[i].dn_bonuslen != 0) {
1335*34f9f568SMartin Matuska 			nr_iovecs++;
1336*34f9f568SMartin Matuska 		}
1337*34f9f568SMartin Matuska 	}
1338*34f9f568SMartin Matuska 
1339*34f9f568SMartin Matuska 	int err = zio_crypt_uios_init_os(puio, cuio, nr_iovecs, &idx);
1340*34f9f568SMartin Matuska 	if (err != 0)
1341*34f9f568SMartin Matuska 		return (err);
1342*34f9f568SMartin Matuska 
1343*34f9f568SMartin Matuska 	if (encrypt) {
1344*34f9f568SMartin Matuska 		src_iovecs = zfs_uio_iov(puio);
1345*34f9f568SMartin Matuska 		dst_iovecs = zfs_uio_iov(cuio);
1346*34f9f568SMartin Matuska 	} else {
1347*34f9f568SMartin Matuska 		src_iovecs = zfs_uio_iov(cuio);
1348*34f9f568SMartin Matuska 		dst_iovecs = zfs_uio_iov(puio);
1349*34f9f568SMartin Matuska 	}
1350*34f9f568SMartin Matuska 
1351*34f9f568SMartin Matuska 	nr_iovecs = 0;
1352*34f9f568SMartin Matuska 
1353*34f9f568SMartin Matuska 	uint8_t *aadbuf = zio_buf_alloc(datalen);
1354*34f9f568SMartin Matuska 	aadp = aadbuf;
1355*34f9f568SMartin Matuska 
1356*34f9f568SMartin Matuska 	/*
1357*34f9f568SMartin Matuska 	 * Iterate through the dnodes again, this time filling in the uios
1358*34f9f568SMartin Matuska 	 * we allocated earlier. We also concatenate any data we want to
1359*34f9f568SMartin Matuska 	 * authenticate onto aadbuf.
1360*34f9f568SMartin Matuska 	 */
1361*34f9f568SMartin Matuska 	for (i = 0; i < max_dnp; i += sdnp[i].dn_extra_slots + 1) {
1362*34f9f568SMartin Matuska 		dnp = &sdnp[i];
1363*34f9f568SMartin Matuska 
1364*34f9f568SMartin Matuska 		/* copy over the core fields and blkptrs (kept as plaintext) */
1365*34f9f568SMartin Matuska 		memcpy(&ddnp[i], dnp,
1366*34f9f568SMartin Matuska 		    (uint8_t *)DN_BONUS(dnp) - (uint8_t *)dnp);
1367*34f9f568SMartin Matuska 
1368*34f9f568SMartin Matuska 		if (dnp->dn_flags & DNODE_FLAG_SPILL_BLKPTR) {
1369*34f9f568SMartin Matuska 			memcpy(DN_SPILL_BLKPTR(&ddnp[i]), DN_SPILL_BLKPTR(dnp),
1370*34f9f568SMartin Matuska 			    sizeof (blkptr_t));
1371*34f9f568SMartin Matuska 		}
1372*34f9f568SMartin Matuska 
1373*34f9f568SMartin Matuska 		/*
1374*34f9f568SMartin Matuska 		 * Handle authenticated data. We authenticate everything in
1375*34f9f568SMartin Matuska 		 * the dnode that can be brought over when we do a raw send.
1376*34f9f568SMartin Matuska 		 * This includes all of the core fields as well as the MACs
1377*34f9f568SMartin Matuska 		 * stored in the bp checksums and all of the portable bits
1378*34f9f568SMartin Matuska 		 * from blk_prop. We include the dnode padding here in case it
1379*34f9f568SMartin Matuska 		 * ever gets used in the future. Some dn_flags and dn_used are
1380*34f9f568SMartin Matuska 		 * not portable so we mask those out values out of the
1381*34f9f568SMartin Matuska 		 * authenticated data.
1382*34f9f568SMartin Matuska 		 */
1383*34f9f568SMartin Matuska 		crypt_len = offsetof(dnode_phys_t, dn_blkptr);
1384*34f9f568SMartin Matuska 		memcpy(aadp, dnp, crypt_len);
1385*34f9f568SMartin Matuska 		adnp = (dnode_phys_t *)aadp;
1386*34f9f568SMartin Matuska 		adnp->dn_flags &= DNODE_CRYPT_PORTABLE_FLAGS_MASK;
1387*34f9f568SMartin Matuska 		adnp->dn_used = 0;
1388*34f9f568SMartin Matuska 		aadp += crypt_len;
1389*34f9f568SMartin Matuska 		aad_len += crypt_len;
1390*34f9f568SMartin Matuska 
1391*34f9f568SMartin Matuska 		for (j = 0; j < dnp->dn_nblkptr; j++) {
1392*34f9f568SMartin Matuska 			zio_crypt_bp_do_aad_updates(&aadp, &aad_len,
1393*34f9f568SMartin Matuska 			    version, byteswap, &dnp->dn_blkptr[j]);
1394*34f9f568SMartin Matuska 		}
1395*34f9f568SMartin Matuska 
1396*34f9f568SMartin Matuska 		if (dnp->dn_flags & DNODE_FLAG_SPILL_BLKPTR) {
1397*34f9f568SMartin Matuska 			zio_crypt_bp_do_aad_updates(&aadp, &aad_len,
1398*34f9f568SMartin Matuska 			    version, byteswap, DN_SPILL_BLKPTR(dnp));
1399*34f9f568SMartin Matuska 		}
1400*34f9f568SMartin Matuska 
1401*34f9f568SMartin Matuska 		/*
1402*34f9f568SMartin Matuska 		 * If this bonus buffer needs to be encrypted, we prepare an
1403*34f9f568SMartin Matuska 		 * iovec_t. The encryption / decryption functions will fill
1404*34f9f568SMartin Matuska 		 * this in for us with the encrypted or decrypted data.
1405*34f9f568SMartin Matuska 		 * Otherwise we add the bonus buffer to the authenticated
1406*34f9f568SMartin Matuska 		 * data buffer and copy it over to the destination. The
1407*34f9f568SMartin Matuska 		 * encrypted iovec extends to DN_MAX_BONUS_LEN(dnp) so that
1408*34f9f568SMartin Matuska 		 * we can guarantee alignment with the AES block size
1409*34f9f568SMartin Matuska 		 * (128 bits).
1410*34f9f568SMartin Matuska 		 */
1411*34f9f568SMartin Matuska 		crypt_len = DN_MAX_BONUS_LEN(dnp);
1412*34f9f568SMartin Matuska 		if (dnp->dn_type != DMU_OT_NONE &&
1413*34f9f568SMartin Matuska 		    DMU_OT_IS_ENCRYPTED(dnp->dn_bonustype) &&
1414*34f9f568SMartin Matuska 		    dnp->dn_bonuslen != 0) {
1415*34f9f568SMartin Matuska 			ASSERT3P(src_iovecs, !=, NULL);
1416*34f9f568SMartin Matuska 			ASSERT3P(dst_iovecs, !=, NULL);
1417*34f9f568SMartin Matuska 			src_iovecs[idx].iov_base = DN_BONUS(dnp);
1418*34f9f568SMartin Matuska 			src_iovecs[idx].iov_len = crypt_len;
1419*34f9f568SMartin Matuska 			dst_iovecs[idx].iov_base = DN_BONUS(&ddnp[i]);
1420*34f9f568SMartin Matuska 			dst_iovecs[idx].iov_len = crypt_len;
1421*34f9f568SMartin Matuska 			idx++;
1422*34f9f568SMartin Matuska 
1423*34f9f568SMartin Matuska 			nr_iovecs++;
1424*34f9f568SMartin Matuska 			total_len += crypt_len;
1425*34f9f568SMartin Matuska 		} else {
1426*34f9f568SMartin Matuska 			memcpy(DN_BONUS(&ddnp[i]), DN_BONUS(dnp), crypt_len);
1427*34f9f568SMartin Matuska 			memcpy(aadp, DN_BONUS(dnp), crypt_len);
1428*34f9f568SMartin Matuska 			aadp += crypt_len;
1429*34f9f568SMartin Matuska 			aad_len += crypt_len;
1430*34f9f568SMartin Matuska 		}
1431*34f9f568SMartin Matuska 	}
1432*34f9f568SMartin Matuska 
1433*34f9f568SMartin Matuska 	*no_crypt = (nr_iovecs == 0);
1434*34f9f568SMartin Matuska 	*enc_len = total_len;
1435*34f9f568SMartin Matuska 	*authbuf = aadbuf;
1436*34f9f568SMartin Matuska 	*auth_len = aad_len;
1437*34f9f568SMartin Matuska 
1438*34f9f568SMartin Matuska 	return (0);
1439*34f9f568SMartin Matuska }
1440*34f9f568SMartin Matuska 
1441*34f9f568SMartin Matuska static int
zio_crypt_init_uios_normal(boolean_t encrypt,uint8_t * plainbuf,uint8_t * cipherbuf,uint_t datalen,zfs_uio_t * puio,zfs_uio_t * cuio,uint_t * enc_len)1442*34f9f568SMartin Matuska zio_crypt_init_uios_normal(boolean_t encrypt, uint8_t *plainbuf,
1443*34f9f568SMartin Matuska     uint8_t *cipherbuf, uint_t datalen, zfs_uio_t *puio, zfs_uio_t *cuio,
1444*34f9f568SMartin Matuska     uint_t *enc_len)
1445*34f9f568SMartin Matuska {
1446*34f9f568SMartin Matuska 	(void) encrypt;
1447*34f9f568SMartin Matuska 
1448*34f9f568SMartin Matuska 	int idx;
1449*34f9f568SMartin Matuska 	int err = zio_crypt_uios_init_os(puio, cuio, 1, &idx);
1450*34f9f568SMartin Matuska 	if (err != 0)
1451*34f9f568SMartin Matuska 		return (err);
1452*34f9f568SMartin Matuska 
1453*34f9f568SMartin Matuska 	zfs_uio_iovbase(puio, idx) = plainbuf;
1454*34f9f568SMartin Matuska 	zfs_uio_iovlen(puio, idx) = datalen;
1455*34f9f568SMartin Matuska 	zfs_uio_iovbase(cuio, idx) = cipherbuf;
1456*34f9f568SMartin Matuska 	zfs_uio_iovlen(cuio, idx) = datalen;
1457*34f9f568SMartin Matuska 
1458*34f9f568SMartin Matuska 	*enc_len = datalen;
1459*34f9f568SMartin Matuska 
1460*34f9f568SMartin Matuska 	return (0);
1461*34f9f568SMartin Matuska }
1462*34f9f568SMartin Matuska 
1463*34f9f568SMartin Matuska /*
1464*34f9f568SMartin Matuska  * This function builds up the plaintext (puio) and ciphertext (cuio) uios so
1465*34f9f568SMartin Matuska  * that they can be used for encryption and decryption by zio_do_crypt_uio().
1466*34f9f568SMartin Matuska  * Most blocks will use zio_crypt_init_uios_normal(), with ZIL and dnode blocks
1467*34f9f568SMartin Matuska  * requiring special handling to parse out pieces that are to be encrypted. The
1468*34f9f568SMartin Matuska  * authbuf is used by these special cases to store additional authenticated
1469*34f9f568SMartin Matuska  * data (AAD) for the encryption modes.
1470*34f9f568SMartin Matuska  */
1471*34f9f568SMartin Matuska static int
zio_crypt_init_uios(boolean_t encrypt,uint64_t version,dmu_object_type_t ot,uint8_t * plainbuf,uint8_t * cipherbuf,uint_t datalen,boolean_t byteswap,zfs_uio_t * puio,zfs_uio_t * cuio,uint_t * enc_len,uint8_t ** authbuf,uint_t * auth_len,boolean_t * no_crypt)1472*34f9f568SMartin Matuska zio_crypt_init_uios(boolean_t encrypt, uint64_t version, dmu_object_type_t ot,
1473*34f9f568SMartin Matuska     uint8_t *plainbuf, uint8_t *cipherbuf, uint_t datalen, boolean_t byteswap,
1474*34f9f568SMartin Matuska     zfs_uio_t *puio, zfs_uio_t *cuio, uint_t *enc_len,
1475*34f9f568SMartin Matuska     uint8_t **authbuf, uint_t *auth_len, boolean_t *no_crypt)
1476*34f9f568SMartin Matuska {
1477*34f9f568SMartin Matuska 	int err;
1478*34f9f568SMartin Matuska 
1479*34f9f568SMartin Matuska 	ASSERT(DMU_OT_IS_ENCRYPTED(ot) || ot == DMU_OT_NONE);
1480*34f9f568SMartin Matuska 
1481*34f9f568SMartin Matuska 	/* route to handler */
1482*34f9f568SMartin Matuska 	switch (ot) {
1483*34f9f568SMartin Matuska 	case DMU_OT_INTENT_LOG:
1484*34f9f568SMartin Matuska 		err = zio_crypt_init_uios_zil(encrypt, plainbuf, cipherbuf,
1485*34f9f568SMartin Matuska 		    datalen, byteswap, puio, cuio, enc_len, authbuf, auth_len,
1486*34f9f568SMartin Matuska 		    no_crypt);
1487*34f9f568SMartin Matuska 		break;
1488*34f9f568SMartin Matuska 	case DMU_OT_DNODE:
1489*34f9f568SMartin Matuska 		err = zio_crypt_init_uios_dnode(encrypt, version, plainbuf,
1490*34f9f568SMartin Matuska 		    cipherbuf, datalen, byteswap, puio, cuio, enc_len, authbuf,
1491*34f9f568SMartin Matuska 		    auth_len, no_crypt);
1492*34f9f568SMartin Matuska 		break;
1493*34f9f568SMartin Matuska 	default:
1494*34f9f568SMartin Matuska 		err = zio_crypt_init_uios_normal(encrypt, plainbuf, cipherbuf,
1495*34f9f568SMartin Matuska 		    datalen, puio, cuio, enc_len);
1496*34f9f568SMartin Matuska 		*authbuf = NULL;
1497*34f9f568SMartin Matuska 		*auth_len = 0;
1498*34f9f568SMartin Matuska 		*no_crypt = B_FALSE;
1499*34f9f568SMartin Matuska 		break;
1500*34f9f568SMartin Matuska 	}
1501*34f9f568SMartin Matuska 
1502*34f9f568SMartin Matuska 	if (err != 0)
1503*34f9f568SMartin Matuska 		return (err);
1504*34f9f568SMartin Matuska 
1505*34f9f568SMartin Matuska 	return (0);
1506*34f9f568SMartin Matuska }
1507*34f9f568SMartin Matuska 
1508*34f9f568SMartin Matuska /*
1509*34f9f568SMartin Matuska  * Primary encryption / decryption entrypoint for zio data.
1510*34f9f568SMartin Matuska  */
1511*34f9f568SMartin Matuska int
zio_do_crypt_data(boolean_t encrypt,zio_crypt_key_t * key,dmu_object_type_t ot,boolean_t byteswap,uint8_t * salt,uint8_t * iv,uint8_t * mac,uint_t datalen,uint8_t * plainbuf,uint8_t * cipherbuf,boolean_t * no_crypt)1512*34f9f568SMartin Matuska zio_do_crypt_data(boolean_t encrypt, zio_crypt_key_t *key,
1513*34f9f568SMartin Matuska     dmu_object_type_t ot, boolean_t byteswap, uint8_t *salt, uint8_t *iv,
1514*34f9f568SMartin Matuska     uint8_t *mac, uint_t datalen, uint8_t *plainbuf, uint8_t *cipherbuf,
1515*34f9f568SMartin Matuska     boolean_t *no_crypt)
1516*34f9f568SMartin Matuska {
1517*34f9f568SMartin Matuska 	int ret;
1518*34f9f568SMartin Matuska 	boolean_t locked = B_FALSE;
1519*34f9f568SMartin Matuska 	const zio_crypt_info_t *ci = &zio_crypt_table[key->zk_crypt];
1520*34f9f568SMartin Matuska 	uint_t enc_len, auth_len;
1521*34f9f568SMartin Matuska 	zfs_uio_t puio, cuio;
1522*34f9f568SMartin Matuska 	uint8_t enc_keydata[MASTER_KEY_MAX_LEN];
1523*34f9f568SMartin Matuska 	crypto_key_t tmp_ckey, *ckey = NULL;
1524*34f9f568SMartin Matuska 	zio_crypt_session_t *sess;
1525*34f9f568SMartin Matuska 	uint8_t *authbuf = NULL;
1526*34f9f568SMartin Matuska 
1527*34f9f568SMartin Matuska 	memset(&puio, 0, sizeof (puio));
1528*34f9f568SMartin Matuska 	memset(&cuio, 0, sizeof (cuio));
1529*34f9f568SMartin Matuska 
1530*34f9f568SMartin Matuska 	/*
1531*34f9f568SMartin Matuska 	 * If the needed key is the current one, just use it. Otherwise we
1532*34f9f568SMartin Matuska 	 * need to generate a temporary one from the given salt + master key.
1533*34f9f568SMartin Matuska 	 * If we are encrypting, we must return a copy of the current salt
1534*34f9f568SMartin Matuska 	 * so that it can be stored in the blkptr_t.
1535*34f9f568SMartin Matuska 	 */
1536*34f9f568SMartin Matuska 	rw_enter(&key->zk_salt_lock, RW_READER);
1537*34f9f568SMartin Matuska 	locked = B_TRUE;
1538*34f9f568SMartin Matuska 
1539*34f9f568SMartin Matuska 	if (memcmp(salt, key->zk_salt, ZIO_DATA_SALT_LEN) == 0) {
1540*34f9f568SMartin Matuska 		ckey = &key->zk_current_key;
1541*34f9f568SMartin Matuska 		sess = &key->zk_current_sess;
1542*34f9f568SMartin Matuska 	} else {
1543*34f9f568SMartin Matuska 		rw_exit(&key->zk_salt_lock);
1544*34f9f568SMartin Matuska 		locked = B_FALSE;
1545*34f9f568SMartin Matuska 
1546*34f9f568SMartin Matuska 		ret = hkdf_sha512(key->zk_master_keydata, ci->ci_keylen, NULL,
1547*34f9f568SMartin Matuska 		    0, salt, ZIO_DATA_SALT_LEN, enc_keydata, ci->ci_keylen);
1548*34f9f568SMartin Matuska 		if (ret != 0)
1549*34f9f568SMartin Matuska 			goto error;
1550*34f9f568SMartin Matuska 
1551*34f9f568SMartin Matuska 		tmp_ckey.ck_data = enc_keydata;
1552*34f9f568SMartin Matuska 		tmp_ckey.ck_length = CRYPTO_BYTES2BITS(ci->ci_keylen);
1553*34f9f568SMartin Matuska 
1554*34f9f568SMartin Matuska 		ckey = &tmp_ckey;
1555*34f9f568SMartin Matuska 		sess = NULL;
1556*34f9f568SMartin Matuska 	}
1557*34f9f568SMartin Matuska 
1558*34f9f568SMartin Matuska 	/*
1559*34f9f568SMartin Matuska 	 * Attempt to use QAT acceleration if we can. We currently don't
1560*34f9f568SMartin Matuska 	 * do this for metadnode and ZIL blocks, since they have a much
1561*34f9f568SMartin Matuska 	 * more involved buffer layout and the qat_crypt() function only
1562*34f9f568SMartin Matuska 	 * works in-place.
1563*34f9f568SMartin Matuska 	 */
1564*34f9f568SMartin Matuska 	if (qat_crypt_use_accel(datalen) &&
1565*34f9f568SMartin Matuska 	    ot != DMU_OT_INTENT_LOG && ot != DMU_OT_DNODE) {
1566*34f9f568SMartin Matuska 		uint8_t *srcbuf, *dstbuf;
1567*34f9f568SMartin Matuska 
1568*34f9f568SMartin Matuska 		if (encrypt) {
1569*34f9f568SMartin Matuska 			srcbuf = plainbuf;
1570*34f9f568SMartin Matuska 			dstbuf = cipherbuf;
1571*34f9f568SMartin Matuska 		} else {
1572*34f9f568SMartin Matuska 			srcbuf = cipherbuf;
1573*34f9f568SMartin Matuska 			dstbuf = plainbuf;
1574*34f9f568SMartin Matuska 		}
1575*34f9f568SMartin Matuska 
1576*34f9f568SMartin Matuska 		ret = qat_crypt((encrypt) ? QAT_ENCRYPT : QAT_DECRYPT, srcbuf,
1577*34f9f568SMartin Matuska 		    dstbuf, NULL, 0, iv, mac, ckey, key->zk_crypt, datalen);
1578*34f9f568SMartin Matuska 		if (ret == CPA_STATUS_SUCCESS) {
1579*34f9f568SMartin Matuska 			if (locked) {
1580*34f9f568SMartin Matuska 				rw_exit(&key->zk_salt_lock);
1581*34f9f568SMartin Matuska 				locked = B_FALSE;
1582*34f9f568SMartin Matuska 			}
1583*34f9f568SMartin Matuska 
1584*34f9f568SMartin Matuska 			return (0);
1585*34f9f568SMartin Matuska 		}
1586*34f9f568SMartin Matuska 		/* If the hardware implementation fails fall back to software */
1587*34f9f568SMartin Matuska 	}
1588*34f9f568SMartin Matuska 
1589*34f9f568SMartin Matuska 	/* create uios for encryption */
1590*34f9f568SMartin Matuska 	ret = zio_crypt_init_uios(encrypt, key->zk_version, ot, plainbuf,
1591*34f9f568SMartin Matuska 	    cipherbuf, datalen, byteswap, &puio, &cuio, &enc_len,
1592*34f9f568SMartin Matuska 	    &authbuf, &auth_len, no_crypt);
1593*34f9f568SMartin Matuska 	if (ret != 0)
1594*34f9f568SMartin Matuska 		goto error;
1595*34f9f568SMartin Matuska 
1596*34f9f568SMartin Matuska 	/* perform the encryption / decryption in software */
1597*34f9f568SMartin Matuska 	if (encrypt)
1598*34f9f568SMartin Matuska 		ret = zio_encrypt_os(ci, ckey, sess, &puio, &cuio, enc_len,
1599*34f9f568SMartin Matuska 		    iv, authbuf, auth_len, mac);
1600*34f9f568SMartin Matuska 	else
1601*34f9f568SMartin Matuska 		ret = zio_decrypt_os(ci, ckey, sess, &cuio, &puio, enc_len,
1602*34f9f568SMartin Matuska 		    iv, authbuf, auth_len, mac);
1603*34f9f568SMartin Matuska 	if (ret != 0)
1604*34f9f568SMartin Matuska 		goto error;
1605*34f9f568SMartin Matuska 
1606*34f9f568SMartin Matuska 	if (locked) {
1607*34f9f568SMartin Matuska 		rw_exit(&key->zk_salt_lock);
1608*34f9f568SMartin Matuska 	}
1609*34f9f568SMartin Matuska 
1610*34f9f568SMartin Matuska 	if (authbuf != NULL)
1611*34f9f568SMartin Matuska 		zio_buf_free(authbuf, datalen);
1612*34f9f568SMartin Matuska 	if (ckey == &tmp_ckey)
1613*34f9f568SMartin Matuska 		memset(enc_keydata, 0, ci->ci_keylen);
1614*34f9f568SMartin Matuska 
1615*34f9f568SMartin Matuska 	zio_crypt_uios_fini_os(&puio, &cuio);
1616*34f9f568SMartin Matuska 
1617*34f9f568SMartin Matuska 	return (0);
1618*34f9f568SMartin Matuska 
1619*34f9f568SMartin Matuska error:
1620*34f9f568SMartin Matuska 	if (locked)
1621*34f9f568SMartin Matuska 		rw_exit(&key->zk_salt_lock);
1622*34f9f568SMartin Matuska 	if (authbuf != NULL)
1623*34f9f568SMartin Matuska 		zio_buf_free(authbuf, datalen);
1624*34f9f568SMartin Matuska 	if (ckey == &tmp_ckey)
1625*34f9f568SMartin Matuska 		memset(enc_keydata, 0, ci->ci_keylen);
1626*34f9f568SMartin Matuska 	zio_crypt_uios_fini_os(&puio, &cuio);
1627*34f9f568SMartin Matuska 	return (SET_ERROR(ret));
1628*34f9f568SMartin Matuska }
1629*34f9f568SMartin Matuska 
1630*34f9f568SMartin Matuska /*
1631*34f9f568SMartin Matuska  * Simple wrapper around zio_do_crypt_data() to work with abd's instead of
1632*34f9f568SMartin Matuska  * linear buffers.
1633*34f9f568SMartin Matuska  */
1634*34f9f568SMartin Matuska int
zio_do_crypt_abd(boolean_t encrypt,zio_crypt_key_t * key,dmu_object_type_t ot,boolean_t byteswap,uint8_t * salt,uint8_t * iv,uint8_t * mac,uint_t datalen,abd_t * pabd,abd_t * cabd,boolean_t * no_crypt)1635*34f9f568SMartin Matuska zio_do_crypt_abd(boolean_t encrypt, zio_crypt_key_t *key, dmu_object_type_t ot,
1636*34f9f568SMartin Matuska     boolean_t byteswap, uint8_t *salt, uint8_t *iv, uint8_t *mac,
1637*34f9f568SMartin Matuska     uint_t datalen, abd_t *pabd, abd_t *cabd, boolean_t *no_crypt)
1638*34f9f568SMartin Matuska {
1639*34f9f568SMartin Matuska 	int ret;
1640*34f9f568SMartin Matuska 	void *ptmp, *ctmp;
1641*34f9f568SMartin Matuska 
1642*34f9f568SMartin Matuska 	if (encrypt) {
1643*34f9f568SMartin Matuska 		ptmp = abd_borrow_buf_copy(pabd, datalen);
1644*34f9f568SMartin Matuska 		ctmp = abd_borrow_buf(cabd, datalen);
1645*34f9f568SMartin Matuska 	} else {
1646*34f9f568SMartin Matuska 		ptmp = abd_borrow_buf(pabd, datalen);
1647*34f9f568SMartin Matuska 		ctmp = abd_borrow_buf_copy(cabd, datalen);
1648*34f9f568SMartin Matuska 	}
1649*34f9f568SMartin Matuska 
1650*34f9f568SMartin Matuska 	ret = zio_do_crypt_data(encrypt, key, ot, byteswap, salt, iv, mac,
1651*34f9f568SMartin Matuska 	    datalen, ptmp, ctmp, no_crypt);
1652*34f9f568SMartin Matuska 	if (ret != 0)
1653*34f9f568SMartin Matuska 		goto error;
1654*34f9f568SMartin Matuska 
1655*34f9f568SMartin Matuska 	if (encrypt) {
1656*34f9f568SMartin Matuska 		abd_return_buf(pabd, ptmp, datalen);
1657*34f9f568SMartin Matuska 		abd_return_buf_copy(cabd, ctmp, datalen);
1658*34f9f568SMartin Matuska 	} else {
1659*34f9f568SMartin Matuska 		abd_return_buf_copy(pabd, ptmp, datalen);
1660*34f9f568SMartin Matuska 		abd_return_buf(cabd, ctmp, datalen);
1661*34f9f568SMartin Matuska 	}
1662*34f9f568SMartin Matuska 
1663*34f9f568SMartin Matuska 	return (0);
1664*34f9f568SMartin Matuska 
1665*34f9f568SMartin Matuska error:
1666*34f9f568SMartin Matuska 	if (encrypt) {
1667*34f9f568SMartin Matuska 		abd_return_buf(pabd, ptmp, datalen);
1668*34f9f568SMartin Matuska 		abd_return_buf_copy(cabd, ctmp, datalen);
1669*34f9f568SMartin Matuska 	} else {
1670*34f9f568SMartin Matuska 		abd_return_buf_copy(pabd, ptmp, datalen);
1671*34f9f568SMartin Matuska 		abd_return_buf(cabd, ctmp, datalen);
1672*34f9f568SMartin Matuska 	}
1673*34f9f568SMartin Matuska 
1674*34f9f568SMartin Matuska 	return (SET_ERROR(ret));
1675*34f9f568SMartin Matuska }
1676*34f9f568SMartin Matuska 
1677*34f9f568SMartin Matuska ZFS_MODULE_PARAM(zfs, zfs_key_,  max_salt_uses, U64, ZMOD_RW,
1678*34f9f568SMartin Matuska 	"Max number of times a salt value can be used for generating "
1679*34f9f568SMartin Matuska 	"encryption keys before it is rotated");
1680