Blame


1 6c6e6e50 2020-10-24 neels /* $OpenBSD: softraid_crypto.c,v 1.139 2020/07/13 00:06:22 kn Exp $ */
2 6c6e6e50 2020-10-24 neels /*
3 6c6e6e50 2020-10-24 neels * Copyright (c) 2007 Marco Peereboom <marco@peereboom.us>
4 6c6e6e50 2020-10-24 neels * Copyright (c) 2008 Hans-Joerg Hoexer <hshoexer@openbsd.org>
5 6c6e6e50 2020-10-24 neels * Copyright (c) 2008 Damien Miller <djm@mindrot.org>
6 6c6e6e50 2020-10-24 neels * Copyright (c) 2009 Joel Sing <jsing@openbsd.org>
7 6c6e6e50 2020-10-24 neels *
8 6c6e6e50 2020-10-24 neels * Permission to use, copy, modify, and distribute this software for any
9 6c6e6e50 2020-10-24 neels * purpose with or without fee is hereby granted, provided that the above
10 6c6e6e50 2020-10-24 neels * copyright notice and this permission notice appear in all copies.
11 6c6e6e50 2020-10-24 neels *
12 6c6e6e50 2020-10-24 neels * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13 6c6e6e50 2020-10-24 neels * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14 6c6e6e50 2020-10-24 neels * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15 6c6e6e50 2020-10-24 neels * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16 6c6e6e50 2020-10-24 neels * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 6c6e6e50 2020-10-24 neels * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 6c6e6e50 2020-10-24 neels * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 6c6e6e50 2020-10-24 neels */
20 6c6e6e50 2020-10-24 neels
21 6c6e6e50 2020-10-24 neels #include "bio.h"
22 6c6e6e50 2020-10-24 neels
23 6c6e6e50 2020-10-24 neels #include <sys/param.h>
24 6c6e6e50 2020-10-24 neels #include <sys/systm.h>
25 6c6e6e50 2020-10-24 neels #include <sys/buf.h>
26 6c6e6e50 2020-10-24 neels #include <sys/device.h>
27 6c6e6e50 2020-10-24 neels #include <sys/ioctl.h>
28 6c6e6e50 2020-10-24 neels #include <sys/malloc.h>
29 6c6e6e50 2020-10-24 neels #include <sys/pool.h>
30 6c6e6e50 2020-10-24 neels #include <sys/kernel.h>
31 6c6e6e50 2020-10-24 neels #include <sys/disk.h>
32 6c6e6e50 2020-10-24 neels #include <sys/rwlock.h>
33 6c6e6e50 2020-10-24 neels #include <sys/queue.h>
34 6c6e6e50 2020-10-24 neels #include <sys/fcntl.h>
35 6c6e6e50 2020-10-24 neels #include <sys/disklabel.h>
36 6c6e6e50 2020-10-24 neels #include <sys/vnode.h>
37 6c6e6e50 2020-10-24 neels #include <sys/mount.h>
38 6c6e6e50 2020-10-24 neels #include <sys/sensors.h>
39 6c6e6e50 2020-10-24 neels #include <sys/stat.h>
40 6c6e6e50 2020-10-24 neels #include <sys/conf.h>
41 6c6e6e50 2020-10-24 neels #include <sys/uio.h>
42 6c6e6e50 2020-10-24 neels #include <sys/dkio.h>
43 6c6e6e50 2020-10-24 neels
44 6c6e6e50 2020-10-24 neels #include <crypto/cryptodev.h>
45 6c6e6e50 2020-10-24 neels #include <crypto/rijndael.h>
46 6c6e6e50 2020-10-24 neels #include <crypto/md5.h>
47 6c6e6e50 2020-10-24 neels #include <crypto/sha1.h>
48 6c6e6e50 2020-10-24 neels #include <crypto/sha2.h>
49 6c6e6e50 2020-10-24 neels #include <crypto/hmac.h>
50 6c6e6e50 2020-10-24 neels
51 6c6e6e50 2020-10-24 neels #include <scsi/scsi_all.h>
52 6c6e6e50 2020-10-24 neels #include <scsi/scsiconf.h>
53 6c6e6e50 2020-10-24 neels #include <scsi/scsi_disk.h>
54 6c6e6e50 2020-10-24 neels
55 6c6e6e50 2020-10-24 neels #include <dev/softraidvar.h>
56 6c6e6e50 2020-10-24 neels
57 6c6e6e50 2020-10-24 neels struct sr_crypto_wu *sr_crypto_prepare(struct sr_workunit *, int);
58 6c6e6e50 2020-10-24 neels int sr_crypto_create_keys(struct sr_discipline *);
59 6c6e6e50 2020-10-24 neels int sr_crypto_get_kdf(struct bioc_createraid *,
60 6c6e6e50 2020-10-24 neels struct sr_discipline *);
61 6c6e6e50 2020-10-24 neels int sr_crypto_decrypt(u_char *, u_char *, u_char *, size_t, int);
62 6c6e6e50 2020-10-24 neels int sr_crypto_encrypt(u_char *, u_char *, u_char *, size_t, int);
63 6c6e6e50 2020-10-24 neels int sr_crypto_decrypt_key(struct sr_discipline *);
64 6c6e6e50 2020-10-24 neels int sr_crypto_change_maskkey(struct sr_discipline *,
65 6c6e6e50 2020-10-24 neels struct sr_crypto_kdfinfo *, struct sr_crypto_kdfinfo *);
66 6c6e6e50 2020-10-24 neels int sr_crypto_create(struct sr_discipline *,
67 6c6e6e50 2020-10-24 neels struct bioc_createraid *, int, int64_t);
68 6c6e6e50 2020-10-24 neels int sr_crypto_init(struct sr_discipline *,
69 6c6e6e50 2020-10-24 neels struct bioc_createraid *);
70 6c6e6e50 2020-10-24 neels int sr_crypto_assemble(struct sr_discipline *,
71 6c6e6e50 2020-10-24 neels struct bioc_createraid *, int, void *);
72 6c6e6e50 2020-10-24 neels int sr_crypto_alloc_resources(struct sr_discipline *);
73 6c6e6e50 2020-10-24 neels void sr_crypto_free_resources(struct sr_discipline *);
74 6c6e6e50 2020-10-24 neels int sr_crypto_ioctl(struct sr_discipline *,
75 6c6e6e50 2020-10-24 neels struct bioc_discipline *);
76 6c6e6e50 2020-10-24 neels int sr_crypto_meta_opt_handler(struct sr_discipline *,
77 6c6e6e50 2020-10-24 neels struct sr_meta_opt_hdr *);
78 6c6e6e50 2020-10-24 neels void sr_crypto_write(struct cryptop *);
79 6c6e6e50 2020-10-24 neels int sr_crypto_rw(struct sr_workunit *);
80 6c6e6e50 2020-10-24 neels int sr_crypto_dev_rw(struct sr_workunit *, struct sr_crypto_wu *);
81 6c6e6e50 2020-10-24 neels void sr_crypto_done(struct sr_workunit *);
82 6c6e6e50 2020-10-24 neels void sr_crypto_read(struct cryptop *);
83 6c6e6e50 2020-10-24 neels void sr_crypto_calculate_check_hmac_sha1(u_int8_t *, int,
84 6c6e6e50 2020-10-24 neels u_int8_t *, int, u_char *);
85 6c6e6e50 2020-10-24 neels void sr_crypto_hotplug(struct sr_discipline *, struct disk *, int);
86 6c6e6e50 2020-10-24 neels
87 6c6e6e50 2020-10-24 neels #ifdef SR_DEBUG0
88 6c6e6e50 2020-10-24 neels void sr_crypto_dumpkeys(struct sr_discipline *);
89 6c6e6e50 2020-10-24 neels #endif
90 6c6e6e50 2020-10-24 neels
91 6c6e6e50 2020-10-24 neels /* Discipline initialisation. */
92 6c6e6e50 2020-10-24 neels void
93 6c6e6e50 2020-10-24 neels sr_crypto_discipline_init(struct sr_discipline *sd)
94 6c6e6e50 2020-10-24 neels {
95 6c6e6e50 2020-10-24 neels int i;
96 6c6e6e50 2020-10-24 neels
97 6c6e6e50 2020-10-24 neels /* Fill out discipline members. */
98 6c6e6e50 2020-10-24 neels sd->sd_wu_size = sizeof(struct sr_crypto_wu);
99 6c6e6e50 2020-10-24 neels sd->sd_type = SR_MD_CRYPTO;
100 6c6e6e50 2020-10-24 neels strlcpy(sd->sd_name, "CRYPTO", sizeof(sd->sd_name));
101 6c6e6e50 2020-10-24 neels sd->sd_capabilities = SR_CAP_SYSTEM_DISK | SR_CAP_AUTO_ASSEMBLE;
102 6c6e6e50 2020-10-24 neels sd->sd_max_wu = SR_CRYPTO_NOWU;
103 6c6e6e50 2020-10-24 neels
104 6c6e6e50 2020-10-24 neels for (i = 0; i < SR_CRYPTO_MAXKEYS; i++)
105 6c6e6e50 2020-10-24 neels sd->mds.mdd_crypto.scr_sid[i] = (u_int64_t)-1;
106 6c6e6e50 2020-10-24 neels
107 6c6e6e50 2020-10-24 neels /* Setup discipline specific function pointers. */
108 6c6e6e50 2020-10-24 neels sd->sd_alloc_resources = sr_crypto_alloc_resources;
109 6c6e6e50 2020-10-24 neels sd->sd_assemble = sr_crypto_assemble;
110 6c6e6e50 2020-10-24 neels sd->sd_create = sr_crypto_create;
111 6c6e6e50 2020-10-24 neels sd->sd_free_resources = sr_crypto_free_resources;
112 6c6e6e50 2020-10-24 neels sd->sd_ioctl_handler = sr_crypto_ioctl;
113 6c6e6e50 2020-10-24 neels sd->sd_meta_opt_handler = sr_crypto_meta_opt_handler;
114 6c6e6e50 2020-10-24 neels sd->sd_scsi_rw = sr_crypto_rw;
115 6c6e6e50 2020-10-24 neels sd->sd_scsi_done = sr_crypto_done;
116 6c6e6e50 2020-10-24 neels }
117 6c6e6e50 2020-10-24 neels
118 6c6e6e50 2020-10-24 neels int
119 6c6e6e50 2020-10-24 neels sr_crypto_create(struct sr_discipline *sd, struct bioc_createraid *bc,
120 6c6e6e50 2020-10-24 neels int no_chunk, int64_t coerced_size)
121 6c6e6e50 2020-10-24 neels {
122 6c6e6e50 2020-10-24 neels int rv = EINVAL;
123 6c6e6e50 2020-10-24 neels
124 6c6e6e50 2020-10-24 neels if (no_chunk != 1) {
125 6c6e6e50 2020-10-24 neels sr_error(sd->sd_sc, "%s requires exactly one chunk",
126 6c6e6e50 2020-10-24 neels sd->sd_name);
127 6c6e6e50 2020-10-24 neels return (rv);
128 6c6e6e50 2020-10-24 neels }
129 6c6e6e50 2020-10-24 neels
130 6c6e6e50 2020-10-24 neels sd->sd_meta->ssdi.ssd_size = coerced_size;
131 6c6e6e50 2020-10-24 neels
132 6c6e6e50 2020-10-24 neels rv = sr_crypto_init(sd, bc);
133 6c6e6e50 2020-10-24 neels if (rv)
134 6c6e6e50 2020-10-24 neels return (rv);
135 6c6e6e50 2020-10-24 neels
136 6c6e6e50 2020-10-24 neels sd->sd_max_ccb_per_wu = no_chunk;
137 6c6e6e50 2020-10-24 neels return (0);
138 6c6e6e50 2020-10-24 neels }
139 6c6e6e50 2020-10-24 neels
140 6c6e6e50 2020-10-24 neels int
141 6c6e6e50 2020-10-24 neels sr_crypto_init(struct sr_discipline *sd, struct bioc_createraid *bc)
142 6c6e6e50 2020-10-24 neels {
143 6c6e6e50 2020-10-24 neels struct sr_meta_opt_item *omi;
144 6c6e6e50 2020-10-24 neels int rv = EINVAL;
145 6c6e6e50 2020-10-24 neels
146 6c6e6e50 2020-10-24 neels if (sd->sd_meta->ssdi.ssd_size > SR_CRYPTO_MAXSIZE) {
147 6c6e6e50 2020-10-24 neels sr_error(sd->sd_sc, "%s exceeds maximum size (%lli > %llu)",
148 6c6e6e50 2020-10-24 neels sd->sd_name, sd->sd_meta->ssdi.ssd_size,
149 6c6e6e50 2020-10-24 neels SR_CRYPTO_MAXSIZE);
150 6c6e6e50 2020-10-24 neels goto done;
151 6c6e6e50 2020-10-24 neels }
152 6c6e6e50 2020-10-24 neels
153 6c6e6e50 2020-10-24 neels /* Create crypto optional metadata. */
154 6c6e6e50 2020-10-24 neels omi = malloc(sizeof(struct sr_meta_opt_item), M_DEVBUF,
155 6c6e6e50 2020-10-24 neels M_WAITOK | M_ZERO);
156 6c6e6e50 2020-10-24 neels omi->omi_som = malloc(sizeof(struct sr_meta_crypto), M_DEVBUF,
157 6c6e6e50 2020-10-24 neels M_WAITOK | M_ZERO);
158 6c6e6e50 2020-10-24 neels omi->omi_som->som_type = SR_OPT_CRYPTO;
159 6c6e6e50 2020-10-24 neels omi->omi_som->som_length = sizeof(struct sr_meta_crypto);
160 6c6e6e50 2020-10-24 neels SLIST_INSERT_HEAD(&sd->sd_meta_opt, omi, omi_link);
161 6c6e6e50 2020-10-24 neels sd->mds.mdd_crypto.scr_meta = (struct sr_meta_crypto *)omi->omi_som;
162 6c6e6e50 2020-10-24 neels sd->sd_meta->ssdi.ssd_opt_no++;
163 6c6e6e50 2020-10-24 neels
164 6c6e6e50 2020-10-24 neels sd->mds.mdd_crypto.key_disk = NULL;
165 6c6e6e50 2020-10-24 neels
166 6c6e6e50 2020-10-24 neels if (bc->bc_key_disk != NODEV) {
167 6c6e6e50 2020-10-24 neels
168 6c6e6e50 2020-10-24 neels /* Create a key disk. */
169 6c6e6e50 2020-10-24 neels if (sr_crypto_get_kdf(bc, sd))
170 6c6e6e50 2020-10-24 neels goto done;
171 6c6e6e50 2020-10-24 neels sd->mds.mdd_crypto.key_disk =
172 6c6e6e50 2020-10-24 neels sr_crypto_create_key_disk(sd, bc->bc_key_disk);
173 6c6e6e50 2020-10-24 neels if (sd->mds.mdd_crypto.key_disk == NULL)
174 6c6e6e50 2020-10-24 neels goto done;
175 6c6e6e50 2020-10-24 neels sd->sd_capabilities |= SR_CAP_AUTO_ASSEMBLE;
176 6c6e6e50 2020-10-24 neels
177 6c6e6e50 2020-10-24 neels } else if (bc->bc_opaque_flags & BIOC_SOOUT) {
178 6c6e6e50 2020-10-24 neels
179 6c6e6e50 2020-10-24 neels /* No hint available yet. */
180 6c6e6e50 2020-10-24 neels bc->bc_opaque_status = BIOC_SOINOUT_FAILED;
181 6c6e6e50 2020-10-24 neels rv = EAGAIN;
182 6c6e6e50 2020-10-24 neels goto done;
183 6c6e6e50 2020-10-24 neels
184 6c6e6e50 2020-10-24 neels } else if (sr_crypto_get_kdf(bc, sd))
185 6c6e6e50 2020-10-24 neels goto done;
186 6c6e6e50 2020-10-24 neels
187 6c6e6e50 2020-10-24 neels /* Passphrase volumes cannot be automatically assembled. */
188 6c6e6e50 2020-10-24 neels if (!(bc->bc_flags & BIOC_SCNOAUTOASSEMBLE) && bc->bc_key_disk == NODEV)
189 6c6e6e50 2020-10-24 neels goto done;
190 6c6e6e50 2020-10-24 neels
191 6c6e6e50 2020-10-24 neels sr_crypto_create_keys(sd);
192 6c6e6e50 2020-10-24 neels
193 6c6e6e50 2020-10-24 neels rv = 0;
194 6c6e6e50 2020-10-24 neels done:
195 6c6e6e50 2020-10-24 neels return (rv);
196 6c6e6e50 2020-10-24 neels }
197 6c6e6e50 2020-10-24 neels
198 6c6e6e50 2020-10-24 neels int
199 6c6e6e50 2020-10-24 neels sr_crypto_assemble(struct sr_discipline *sd, struct bioc_createraid *bc,
200 6c6e6e50 2020-10-24 neels int no_chunk, void *data)
201 6c6e6e50 2020-10-24 neels {
202 6c6e6e50 2020-10-24 neels int rv = EINVAL;
203 6c6e6e50 2020-10-24 neels
204 6c6e6e50 2020-10-24 neels sd->mds.mdd_crypto.key_disk = NULL;
205 6c6e6e50 2020-10-24 neels
206 6c6e6e50 2020-10-24 neels /* Crypto optional metadata must already exist... */
207 6c6e6e50 2020-10-24 neels if (sd->mds.mdd_crypto.scr_meta == NULL)
208 6c6e6e50 2020-10-24 neels goto done;
209 6c6e6e50 2020-10-24 neels
210 6c6e6e50 2020-10-24 neels if (data != NULL) {
211 6c6e6e50 2020-10-24 neels /* Kernel already has mask key. */
212 6c6e6e50 2020-10-24 neels memcpy(sd->mds.mdd_crypto.scr_maskkey, data,
213 6c6e6e50 2020-10-24 neels sizeof(sd->mds.mdd_crypto.scr_maskkey));
214 6c6e6e50 2020-10-24 neels } else if (bc->bc_key_disk != NODEV) {
215 6c6e6e50 2020-10-24 neels /* Read the mask key from the key disk. */
216 6c6e6e50 2020-10-24 neels sd->mds.mdd_crypto.key_disk =
217 6c6e6e50 2020-10-24 neels sr_crypto_read_key_disk(sd, bc->bc_key_disk);
218 6c6e6e50 2020-10-24 neels if (sd->mds.mdd_crypto.key_disk == NULL)
219 6c6e6e50 2020-10-24 neels goto done;
220 6c6e6e50 2020-10-24 neels } else if (bc->bc_opaque_flags & BIOC_SOOUT) {
221 6c6e6e50 2020-10-24 neels /* provide userland with kdf hint */
222 6c6e6e50 2020-10-24 neels if (bc->bc_opaque == NULL)
223 6c6e6e50 2020-10-24 neels goto done;
224 6c6e6e50 2020-10-24 neels
225 6c6e6e50 2020-10-24 neels if (sizeof(sd->mds.mdd_crypto.scr_meta->scm_kdfhint) <
226 6c6e6e50 2020-10-24 neels bc->bc_opaque_size)
227 6c6e6e50 2020-10-24 neels goto done;
228 6c6e6e50 2020-10-24 neels
229 6c6e6e50 2020-10-24 neels if (copyout(sd->mds.mdd_crypto.scr_meta->scm_kdfhint,
230 6c6e6e50 2020-10-24 neels bc->bc_opaque, bc->bc_opaque_size))
231 6c6e6e50 2020-10-24 neels goto done;
232 6c6e6e50 2020-10-24 neels
233 6c6e6e50 2020-10-24 neels /* we're done */
234 6c6e6e50 2020-10-24 neels bc->bc_opaque_status = BIOC_SOINOUT_OK;
235 6c6e6e50 2020-10-24 neels rv = EAGAIN;
236 6c6e6e50 2020-10-24 neels goto done;
237 6c6e6e50 2020-10-24 neels } else if (bc->bc_opaque_flags & BIOC_SOIN) {
238 6c6e6e50 2020-10-24 neels /* get kdf with maskkey from userland */
239 6c6e6e50 2020-10-24 neels if (sr_crypto_get_kdf(bc, sd))
240 6c6e6e50 2020-10-24 neels goto done;
241 6c6e6e50 2020-10-24 neels } else
242 6c6e6e50 2020-10-24 neels goto done;
243 6c6e6e50 2020-10-24 neels
244 6c6e6e50 2020-10-24 neels sd->sd_max_ccb_per_wu = sd->sd_meta->ssdi.ssd_chunk_no;
245 6c6e6e50 2020-10-24 neels
246 6c6e6e50 2020-10-24 neels rv = 0;
247 6c6e6e50 2020-10-24 neels done:
248 6c6e6e50 2020-10-24 neels return (rv);
249 6c6e6e50 2020-10-24 neels }
250 6c6e6e50 2020-10-24 neels
251 6c6e6e50 2020-10-24 neels struct sr_crypto_wu *
252 6c6e6e50 2020-10-24 neels sr_crypto_prepare(struct sr_workunit *wu, int encrypt)
253 6c6e6e50 2020-10-24 neels {
254 6c6e6e50 2020-10-24 neels struct scsi_xfer *xs = wu->swu_xs;
255 6c6e6e50 2020-10-24 neels struct sr_discipline *sd = wu->swu_dis;
256 6c6e6e50 2020-10-24 neels struct sr_crypto_wu *crwu;
257 6c6e6e50 2020-10-24 neels struct cryptodesc *crd;
258 6c6e6e50 2020-10-24 neels int flags, i, n;
259 6c6e6e50 2020-10-24 neels daddr_t blkno;
260 6c6e6e50 2020-10-24 neels u_int keyndx;
261 6c6e6e50 2020-10-24 neels
262 6c6e6e50 2020-10-24 neels DNPRINTF(SR_D_DIS, "%s: sr_crypto_prepare wu %p encrypt %d\n",
263 6c6e6e50 2020-10-24 neels DEVNAME(sd->sd_sc), wu, encrypt);
264 6c6e6e50 2020-10-24 neels
265 6c6e6e50 2020-10-24 neels crwu = (struct sr_crypto_wu *)wu;
266 6c6e6e50 2020-10-24 neels crwu->cr_uio.uio_iovcnt = 1;
267 6c6e6e50 2020-10-24 neels crwu->cr_uio.uio_iov->iov_len = xs->datalen;
268 6c6e6e50 2020-10-24 neels if (xs->flags & SCSI_DATA_OUT) {
269 6c6e6e50 2020-10-24 neels crwu->cr_uio.uio_iov->iov_base = crwu->cr_dmabuf;
270 6c6e6e50 2020-10-24 neels memcpy(crwu->cr_uio.uio_iov->iov_base, xs->data, xs->datalen);
271 6c6e6e50 2020-10-24 neels } else
272 6c6e6e50 2020-10-24 neels crwu->cr_uio.uio_iov->iov_base = xs->data;
273 6c6e6e50 2020-10-24 neels
274 6c6e6e50 2020-10-24 neels blkno = wu->swu_blk_start;
275 6c6e6e50 2020-10-24 neels n = xs->datalen >> DEV_BSHIFT;
276 6c6e6e50 2020-10-24 neels
277 6c6e6e50 2020-10-24 neels /*
278 6c6e6e50 2020-10-24 neels * We preallocated enough crypto descs for up to MAXPHYS of I/O.
279 6c6e6e50 2020-10-24 neels * Since there may be less than that we need to tweak the amount
280 6c6e6e50 2020-10-24 neels * of crypto desc structures to be just long enough for our needs.
281 6c6e6e50 2020-10-24 neels */
282 6c6e6e50 2020-10-24 neels KASSERT(crwu->cr_crp->crp_ndescalloc >= n);
283 6c6e6e50 2020-10-24 neels crwu->cr_crp->crp_ndesc = n;
284 6c6e6e50 2020-10-24 neels flags = (encrypt ? CRD_F_ENCRYPT : 0) |
285 6c6e6e50 2020-10-24 neels CRD_F_IV_PRESENT | CRD_F_IV_EXPLICIT;
286 6c6e6e50 2020-10-24 neels
287 6c6e6e50 2020-10-24 neels /*
288 6c6e6e50 2020-10-24 neels * Select crypto session based on block number.
289 6c6e6e50 2020-10-24 neels *
290 6c6e6e50 2020-10-24 neels * XXX - this does not handle the case where the read/write spans
291 6c6e6e50 2020-10-24 neels * across a different key blocks (e.g. 0.5TB boundary). Currently
292 6c6e6e50 2020-10-24 neels * this is already broken by the use of scr_key[0] below.
293 6c6e6e50 2020-10-24 neels */
294 6c6e6e50 2020-10-24 neels keyndx = blkno >> SR_CRYPTO_KEY_BLKSHIFT;
295 6c6e6e50 2020-10-24 neels crwu->cr_crp->crp_sid = sd->mds.mdd_crypto.scr_sid[keyndx];
296 6c6e6e50 2020-10-24 neels
297 6c6e6e50 2020-10-24 neels crwu->cr_crp->crp_opaque = crwu;
298 6c6e6e50 2020-10-24 neels crwu->cr_crp->crp_ilen = xs->datalen;
299 6c6e6e50 2020-10-24 neels crwu->cr_crp->crp_alloctype = M_DEVBUF;
300 6c6e6e50 2020-10-24 neels crwu->cr_crp->crp_flags = CRYPTO_F_IOV | CRYPTO_F_NOQUEUE;
301 6c6e6e50 2020-10-24 neels crwu->cr_crp->crp_buf = &crwu->cr_uio;
302 6c6e6e50 2020-10-24 neels for (i = 0; i < crwu->cr_crp->crp_ndesc; i++, blkno++) {
303 6c6e6e50 2020-10-24 neels crd = &crwu->cr_crp->crp_desc[i];
304 6c6e6e50 2020-10-24 neels crd->crd_skip = i << DEV_BSHIFT;
305 6c6e6e50 2020-10-24 neels crd->crd_len = DEV_BSIZE;
306 6c6e6e50 2020-10-24 neels crd->crd_inject = 0;
307 6c6e6e50 2020-10-24 neels crd->crd_flags = flags;
308 6c6e6e50 2020-10-24 neels crd->crd_alg = sd->mds.mdd_crypto.scr_alg;
309 6c6e6e50 2020-10-24 neels crd->crd_klen = sd->mds.mdd_crypto.scr_klen;
310 6c6e6e50 2020-10-24 neels crd->crd_key = sd->mds.mdd_crypto.scr_key[0];
311 6c6e6e50 2020-10-24 neels memcpy(crd->crd_iv, &blkno, sizeof(blkno));
312 6c6e6e50 2020-10-24 neels }
313 6c6e6e50 2020-10-24 neels
314 6c6e6e50 2020-10-24 neels return (crwu);
315 6c6e6e50 2020-10-24 neels }
316 6c6e6e50 2020-10-24 neels
317 6c6e6e50 2020-10-24 neels int
318 6c6e6e50 2020-10-24 neels sr_crypto_get_kdf(struct bioc_createraid *bc, struct sr_discipline *sd)
319 6c6e6e50 2020-10-24 neels {
320 6c6e6e50 2020-10-24 neels int rv = EINVAL;
321 6c6e6e50 2020-10-24 neels struct sr_crypto_kdfinfo *kdfinfo;
322 6c6e6e50 2020-10-24 neels
323 6c6e6e50 2020-10-24 neels if (!(bc->bc_opaque_flags & BIOC_SOIN))
324 6c6e6e50 2020-10-24 neels return (rv);
325 6c6e6e50 2020-10-24 neels if (bc->bc_opaque == NULL)
326 6c6e6e50 2020-10-24 neels return (rv);
327 6c6e6e50 2020-10-24 neels if (bc->bc_opaque_size != sizeof(*kdfinfo))
328 6c6e6e50 2020-10-24 neels return (rv);
329 6c6e6e50 2020-10-24 neels
330 6c6e6e50 2020-10-24 neels kdfinfo = malloc(bc->bc_opaque_size, M_DEVBUF, M_WAITOK | M_ZERO);
331 6c6e6e50 2020-10-24 neels if (copyin(bc->bc_opaque, kdfinfo, bc->bc_opaque_size))
332 6c6e6e50 2020-10-24 neels goto out;
333 6c6e6e50 2020-10-24 neels
334 6c6e6e50 2020-10-24 neels if (kdfinfo->len != bc->bc_opaque_size)
335 6c6e6e50 2020-10-24 neels goto out;
336 6c6e6e50 2020-10-24 neels
337 6c6e6e50 2020-10-24 neels /* copy KDF hint to disk meta data */
338 6c6e6e50 2020-10-24 neels if (kdfinfo->flags & SR_CRYPTOKDF_HINT) {
339 6c6e6e50 2020-10-24 neels if (sizeof(sd->mds.mdd_crypto.scr_meta->scm_kdfhint) <
340 6c6e6e50 2020-10-24 neels kdfinfo->genkdf.len)
341 6c6e6e50 2020-10-24 neels goto out;
342 6c6e6e50 2020-10-24 neels memcpy(sd->mds.mdd_crypto.scr_meta->scm_kdfhint,
343 6c6e6e50 2020-10-24 neels &kdfinfo->genkdf, kdfinfo->genkdf.len);
344 6c6e6e50 2020-10-24 neels }
345 6c6e6e50 2020-10-24 neels
346 6c6e6e50 2020-10-24 neels /* copy mask key to run-time meta data */
347 6c6e6e50 2020-10-24 neels if ((kdfinfo->flags & SR_CRYPTOKDF_KEY)) {
348 6c6e6e50 2020-10-24 neels if (sizeof(sd->mds.mdd_crypto.scr_maskkey) <
349 6c6e6e50 2020-10-24 neels sizeof(kdfinfo->maskkey))
350 6c6e6e50 2020-10-24 neels goto out;
351 6c6e6e50 2020-10-24 neels memcpy(sd->mds.mdd_crypto.scr_maskkey, &kdfinfo->maskkey,
352 6c6e6e50 2020-10-24 neels sizeof(kdfinfo->maskkey));
353 6c6e6e50 2020-10-24 neels }
354 6c6e6e50 2020-10-24 neels
355 6c6e6e50 2020-10-24 neels bc->bc_opaque_status = BIOC_SOINOUT_OK;
356 6c6e6e50 2020-10-24 neels rv = 0;
357 6c6e6e50 2020-10-24 neels out:
358 6c6e6e50 2020-10-24 neels explicit_bzero(kdfinfo, bc->bc_opaque_size);
359 6c6e6e50 2020-10-24 neels free(kdfinfo, M_DEVBUF, bc->bc_opaque_size);
360 6c6e6e50 2020-10-24 neels
361 6c6e6e50 2020-10-24 neels return (rv);
362 6c6e6e50 2020-10-24 neels }
363 6c6e6e50 2020-10-24 neels
364 6c6e6e50 2020-10-24 neels int
365 6c6e6e50 2020-10-24 neels sr_crypto_encrypt(u_char *p, u_char *c, u_char *key, size_t size, int alg)
366 6c6e6e50 2020-10-24 neels {
367 6c6e6e50 2020-10-24 neels rijndael_ctx ctx;
368 6c6e6e50 2020-10-24 neels int i, rv = 1;
369 6c6e6e50 2020-10-24 neels
370 6c6e6e50 2020-10-24 neels switch (alg) {
371 6c6e6e50 2020-10-24 neels case SR_CRYPTOM_AES_ECB_256:
372 6c6e6e50 2020-10-24 neels if (rijndael_set_key_enc_only(&ctx, key, 256) != 0)
373 6c6e6e50 2020-10-24 neels goto out;
374 6c6e6e50 2020-10-24 neels for (i = 0; i < size; i += RIJNDAEL128_BLOCK_LEN)
375 6c6e6e50 2020-10-24 neels rijndael_encrypt(&ctx, &p[i], &c[i]);
376 6c6e6e50 2020-10-24 neels rv = 0;
377 6c6e6e50 2020-10-24 neels break;
378 6c6e6e50 2020-10-24 neels default:
379 6c6e6e50 2020-10-24 neels DNPRINTF(SR_D_DIS, "%s: unsupported encryption algorithm %d\n",
380 6c6e6e50 2020-10-24 neels "softraid", alg);
381 6c6e6e50 2020-10-24 neels rv = -1;
382 6c6e6e50 2020-10-24 neels goto out;
383 6c6e6e50 2020-10-24 neels }
384 6c6e6e50 2020-10-24 neels
385 6c6e6e50 2020-10-24 neels out:
386 6c6e6e50 2020-10-24 neels explicit_bzero(&ctx, sizeof(ctx));
387 6c6e6e50 2020-10-24 neels return (rv);
388 6c6e6e50 2020-10-24 neels }
389 6c6e6e50 2020-10-24 neels
390 6c6e6e50 2020-10-24 neels int
391 6c6e6e50 2020-10-24 neels sr_crypto_decrypt(u_char *c, u_char *p, u_char *key, size_t size, int alg)
392 6c6e6e50 2020-10-24 neels {
393 6c6e6e50 2020-10-24 neels rijndael_ctx ctx;
394 6c6e6e50 2020-10-24 neels int i, rv = 1;
395 6c6e6e50 2020-10-24 neels
396 6c6e6e50 2020-10-24 neels switch (alg) {
397 6c6e6e50 2020-10-24 neels case SR_CRYPTOM_AES_ECB_256:
398 6c6e6e50 2020-10-24 neels if (rijndael_set_key(&ctx, key, 256) != 0)
399 6c6e6e50 2020-10-24 neels goto out;
400 6c6e6e50 2020-10-24 neels for (i = 0; i < size; i += RIJNDAEL128_BLOCK_LEN)
401 6c6e6e50 2020-10-24 neels rijndael_decrypt(&ctx, &c[i], &p[i]);
402 6c6e6e50 2020-10-24 neels rv = 0;
403 6c6e6e50 2020-10-24 neels break;
404 6c6e6e50 2020-10-24 neels default:
405 6c6e6e50 2020-10-24 neels DNPRINTF(SR_D_DIS, "%s: unsupported encryption algorithm %d\n",
406 6c6e6e50 2020-10-24 neels "softraid", alg);
407 6c6e6e50 2020-10-24 neels rv = -1;
408 6c6e6e50 2020-10-24 neels goto out;
409 6c6e6e50 2020-10-24 neels }
410 6c6e6e50 2020-10-24 neels
411 6c6e6e50 2020-10-24 neels out:
412 6c6e6e50 2020-10-24 neels explicit_bzero(&ctx, sizeof(ctx));
413 6c6e6e50 2020-10-24 neels return (rv);
414 6c6e6e50 2020-10-24 neels }
415 6c6e6e50 2020-10-24 neels
416 6c6e6e50 2020-10-24 neels void
417 6c6e6e50 2020-10-24 neels sr_crypto_calculate_check_hmac_sha1(u_int8_t *maskkey, int maskkey_size,
418 6c6e6e50 2020-10-24 neels u_int8_t *key, int key_size, u_char *check_digest)
419 6c6e6e50 2020-10-24 neels {
420 6c6e6e50 2020-10-24 neels u_char check_key[SHA1_DIGEST_LENGTH];
421 6c6e6e50 2020-10-24 neels HMAC_SHA1_CTX hmacctx;
422 6c6e6e50 2020-10-24 neels SHA1_CTX shactx;
423 6c6e6e50 2020-10-24 neels
424 6c6e6e50 2020-10-24 neels bzero(check_key, sizeof(check_key));
425 6c6e6e50 2020-10-24 neels bzero(&hmacctx, sizeof(hmacctx));
426 6c6e6e50 2020-10-24 neels bzero(&shactx, sizeof(shactx));
427 6c6e6e50 2020-10-24 neels
428 6c6e6e50 2020-10-24 neels /* k = SHA1(mask_key) */
429 6c6e6e50 2020-10-24 neels SHA1Init(&shactx);
430 6c6e6e50 2020-10-24 neels SHA1Update(&shactx, maskkey, maskkey_size);
431 6c6e6e50 2020-10-24 neels SHA1Final(check_key, &shactx);
432 6c6e6e50 2020-10-24 neels
433 6c6e6e50 2020-10-24 neels /* mac = HMAC_SHA1_k(unencrypted key) */
434 6c6e6e50 2020-10-24 neels HMAC_SHA1_Init(&hmacctx, check_key, sizeof(check_key));
435 6c6e6e50 2020-10-24 neels HMAC_SHA1_Update(&hmacctx, key, key_size);
436 6c6e6e50 2020-10-24 neels HMAC_SHA1_Final(check_digest, &hmacctx);
437 6c6e6e50 2020-10-24 neels
438 6c6e6e50 2020-10-24 neels explicit_bzero(check_key, sizeof(check_key));
439 6c6e6e50 2020-10-24 neels explicit_bzero(&hmacctx, sizeof(hmacctx));
440 6c6e6e50 2020-10-24 neels explicit_bzero(&shactx, sizeof(shactx));
441 6c6e6e50 2020-10-24 neels }
442 6c6e6e50 2020-10-24 neels
443 6c6e6e50 2020-10-24 neels int
444 6c6e6e50 2020-10-24 neels sr_crypto_decrypt_key(struct sr_discipline *sd)
445 6c6e6e50 2020-10-24 neels {
446 6c6e6e50 2020-10-24 neels u_char check_digest[SHA1_DIGEST_LENGTH];
447 6c6e6e50 2020-10-24 neels int rv = 1;
448 6c6e6e50 2020-10-24 neels
449 6c6e6e50 2020-10-24 neels DNPRINTF(SR_D_DIS, "%s: sr_crypto_decrypt_key\n", DEVNAME(sd->sd_sc));
450 6c6e6e50 2020-10-24 neels
451 6c6e6e50 2020-10-24 neels if (sd->mds.mdd_crypto.scr_meta->scm_check_alg != SR_CRYPTOC_HMAC_SHA1)
452 6c6e6e50 2020-10-24 neels goto out;
453 6c6e6e50 2020-10-24 neels
454 6c6e6e50 2020-10-24 neels if (sr_crypto_decrypt((u_char *)sd->mds.mdd_crypto.scr_meta->scm_key,
455 6c6e6e50 2020-10-24 neels (u_char *)sd->mds.mdd_crypto.scr_key,
456 6c6e6e50 2020-10-24 neels sd->mds.mdd_crypto.scr_maskkey, sizeof(sd->mds.mdd_crypto.scr_key),
457 6c6e6e50 2020-10-24 neels sd->mds.mdd_crypto.scr_meta->scm_mask_alg) == -1)
458 6c6e6e50 2020-10-24 neels goto out;
459 6c6e6e50 2020-10-24 neels
460 6c6e6e50 2020-10-24 neels #ifdef SR_DEBUG0
461 6c6e6e50 2020-10-24 neels sr_crypto_dumpkeys(sd);
462 6c6e6e50 2020-10-24 neels #endif
463 6c6e6e50 2020-10-24 neels
464 6c6e6e50 2020-10-24 neels /* Check that the key decrypted properly. */
465 6c6e6e50 2020-10-24 neels sr_crypto_calculate_check_hmac_sha1(sd->mds.mdd_crypto.scr_maskkey,
466 6c6e6e50 2020-10-24 neels sizeof(sd->mds.mdd_crypto.scr_maskkey),
467 6c6e6e50 2020-10-24 neels (u_int8_t *)sd->mds.mdd_crypto.scr_key,
468 6c6e6e50 2020-10-24 neels sizeof(sd->mds.mdd_crypto.scr_key),
469 6c6e6e50 2020-10-24 neels check_digest);
470 6c6e6e50 2020-10-24 neels if (memcmp(sd->mds.mdd_crypto.scr_meta->chk_hmac_sha1.sch_mac,
471 6c6e6e50 2020-10-24 neels check_digest, sizeof(check_digest)) != 0) {
472 6c6e6e50 2020-10-24 neels explicit_bzero(sd->mds.mdd_crypto.scr_key,
473 6c6e6e50 2020-10-24 neels sizeof(sd->mds.mdd_crypto.scr_key));
474 6c6e6e50 2020-10-24 neels goto out;
475 6c6e6e50 2020-10-24 neels }
476 6c6e6e50 2020-10-24 neels
477 6c6e6e50 2020-10-24 neels rv = 0; /* Success */
478 6c6e6e50 2020-10-24 neels out:
479 6c6e6e50 2020-10-24 neels /* we don't need the mask key anymore */
480 6c6e6e50 2020-10-24 neels explicit_bzero(&sd->mds.mdd_crypto.scr_maskkey,
481 6c6e6e50 2020-10-24 neels sizeof(sd->mds.mdd_crypto.scr_maskkey));
482 6c6e6e50 2020-10-24 neels
483 6c6e6e50 2020-10-24 neels explicit_bzero(check_digest, sizeof(check_digest));
484 6c6e6e50 2020-10-24 neels
485 6c6e6e50 2020-10-24 neels return rv;
486 6c6e6e50 2020-10-24 neels }
487 6c6e6e50 2020-10-24 neels
488 6c6e6e50 2020-10-24 neels int
489 6c6e6e50 2020-10-24 neels sr_crypto_create_keys(struct sr_discipline *sd)
490 6c6e6e50 2020-10-24 neels {
491 6c6e6e50 2020-10-24 neels
492 6c6e6e50 2020-10-24 neels DNPRINTF(SR_D_DIS, "%s: sr_crypto_create_keys\n",
493 6c6e6e50 2020-10-24 neels DEVNAME(sd->sd_sc));
494 6c6e6e50 2020-10-24 neels
495 6c6e6e50 2020-10-24 neels if (AES_MAXKEYBYTES < sizeof(sd->mds.mdd_crypto.scr_maskkey))
496 6c6e6e50 2020-10-24 neels return (1);
497 6c6e6e50 2020-10-24 neels
498 6c6e6e50 2020-10-24 neels /* XXX allow user to specify */
499 6c6e6e50 2020-10-24 neels sd->mds.mdd_crypto.scr_meta->scm_alg = SR_CRYPTOA_AES_XTS_256;
500 6c6e6e50 2020-10-24 neels
501 6c6e6e50 2020-10-24 neels /* generate crypto keys */
502 6c6e6e50 2020-10-24 neels arc4random_buf(sd->mds.mdd_crypto.scr_key,
503 6c6e6e50 2020-10-24 neels sizeof(sd->mds.mdd_crypto.scr_key));
504 6c6e6e50 2020-10-24 neels
505 6c6e6e50 2020-10-24 neels /* Mask the disk keys. */
506 6c6e6e50 2020-10-24 neels sd->mds.mdd_crypto.scr_meta->scm_mask_alg = SR_CRYPTOM_AES_ECB_256;
507 6c6e6e50 2020-10-24 neels sr_crypto_encrypt((u_char *)sd->mds.mdd_crypto.scr_key,
508 6c6e6e50 2020-10-24 neels (u_char *)sd->mds.mdd_crypto.scr_meta->scm_key,
509 6c6e6e50 2020-10-24 neels sd->mds.mdd_crypto.scr_maskkey, sizeof(sd->mds.mdd_crypto.scr_key),
510 6c6e6e50 2020-10-24 neels sd->mds.mdd_crypto.scr_meta->scm_mask_alg);
511 6c6e6e50 2020-10-24 neels
512 6c6e6e50 2020-10-24 neels /* Prepare key decryption check code. */
513 6c6e6e50 2020-10-24 neels sd->mds.mdd_crypto.scr_meta->scm_check_alg = SR_CRYPTOC_HMAC_SHA1;
514 6c6e6e50 2020-10-24 neels sr_crypto_calculate_check_hmac_sha1(sd->mds.mdd_crypto.scr_maskkey,
515 6c6e6e50 2020-10-24 neels sizeof(sd->mds.mdd_crypto.scr_maskkey),
516 6c6e6e50 2020-10-24 neels (u_int8_t *)sd->mds.mdd_crypto.scr_key,
517 6c6e6e50 2020-10-24 neels sizeof(sd->mds.mdd_crypto.scr_key),
518 6c6e6e50 2020-10-24 neels sd->mds.mdd_crypto.scr_meta->chk_hmac_sha1.sch_mac);
519 6c6e6e50 2020-10-24 neels
520 6c6e6e50 2020-10-24 neels /* Erase the plaintext disk keys */
521 6c6e6e50 2020-10-24 neels explicit_bzero(sd->mds.mdd_crypto.scr_key,
522 6c6e6e50 2020-10-24 neels sizeof(sd->mds.mdd_crypto.scr_key));
523 6c6e6e50 2020-10-24 neels
524 6c6e6e50 2020-10-24 neels #ifdef SR_DEBUG0
525 6c6e6e50 2020-10-24 neels sr_crypto_dumpkeys(sd);
526 6c6e6e50 2020-10-24 neels #endif
527 6c6e6e50 2020-10-24 neels
528 6c6e6e50 2020-10-24 neels sd->mds.mdd_crypto.scr_meta->scm_flags = SR_CRYPTOF_KEY |
529 6c6e6e50 2020-10-24 neels SR_CRYPTOF_KDFHINT;
530 6c6e6e50 2020-10-24 neels
531 6c6e6e50 2020-10-24 neels return (0);
532 6c6e6e50 2020-10-24 neels }
533 6c6e6e50 2020-10-24 neels
534 6c6e6e50 2020-10-24 neels int
535 6c6e6e50 2020-10-24 neels sr_crypto_change_maskkey(struct sr_discipline *sd,
536 6c6e6e50 2020-10-24 neels struct sr_crypto_kdfinfo *kdfinfo1, struct sr_crypto_kdfinfo *kdfinfo2)
537 6c6e6e50 2020-10-24 neels {
538 6c6e6e50 2020-10-24 neels u_char check_digest[SHA1_DIGEST_LENGTH];
539 6c6e6e50 2020-10-24 neels u_char *c, *p = NULL;
540 6c6e6e50 2020-10-24 neels size_t ksz;
541 6c6e6e50 2020-10-24 neels int rv = 1;
542 6c6e6e50 2020-10-24 neels
543 6c6e6e50 2020-10-24 neels DNPRINTF(SR_D_DIS, "%s: sr_crypto_change_maskkey\n",
544 6c6e6e50 2020-10-24 neels DEVNAME(sd->sd_sc));
545 6c6e6e50 2020-10-24 neels
546 6c6e6e50 2020-10-24 neels if (sd->mds.mdd_crypto.scr_meta->scm_check_alg != SR_CRYPTOC_HMAC_SHA1)
547 6c6e6e50 2020-10-24 neels goto out;
548 6c6e6e50 2020-10-24 neels
549 6c6e6e50 2020-10-24 neels c = (u_char *)sd->mds.mdd_crypto.scr_meta->scm_key;
550 6c6e6e50 2020-10-24 neels ksz = sizeof(sd->mds.mdd_crypto.scr_key);
551 6c6e6e50 2020-10-24 neels p = malloc(ksz, M_DEVBUF, M_WAITOK | M_CANFAIL | M_ZERO);
552 6c6e6e50 2020-10-24 neels if (p == NULL)
553 6c6e6e50 2020-10-24 neels goto out;
554 6c6e6e50 2020-10-24 neels
555 6c6e6e50 2020-10-24 neels if (sr_crypto_decrypt(c, p, kdfinfo1->maskkey, ksz,
556 6c6e6e50 2020-10-24 neels sd->mds.mdd_crypto.scr_meta->scm_mask_alg) == -1)
557 6c6e6e50 2020-10-24 neels goto out;
558 6c6e6e50 2020-10-24 neels
559 6c6e6e50 2020-10-24 neels #ifdef SR_DEBUG0
560 6c6e6e50 2020-10-24 neels sr_crypto_dumpkeys(sd);
561 6c6e6e50 2020-10-24 neels #endif
562 6c6e6e50 2020-10-24 neels
563 6c6e6e50 2020-10-24 neels sr_crypto_calculate_check_hmac_sha1(kdfinfo1->maskkey,
564 6c6e6e50 2020-10-24 neels sizeof(kdfinfo1->maskkey), p, ksz, check_digest);
565 6c6e6e50 2020-10-24 neels if (memcmp(sd->mds.mdd_crypto.scr_meta->chk_hmac_sha1.sch_mac,
566 6c6e6e50 2020-10-24 neels check_digest, sizeof(check_digest)) != 0) {
567 6c6e6e50 2020-10-24 neels sr_error(sd->sd_sc, "incorrect key or passphrase");
568 6c6e6e50 2020-10-24 neels rv = EPERM;
569 6c6e6e50 2020-10-24 neels goto out;
570 6c6e6e50 2020-10-24 neels }
571 6c6e6e50 2020-10-24 neels
572 6c6e6e50 2020-10-24 neels /* Copy new KDF hint to metadata, if supplied. */
573 6c6e6e50 2020-10-24 neels if (kdfinfo2->flags & SR_CRYPTOKDF_HINT) {
574 6c6e6e50 2020-10-24 neels if (kdfinfo2->genkdf.len >
575 6c6e6e50 2020-10-24 neels sizeof(sd->mds.mdd_crypto.scr_meta->scm_kdfhint))
576 6c6e6e50 2020-10-24 neels goto out;
577 6c6e6e50 2020-10-24 neels explicit_bzero(sd->mds.mdd_crypto.scr_meta->scm_kdfhint,
578 6c6e6e50 2020-10-24 neels sizeof(sd->mds.mdd_crypto.scr_meta->scm_kdfhint));
579 6c6e6e50 2020-10-24 neels memcpy(sd->mds.mdd_crypto.scr_meta->scm_kdfhint,
580 6c6e6e50 2020-10-24 neels &kdfinfo2->genkdf, kdfinfo2->genkdf.len);
581 6c6e6e50 2020-10-24 neels }
582 6c6e6e50 2020-10-24 neels
583 6c6e6e50 2020-10-24 neels /* Mask the disk keys. */
584 6c6e6e50 2020-10-24 neels c = (u_char *)sd->mds.mdd_crypto.scr_meta->scm_key;
585 6c6e6e50 2020-10-24 neels if (sr_crypto_encrypt(p, c, kdfinfo2->maskkey, ksz,
586 6c6e6e50 2020-10-24 neels sd->mds.mdd_crypto.scr_meta->scm_mask_alg) == -1)
587 6c6e6e50 2020-10-24 neels goto out;
588 6c6e6e50 2020-10-24 neels
589 6c6e6e50 2020-10-24 neels /* Prepare key decryption check code. */
590 6c6e6e50 2020-10-24 neels sd->mds.mdd_crypto.scr_meta->scm_check_alg = SR_CRYPTOC_HMAC_SHA1;
591 6c6e6e50 2020-10-24 neels sr_crypto_calculate_check_hmac_sha1(kdfinfo2->maskkey,
592 6c6e6e50 2020-10-24 neels sizeof(kdfinfo2->maskkey), (u_int8_t *)sd->mds.mdd_crypto.scr_key,
593 6c6e6e50 2020-10-24 neels sizeof(sd->mds.mdd_crypto.scr_key), check_digest);
594 6c6e6e50 2020-10-24 neels
595 6c6e6e50 2020-10-24 neels /* Copy new encrypted key and HMAC to metadata. */
596 6c6e6e50 2020-10-24 neels memcpy(sd->mds.mdd_crypto.scr_meta->chk_hmac_sha1.sch_mac, check_digest,
597 6c6e6e50 2020-10-24 neels sizeof(sd->mds.mdd_crypto.scr_meta->chk_hmac_sha1.sch_mac));
598 6c6e6e50 2020-10-24 neels
599 6c6e6e50 2020-10-24 neels rv = 0; /* Success */
600 6c6e6e50 2020-10-24 neels
601 6c6e6e50 2020-10-24 neels out:
602 6c6e6e50 2020-10-24 neels if (p) {
603 6c6e6e50 2020-10-24 neels explicit_bzero(p, ksz);
604 6c6e6e50 2020-10-24 neels free(p, M_DEVBUF, ksz);
605 6c6e6e50 2020-10-24 neels }
606 6c6e6e50 2020-10-24 neels
607 6c6e6e50 2020-10-24 neels explicit_bzero(check_digest, sizeof(check_digest));
608 6c6e6e50 2020-10-24 neels explicit_bzero(&kdfinfo1->maskkey, sizeof(kdfinfo1->maskkey));
609 6c6e6e50 2020-10-24 neels explicit_bzero(&kdfinfo2->maskkey, sizeof(kdfinfo2->maskkey));
610 6c6e6e50 2020-10-24 neels
611 6c6e6e50 2020-10-24 neels return (rv);
612 6c6e6e50 2020-10-24 neels }
613 6c6e6e50 2020-10-24 neels
614 6c6e6e50 2020-10-24 neels struct sr_chunk *
615 6c6e6e50 2020-10-24 neels sr_crypto_create_key_disk(struct sr_discipline *sd, dev_t dev)
616 6c6e6e50 2020-10-24 neels {
617 6c6e6e50 2020-10-24 neels struct sr_softc *sc = sd->sd_sc;
618 6c6e6e50 2020-10-24 neels struct sr_discipline *fakesd = NULL;
619 6c6e6e50 2020-10-24 neels struct sr_metadata *sm = NULL;
620 6c6e6e50 2020-10-24 neels struct sr_meta_chunk *km;
621 6c6e6e50 2020-10-24 neels struct sr_meta_opt_item *omi = NULL;
622 6c6e6e50 2020-10-24 neels struct sr_meta_keydisk *skm;
623 6c6e6e50 2020-10-24 neels struct sr_chunk *key_disk = NULL;
624 6c6e6e50 2020-10-24 neels struct disklabel label;
625 6c6e6e50 2020-10-24 neels struct vnode *vn;
626 6c6e6e50 2020-10-24 neels char devname[32];
627 6c6e6e50 2020-10-24 neels int c, part, open = 0;
628 6c6e6e50 2020-10-24 neels
629 6c6e6e50 2020-10-24 neels /*
630 6c6e6e50 2020-10-24 neels * Create a metadata structure on the key disk and store
631 6c6e6e50 2020-10-24 neels * keying material in the optional metadata.
632 6c6e6e50 2020-10-24 neels */
633 6c6e6e50 2020-10-24 neels
634 6c6e6e50 2020-10-24 neels sr_meta_getdevname(sc, dev, devname, sizeof(devname));
635 6c6e6e50 2020-10-24 neels
636 6c6e6e50 2020-10-24 neels /* Make sure chunk is not already in use. */
637 6c6e6e50 2020-10-24 neels c = sr_chunk_in_use(sc, dev);
638 6c6e6e50 2020-10-24 neels if (c != BIOC_SDINVALID && c != BIOC_SDOFFLINE) {
639 6c6e6e50 2020-10-24 neels sr_error(sc, "%s is already in use", devname);
640 6c6e6e50 2020-10-24 neels goto done;
641 6c6e6e50 2020-10-24 neels }
642 6c6e6e50 2020-10-24 neels
643 6c6e6e50 2020-10-24 neels /* Open device. */
644 6c6e6e50 2020-10-24 neels if (bdevvp(dev, &vn)) {
645 6c6e6e50 2020-10-24 neels sr_error(sc, "cannot open key disk %s", devname);
646 6c6e6e50 2020-10-24 neels goto done;
647 6c6e6e50 2020-10-24 neels }
648 6c6e6e50 2020-10-24 neels if (VOP_OPEN(vn, FREAD | FWRITE, NOCRED, curproc)) {
649 6c6e6e50 2020-10-24 neels DNPRINTF(SR_D_META,"%s: sr_crypto_create_key_disk cannot "
650 6c6e6e50 2020-10-24 neels "open %s\n", DEVNAME(sc), devname);
651 6c6e6e50 2020-10-24 neels vput(vn);
652 6c6e6e50 2020-10-24 neels goto done;
653 6c6e6e50 2020-10-24 neels }
654 6c6e6e50 2020-10-24 neels open = 1; /* close dev on error */
655 6c6e6e50 2020-10-24 neels
656 6c6e6e50 2020-10-24 neels /* Get partition details. */
657 6c6e6e50 2020-10-24 neels part = DISKPART(dev);
658 6c6e6e50 2020-10-24 neels if (VOP_IOCTL(vn, DIOCGDINFO, (caddr_t)&label,
659 6c6e6e50 2020-10-24 neels FREAD, NOCRED, curproc)) {
660 6c6e6e50 2020-10-24 neels DNPRINTF(SR_D_META, "%s: sr_crypto_create_key_disk ioctl "
661 6c6e6e50 2020-10-24 neels "failed\n", DEVNAME(sc));
662 6c6e6e50 2020-10-24 neels goto done;
663 6c6e6e50 2020-10-24 neels }
664 6c6e6e50 2020-10-24 neels if (label.d_partitions[part].p_fstype != FS_RAID) {
665 6c6e6e50 2020-10-24 neels sr_error(sc, "%s partition not of type RAID (%d)",
666 6c6e6e50 2020-10-24 neels devname, label.d_partitions[part].p_fstype);
667 6c6e6e50 2020-10-24 neels goto done;
668 6c6e6e50 2020-10-24 neels }
669 6c6e6e50 2020-10-24 neels
670 6c6e6e50 2020-10-24 neels /*
671 6c6e6e50 2020-10-24 neels * Create and populate chunk metadata.
672 6c6e6e50 2020-10-24 neels */
673 6c6e6e50 2020-10-24 neels
674 6c6e6e50 2020-10-24 neels key_disk = malloc(sizeof(struct sr_chunk), M_DEVBUF, M_WAITOK | M_ZERO);
675 6c6e6e50 2020-10-24 neels km = &key_disk->src_meta;
676 6c6e6e50 2020-10-24 neels
677 6c6e6e50 2020-10-24 neels key_disk->src_dev_mm = dev;
678 6c6e6e50 2020-10-24 neels key_disk->src_vn = vn;
679 6c6e6e50 2020-10-24 neels strlcpy(key_disk->src_devname, devname, sizeof(km->scmi.scm_devname));
680 6c6e6e50 2020-10-24 neels key_disk->src_size = 0;
681 6c6e6e50 2020-10-24 neels
682 6c6e6e50 2020-10-24 neels km->scmi.scm_volid = sd->sd_meta->ssdi.ssd_level;
683 6c6e6e50 2020-10-24 neels km->scmi.scm_chunk_id = 0;
684 6c6e6e50 2020-10-24 neels km->scmi.scm_size = 0;
685 6c6e6e50 2020-10-24 neels km->scmi.scm_coerced_size = 0;
686 6c6e6e50 2020-10-24 neels strlcpy(km->scmi.scm_devname, devname, sizeof(km->scmi.scm_devname));
687 6c6e6e50 2020-10-24 neels memcpy(&km->scmi.scm_uuid, &sd->sd_meta->ssdi.ssd_uuid,
688 6c6e6e50 2020-10-24 neels sizeof(struct sr_uuid));
689 6c6e6e50 2020-10-24 neels
690 6c6e6e50 2020-10-24 neels sr_checksum(sc, km, &km->scm_checksum,
691 6c6e6e50 2020-10-24 neels sizeof(struct sr_meta_chunk_invariant));
692 6c6e6e50 2020-10-24 neels
693 6c6e6e50 2020-10-24 neels km->scm_status = BIOC_SDONLINE;
694 6c6e6e50 2020-10-24 neels
695 6c6e6e50 2020-10-24 neels /*
696 6c6e6e50 2020-10-24 neels * Create and populate our own discipline and metadata.
697 6c6e6e50 2020-10-24 neels */
698 6c6e6e50 2020-10-24 neels
699 6c6e6e50 2020-10-24 neels sm = malloc(sizeof(struct sr_metadata), M_DEVBUF, M_WAITOK | M_ZERO);
700 6c6e6e50 2020-10-24 neels sm->ssdi.ssd_magic = SR_MAGIC;
701 6c6e6e50 2020-10-24 neels sm->ssdi.ssd_version = SR_META_VERSION;
702 6c6e6e50 2020-10-24 neels sm->ssd_ondisk = 0;
703 6c6e6e50 2020-10-24 neels sm->ssdi.ssd_vol_flags = 0;
704 6c6e6e50 2020-10-24 neels memcpy(&sm->ssdi.ssd_uuid, &sd->sd_meta->ssdi.ssd_uuid,
705 6c6e6e50 2020-10-24 neels sizeof(struct sr_uuid));
706 6c6e6e50 2020-10-24 neels sm->ssdi.ssd_chunk_no = 1;
707 6c6e6e50 2020-10-24 neels sm->ssdi.ssd_volid = SR_KEYDISK_VOLID;
708 6c6e6e50 2020-10-24 neels sm->ssdi.ssd_level = SR_KEYDISK_LEVEL;
709 6c6e6e50 2020-10-24 neels sm->ssdi.ssd_size = 0;
710 6c6e6e50 2020-10-24 neels strlcpy(sm->ssdi.ssd_vendor, "OPENBSD", sizeof(sm->ssdi.ssd_vendor));
711 6c6e6e50 2020-10-24 neels snprintf(sm->ssdi.ssd_product, sizeof(sm->ssdi.ssd_product),
712 6c6e6e50 2020-10-24 neels "SR %s", "KEYDISK");
713 6c6e6e50 2020-10-24 neels snprintf(sm->ssdi.ssd_revision, sizeof(sm->ssdi.ssd_revision),
714 6c6e6e50 2020-10-24 neels "%03d", SR_META_VERSION);
715 6c6e6e50 2020-10-24 neels
716 6c6e6e50 2020-10-24 neels fakesd = malloc(sizeof(struct sr_discipline), M_DEVBUF,
717 6c6e6e50 2020-10-24 neels M_WAITOK | M_ZERO);
718 6c6e6e50 2020-10-24 neels fakesd->sd_sc = sd->sd_sc;
719 6c6e6e50 2020-10-24 neels fakesd->sd_meta = sm;
720 6c6e6e50 2020-10-24 neels fakesd->sd_meta_type = SR_META_F_NATIVE;
721 6c6e6e50 2020-10-24 neels fakesd->sd_vol_status = BIOC_SVONLINE;
722 6c6e6e50 2020-10-24 neels strlcpy(fakesd->sd_name, "KEYDISK", sizeof(fakesd->sd_name));
723 6c6e6e50 2020-10-24 neels SLIST_INIT(&fakesd->sd_meta_opt);
724 6c6e6e50 2020-10-24 neels
725 6c6e6e50 2020-10-24 neels /* Add chunk to volume. */
726 6c6e6e50 2020-10-24 neels fakesd->sd_vol.sv_chunks = malloc(sizeof(struct sr_chunk *), M_DEVBUF,
727 6c6e6e50 2020-10-24 neels M_WAITOK | M_ZERO);
728 6c6e6e50 2020-10-24 neels fakesd->sd_vol.sv_chunks[0] = key_disk;
729 6c6e6e50 2020-10-24 neels SLIST_INIT(&fakesd->sd_vol.sv_chunk_list);
730 6c6e6e50 2020-10-24 neels SLIST_INSERT_HEAD(&fakesd->sd_vol.sv_chunk_list, key_disk, src_link);
731 6c6e6e50 2020-10-24 neels
732 6c6e6e50 2020-10-24 neels /* Generate mask key. */
733 6c6e6e50 2020-10-24 neels arc4random_buf(sd->mds.mdd_crypto.scr_maskkey,
734 6c6e6e50 2020-10-24 neels sizeof(sd->mds.mdd_crypto.scr_maskkey));
735 6c6e6e50 2020-10-24 neels
736 6c6e6e50 2020-10-24 neels /* Copy mask key to optional metadata area. */
737 6c6e6e50 2020-10-24 neels omi = malloc(sizeof(struct sr_meta_opt_item), M_DEVBUF,
738 6c6e6e50 2020-10-24 neels M_WAITOK | M_ZERO);
739 6c6e6e50 2020-10-24 neels omi->omi_som = malloc(sizeof(struct sr_meta_keydisk), M_DEVBUF,
740 6c6e6e50 2020-10-24 neels M_WAITOK | M_ZERO);
741 6c6e6e50 2020-10-24 neels omi->omi_som->som_type = SR_OPT_KEYDISK;
742 6c6e6e50 2020-10-24 neels omi->omi_som->som_length = sizeof(struct sr_meta_keydisk);
743 6c6e6e50 2020-10-24 neels skm = (struct sr_meta_keydisk *)omi->omi_som;
744 6c6e6e50 2020-10-24 neels memcpy(&skm->skm_maskkey, sd->mds.mdd_crypto.scr_maskkey,
745 6c6e6e50 2020-10-24 neels sizeof(skm->skm_maskkey));
746 6c6e6e50 2020-10-24 neels SLIST_INSERT_HEAD(&fakesd->sd_meta_opt, omi, omi_link);
747 6c6e6e50 2020-10-24 neels fakesd->sd_meta->ssdi.ssd_opt_no++;
748 6c6e6e50 2020-10-24 neels
749 6c6e6e50 2020-10-24 neels /* Save metadata. */
750 6c6e6e50 2020-10-24 neels if (sr_meta_save(fakesd, SR_META_DIRTY)) {
751 6c6e6e50 2020-10-24 neels sr_error(sc, "could not save metadata to %s", devname);
752 6c6e6e50 2020-10-24 neels goto fail;
753 6c6e6e50 2020-10-24 neels }
754 6c6e6e50 2020-10-24 neels
755 6c6e6e50 2020-10-24 neels goto done;
756 6c6e6e50 2020-10-24 neels
757 6c6e6e50 2020-10-24 neels fail:
758 6c6e6e50 2020-10-24 neels free(key_disk, M_DEVBUF, sizeof(struct sr_chunk));
759 6c6e6e50 2020-10-24 neels key_disk = NULL;
760 6c6e6e50 2020-10-24 neels
761 6c6e6e50 2020-10-24 neels done:
762 6c6e6e50 2020-10-24 neels free(omi, M_DEVBUF, sizeof(struct sr_meta_opt_item));
763 6c6e6e50 2020-10-24 neels if (fakesd && fakesd->sd_vol.sv_chunks)
764 6c6e6e50 2020-10-24 neels free(fakesd->sd_vol.sv_chunks, M_DEVBUF,
765 6c6e6e50 2020-10-24 neels sizeof(struct sr_chunk *));
766 6c6e6e50 2020-10-24 neels free(fakesd, M_DEVBUF, sizeof(struct sr_discipline));
767 6c6e6e50 2020-10-24 neels free(sm, M_DEVBUF, sizeof(struct sr_metadata));
768 6c6e6e50 2020-10-24 neels if (open) {
769 6c6e6e50 2020-10-24 neels VOP_CLOSE(vn, FREAD | FWRITE, NOCRED, curproc);
770 6c6e6e50 2020-10-24 neels vput(vn);
771 6c6e6e50 2020-10-24 neels }
772 6c6e6e50 2020-10-24 neels
773 6c6e6e50 2020-10-24 neels return key_disk;
774 6c6e6e50 2020-10-24 neels }
775 6c6e6e50 2020-10-24 neels
776 6c6e6e50 2020-10-24 neels struct sr_chunk *
777 6c6e6e50 2020-10-24 neels sr_crypto_read_key_disk(struct sr_discipline *sd, dev_t dev)
778 6c6e6e50 2020-10-24 neels {
779 6c6e6e50 2020-10-24 neels struct sr_softc *sc = sd->sd_sc;
780 6c6e6e50 2020-10-24 neels struct sr_metadata *sm = NULL;
781 6c6e6e50 2020-10-24 neels struct sr_meta_opt_item *omi, *omi_next;
782 6c6e6e50 2020-10-24 neels struct sr_meta_opt_hdr *omh;
783 6c6e6e50 2020-10-24 neels struct sr_meta_keydisk *skm;
784 6c6e6e50 2020-10-24 neels struct sr_meta_opt_head som;
785 6c6e6e50 2020-10-24 neels struct sr_chunk *key_disk = NULL;
786 6c6e6e50 2020-10-24 neels struct disklabel label;
787 6c6e6e50 2020-10-24 neels struct vnode *vn = NULL;
788 6c6e6e50 2020-10-24 neels char devname[32];
789 6c6e6e50 2020-10-24 neels int c, part, open = 0;
790 6c6e6e50 2020-10-24 neels
791 6c6e6e50 2020-10-24 neels /*
792 6c6e6e50 2020-10-24 neels * Load a key disk and load keying material into memory.
793 6c6e6e50 2020-10-24 neels */
794 6c6e6e50 2020-10-24 neels
795 6c6e6e50 2020-10-24 neels SLIST_INIT(&som);
796 6c6e6e50 2020-10-24 neels
797 6c6e6e50 2020-10-24 neels sr_meta_getdevname(sc, dev, devname, sizeof(devname));
798 6c6e6e50 2020-10-24 neels
799 6c6e6e50 2020-10-24 neels /* Make sure chunk is not already in use. */
800 6c6e6e50 2020-10-24 neels c = sr_chunk_in_use(sc, dev);
801 6c6e6e50 2020-10-24 neels if (c != BIOC_SDINVALID && c != BIOC_SDOFFLINE) {
802 6c6e6e50 2020-10-24 neels sr_error(sc, "%s is already in use", devname);
803 6c6e6e50 2020-10-24 neels goto done;
804 6c6e6e50 2020-10-24 neels }
805 6c6e6e50 2020-10-24 neels
806 6c6e6e50 2020-10-24 neels /* Open device. */
807 6c6e6e50 2020-10-24 neels if (bdevvp(dev, &vn)) {
808 6c6e6e50 2020-10-24 neels sr_error(sc, "cannot open key disk %s", devname);
809 6c6e6e50 2020-10-24 neels goto done;
810 6c6e6e50 2020-10-24 neels }
811 6c6e6e50 2020-10-24 neels if (VOP_OPEN(vn, FREAD, NOCRED, curproc)) {
812 6c6e6e50 2020-10-24 neels DNPRINTF(SR_D_META,"%s: sr_crypto_read_key_disk cannot "
813 6c6e6e50 2020-10-24 neels "open %s\n", DEVNAME(sc), devname);
814 6c6e6e50 2020-10-24 neels vput(vn);
815 6c6e6e50 2020-10-24 neels goto done;
816 6c6e6e50 2020-10-24 neels }
817 6c6e6e50 2020-10-24 neels open = 1; /* close dev on error */
818 6c6e6e50 2020-10-24 neels
819 6c6e6e50 2020-10-24 neels /* Get partition details. */
820 6c6e6e50 2020-10-24 neels part = DISKPART(dev);
821 6c6e6e50 2020-10-24 neels if (VOP_IOCTL(vn, DIOCGDINFO, (caddr_t)&label, FREAD,
822 6c6e6e50 2020-10-24 neels NOCRED, curproc)) {
823 6c6e6e50 2020-10-24 neels DNPRINTF(SR_D_META, "%s: sr_crypto_read_key_disk ioctl "
824 6c6e6e50 2020-10-24 neels "failed\n", DEVNAME(sc));
825 6c6e6e50 2020-10-24 neels goto done;
826 6c6e6e50 2020-10-24 neels }
827 6c6e6e50 2020-10-24 neels if (label.d_partitions[part].p_fstype != FS_RAID) {
828 6c6e6e50 2020-10-24 neels sr_error(sc, "%s partition not of type RAID (%d)",
829 6c6e6e50 2020-10-24 neels devname, label.d_partitions[part].p_fstype);
830 6c6e6e50 2020-10-24 neels goto done;
831 6c6e6e50 2020-10-24 neels }
832 6c6e6e50 2020-10-24 neels
833 6c6e6e50 2020-10-24 neels /*
834 6c6e6e50 2020-10-24 neels * Read and validate key disk metadata.
835 6c6e6e50 2020-10-24 neels */
836 6c6e6e50 2020-10-24 neels sm = malloc(SR_META_SIZE * DEV_BSIZE, M_DEVBUF, M_WAITOK | M_ZERO);
837 6c6e6e50 2020-10-24 neels if (sr_meta_native_read(sd, dev, sm, NULL)) {
838 6c6e6e50 2020-10-24 neels sr_error(sc, "native bootprobe could not read native metadata");
839 6c6e6e50 2020-10-24 neels goto done;
840 6c6e6e50 2020-10-24 neels }
841 6c6e6e50 2020-10-24 neels
842 6c6e6e50 2020-10-24 neels if (sr_meta_validate(sd, dev, sm, NULL)) {
843 6c6e6e50 2020-10-24 neels DNPRINTF(SR_D_META, "%s: invalid metadata\n",
844 6c6e6e50 2020-10-24 neels DEVNAME(sc));
845 6c6e6e50 2020-10-24 neels goto done;
846 6c6e6e50 2020-10-24 neels }
847 6c6e6e50 2020-10-24 neels
848 6c6e6e50 2020-10-24 neels /* Make sure this is a key disk. */
849 6c6e6e50 2020-10-24 neels if (sm->ssdi.ssd_level != SR_KEYDISK_LEVEL) {
850 6c6e6e50 2020-10-24 neels sr_error(sc, "%s is not a key disk", devname);
851 6c6e6e50 2020-10-24 neels goto done;
852 6c6e6e50 2020-10-24 neels }
853 6c6e6e50 2020-10-24 neels
854 6c6e6e50 2020-10-24 neels /* Construct key disk chunk. */
855 6c6e6e50 2020-10-24 neels key_disk = malloc(sizeof(struct sr_chunk), M_DEVBUF, M_WAITOK | M_ZERO);
856 6c6e6e50 2020-10-24 neels key_disk->src_dev_mm = dev;
857 6c6e6e50 2020-10-24 neels key_disk->src_vn = vn;
858 6c6e6e50 2020-10-24 neels key_disk->src_size = 0;
859 6c6e6e50 2020-10-24 neels
860 6c6e6e50 2020-10-24 neels memcpy(&key_disk->src_meta, (struct sr_meta_chunk *)(sm + 1),
861 6c6e6e50 2020-10-24 neels sizeof(key_disk->src_meta));
862 6c6e6e50 2020-10-24 neels
863 6c6e6e50 2020-10-24 neels /* Read mask key from optional metadata. */
864 6c6e6e50 2020-10-24 neels sr_meta_opt_load(sc, sm, &som);
865 6c6e6e50 2020-10-24 neels SLIST_FOREACH(omi, &som, omi_link) {
866 6c6e6e50 2020-10-24 neels omh = omi->omi_som;
867 6c6e6e50 2020-10-24 neels if (omh->som_type == SR_OPT_KEYDISK) {
868 6c6e6e50 2020-10-24 neels skm = (struct sr_meta_keydisk *)omh;
869 6c6e6e50 2020-10-24 neels memcpy(sd->mds.mdd_crypto.scr_maskkey, &skm->skm_maskkey,
870 6c6e6e50 2020-10-24 neels sizeof(sd->mds.mdd_crypto.scr_maskkey));
871 6c6e6e50 2020-10-24 neels } else if (omh->som_type == SR_OPT_CRYPTO) {
872 6c6e6e50 2020-10-24 neels /* Original keydisk format with key in crypto area. */
873 6c6e6e50 2020-10-24 neels memcpy(sd->mds.mdd_crypto.scr_maskkey,
874 6c6e6e50 2020-10-24 neels omh + sizeof(struct sr_meta_opt_hdr),
875 6c6e6e50 2020-10-24 neels sizeof(sd->mds.mdd_crypto.scr_maskkey));
876 6c6e6e50 2020-10-24 neels }
877 6c6e6e50 2020-10-24 neels }
878 6c6e6e50 2020-10-24 neels
879 6c6e6e50 2020-10-24 neels open = 0;
880 6c6e6e50 2020-10-24 neels
881 6c6e6e50 2020-10-24 neels done:
882 6c6e6e50 2020-10-24 neels for (omi = SLIST_FIRST(&som); omi != NULL; omi = omi_next) {
883 6c6e6e50 2020-10-24 neels omi_next = SLIST_NEXT(omi, omi_link);
884 6c6e6e50 2020-10-24 neels free(omi->omi_som, M_DEVBUF, 0);
885 6c6e6e50 2020-10-24 neels free(omi, M_DEVBUF, sizeof(struct sr_meta_opt_item));
886 6c6e6e50 2020-10-24 neels }
887 6c6e6e50 2020-10-24 neels
888 6c6e6e50 2020-10-24 neels free(sm, M_DEVBUF, SR_META_SIZE * DEV_BSIZE);
889 6c6e6e50 2020-10-24 neels
890 6c6e6e50 2020-10-24 neels if (vn && open) {
891 6c6e6e50 2020-10-24 neels VOP_CLOSE(vn, FREAD, NOCRED, curproc);
892 6c6e6e50 2020-10-24 neels vput(vn);
893 6c6e6e50 2020-10-24 neels }
894 6c6e6e50 2020-10-24 neels
895 6c6e6e50 2020-10-24 neels return key_disk;
896 6c6e6e50 2020-10-24 neels }
897 6c6e6e50 2020-10-24 neels
898 6c6e6e50 2020-10-24 neels static void
899 6c6e6e50 2020-10-24 neels sr_crypto_free_sessions(struct sr_discipline *sd)
900 6c6e6e50 2020-10-24 neels {
901 6c6e6e50 2020-10-24 neels u_int i;
902 6c6e6e50 2020-10-24 neels
903 6c6e6e50 2020-10-24 neels for (i = 0; i < SR_CRYPTO_MAXKEYS; i++) {
904 6c6e6e50 2020-10-24 neels if (sd->mds.mdd_crypto.scr_sid[i] != (u_int64_t)-1) {
905 6c6e6e50 2020-10-24 neels crypto_freesession(sd->mds.mdd_crypto.scr_sid[i]);
906 6c6e6e50 2020-10-24 neels sd->mds.mdd_crypto.scr_sid[i] = (u_int64_t)-1;
907 6c6e6e50 2020-10-24 neels }
908 6c6e6e50 2020-10-24 neels }
909 6c6e6e50 2020-10-24 neels }
910 6c6e6e50 2020-10-24 neels
911 6c6e6e50 2020-10-24 neels int
912 6c6e6e50 2020-10-24 neels sr_crypto_alloc_resources(struct sr_discipline *sd)
913 6c6e6e50 2020-10-24 neels {
914 6c6e6e50 2020-10-24 neels struct sr_workunit *wu;
915 6c6e6e50 2020-10-24 neels struct sr_crypto_wu *crwu;
916 6c6e6e50 2020-10-24 neels struct cryptoini cri;
917 6c6e6e50 2020-10-24 neels u_int num_keys, i;
918 6c6e6e50 2020-10-24 neels
919 6c6e6e50 2020-10-24 neels DNPRINTF(SR_D_DIS, "%s: sr_crypto_alloc_resources\n",
920 6c6e6e50 2020-10-24 neels DEVNAME(sd->sd_sc));
921 6c6e6e50 2020-10-24 neels
922 6c6e6e50 2020-10-24 neels sd->mds.mdd_crypto.scr_alg = CRYPTO_AES_XTS;
923 6c6e6e50 2020-10-24 neels switch (sd->mds.mdd_crypto.scr_meta->scm_alg) {
924 6c6e6e50 2020-10-24 neels case SR_CRYPTOA_AES_XTS_128:
925 6c6e6e50 2020-10-24 neels sd->mds.mdd_crypto.scr_klen = 256;
926 6c6e6e50 2020-10-24 neels break;
927 6c6e6e50 2020-10-24 neels case SR_CRYPTOA_AES_XTS_256:
928 6c6e6e50 2020-10-24 neels sd->mds.mdd_crypto.scr_klen = 512;
929 6c6e6e50 2020-10-24 neels break;
930 6c6e6e50 2020-10-24 neels default:
931 6c6e6e50 2020-10-24 neels sr_error(sd->sd_sc, "unknown crypto algorithm");
932 6c6e6e50 2020-10-24 neels return (EINVAL);
933 6c6e6e50 2020-10-24 neels }
934 6c6e6e50 2020-10-24 neels
935 6c6e6e50 2020-10-24 neels for (i = 0; i < SR_CRYPTO_MAXKEYS; i++)
936 6c6e6e50 2020-10-24 neels sd->mds.mdd_crypto.scr_sid[i] = (u_int64_t)-1;
937 6c6e6e50 2020-10-24 neels
938 6c6e6e50 2020-10-24 neels if (sr_wu_alloc(sd)) {
939 6c6e6e50 2020-10-24 neels sr_error(sd->sd_sc, "unable to allocate work units");
940 6c6e6e50 2020-10-24 neels return (ENOMEM);
941 6c6e6e50 2020-10-24 neels }
942 6c6e6e50 2020-10-24 neels if (sr_ccb_alloc(sd)) {
943 6c6e6e50 2020-10-24 neels sr_error(sd->sd_sc, "unable to allocate CCBs");
944 6c6e6e50 2020-10-24 neels return (ENOMEM);
945 6c6e6e50 2020-10-24 neels }
946 6c6e6e50 2020-10-24 neels if (sr_crypto_decrypt_key(sd)) {
947 6c6e6e50 2020-10-24 neels sr_error(sd->sd_sc, "incorrect key or passphrase");
948 6c6e6e50 2020-10-24 neels return (EPERM);
949 6c6e6e50 2020-10-24 neels }
950 6c6e6e50 2020-10-24 neels
951 6c6e6e50 2020-10-24 neels /*
952 6c6e6e50 2020-10-24 neels * For each work unit allocate the uio, iovec and crypto structures.
953 6c6e6e50 2020-10-24 neels * These have to be allocated now because during runtime we cannot
954 6c6e6e50 2020-10-24 neels * fail an allocation without failing the I/O (which can cause real
955 6c6e6e50 2020-10-24 neels * problems).
956 6c6e6e50 2020-10-24 neels */
957 6c6e6e50 2020-10-24 neels TAILQ_FOREACH(wu, &sd->sd_wu, swu_next) {
958 6c6e6e50 2020-10-24 neels crwu = (struct sr_crypto_wu *)wu;
959 6c6e6e50 2020-10-24 neels crwu->cr_uio.uio_iov = &crwu->cr_iov;
960 6c6e6e50 2020-10-24 neels crwu->cr_dmabuf = dma_alloc(MAXPHYS, PR_WAITOK);
961 6c6e6e50 2020-10-24 neels crwu->cr_crp = crypto_getreq(MAXPHYS >> DEV_BSHIFT);
962 6c6e6e50 2020-10-24 neels if (crwu->cr_crp == NULL)
963 6c6e6e50 2020-10-24 neels return (ENOMEM);
964 6c6e6e50 2020-10-24 neels }
965 6c6e6e50 2020-10-24 neels
966 6c6e6e50 2020-10-24 neels memset(&cri, 0, sizeof(cri));
967 6c6e6e50 2020-10-24 neels cri.cri_alg = sd->mds.mdd_crypto.scr_alg;
968 6c6e6e50 2020-10-24 neels cri.cri_klen = sd->mds.mdd_crypto.scr_klen;
969 6c6e6e50 2020-10-24 neels
970 6c6e6e50 2020-10-24 neels /* Allocate a session for every 2^SR_CRYPTO_KEY_BLKSHIFT blocks. */
971 6c6e6e50 2020-10-24 neels num_keys = ((sd->sd_meta->ssdi.ssd_size - 1) >>
972 6c6e6e50 2020-10-24 neels SR_CRYPTO_KEY_BLKSHIFT) + 1;
973 6c6e6e50 2020-10-24 neels if (num_keys > SR_CRYPTO_MAXKEYS)
974 6c6e6e50 2020-10-24 neels return (EFBIG);
975 6c6e6e50 2020-10-24 neels for (i = 0; i < num_keys; i++) {
976 6c6e6e50 2020-10-24 neels cri.cri_key = sd->mds.mdd_crypto.scr_key[i];
977 6c6e6e50 2020-10-24 neels if (crypto_newsession(&sd->mds.mdd_crypto.scr_sid[i],
978 6c6e6e50 2020-10-24 neels &cri, 0) != 0) {
979 6c6e6e50 2020-10-24 neels sr_crypto_free_sessions(sd);
980 6c6e6e50 2020-10-24 neels return (EINVAL);
981 6c6e6e50 2020-10-24 neels }
982 6c6e6e50 2020-10-24 neels }
983 6c6e6e50 2020-10-24 neels
984 6c6e6e50 2020-10-24 neels sr_hotplug_register(sd, sr_crypto_hotplug);
985 6c6e6e50 2020-10-24 neels
986 6c6e6e50 2020-10-24 neels return (0);
987 6c6e6e50 2020-10-24 neels }
988 6c6e6e50 2020-10-24 neels
989 6c6e6e50 2020-10-24 neels void
990 6c6e6e50 2020-10-24 neels sr_crypto_free_resources(struct sr_discipline *sd)
991 6c6e6e50 2020-10-24 neels {
992 6c6e6e50 2020-10-24 neels struct sr_workunit *wu;
993 6c6e6e50 2020-10-24 neels struct sr_crypto_wu *crwu;
994 6c6e6e50 2020-10-24 neels
995 6c6e6e50 2020-10-24 neels DNPRINTF(SR_D_DIS, "%s: sr_crypto_free_resources\n",
996 6c6e6e50 2020-10-24 neels DEVNAME(sd->sd_sc));
997 6c6e6e50 2020-10-24 neels
998 6c6e6e50 2020-10-24 neels if (sd->mds.mdd_crypto.key_disk != NULL) {
999 6c6e6e50 2020-10-24 neels explicit_bzero(sd->mds.mdd_crypto.key_disk,
1000 6c6e6e50 2020-10-24 neels sizeof(*sd->mds.mdd_crypto.key_disk));
1001 6c6e6e50 2020-10-24 neels free(sd->mds.mdd_crypto.key_disk, M_DEVBUF,
1002 6c6e6e50 2020-10-24 neels sizeof(*sd->mds.mdd_crypto.key_disk));
1003 6c6e6e50 2020-10-24 neels }
1004 6c6e6e50 2020-10-24 neels
1005 6c6e6e50 2020-10-24 neels sr_hotplug_unregister(sd, sr_crypto_hotplug);
1006 6c6e6e50 2020-10-24 neels
1007 6c6e6e50 2020-10-24 neels sr_crypto_free_sessions(sd);
1008 6c6e6e50 2020-10-24 neels
1009 6c6e6e50 2020-10-24 neels TAILQ_FOREACH(wu, &sd->sd_wu, swu_next) {
1010 6c6e6e50 2020-10-24 neels crwu = (struct sr_crypto_wu *)wu;
1011 6c6e6e50 2020-10-24 neels if (crwu->cr_dmabuf)
1012 6c6e6e50 2020-10-24 neels dma_free(crwu->cr_dmabuf, MAXPHYS);
1013 6c6e6e50 2020-10-24 neels if (crwu->cr_crp)
1014 6c6e6e50 2020-10-24 neels crypto_freereq(crwu->cr_crp);
1015 6c6e6e50 2020-10-24 neels }
1016 6c6e6e50 2020-10-24 neels
1017 6c6e6e50 2020-10-24 neels sr_wu_free(sd);
1018 6c6e6e50 2020-10-24 neels sr_ccb_free(sd);
1019 6c6e6e50 2020-10-24 neels }
1020 6c6e6e50 2020-10-24 neels
1021 6c6e6e50 2020-10-24 neels int
1022 6c6e6e50 2020-10-24 neels sr_crypto_ioctl(struct sr_discipline *sd, struct bioc_discipline *bd)
1023 6c6e6e50 2020-10-24 neels {
1024 6c6e6e50 2020-10-24 neels struct sr_crypto_kdfpair kdfpair;
1025 6c6e6e50 2020-10-24 neels struct sr_crypto_kdfinfo kdfinfo1, kdfinfo2;
1026 6c6e6e50 2020-10-24 neels int size, rv = 1;
1027 6c6e6e50 2020-10-24 neels
1028 6c6e6e50 2020-10-24 neels DNPRINTF(SR_D_IOCTL, "%s: sr_crypto_ioctl %u\n",
1029 6c6e6e50 2020-10-24 neels DEVNAME(sd->sd_sc), bd->bd_cmd);
1030 6c6e6e50 2020-10-24 neels
1031 6c6e6e50 2020-10-24 neels switch (bd->bd_cmd) {
1032 6c6e6e50 2020-10-24 neels case SR_IOCTL_GET_KDFHINT:
1033 6c6e6e50 2020-10-24 neels
1034 6c6e6e50 2020-10-24 neels /* Get KDF hint for userland. */
1035 6c6e6e50 2020-10-24 neels size = sizeof(sd->mds.mdd_crypto.scr_meta->scm_kdfhint);
1036 6c6e6e50 2020-10-24 neels if (bd->bd_data == NULL || bd->bd_size > size)
1037 6c6e6e50 2020-10-24 neels goto bad;
1038 6c6e6e50 2020-10-24 neels if (copyout(sd->mds.mdd_crypto.scr_meta->scm_kdfhint,
1039 6c6e6e50 2020-10-24 neels bd->bd_data, bd->bd_size))
1040 6c6e6e50 2020-10-24 neels goto bad;
1041 6c6e6e50 2020-10-24 neels
1042 6c6e6e50 2020-10-24 neels rv = 0;
1043 6c6e6e50 2020-10-24 neels
1044 6c6e6e50 2020-10-24 neels break;
1045 6c6e6e50 2020-10-24 neels
1046 6c6e6e50 2020-10-24 neels case SR_IOCTL_CHANGE_PASSPHRASE:
1047 6c6e6e50 2020-10-24 neels
1048 6c6e6e50 2020-10-24 neels /* Attempt to change passphrase. */
1049 6c6e6e50 2020-10-24 neels
1050 6c6e6e50 2020-10-24 neels size = sizeof(kdfpair);
1051 6c6e6e50 2020-10-24 neels if (bd->bd_data == NULL || bd->bd_size > size)
1052 6c6e6e50 2020-10-24 neels goto bad;
1053 6c6e6e50 2020-10-24 neels if (copyin(bd->bd_data, &kdfpair, size))
1054 6c6e6e50 2020-10-24 neels goto bad;
1055 6c6e6e50 2020-10-24 neels
1056 6c6e6e50 2020-10-24 neels size = sizeof(kdfinfo1);
1057 6c6e6e50 2020-10-24 neels if (kdfpair.kdfinfo1 == NULL || kdfpair.kdfsize1 > size)
1058 6c6e6e50 2020-10-24 neels goto bad;
1059 6c6e6e50 2020-10-24 neels if (copyin(kdfpair.kdfinfo1, &kdfinfo1, size))
1060 6c6e6e50 2020-10-24 neels goto bad;
1061 6c6e6e50 2020-10-24 neels
1062 6c6e6e50 2020-10-24 neels size = sizeof(kdfinfo2);
1063 6c6e6e50 2020-10-24 neels if (kdfpair.kdfinfo2 == NULL || kdfpair.kdfsize2 > size)
1064 6c6e6e50 2020-10-24 neels goto bad;
1065 6c6e6e50 2020-10-24 neels if (copyin(kdfpair.kdfinfo2, &kdfinfo2, size))
1066 6c6e6e50 2020-10-24 neels goto bad;
1067 6c6e6e50 2020-10-24 neels
1068 6c6e6e50 2020-10-24 neels if (sr_crypto_change_maskkey(sd, &kdfinfo1, &kdfinfo2))
1069 6c6e6e50 2020-10-24 neels goto bad;
1070 6c6e6e50 2020-10-24 neels
1071 6c6e6e50 2020-10-24 neels /* Save metadata to disk. */
1072 6c6e6e50 2020-10-24 neels rv = sr_meta_save(sd, SR_META_DIRTY);
1073 6c6e6e50 2020-10-24 neels
1074 6c6e6e50 2020-10-24 neels break;
1075 6c6e6e50 2020-10-24 neels }
1076 6c6e6e50 2020-10-24 neels
1077 6c6e6e50 2020-10-24 neels bad:
1078 6c6e6e50 2020-10-24 neels explicit_bzero(&kdfpair, sizeof(kdfpair));
1079 6c6e6e50 2020-10-24 neels explicit_bzero(&kdfinfo1, sizeof(kdfinfo1));
1080 6c6e6e50 2020-10-24 neels explicit_bzero(&kdfinfo2, sizeof(kdfinfo2));
1081 6c6e6e50 2020-10-24 neels
1082 6c6e6e50 2020-10-24 neels return (rv);
1083 6c6e6e50 2020-10-24 neels }
1084 6c6e6e50 2020-10-24 neels
1085 6c6e6e50 2020-10-24 neels int
1086 6c6e6e50 2020-10-24 neels sr_crypto_meta_opt_handler(struct sr_discipline *sd, struct sr_meta_opt_hdr *om)
1087 6c6e6e50 2020-10-24 neels {
1088 6c6e6e50 2020-10-24 neels int rv = EINVAL;
1089 6c6e6e50 2020-10-24 neels
1090 6c6e6e50 2020-10-24 neels if (om->som_type == SR_OPT_CRYPTO) {
1091 6c6e6e50 2020-10-24 neels sd->mds.mdd_crypto.scr_meta = (struct sr_meta_crypto *)om;
1092 6c6e6e50 2020-10-24 neels rv = 0;
1093 6c6e6e50 2020-10-24 neels }
1094 6c6e6e50 2020-10-24 neels
1095 6c6e6e50 2020-10-24 neels return (rv);
1096 6c6e6e50 2020-10-24 neels }
1097 6c6e6e50 2020-10-24 neels
1098 6c6e6e50 2020-10-24 neels int
1099 6c6e6e50 2020-10-24 neels sr_crypto_rw(struct sr_workunit *wu)
1100 6c6e6e50 2020-10-24 neels {
1101 6c6e6e50 2020-10-24 neels struct sr_crypto_wu *crwu;
1102 6c6e6e50 2020-10-24 neels daddr_t blkno;
1103 6c6e6e50 2020-10-24 neels int rv = 0;
1104 6c6e6e50 2020-10-24 neels
1105 6c6e6e50 2020-10-24 neels DNPRINTF(SR_D_DIS, "%s: sr_crypto_rw wu %p\n",
1106 6c6e6e50 2020-10-24 neels DEVNAME(wu->swu_dis->sd_sc), wu);
1107 6c6e6e50 2020-10-24 neels
1108 6c6e6e50 2020-10-24 neels if (sr_validate_io(wu, &blkno, "sr_crypto_rw"))
1109 6c6e6e50 2020-10-24 neels return (1);
1110 6c6e6e50 2020-10-24 neels
1111 6c6e6e50 2020-10-24 neels if (wu->swu_xs->flags & SCSI_DATA_OUT) {
1112 6c6e6e50 2020-10-24 neels crwu = sr_crypto_prepare(wu, 1);
1113 6c6e6e50 2020-10-24 neels crwu->cr_crp->crp_callback = sr_crypto_write;
1114 6c6e6e50 2020-10-24 neels rv = crypto_dispatch(crwu->cr_crp);
1115 6c6e6e50 2020-10-24 neels if (rv == 0)
1116 6c6e6e50 2020-10-24 neels rv = crwu->cr_crp->crp_etype;
1117 6c6e6e50 2020-10-24 neels } else
1118 6c6e6e50 2020-10-24 neels rv = sr_crypto_dev_rw(wu, NULL);
1119 6c6e6e50 2020-10-24 neels
1120 6c6e6e50 2020-10-24 neels return (rv);
1121 6c6e6e50 2020-10-24 neels }
1122 6c6e6e50 2020-10-24 neels
1123 6c6e6e50 2020-10-24 neels void
1124 6c6e6e50 2020-10-24 neels sr_crypto_write(struct cryptop *crp)
1125 6c6e6e50 2020-10-24 neels {
1126 6c6e6e50 2020-10-24 neels struct sr_crypto_wu *crwu = crp->crp_opaque;
1127 6c6e6e50 2020-10-24 neels struct sr_workunit *wu = &crwu->cr_wu;
1128 6c6e6e50 2020-10-24 neels int s;
1129 6c6e6e50 2020-10-24 neels
1130 6c6e6e50 2020-10-24 neels DNPRINTF(SR_D_INTR, "%s: sr_crypto_write: wu %p xs: %p\n",
1131 6c6e6e50 2020-10-24 neels DEVNAME(wu->swu_dis->sd_sc), wu, wu->swu_xs);
1132 6c6e6e50 2020-10-24 neels
1133 6c6e6e50 2020-10-24 neels if (crp->crp_etype) {
1134 6c6e6e50 2020-10-24 neels /* fail io */
1135 6c6e6e50 2020-10-24 neels wu->swu_xs->error = XS_DRIVER_STUFFUP;
1136 6c6e6e50 2020-10-24 neels s = splbio();
1137 6c6e6e50 2020-10-24 neels sr_scsi_done(wu->swu_dis, wu->swu_xs);
1138 6c6e6e50 2020-10-24 neels splx(s);
1139 6c6e6e50 2020-10-24 neels }
1140 6c6e6e50 2020-10-24 neels
1141 6c6e6e50 2020-10-24 neels sr_crypto_dev_rw(wu, crwu);
1142 6c6e6e50 2020-10-24 neels }
1143 6c6e6e50 2020-10-24 neels
1144 6c6e6e50 2020-10-24 neels int
1145 6c6e6e50 2020-10-24 neels sr_crypto_dev_rw(struct sr_workunit *wu, struct sr_crypto_wu *crwu)
1146 6c6e6e50 2020-10-24 neels {
1147 6c6e6e50 2020-10-24 neels struct sr_discipline *sd = wu->swu_dis;
1148 6c6e6e50 2020-10-24 neels struct scsi_xfer *xs = wu->swu_xs;
1149 6c6e6e50 2020-10-24 neels struct sr_ccb *ccb;
1150 6c6e6e50 2020-10-24 neels struct uio *uio;
1151 6c6e6e50 2020-10-24 neels daddr_t blkno;
1152 6c6e6e50 2020-10-24 neels
1153 6c6e6e50 2020-10-24 neels blkno = wu->swu_blk_start;
1154 6c6e6e50 2020-10-24 neels
1155 6c6e6e50 2020-10-24 neels ccb = sr_ccb_rw(sd, 0, blkno, xs->datalen, xs->data, xs->flags, 0);
1156 6c6e6e50 2020-10-24 neels if (!ccb) {
1157 6c6e6e50 2020-10-24 neels /* should never happen but handle more gracefully */
1158 6c6e6e50 2020-10-24 neels printf("%s: %s: too many ccbs queued\n",
1159 6c6e6e50 2020-10-24 neels DEVNAME(sd->sd_sc), sd->sd_meta->ssd_devname);
1160 6c6e6e50 2020-10-24 neels goto bad;
1161 6c6e6e50 2020-10-24 neels }
1162 6c6e6e50 2020-10-24 neels if (!ISSET(xs->flags, SCSI_DATA_IN)) {
1163 6c6e6e50 2020-10-24 neels uio = crwu->cr_crp->crp_buf;
1164 6c6e6e50 2020-10-24 neels ccb->ccb_buf.b_data = uio->uio_iov->iov_base;
1165 6c6e6e50 2020-10-24 neels ccb->ccb_opaque = crwu;
1166 6c6e6e50 2020-10-24 neels }
1167 6c6e6e50 2020-10-24 neels sr_wu_enqueue_ccb(wu, ccb);
1168 6c6e6e50 2020-10-24 neels sr_schedule_wu(wu);
1169 6c6e6e50 2020-10-24 neels
1170 6c6e6e50 2020-10-24 neels return (0);
1171 6c6e6e50 2020-10-24 neels
1172 6c6e6e50 2020-10-24 neels bad:
1173 6c6e6e50 2020-10-24 neels /* wu is unwound by sr_wu_put */
1174 6c6e6e50 2020-10-24 neels if (crwu)
1175 6c6e6e50 2020-10-24 neels crwu->cr_crp->crp_etype = EINVAL;
1176 6c6e6e50 2020-10-24 neels return (1);
1177 6c6e6e50 2020-10-24 neels }
1178 6c6e6e50 2020-10-24 neels
1179 6c6e6e50 2020-10-24 neels void
1180 6c6e6e50 2020-10-24 neels sr_crypto_done(struct sr_workunit *wu)
1181 6c6e6e50 2020-10-24 neels {
1182 6c6e6e50 2020-10-24 neels struct scsi_xfer *xs = wu->swu_xs;
1183 6c6e6e50 2020-10-24 neels struct sr_crypto_wu *crwu;
1184 6c6e6e50 2020-10-24 neels int s;
1185 6c6e6e50 2020-10-24 neels
1186 6c6e6e50 2020-10-24 neels /* If this was a successful read, initiate decryption of the data. */
1187 6c6e6e50 2020-10-24 neels if (ISSET(xs->flags, SCSI_DATA_IN) && xs->error == XS_NOERROR) {
1188 6c6e6e50 2020-10-24 neels crwu = sr_crypto_prepare(wu, 0);
1189 6c6e6e50 2020-10-24 neels crwu->cr_crp->crp_callback = sr_crypto_read;
1190 6c6e6e50 2020-10-24 neels DNPRINTF(SR_D_INTR, "%s: sr_crypto_done: crypto_dispatch %p\n",
1191 6c6e6e50 2020-10-24 neels DEVNAME(wu->swu_dis->sd_sc), crwu->cr_crp);
1192 6c6e6e50 2020-10-24 neels crypto_dispatch(crwu->cr_crp);
1193 6c6e6e50 2020-10-24 neels return;
1194 6c6e6e50 2020-10-24 neels }
1195 6c6e6e50 2020-10-24 neels
1196 6c6e6e50 2020-10-24 neels s = splbio();
1197 6c6e6e50 2020-10-24 neels sr_scsi_done(wu->swu_dis, wu->swu_xs);
1198 6c6e6e50 2020-10-24 neels splx(s);
1199 6c6e6e50 2020-10-24 neels }
1200 6c6e6e50 2020-10-24 neels
1201 6c6e6e50 2020-10-24 neels void
1202 6c6e6e50 2020-10-24 neels sr_crypto_read(struct cryptop *crp)
1203 6c6e6e50 2020-10-24 neels {
1204 6c6e6e50 2020-10-24 neels struct sr_crypto_wu *crwu = crp->crp_opaque;
1205 6c6e6e50 2020-10-24 neels struct sr_workunit *wu = &crwu->cr_wu;
1206 6c6e6e50 2020-10-24 neels int s;
1207 6c6e6e50 2020-10-24 neels
1208 6c6e6e50 2020-10-24 neels DNPRINTF(SR_D_INTR, "%s: sr_crypto_read: wu %p xs: %p\n",
1209 6c6e6e50 2020-10-24 neels DEVNAME(wu->swu_dis->sd_sc), wu, wu->swu_xs);
1210 6c6e6e50 2020-10-24 neels
1211 6c6e6e50 2020-10-24 neels if (crp->crp_etype)
1212 6c6e6e50 2020-10-24 neels wu->swu_xs->error = XS_DRIVER_STUFFUP;
1213 6c6e6e50 2020-10-24 neels
1214 6c6e6e50 2020-10-24 neels s = splbio();
1215 6c6e6e50 2020-10-24 neels sr_scsi_done(wu->swu_dis, wu->swu_xs);
1216 6c6e6e50 2020-10-24 neels splx(s);
1217 6c6e6e50 2020-10-24 neels }
1218 6c6e6e50 2020-10-24 neels
1219 6c6e6e50 2020-10-24 neels void
1220 6c6e6e50 2020-10-24 neels sr_crypto_hotplug(struct sr_discipline *sd, struct disk *diskp, int action)
1221 6c6e6e50 2020-10-24 neels {
1222 6c6e6e50 2020-10-24 neels DNPRINTF(SR_D_MISC, "%s: sr_crypto_hotplug: %s %d\n",
1223 6c6e6e50 2020-10-24 neels DEVNAME(sd->sd_sc), diskp->dk_name, action);
1224 6c6e6e50 2020-10-24 neels }
1225 6c6e6e50 2020-10-24 neels
1226 6c6e6e50 2020-10-24 neels #ifdef SR_DEBUG0
1227 6c6e6e50 2020-10-24 neels void
1228 6c6e6e50 2020-10-24 neels sr_crypto_dumpkeys(struct sr_discipline *sd)
1229 6c6e6e50 2020-10-24 neels {
1230 6c6e6e50 2020-10-24 neels int i, j;
1231 6c6e6e50 2020-10-24 neels
1232 6c6e6e50 2020-10-24 neels printf("sr_crypto_dumpkeys:\n");
1233 6c6e6e50 2020-10-24 neels for (i = 0; i < SR_CRYPTO_MAXKEYS; i++) {
1234 6c6e6e50 2020-10-24 neels printf("\tscm_key[%d]: 0x", i);
1235 6c6e6e50 2020-10-24 neels for (j = 0; j < SR_CRYPTO_KEYBYTES; j++) {
1236 6c6e6e50 2020-10-24 neels printf("%02x",
1237 6c6e6e50 2020-10-24 neels sd->mds.mdd_crypto.scr_meta->scm_key[i][j]);
1238 6c6e6e50 2020-10-24 neels }
1239 6c6e6e50 2020-10-24 neels printf("\n");
1240 6c6e6e50 2020-10-24 neels }
1241 6c6e6e50 2020-10-24 neels printf("sr_crypto_dumpkeys: runtime data keys:\n");
1242 6c6e6e50 2020-10-24 neels for (i = 0; i < SR_CRYPTO_MAXKEYS; i++) {
1243 6c6e6e50 2020-10-24 neels printf("\tscr_key[%d]: 0x", i);
1244 6c6e6e50 2020-10-24 neels for (j = 0; j < SR_CRYPTO_KEYBYTES; j++) {
1245 6c6e6e50 2020-10-24 neels printf("%02x",
1246 6c6e6e50 2020-10-24 neels sd->mds.mdd_crypto.scr_key[i][j]);
1247 6c6e6e50 2020-10-24 neels }
1248 6c6e6e50 2020-10-24 neels printf("\n");
1249 6c6e6e50 2020-10-24 neels }
1250 6c6e6e50 2020-10-24 neels }
1251 6c6e6e50 2020-10-24 neels #endif /* SR_DEBUG */