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