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