]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/geom/eli/g_eli.c
Merge ^/vendor/lvm-project/release-10.x up to its last change (upstream
[FreeBSD/FreeBSD.git] / sys / geom / eli / g_eli.c
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3  *
4  * Copyright (c) 2005-2019 Pawel Jakub Dawidek <pawel@dawidek.net>
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  */
28
29 #include <sys/cdefs.h>
30 __FBSDID("$FreeBSD$");
31
32 #include <sys/param.h>
33 #include <sys/systm.h>
34 #include <sys/cons.h>
35 #include <sys/kernel.h>
36 #include <sys/linker.h>
37 #include <sys/module.h>
38 #include <sys/lock.h>
39 #include <sys/mutex.h>
40 #include <sys/bio.h>
41 #include <sys/sbuf.h>
42 #include <sys/sysctl.h>
43 #include <sys/malloc.h>
44 #include <sys/eventhandler.h>
45 #include <sys/kthread.h>
46 #include <sys/proc.h>
47 #include <sys/sched.h>
48 #include <sys/smp.h>
49 #include <sys/uio.h>
50 #include <sys/vnode.h>
51
52 #include <vm/uma.h>
53
54 #include <geom/geom.h>
55 #include <geom/geom_dbg.h>
56 #include <geom/eli/g_eli.h>
57 #include <geom/eli/pkcs5v2.h>
58
59 #include <crypto/intake.h>
60
61 FEATURE(geom_eli, "GEOM crypto module");
62
63 MALLOC_DEFINE(M_ELI, "eli data", "GEOM_ELI Data");
64
65 SYSCTL_DECL(_kern_geom);
66 SYSCTL_NODE(_kern_geom, OID_AUTO, eli, CTLFLAG_RW, 0, "GEOM_ELI stuff");
67 static int g_eli_version = G_ELI_VERSION;
68 SYSCTL_INT(_kern_geom_eli, OID_AUTO, version, CTLFLAG_RD, &g_eli_version, 0,
69     "GELI version");
70 int g_eli_debug = 0;
71 SYSCTL_INT(_kern_geom_eli, OID_AUTO, debug, CTLFLAG_RWTUN, &g_eli_debug, 0,
72     "Debug level");
73 static u_int g_eli_tries = 3;
74 SYSCTL_UINT(_kern_geom_eli, OID_AUTO, tries, CTLFLAG_RWTUN, &g_eli_tries, 0,
75     "Number of tries for entering the passphrase");
76 static u_int g_eli_visible_passphrase = GETS_NOECHO;
77 SYSCTL_UINT(_kern_geom_eli, OID_AUTO, visible_passphrase, CTLFLAG_RWTUN,
78     &g_eli_visible_passphrase, 0,
79     "Visibility of passphrase prompt (0 = invisible, 1 = visible, 2 = asterisk)");
80 u_int g_eli_overwrites = G_ELI_OVERWRITES;
81 SYSCTL_UINT(_kern_geom_eli, OID_AUTO, overwrites, CTLFLAG_RWTUN, &g_eli_overwrites,
82     0, "Number of times on-disk keys should be overwritten when destroying them");
83 static u_int g_eli_threads = 0;
84 SYSCTL_UINT(_kern_geom_eli, OID_AUTO, threads, CTLFLAG_RWTUN, &g_eli_threads, 0,
85     "Number of threads doing crypto work");
86 u_int g_eli_batch = 0;
87 SYSCTL_UINT(_kern_geom_eli, OID_AUTO, batch, CTLFLAG_RWTUN, &g_eli_batch, 0,
88     "Use crypto operations batching");
89
90 /*
91  * Passphrase cached during boot, in order to be more user-friendly if
92  * there are multiple providers using the same passphrase.
93  */
94 static char cached_passphrase[256];
95 static u_int g_eli_boot_passcache = 1;
96 TUNABLE_INT("kern.geom.eli.boot_passcache", &g_eli_boot_passcache);
97 SYSCTL_UINT(_kern_geom_eli, OID_AUTO, boot_passcache, CTLFLAG_RD,
98     &g_eli_boot_passcache, 0,
99     "Passphrases are cached during boot process for possible reuse");
100 static void
101 fetch_loader_passphrase(void * dummy)
102 {
103         char * env_passphrase;
104
105         KASSERT(dynamic_kenv, ("need dynamic kenv"));
106
107         if ((env_passphrase = kern_getenv("kern.geom.eli.passphrase")) != NULL) {
108                 /* Extract passphrase from the environment. */
109                 strlcpy(cached_passphrase, env_passphrase,
110                     sizeof(cached_passphrase));
111                 freeenv(env_passphrase);
112
113                 /* Wipe the passphrase from the environment. */
114                 kern_unsetenv("kern.geom.eli.passphrase");
115         }
116 }
117 SYSINIT(geli_fetch_loader_passphrase, SI_SUB_KMEM + 1, SI_ORDER_ANY,
118     fetch_loader_passphrase, NULL);
119
120 static void
121 zero_boot_passcache(void)
122 {
123
124         explicit_bzero(cached_passphrase, sizeof(cached_passphrase));
125 }
126
127 static void
128 zero_geli_intake_keys(void)
129 {
130         struct keybuf *keybuf;
131         int i;
132
133         if ((keybuf = get_keybuf()) != NULL) {
134                 /* Scan the key buffer, clear all GELI keys. */
135                 for (i = 0; i < keybuf->kb_nents; i++) {
136                          if (keybuf->kb_ents[i].ke_type == KEYBUF_TYPE_GELI) {
137                                  explicit_bzero(keybuf->kb_ents[i].ke_data,
138                                      sizeof(keybuf->kb_ents[i].ke_data));
139                                  keybuf->kb_ents[i].ke_type = KEYBUF_TYPE_NONE;
140                          }
141                 }
142         }
143 }
144
145 static void
146 zero_intake_passcache(void *dummy)
147 {
148         zero_boot_passcache();
149         zero_geli_intake_keys();
150 }
151 EVENTHANDLER_DEFINE(mountroot, zero_intake_passcache, NULL, 0);
152
153 static eventhandler_tag g_eli_pre_sync = NULL;
154
155 static int g_eli_read_metadata_offset(struct g_class *mp, struct g_provider *pp,
156     off_t offset, struct g_eli_metadata *md);
157
158 static int g_eli_destroy_geom(struct gctl_req *req, struct g_class *mp,
159     struct g_geom *gp);
160 static void g_eli_init(struct g_class *mp);
161 static void g_eli_fini(struct g_class *mp);
162
163 static g_taste_t g_eli_taste;
164 static g_dumpconf_t g_eli_dumpconf;
165
166 struct g_class g_eli_class = {
167         .name = G_ELI_CLASS_NAME,
168         .version = G_VERSION,
169         .ctlreq = g_eli_config,
170         .taste = g_eli_taste,
171         .destroy_geom = g_eli_destroy_geom,
172         .init = g_eli_init,
173         .fini = g_eli_fini
174 };
175
176
177 /*
178  * Code paths:
179  * BIO_READ:
180  *      g_eli_start -> g_eli_crypto_read -> g_io_request -> g_eli_read_done -> g_eli_crypto_run -> g_eli_crypto_read_done -> g_io_deliver
181  * BIO_WRITE:
182  *      g_eli_start -> g_eli_crypto_run -> g_eli_crypto_write_done -> g_io_request -> g_eli_write_done -> g_io_deliver
183  */
184
185
186 /*
187  * EAGAIN from crypto(9) means, that we were probably balanced to another crypto
188  * accelerator or something like this.
189  * The function updates the SID and rerun the operation.
190  */
191 int
192 g_eli_crypto_rerun(struct cryptop *crp)
193 {
194         struct g_eli_softc *sc;
195         struct g_eli_worker *wr;
196         struct bio *bp;
197         int error;
198
199         bp = (struct bio *)crp->crp_opaque;
200         sc = bp->bio_to->geom->softc;
201         LIST_FOREACH(wr, &sc->sc_workers, w_next) {
202                 if (wr->w_number == bp->bio_pflags)
203                         break;
204         }
205         KASSERT(wr != NULL, ("Invalid worker (%u).", bp->bio_pflags));
206         G_ELI_DEBUG(1, "Rerunning crypto %s request (sid: %p -> %p).",
207             bp->bio_cmd == BIO_READ ? "READ" : "WRITE", wr->w_sid,
208             crp->crp_session);
209         wr->w_sid = crp->crp_session;
210         crp->crp_etype = 0;
211         error = crypto_dispatch(crp);
212         if (error == 0)
213                 return (0);
214         G_ELI_DEBUG(1, "%s: crypto_dispatch() returned %d.", __func__, error);
215         crp->crp_etype = error;
216         return (error);
217 }
218
219 static void
220 g_eli_getattr_done(struct bio *bp)
221 {
222         if (bp->bio_error == 0 && 
223             !strcmp(bp->bio_attribute, "GEOM::physpath")) {
224                 strlcat(bp->bio_data, "/eli", bp->bio_length);
225         }
226         g_std_done(bp);
227 }
228
229 /*
230  * The function is called afer reading encrypted data from the provider.
231  *
232  * g_eli_start -> g_eli_crypto_read -> g_io_request -> G_ELI_READ_DONE -> g_eli_crypto_run -> g_eli_crypto_read_done -> g_io_deliver
233  */
234 void
235 g_eli_read_done(struct bio *bp)
236 {
237         struct g_eli_softc *sc;
238         struct bio *pbp;
239
240         G_ELI_LOGREQ(2, bp, "Request done.");
241         pbp = bp->bio_parent;
242         if (pbp->bio_error == 0 && bp->bio_error != 0)
243                 pbp->bio_error = bp->bio_error;
244         g_destroy_bio(bp);
245         /*
246          * Do we have all sectors already?
247          */
248         pbp->bio_inbed++;
249         if (pbp->bio_inbed < pbp->bio_children)
250                 return;
251         sc = pbp->bio_to->geom->softc;
252         if (pbp->bio_error != 0) {
253                 G_ELI_LOGREQ(0, pbp, "%s() failed (error=%d)", __func__,
254                     pbp->bio_error);
255                 pbp->bio_completed = 0;
256                 if (pbp->bio_driver2 != NULL) {
257                         free(pbp->bio_driver2, M_ELI);
258                         pbp->bio_driver2 = NULL;
259                 }
260                 g_io_deliver(pbp, pbp->bio_error);
261                 if (sc != NULL)
262                         atomic_subtract_int(&sc->sc_inflight, 1);
263                 return;
264         }
265         mtx_lock(&sc->sc_queue_mtx);
266         bioq_insert_tail(&sc->sc_queue, pbp);
267         mtx_unlock(&sc->sc_queue_mtx);
268         wakeup(sc);
269 }
270
271 /*
272  * The function is called after we encrypt and write data.
273  *
274  * g_eli_start -> g_eli_crypto_run -> g_eli_crypto_write_done -> g_io_request -> G_ELI_WRITE_DONE -> g_io_deliver
275  */
276 void
277 g_eli_write_done(struct bio *bp)
278 {
279         struct g_eli_softc *sc;
280         struct bio *pbp;
281
282         G_ELI_LOGREQ(2, bp, "Request done.");
283         pbp = bp->bio_parent;
284         if (pbp->bio_error == 0 && bp->bio_error != 0)
285                 pbp->bio_error = bp->bio_error;
286         g_destroy_bio(bp);
287         /*
288          * Do we have all sectors already?
289          */
290         pbp->bio_inbed++;
291         if (pbp->bio_inbed < pbp->bio_children)
292                 return;
293         free(pbp->bio_driver2, M_ELI);
294         pbp->bio_driver2 = NULL;
295         if (pbp->bio_error != 0) {
296                 G_ELI_LOGREQ(0, pbp, "%s() failed (error=%d)", __func__,
297                     pbp->bio_error);
298                 pbp->bio_completed = 0;
299         } else
300                 pbp->bio_completed = pbp->bio_length;
301
302         /*
303          * Write is finished, send it up.
304          */
305         sc = pbp->bio_to->geom->softc;
306         g_io_deliver(pbp, pbp->bio_error);
307         if (sc != NULL)
308                 atomic_subtract_int(&sc->sc_inflight, 1);
309 }
310
311 /*
312  * This function should never be called, but GEOM made as it set ->orphan()
313  * method for every geom.
314  */
315 static void
316 g_eli_orphan_spoil_assert(struct g_consumer *cp)
317 {
318
319         panic("Function %s() called for %s.", __func__, cp->geom->name);
320 }
321
322 static void
323 g_eli_orphan(struct g_consumer *cp)
324 {
325         struct g_eli_softc *sc;
326
327         g_topology_assert();
328         sc = cp->geom->softc;
329         if (sc == NULL)
330                 return;
331         g_eli_destroy(sc, TRUE);
332 }
333
334 static void
335 g_eli_resize(struct g_consumer *cp)
336 {
337         struct g_eli_softc *sc;
338         struct g_provider *epp, *pp;
339         off_t oldsize;
340
341         g_topology_assert();
342         sc = cp->geom->softc;
343         if (sc == NULL)
344                 return;
345
346         if ((sc->sc_flags & G_ELI_FLAG_AUTORESIZE) == 0) {
347                 G_ELI_DEBUG(0, "Autoresize is turned off, old size: %jd.",
348                     (intmax_t)sc->sc_provsize);
349                 return;
350         }
351
352         pp = cp->provider;
353
354         if ((sc->sc_flags & G_ELI_FLAG_ONETIME) == 0) {
355                 struct g_eli_metadata md;
356                 u_char *sector;
357                 int error;
358
359                 sector = NULL;
360
361                 error = g_eli_read_metadata_offset(cp->geom->class, pp,
362                     sc->sc_provsize - pp->sectorsize, &md);
363                 if (error != 0) {
364                         G_ELI_DEBUG(0, "Cannot read metadata from %s (error=%d).",
365                             pp->name, error);
366                         goto iofail;
367                 }
368
369                 md.md_provsize = pp->mediasize;
370
371                 sector = malloc(pp->sectorsize, M_ELI, M_WAITOK | M_ZERO);
372                 eli_metadata_encode(&md, sector);
373                 error = g_write_data(cp, pp->mediasize - pp->sectorsize, sector,
374                     pp->sectorsize);
375                 if (error != 0) {
376                         G_ELI_DEBUG(0, "Cannot store metadata on %s (error=%d).",
377                             pp->name, error);
378                         goto iofail;
379                 }
380                 explicit_bzero(sector, pp->sectorsize);
381                 error = g_write_data(cp, sc->sc_provsize - pp->sectorsize,
382                     sector, pp->sectorsize);
383                 if (error != 0) {
384                         G_ELI_DEBUG(0, "Cannot clear old metadata from %s (error=%d).",
385                             pp->name, error);
386                         goto iofail;
387                 }
388 iofail:
389                 explicit_bzero(&md, sizeof(md));
390                 if (sector != NULL) {
391                         explicit_bzero(sector, pp->sectorsize);
392                         free(sector, M_ELI);
393                 }
394         }
395
396         oldsize = sc->sc_mediasize;
397         sc->sc_mediasize = eli_mediasize(sc, pp->mediasize, pp->sectorsize);
398         g_eli_key_resize(sc);
399         sc->sc_provsize = pp->mediasize;
400
401         epp = LIST_FIRST(&sc->sc_geom->provider);
402         g_resize_provider(epp, sc->sc_mediasize);
403         G_ELI_DEBUG(0, "Device %s size changed from %jd to %jd.", epp->name,
404             (intmax_t)oldsize, (intmax_t)sc->sc_mediasize);
405 }
406
407 /*
408  * BIO_READ:
409  *      G_ELI_START -> g_eli_crypto_read -> g_io_request -> g_eli_read_done -> g_eli_crypto_run -> g_eli_crypto_read_done -> g_io_deliver
410  * BIO_WRITE:
411  *      G_ELI_START -> g_eli_crypto_run -> g_eli_crypto_write_done -> g_io_request -> g_eli_write_done -> g_io_deliver
412  */
413 static void
414 g_eli_start(struct bio *bp)
415 {
416         struct g_eli_softc *sc;
417         struct g_consumer *cp;
418         struct bio *cbp;
419
420         sc = bp->bio_to->geom->softc;
421         KASSERT(sc != NULL,
422             ("Provider's error should be set (error=%d)(device=%s).",
423             bp->bio_to->error, bp->bio_to->name));
424         G_ELI_LOGREQ(2, bp, "Request received.");
425
426         switch (bp->bio_cmd) {
427         case BIO_READ:
428         case BIO_WRITE:
429         case BIO_GETATTR:
430         case BIO_FLUSH:
431         case BIO_ZONE:
432         case BIO_SPEEDUP:
433                 break;
434         case BIO_DELETE:
435                 /*
436                  * If the user hasn't set the NODELETE flag, we just pass
437                  * it down the stack and let the layers beneath us do (or
438                  * not) whatever they do with it.  If they have, we
439                  * reject it.  A possible extension would be an
440                  * additional flag to take it as a hint to shred the data
441                  * with [multiple?] overwrites.
442                  */
443                 if (!(sc->sc_flags & G_ELI_FLAG_NODELETE))
444                         break;
445         default:
446                 g_io_deliver(bp, EOPNOTSUPP);
447                 return;
448         }
449         cbp = g_clone_bio(bp);
450         if (cbp == NULL) {
451                 g_io_deliver(bp, ENOMEM);
452                 return;
453         }
454         bp->bio_driver1 = cbp;
455         bp->bio_pflags = G_ELI_NEW_BIO;
456         switch (bp->bio_cmd) {
457         case BIO_READ:
458                 if (!(sc->sc_flags & G_ELI_FLAG_AUTH)) {
459                         g_eli_crypto_read(sc, bp, 0);
460                         break;
461                 }
462                 /* FALLTHROUGH */
463         case BIO_WRITE:
464                 mtx_lock(&sc->sc_queue_mtx);
465                 bioq_insert_tail(&sc->sc_queue, bp);
466                 mtx_unlock(&sc->sc_queue_mtx);
467                 wakeup(sc);
468                 break;
469         case BIO_GETATTR:
470         case BIO_FLUSH:
471         case BIO_DELETE:
472         case BIO_SPEEDUP:
473         case BIO_ZONE:
474                 if (bp->bio_cmd == BIO_GETATTR)
475                         cbp->bio_done = g_eli_getattr_done;
476                 else
477                         cbp->bio_done = g_std_done;
478                 cp = LIST_FIRST(&sc->sc_geom->consumer);
479                 cbp->bio_to = cp->provider;
480                 G_ELI_LOGREQ(2, cbp, "Sending request.");
481                 g_io_request(cbp, cp);
482                 break;
483         }
484 }
485
486 static int
487 g_eli_newsession(struct g_eli_worker *wr)
488 {
489         struct g_eli_softc *sc;
490         struct cryptoini crie, cria;
491         int error;
492
493         sc = wr->w_softc;
494
495         bzero(&crie, sizeof(crie));
496         crie.cri_alg = sc->sc_ealgo;
497         crie.cri_klen = sc->sc_ekeylen;
498         if (sc->sc_ealgo == CRYPTO_AES_XTS)
499                 crie.cri_klen <<= 1;
500         if ((sc->sc_flags & G_ELI_FLAG_FIRST_KEY) != 0) {
501                 crie.cri_key = g_eli_key_hold(sc, 0,
502                     LIST_FIRST(&sc->sc_geom->consumer)->provider->sectorsize);
503         } else {
504                 crie.cri_key = sc->sc_ekey;
505         }
506         if (sc->sc_flags & G_ELI_FLAG_AUTH) {
507                 bzero(&cria, sizeof(cria));
508                 cria.cri_alg = sc->sc_aalgo;
509                 cria.cri_klen = sc->sc_akeylen;
510                 cria.cri_key = sc->sc_akey;
511                 crie.cri_next = &cria;
512         }
513
514         switch (sc->sc_crypto) {
515         case G_ELI_CRYPTO_SW:
516                 error = crypto_newsession(&wr->w_sid, &crie,
517                     CRYPTOCAP_F_SOFTWARE);
518                 break;
519         case G_ELI_CRYPTO_HW:
520                 error = crypto_newsession(&wr->w_sid, &crie,
521                     CRYPTOCAP_F_HARDWARE);
522                 break;
523         case G_ELI_CRYPTO_UNKNOWN:
524                 error = crypto_newsession(&wr->w_sid, &crie,
525                     CRYPTOCAP_F_HARDWARE);
526                 if (error == 0) {
527                         mtx_lock(&sc->sc_queue_mtx);
528                         if (sc->sc_crypto == G_ELI_CRYPTO_UNKNOWN)
529                                 sc->sc_crypto = G_ELI_CRYPTO_HW;
530                         mtx_unlock(&sc->sc_queue_mtx);
531                 } else {
532                         error = crypto_newsession(&wr->w_sid, &crie,
533                             CRYPTOCAP_F_SOFTWARE);
534                         mtx_lock(&sc->sc_queue_mtx);
535                         if (sc->sc_crypto == G_ELI_CRYPTO_UNKNOWN)
536                                 sc->sc_crypto = G_ELI_CRYPTO_SW;
537                         mtx_unlock(&sc->sc_queue_mtx);
538                 }
539                 break;
540         default:
541                 panic("%s: invalid condition", __func__);
542         }
543
544         if ((sc->sc_flags & G_ELI_FLAG_FIRST_KEY) != 0)
545                 g_eli_key_drop(sc, crie.cri_key);
546
547         return (error);
548 }
549
550 static void
551 g_eli_freesession(struct g_eli_worker *wr)
552 {
553
554         crypto_freesession(wr->w_sid);
555 }
556
557 static void
558 g_eli_cancel(struct g_eli_softc *sc)
559 {
560         struct bio *bp;
561
562         mtx_assert(&sc->sc_queue_mtx, MA_OWNED);
563
564         while ((bp = bioq_takefirst(&sc->sc_queue)) != NULL) {
565                 KASSERT(bp->bio_pflags == G_ELI_NEW_BIO,
566                     ("Not new bio when canceling (bp=%p).", bp));
567                 g_io_deliver(bp, ENXIO);
568         }
569 }
570
571 static struct bio *
572 g_eli_takefirst(struct g_eli_softc *sc)
573 {
574         struct bio *bp;
575
576         mtx_assert(&sc->sc_queue_mtx, MA_OWNED);
577
578         if (!(sc->sc_flags & G_ELI_FLAG_SUSPEND))
579                 return (bioq_takefirst(&sc->sc_queue));
580         /*
581          * Device suspended, so we skip new I/O requests.
582          */
583         TAILQ_FOREACH(bp, &sc->sc_queue.queue, bio_queue) {
584                 if (bp->bio_pflags != G_ELI_NEW_BIO)
585                         break;
586         }
587         if (bp != NULL)
588                 bioq_remove(&sc->sc_queue, bp);
589         return (bp);
590 }
591
592 /*
593  * This is the main function for kernel worker thread when we don't have
594  * hardware acceleration and we have to do cryptography in software.
595  * Dedicated thread is needed, so we don't slow down g_up/g_down GEOM
596  * threads with crypto work.
597  */
598 static void
599 g_eli_worker(void *arg)
600 {
601         struct g_eli_softc *sc;
602         struct g_eli_worker *wr;
603         struct bio *bp;
604         int error;
605
606         wr = arg;
607         sc = wr->w_softc;
608 #ifdef EARLY_AP_STARTUP
609         MPASS(!sc->sc_cpubind || smp_started);
610 #elif defined(SMP)
611         /* Before sched_bind() to a CPU, wait for all CPUs to go on-line. */
612         if (sc->sc_cpubind) {
613                 while (!smp_started)
614                         tsleep(wr, 0, "geli:smp", hz / 4);
615         }
616 #endif
617         thread_lock(curthread);
618         sched_prio(curthread, PUSER);
619         if (sc->sc_cpubind)
620                 sched_bind(curthread, wr->w_number % mp_ncpus);
621         thread_unlock(curthread);
622
623         G_ELI_DEBUG(1, "Thread %s started.", curthread->td_proc->p_comm);
624
625         for (;;) {
626                 mtx_lock(&sc->sc_queue_mtx);
627 again:
628                 bp = g_eli_takefirst(sc);
629                 if (bp == NULL) {
630                         if (sc->sc_flags & G_ELI_FLAG_DESTROY) {
631                                 g_eli_cancel(sc);
632                                 LIST_REMOVE(wr, w_next);
633                                 g_eli_freesession(wr);
634                                 free(wr, M_ELI);
635                                 G_ELI_DEBUG(1, "Thread %s exiting.",
636                                     curthread->td_proc->p_comm);
637                                 wakeup(&sc->sc_workers);
638                                 mtx_unlock(&sc->sc_queue_mtx);
639                                 kproc_exit(0);
640                         }
641                         while (sc->sc_flags & G_ELI_FLAG_SUSPEND) {
642                                 if (sc->sc_inflight > 0) {
643                                         G_ELI_DEBUG(0, "inflight=%d",
644                                             sc->sc_inflight);
645                                         /*
646                                          * We still have inflight BIOs, so
647                                          * sleep and retry.
648                                          */
649                                         msleep(sc, &sc->sc_queue_mtx, PRIBIO,
650                                             "geli:inf", hz / 5);
651                                         goto again;
652                                 }
653                                 /*
654                                  * Suspend requested, mark the worker as
655                                  * suspended and go to sleep.
656                                  */
657                                 if (wr->w_active) {
658                                         g_eli_freesession(wr);
659                                         wr->w_active = FALSE;
660                                 }
661                                 wakeup(&sc->sc_workers);
662                                 msleep(sc, &sc->sc_queue_mtx, PRIBIO,
663                                     "geli:suspend", 0);
664                                 if (!wr->w_active &&
665                                     !(sc->sc_flags & G_ELI_FLAG_SUSPEND)) {
666                                         error = g_eli_newsession(wr);
667                                         KASSERT(error == 0,
668                                             ("g_eli_newsession() failed on resume (error=%d)",
669                                             error));
670                                         wr->w_active = TRUE;
671                                 }
672                                 goto again;
673                         }
674                         msleep(sc, &sc->sc_queue_mtx, PDROP, "geli:w", 0);
675                         continue;
676                 }
677                 if (bp->bio_pflags == G_ELI_NEW_BIO)
678                         atomic_add_int(&sc->sc_inflight, 1);
679                 mtx_unlock(&sc->sc_queue_mtx);
680                 if (bp->bio_pflags == G_ELI_NEW_BIO) {
681                         bp->bio_pflags = 0;
682                         if (sc->sc_flags & G_ELI_FLAG_AUTH) {
683                                 if (bp->bio_cmd == BIO_READ)
684                                         g_eli_auth_read(sc, bp);
685                                 else
686                                         g_eli_auth_run(wr, bp);
687                         } else {
688                                 if (bp->bio_cmd == BIO_READ)
689                                         g_eli_crypto_read(sc, bp, 1);
690                                 else
691                                         g_eli_crypto_run(wr, bp);
692                         }
693                 } else {
694                         if (sc->sc_flags & G_ELI_FLAG_AUTH)
695                                 g_eli_auth_run(wr, bp);
696                         else
697                                 g_eli_crypto_run(wr, bp);
698                 }
699         }
700 }
701
702 static int
703 g_eli_read_metadata_offset(struct g_class *mp, struct g_provider *pp,
704     off_t offset, struct g_eli_metadata *md)
705 {
706         struct g_geom *gp;
707         struct g_consumer *cp;
708         u_char *buf = NULL;
709         int error;
710
711         g_topology_assert();
712
713         gp = g_new_geomf(mp, "eli:taste");
714         gp->start = g_eli_start;
715         gp->access = g_std_access;
716         /*
717          * g_eli_read_metadata() is always called from the event thread.
718          * Our geom is created and destroyed in the same event, so there
719          * could be no orphan nor spoil event in the meantime.
720          */
721         gp->orphan = g_eli_orphan_spoil_assert;
722         gp->spoiled = g_eli_orphan_spoil_assert;
723         cp = g_new_consumer(gp);
724         error = g_attach(cp, pp);
725         if (error != 0)
726                 goto end;
727         error = g_access(cp, 1, 0, 0);
728         if (error != 0)
729                 goto end;
730         g_topology_unlock();
731         buf = g_read_data(cp, offset, pp->sectorsize, &error);
732         g_topology_lock();
733         if (buf == NULL)
734                 goto end;
735         error = eli_metadata_decode(buf, md);
736         if (error != 0)
737                 goto end;
738         /* Metadata was read and decoded successfully. */
739 end:
740         if (buf != NULL)
741                 g_free(buf);
742         if (cp->provider != NULL) {
743                 if (cp->acr == 1)
744                         g_access(cp, -1, 0, 0);
745                 g_detach(cp);
746         }
747         g_destroy_consumer(cp);
748         g_destroy_geom(gp);
749         return (error);
750 }
751
752 int
753 g_eli_read_metadata(struct g_class *mp, struct g_provider *pp,
754     struct g_eli_metadata *md)
755 {
756
757         return (g_eli_read_metadata_offset(mp, pp,
758             pp->mediasize - pp->sectorsize, md));
759 }
760
761 /*
762  * The function is called when we had last close on provider and user requested
763  * to close it when this situation occur.
764  */
765 static void
766 g_eli_last_close(void *arg, int flags __unused)
767 {
768         struct g_geom *gp;
769         char gpname[64];
770         int error;
771
772         g_topology_assert();
773         gp = arg;
774         strlcpy(gpname, gp->name, sizeof(gpname));
775         error = g_eli_destroy(gp->softc, TRUE);
776         KASSERT(error == 0, ("Cannot detach %s on last close (error=%d).",
777             gpname, error));
778         G_ELI_DEBUG(0, "Detached %s on last close.", gpname);
779 }
780
781 int
782 g_eli_access(struct g_provider *pp, int dr, int dw, int de)
783 {
784         struct g_eli_softc *sc;
785         struct g_geom *gp;
786
787         gp = pp->geom;
788         sc = gp->softc;
789
790         if (dw > 0) {
791                 if (sc->sc_flags & G_ELI_FLAG_RO) {
792                         /* Deny write attempts. */
793                         return (EROFS);
794                 }
795                 /* Someone is opening us for write, we need to remember that. */
796                 sc->sc_flags |= G_ELI_FLAG_WOPEN;
797                 return (0);
798         }
799         /* Is this the last close? */
800         if (pp->acr + dr > 0 || pp->acw + dw > 0 || pp->ace + de > 0)
801                 return (0);
802
803         /*
804          * Automatically detach on last close if requested.
805          */
806         if ((sc->sc_flags & G_ELI_FLAG_RW_DETACH) ||
807             (sc->sc_flags & G_ELI_FLAG_WOPEN)) {
808                 g_post_event(g_eli_last_close, gp, M_WAITOK, NULL);
809         }
810         return (0);
811 }
812
813 static int
814 g_eli_cpu_is_disabled(int cpu)
815 {
816 #ifdef SMP
817         return (CPU_ISSET(cpu, &hlt_cpus_mask));
818 #else
819         return (0);
820 #endif
821 }
822
823 struct g_geom *
824 g_eli_create(struct gctl_req *req, struct g_class *mp, struct g_provider *bpp,
825     const struct g_eli_metadata *md, const u_char *mkey, int nkey)
826 {
827         struct g_eli_softc *sc;
828         struct g_eli_worker *wr;
829         struct g_geom *gp;
830         struct g_provider *pp;
831         struct g_consumer *cp;
832         u_int i, threads;
833         int dcw, error;
834
835         G_ELI_DEBUG(1, "Creating device %s%s.", bpp->name, G_ELI_SUFFIX);
836
837         gp = g_new_geomf(mp, "%s%s", bpp->name, G_ELI_SUFFIX);
838         sc = malloc(sizeof(*sc), M_ELI, M_WAITOK | M_ZERO);
839         gp->start = g_eli_start;
840         /*
841          * Spoiling can happen even though we have the provider open
842          * exclusively, e.g. through media change events.
843          */
844         gp->spoiled = g_eli_orphan;
845         gp->orphan = g_eli_orphan;
846         gp->resize = g_eli_resize;
847         gp->dumpconf = g_eli_dumpconf;
848         /*
849          * If detach-on-last-close feature is not enabled and we don't operate
850          * on read-only provider, we can simply use g_std_access().
851          */
852         if (md->md_flags & (G_ELI_FLAG_WO_DETACH | G_ELI_FLAG_RO))
853                 gp->access = g_eli_access;
854         else
855                 gp->access = g_std_access;
856
857         eli_metadata_softc(sc, md, bpp->sectorsize, bpp->mediasize);
858         sc->sc_nkey = nkey;
859
860         gp->softc = sc;
861         sc->sc_geom = gp;
862
863         bioq_init(&sc->sc_queue);
864         mtx_init(&sc->sc_queue_mtx, "geli:queue", NULL, MTX_DEF);
865         mtx_init(&sc->sc_ekeys_lock, "geli:ekeys", NULL, MTX_DEF);
866
867         pp = NULL;
868         cp = g_new_consumer(gp);
869         error = g_attach(cp, bpp);
870         if (error != 0) {
871                 if (req != NULL) {
872                         gctl_error(req, "Cannot attach to %s (error=%d).",
873                             bpp->name, error);
874                 } else {
875                         G_ELI_DEBUG(1, "Cannot attach to %s (error=%d).",
876                             bpp->name, error);
877                 }
878                 goto failed;
879         }
880         /*
881          * Keep provider open all the time, so we can run critical tasks,
882          * like Master Keys deletion, without wondering if we can open
883          * provider or not.
884          * We don't open provider for writing only when user requested read-only
885          * access.
886          */
887         dcw = (sc->sc_flags & G_ELI_FLAG_RO) ? 0 : 1;
888         error = g_access(cp, 1, dcw, 1);
889         if (error != 0) {
890                 if (req != NULL) {
891                         gctl_error(req, "Cannot access %s (error=%d).",
892                             bpp->name, error);
893                 } else {
894                         G_ELI_DEBUG(1, "Cannot access %s (error=%d).",
895                             bpp->name, error);
896                 }
897                 goto failed;
898         }
899
900         /*
901          * Remember the keys in our softc structure.
902          */
903         g_eli_mkey_propagate(sc, mkey);
904
905         LIST_INIT(&sc->sc_workers);
906
907         threads = g_eli_threads;
908         if (threads == 0)
909                 threads = mp_ncpus;
910         sc->sc_cpubind = (mp_ncpus > 1 && threads == mp_ncpus);
911         for (i = 0; i < threads; i++) {
912                 if (g_eli_cpu_is_disabled(i)) {
913                         G_ELI_DEBUG(1, "%s: CPU %u disabled, skipping.",
914                             bpp->name, i);
915                         continue;
916                 }
917                 wr = malloc(sizeof(*wr), M_ELI, M_WAITOK | M_ZERO);
918                 wr->w_softc = sc;
919                 wr->w_number = i;
920                 wr->w_active = TRUE;
921
922                 error = g_eli_newsession(wr);
923                 if (error != 0) {
924                         free(wr, M_ELI);
925                         if (req != NULL) {
926                                 gctl_error(req, "Cannot set up crypto session "
927                                     "for %s (error=%d).", bpp->name, error);
928                         } else {
929                                 G_ELI_DEBUG(1, "Cannot set up crypto session "
930                                     "for %s (error=%d).", bpp->name, error);
931                         }
932                         goto failed;
933                 }
934
935                 error = kproc_create(g_eli_worker, wr, &wr->w_proc, 0, 0,
936                     "g_eli[%u] %s", i, bpp->name);
937                 if (error != 0) {
938                         g_eli_freesession(wr);
939                         free(wr, M_ELI);
940                         if (req != NULL) {
941                                 gctl_error(req, "Cannot create kernel thread "
942                                     "for %s (error=%d).", bpp->name, error);
943                         } else {
944                                 G_ELI_DEBUG(1, "Cannot create kernel thread "
945                                     "for %s (error=%d).", bpp->name, error);
946                         }
947                         goto failed;
948                 }
949                 LIST_INSERT_HEAD(&sc->sc_workers, wr, w_next);
950         }
951
952         /*
953          * Create decrypted provider.
954          */
955         pp = g_new_providerf(gp, "%s%s", bpp->name, G_ELI_SUFFIX);
956         pp->mediasize = sc->sc_mediasize;
957         pp->sectorsize = sc->sc_sectorsize;
958
959         g_error_provider(pp, 0);
960
961         G_ELI_DEBUG(0, "Device %s created.", pp->name);
962         G_ELI_DEBUG(0, "Encryption: %s %u", g_eli_algo2str(sc->sc_ealgo),
963             sc->sc_ekeylen);
964         switch (sc->sc_ealgo) {
965         case CRYPTO_3DES_CBC:
966                 gone_in(13,
967                     "support for GEOM_ELI volumes encrypted with 3des");
968                 break;
969         case CRYPTO_BLF_CBC:
970                 gone_in(13,
971                     "support for GEOM_ELI volumes encrypted with blowfish");
972                 break;
973         }
974         if (sc->sc_flags & G_ELI_FLAG_AUTH) {
975                 G_ELI_DEBUG(0, " Integrity: %s", g_eli_algo2str(sc->sc_aalgo));
976                 switch (sc->sc_aalgo) {
977                 case CRYPTO_MD5_HMAC:
978                         gone_in(13,
979                     "support for GEOM_ELI volumes authenticated with hmac/md5");
980                         break;
981                 }
982         }
983         G_ELI_DEBUG(0, "    Crypto: %s",
984             sc->sc_crypto == G_ELI_CRYPTO_SW ? "software" : "hardware");
985         return (gp);
986 failed:
987         mtx_lock(&sc->sc_queue_mtx);
988         sc->sc_flags |= G_ELI_FLAG_DESTROY;
989         wakeup(sc);
990         /*
991          * Wait for kernel threads self destruction.
992          */
993         while (!LIST_EMPTY(&sc->sc_workers)) {
994                 msleep(&sc->sc_workers, &sc->sc_queue_mtx, PRIBIO,
995                     "geli:destroy", 0);
996         }
997         mtx_destroy(&sc->sc_queue_mtx);
998         if (cp->provider != NULL) {
999                 if (cp->acr == 1)
1000                         g_access(cp, -1, -dcw, -1);
1001                 g_detach(cp);
1002         }
1003         g_destroy_consumer(cp);
1004         g_destroy_geom(gp);
1005         g_eli_key_destroy(sc);
1006         bzero(sc, sizeof(*sc));
1007         free(sc, M_ELI);
1008         return (NULL);
1009 }
1010
1011 int
1012 g_eli_destroy(struct g_eli_softc *sc, boolean_t force)
1013 {
1014         struct g_geom *gp;
1015         struct g_provider *pp;
1016
1017         g_topology_assert();
1018
1019         if (sc == NULL)
1020                 return (ENXIO);
1021
1022         gp = sc->sc_geom;
1023         pp = LIST_FIRST(&gp->provider);
1024         if (pp != NULL && (pp->acr != 0 || pp->acw != 0 || pp->ace != 0)) {
1025                 if (force) {
1026                         G_ELI_DEBUG(1, "Device %s is still open, so it "
1027                             "cannot be definitely removed.", pp->name);
1028                         sc->sc_flags |= G_ELI_FLAG_RW_DETACH;
1029                         gp->access = g_eli_access;
1030                         g_wither_provider(pp, ENXIO);
1031                         return (EBUSY);
1032                 } else {
1033                         G_ELI_DEBUG(1,
1034                             "Device %s is still open (r%dw%de%d).", pp->name,
1035                             pp->acr, pp->acw, pp->ace);
1036                         return (EBUSY);
1037                 }
1038         }
1039
1040         mtx_lock(&sc->sc_queue_mtx);
1041         sc->sc_flags |= G_ELI_FLAG_DESTROY;
1042         wakeup(sc);
1043         while (!LIST_EMPTY(&sc->sc_workers)) {
1044                 msleep(&sc->sc_workers, &sc->sc_queue_mtx, PRIBIO,
1045                     "geli:destroy", 0);
1046         }
1047         mtx_destroy(&sc->sc_queue_mtx);
1048         gp->softc = NULL;
1049         g_eli_key_destroy(sc);
1050         bzero(sc, sizeof(*sc));
1051         free(sc, M_ELI);
1052
1053         G_ELI_DEBUG(0, "Device %s destroyed.", gp->name);
1054         g_wither_geom_close(gp, ENXIO);
1055
1056         return (0);
1057 }
1058
1059 static int
1060 g_eli_destroy_geom(struct gctl_req *req __unused,
1061     struct g_class *mp __unused, struct g_geom *gp)
1062 {
1063         struct g_eli_softc *sc;
1064
1065         sc = gp->softc;
1066         return (g_eli_destroy(sc, FALSE));
1067 }
1068
1069 static int
1070 g_eli_keyfiles_load(struct hmac_ctx *ctx, const char *provider)
1071 {
1072         u_char *keyfile, *data;
1073         char *file, name[64];
1074         size_t size;
1075         int i;
1076
1077         for (i = 0; ; i++) {
1078                 snprintf(name, sizeof(name), "%s:geli_keyfile%d", provider, i);
1079                 keyfile = preload_search_by_type(name);
1080                 if (keyfile == NULL && i == 0) {
1081                         /*
1082                          * If there is only one keyfile, allow simpler name.
1083                          */
1084                         snprintf(name, sizeof(name), "%s:geli_keyfile", provider);
1085                         keyfile = preload_search_by_type(name);
1086                 }
1087                 if (keyfile == NULL)
1088                         return (i);     /* Return number of loaded keyfiles. */
1089                 data = preload_fetch_addr(keyfile);
1090                 if (data == NULL) {
1091                         G_ELI_DEBUG(0, "Cannot find key file data for %s.",
1092                             name);
1093                         return (0);
1094                 }
1095                 size = preload_fetch_size(keyfile);
1096                 if (size == 0) {
1097                         G_ELI_DEBUG(0, "Cannot find key file size for %s.",
1098                             name);
1099                         return (0);
1100                 }
1101                 file = preload_search_info(keyfile, MODINFO_NAME);
1102                 if (file == NULL) {
1103                         G_ELI_DEBUG(0, "Cannot find key file name for %s.",
1104                             name);
1105                         return (0);
1106                 }
1107                 G_ELI_DEBUG(1, "Loaded keyfile %s for %s (type: %s).", file,
1108                     provider, name);
1109                 g_eli_crypto_hmac_update(ctx, data, size);
1110         }
1111 }
1112
1113 static void
1114 g_eli_keyfiles_clear(const char *provider)
1115 {
1116         u_char *keyfile, *data;
1117         char name[64];
1118         size_t size;
1119         int i;
1120
1121         for (i = 0; ; i++) {
1122                 snprintf(name, sizeof(name), "%s:geli_keyfile%d", provider, i);
1123                 keyfile = preload_search_by_type(name);
1124                 if (keyfile == NULL)
1125                         return;
1126                 data = preload_fetch_addr(keyfile);
1127                 size = preload_fetch_size(keyfile);
1128                 if (data != NULL && size != 0)
1129                         bzero(data, size);
1130         }
1131 }
1132
1133 /*
1134  * Tasting is only made on boot.
1135  * We detect providers which should be attached before root is mounted.
1136  */
1137 static struct g_geom *
1138 g_eli_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
1139 {
1140         struct g_eli_metadata md;
1141         struct g_geom *gp;
1142         struct hmac_ctx ctx;
1143         char passphrase[256];
1144         u_char key[G_ELI_USERKEYLEN], mkey[G_ELI_DATAIVKEYLEN];
1145         u_int i, nkey, nkeyfiles, tries, showpass;
1146         int error;
1147         struct keybuf *keybuf;
1148
1149         g_trace(G_T_TOPOLOGY, "%s(%s, %s)", __func__, mp->name, pp->name);
1150         g_topology_assert();
1151
1152         if (root_mounted() || g_eli_tries == 0)
1153                 return (NULL);
1154
1155         G_ELI_DEBUG(3, "Tasting %s.", pp->name);
1156
1157         error = g_eli_read_metadata(mp, pp, &md);
1158         if (error != 0)
1159                 return (NULL);
1160         gp = NULL;
1161
1162         if (strcmp(md.md_magic, G_ELI_MAGIC) != 0)
1163                 return (NULL);
1164         if (md.md_version > G_ELI_VERSION) {
1165                 printf("geom_eli.ko module is too old to handle %s.\n",
1166                     pp->name);
1167                 return (NULL);
1168         }
1169         if (md.md_provsize != pp->mediasize)
1170                 return (NULL);
1171         /* Should we attach it on boot? */
1172         if (!(md.md_flags & G_ELI_FLAG_BOOT))
1173                 return (NULL);
1174         if (md.md_keys == 0x00) {
1175                 G_ELI_DEBUG(0, "No valid keys on %s.", pp->name);
1176                 return (NULL);
1177         }
1178         if (md.md_iterations == -1) {
1179                 /* If there is no passphrase, we try only once. */
1180                 tries = 1;
1181         } else {
1182                 /* Ask for the passphrase no more than g_eli_tries times. */
1183                 tries = g_eli_tries;
1184         }
1185
1186         if ((keybuf = get_keybuf()) != NULL) {
1187                 /* Scan the key buffer, try all GELI keys. */
1188                 for (i = 0; i < keybuf->kb_nents; i++) {
1189                          if (keybuf->kb_ents[i].ke_type == KEYBUF_TYPE_GELI) {
1190                                  memcpy(key, keybuf->kb_ents[i].ke_data,
1191                                      sizeof(key));
1192
1193                                  if (g_eli_mkey_decrypt_any(&md, key,
1194                                      mkey, &nkey) == 0 ) {
1195                                          explicit_bzero(key, sizeof(key));
1196                                          goto have_key;
1197                                  }
1198                          }
1199                 }
1200         }
1201
1202         for (i = 0; i <= tries; i++) {
1203                 g_eli_crypto_hmac_init(&ctx, NULL, 0);
1204
1205                 /*
1206                  * Load all key files.
1207                  */
1208                 nkeyfiles = g_eli_keyfiles_load(&ctx, pp->name);
1209
1210                 if (nkeyfiles == 0 && md.md_iterations == -1) {
1211                         /*
1212                          * No key files and no passphrase, something is
1213                          * definitely wrong here.
1214                          * geli(8) doesn't allow for such situation, so assume
1215                          * that there was really no passphrase and in that case
1216                          * key files are no properly defined in loader.conf.
1217                          */
1218                         G_ELI_DEBUG(0,
1219                             "Found no key files in loader.conf for %s.",
1220                             pp->name);
1221                         return (NULL);
1222                 }
1223
1224                 /* Ask for the passphrase if defined. */
1225                 if (md.md_iterations >= 0) {
1226                         /* Try first with cached passphrase. */
1227                         if (i == 0) {
1228                                 if (!g_eli_boot_passcache)
1229                                         continue;
1230                                 memcpy(passphrase, cached_passphrase,
1231                                     sizeof(passphrase));
1232                         } else {
1233                                 printf("Enter passphrase for %s: ", pp->name);
1234                                 showpass = g_eli_visible_passphrase;
1235                                 if ((md.md_flags & G_ELI_FLAG_GELIDISPLAYPASS) != 0)
1236                                         showpass = GETS_ECHOPASS;
1237                                 cngets(passphrase, sizeof(passphrase),
1238                                     showpass);
1239                                 memcpy(cached_passphrase, passphrase,
1240                                     sizeof(passphrase));
1241                         }
1242                 }
1243
1244                 /*
1245                  * Prepare Derived-Key from the user passphrase.
1246                  */
1247                 if (md.md_iterations == 0) {
1248                         g_eli_crypto_hmac_update(&ctx, md.md_salt,
1249                             sizeof(md.md_salt));
1250                         g_eli_crypto_hmac_update(&ctx, passphrase,
1251                             strlen(passphrase));
1252                         explicit_bzero(passphrase, sizeof(passphrase));
1253                 } else if (md.md_iterations > 0) {
1254                         u_char dkey[G_ELI_USERKEYLEN];
1255
1256                         pkcs5v2_genkey(dkey, sizeof(dkey), md.md_salt,
1257                             sizeof(md.md_salt), passphrase, md.md_iterations);
1258                         bzero(passphrase, sizeof(passphrase));
1259                         g_eli_crypto_hmac_update(&ctx, dkey, sizeof(dkey));
1260                         explicit_bzero(dkey, sizeof(dkey));
1261                 }
1262
1263                 g_eli_crypto_hmac_final(&ctx, key, 0);
1264
1265                 /*
1266                  * Decrypt Master-Key.
1267                  */
1268                 error = g_eli_mkey_decrypt_any(&md, key, mkey, &nkey);
1269                 bzero(key, sizeof(key));
1270                 if (error == -1) {
1271                         if (i == tries) {
1272                                 G_ELI_DEBUG(0,
1273                                     "Wrong key for %s. No tries left.",
1274                                     pp->name);
1275                                 g_eli_keyfiles_clear(pp->name);
1276                                 return (NULL);
1277                         }
1278                         if (i > 0) {
1279                                 G_ELI_DEBUG(0,
1280                                     "Wrong key for %s. Tries left: %u.",
1281                                     pp->name, tries - i);
1282                         }
1283                         /* Try again. */
1284                         continue;
1285                 } else if (error > 0) {
1286                         G_ELI_DEBUG(0,
1287                             "Cannot decrypt Master Key for %s (error=%d).",
1288                             pp->name, error);
1289                         g_eli_keyfiles_clear(pp->name);
1290                         return (NULL);
1291                 }
1292                 g_eli_keyfiles_clear(pp->name);
1293                 G_ELI_DEBUG(1, "Using Master Key %u for %s.", nkey, pp->name);
1294                 break;
1295         }
1296 have_key:
1297
1298         /*
1299          * We have correct key, let's attach provider.
1300          */
1301         gp = g_eli_create(NULL, mp, pp, &md, mkey, nkey);
1302         bzero(mkey, sizeof(mkey));
1303         bzero(&md, sizeof(md));
1304         if (gp == NULL) {
1305                 G_ELI_DEBUG(0, "Cannot create device %s%s.", pp->name,
1306                     G_ELI_SUFFIX);
1307                 return (NULL);
1308         }
1309         return (gp);
1310 }
1311
1312 static void
1313 g_eli_dumpconf(struct sbuf *sb, const char *indent, struct g_geom *gp,
1314     struct g_consumer *cp, struct g_provider *pp)
1315 {
1316         struct g_eli_softc *sc;
1317
1318         g_topology_assert();
1319         sc = gp->softc;
1320         if (sc == NULL)
1321                 return;
1322         if (pp != NULL || cp != NULL)
1323                 return; /* Nothing here. */
1324
1325         sbuf_printf(sb, "%s<KeysTotal>%ju</KeysTotal>\n", indent,
1326             (uintmax_t)sc->sc_ekeys_total);
1327         sbuf_printf(sb, "%s<KeysAllocated>%ju</KeysAllocated>\n", indent,
1328             (uintmax_t)sc->sc_ekeys_allocated);
1329         sbuf_printf(sb, "%s<Flags>", indent);
1330         if (sc->sc_flags == 0)
1331                 sbuf_cat(sb, "NONE");
1332         else {
1333                 int first = 1;
1334
1335 #define ADD_FLAG(flag, name)    do {                                    \
1336         if (sc->sc_flags & (flag)) {                                    \
1337                 if (!first)                                             \
1338                         sbuf_cat(sb, ", ");                             \
1339                 else                                                    \
1340                         first = 0;                                      \
1341                 sbuf_cat(sb, name);                                     \
1342         }                                                               \
1343 } while (0)
1344                 ADD_FLAG(G_ELI_FLAG_SUSPEND, "SUSPEND");
1345                 ADD_FLAG(G_ELI_FLAG_SINGLE_KEY, "SINGLE-KEY");
1346                 ADD_FLAG(G_ELI_FLAG_NATIVE_BYTE_ORDER, "NATIVE-BYTE-ORDER");
1347                 ADD_FLAG(G_ELI_FLAG_ONETIME, "ONETIME");
1348                 ADD_FLAG(G_ELI_FLAG_BOOT, "BOOT");
1349                 ADD_FLAG(G_ELI_FLAG_WO_DETACH, "W-DETACH");
1350                 ADD_FLAG(G_ELI_FLAG_RW_DETACH, "RW-DETACH");
1351                 ADD_FLAG(G_ELI_FLAG_AUTH, "AUTH");
1352                 ADD_FLAG(G_ELI_FLAG_WOPEN, "W-OPEN");
1353                 ADD_FLAG(G_ELI_FLAG_DESTROY, "DESTROY");
1354                 ADD_FLAG(G_ELI_FLAG_RO, "READ-ONLY");
1355                 ADD_FLAG(G_ELI_FLAG_NODELETE, "NODELETE");
1356                 ADD_FLAG(G_ELI_FLAG_GELIBOOT, "GELIBOOT");
1357                 ADD_FLAG(G_ELI_FLAG_GELIDISPLAYPASS, "GELIDISPLAYPASS");
1358                 ADD_FLAG(G_ELI_FLAG_AUTORESIZE, "AUTORESIZE");
1359 #undef  ADD_FLAG
1360         }
1361         sbuf_cat(sb, "</Flags>\n");
1362
1363         if (!(sc->sc_flags & G_ELI_FLAG_ONETIME)) {
1364                 sbuf_printf(sb, "%s<UsedKey>%u</UsedKey>\n", indent,
1365                     sc->sc_nkey);
1366         }
1367         sbuf_printf(sb, "%s<Version>%u</Version>\n", indent, sc->sc_version);
1368         sbuf_printf(sb, "%s<Crypto>", indent);
1369         switch (sc->sc_crypto) {
1370         case G_ELI_CRYPTO_HW:
1371                 sbuf_cat(sb, "hardware");
1372                 break;
1373         case G_ELI_CRYPTO_SW:
1374                 sbuf_cat(sb, "software");
1375                 break;
1376         default:
1377                 sbuf_cat(sb, "UNKNOWN");
1378                 break;
1379         }
1380         sbuf_cat(sb, "</Crypto>\n");
1381         if (sc->sc_flags & G_ELI_FLAG_AUTH) {
1382                 sbuf_printf(sb,
1383                     "%s<AuthenticationAlgorithm>%s</AuthenticationAlgorithm>\n",
1384                     indent, g_eli_algo2str(sc->sc_aalgo));
1385         }
1386         sbuf_printf(sb, "%s<KeyLength>%u</KeyLength>\n", indent,
1387             sc->sc_ekeylen);
1388         sbuf_printf(sb, "%s<EncryptionAlgorithm>%s</EncryptionAlgorithm>\n",
1389             indent, g_eli_algo2str(sc->sc_ealgo));
1390         sbuf_printf(sb, "%s<State>%s</State>\n", indent,
1391             (sc->sc_flags & G_ELI_FLAG_SUSPEND) ? "SUSPENDED" : "ACTIVE");
1392 }
1393
1394 static void
1395 g_eli_shutdown_pre_sync(void *arg, int howto)
1396 {
1397         struct g_class *mp;
1398         struct g_geom *gp, *gp2;
1399         struct g_provider *pp;
1400         struct g_eli_softc *sc;
1401         int error;
1402
1403         mp = arg;
1404         g_topology_lock();
1405         LIST_FOREACH_SAFE(gp, &mp->geom, geom, gp2) {
1406                 sc = gp->softc;
1407                 if (sc == NULL)
1408                         continue;
1409                 pp = LIST_FIRST(&gp->provider);
1410                 KASSERT(pp != NULL, ("No provider? gp=%p (%s)", gp, gp->name));
1411                 if (pp->acr + pp->acw + pp->ace == 0)
1412                         error = g_eli_destroy(sc, TRUE);
1413                 else {
1414                         sc->sc_flags |= G_ELI_FLAG_RW_DETACH;
1415                         gp->access = g_eli_access;
1416                 }
1417         }
1418         g_topology_unlock();
1419 }
1420
1421 static void
1422 g_eli_init(struct g_class *mp)
1423 {
1424
1425         g_eli_pre_sync = EVENTHANDLER_REGISTER(shutdown_pre_sync,
1426             g_eli_shutdown_pre_sync, mp, SHUTDOWN_PRI_FIRST);
1427         if (g_eli_pre_sync == NULL)
1428                 G_ELI_DEBUG(0, "Warning! Cannot register shutdown event.");
1429 }
1430
1431 static void
1432 g_eli_fini(struct g_class *mp)
1433 {
1434
1435         if (g_eli_pre_sync != NULL)
1436                 EVENTHANDLER_DEREGISTER(shutdown_pre_sync, g_eli_pre_sync);
1437 }
1438
1439 DECLARE_GEOM_CLASS(g_eli_class, g_eli);
1440 MODULE_DEPEND(g_eli, crypto, 1, 1, 1);
1441 MODULE_VERSION(geom_eli, 0);