]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/geom/eli/g_eli.h
Merge sendmail 8.16.1 to HEAD: See contrib/sendmail/RELEASE_NOTES for details
[FreeBSD/FreeBSD.git] / sys / geom / eli / g_eli.h
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  * $FreeBSD$
29  */
30
31 #ifndef _G_ELI_H_
32 #define _G_ELI_H_
33
34 #include <sys/endian.h>
35 #include <sys/errno.h>
36 #include <sys/malloc.h>
37 #include <crypto/sha2/sha256.h>
38 #include <crypto/sha2/sha512.h>
39 #include <opencrypto/cryptodev.h>
40 #ifdef _KERNEL
41 #include <sys/bio.h>
42 #include <sys/libkern.h>
43 #include <sys/lock.h>
44 #include <sys/mutex.h>
45 #include <geom/geom.h>
46 #include <crypto/intake.h>
47 #else
48 #include <assert.h>
49 #include <stdio.h>
50 #include <string.h>
51 #include <strings.h>
52 #endif
53 #include <sys/queue.h>
54 #include <sys/tree.h>
55 #ifndef _OpenSSL_
56 #include <sys/md5.h>
57 #endif
58
59 #define G_ELI_CLASS_NAME        "ELI"
60 #define G_ELI_MAGIC             "GEOM::ELI"
61 #define G_ELI_SUFFIX            ".eli"
62
63 /*
64  * Version history:
65  * 0 - Initial version number.
66  * 1 - Added data authentication support (md_aalgo field and
67  *     G_ELI_FLAG_AUTH flag).
68  * 2 - Added G_ELI_FLAG_READONLY.
69  * 3 - Added 'configure' subcommand.
70  * 4 - IV is generated from offset converted to little-endian
71  *     (the G_ELI_FLAG_NATIVE_BYTE_ORDER flag will be set for older versions).
72  * 5 - Added multiple encrypton keys and AES-XTS support.
73  * 6 - Fixed usage of multiple keys for authenticated providers (the
74  *     G_ELI_FLAG_FIRST_KEY flag will be set for older versions).
75  * 7 - Encryption keys are now generated from the Data Key and not from the
76  *     IV Key (the G_ELI_FLAG_ENC_IVKEY flag will be set for older versions).
77  */
78 #define G_ELI_VERSION_00        0
79 #define G_ELI_VERSION_01        1
80 #define G_ELI_VERSION_02        2
81 #define G_ELI_VERSION_03        3
82 #define G_ELI_VERSION_04        4
83 #define G_ELI_VERSION_05        5
84 #define G_ELI_VERSION_06        6
85 #define G_ELI_VERSION_07        7
86 #define G_ELI_VERSION           G_ELI_VERSION_07
87
88 /* ON DISK FLAGS. */
89 /* Use random, onetime keys. */
90 #define G_ELI_FLAG_ONETIME              0x00000001
91 /* Ask for the passphrase from the kernel, before mounting root. */
92 #define G_ELI_FLAG_BOOT                 0x00000002
93 /* Detach on last close, if we were open for writing. */
94 #define G_ELI_FLAG_WO_DETACH            0x00000004
95 /* Detach on last close. */
96 #define G_ELI_FLAG_RW_DETACH            0x00000008
97 /* Provide data authentication. */
98 #define G_ELI_FLAG_AUTH                 0x00000010
99 /* Provider is read-only, we should deny all write attempts. */
100 #define G_ELI_FLAG_RO                   0x00000020
101 /* Don't pass through BIO_DELETE requests. */
102 #define G_ELI_FLAG_NODELETE             0x00000040
103 /* This GELI supports GELIBoot */
104 #define G_ELI_FLAG_GELIBOOT             0x00000080
105 /* Hide passphrase length in GELIboot. */
106 #define G_ELI_FLAG_GELIDISPLAYPASS      0x00000100
107 /* Expand provider automatically. */
108 #define G_ELI_FLAG_AUTORESIZE           0x00000200
109
110 /* RUNTIME FLAGS. */
111 /* Provider was open for writing. */
112 #define G_ELI_FLAG_WOPEN                0x00010000
113 /* Destroy device. */
114 #define G_ELI_FLAG_DESTROY              0x00020000
115 /* Provider uses native byte-order for IV generation. */
116 #define G_ELI_FLAG_NATIVE_BYTE_ORDER    0x00040000
117 /* Provider uses single encryption key. */
118 #define G_ELI_FLAG_SINGLE_KEY           0x00080000
119 /* Device suspended. */
120 #define G_ELI_FLAG_SUSPEND              0x00100000
121 /* Provider uses first encryption key. */
122 #define G_ELI_FLAG_FIRST_KEY            0x00200000
123 /* Provider uses IV-Key for encryption key generation. */
124 #define G_ELI_FLAG_ENC_IVKEY            0x00400000
125
126 #define G_ELI_NEW_BIO   255
127
128 #define SHA512_MDLEN            64
129 #define G_ELI_AUTH_SECKEYLEN    SHA256_DIGEST_LENGTH
130
131 #define G_ELI_MAXMKEYS          2
132 #define G_ELI_MAXKEYLEN         64
133 #define G_ELI_USERKEYLEN        G_ELI_MAXKEYLEN
134 #define G_ELI_DATAKEYLEN        G_ELI_MAXKEYLEN
135 #define G_ELI_AUTHKEYLEN        G_ELI_MAXKEYLEN
136 #define G_ELI_IVKEYLEN          G_ELI_MAXKEYLEN
137 #define G_ELI_SALTLEN           64
138 #define G_ELI_DATAIVKEYLEN      (G_ELI_DATAKEYLEN + G_ELI_IVKEYLEN)
139 /* Data-Key, IV-Key, HMAC_SHA512(Derived-Key, Data-Key+IV-Key) */
140 #define G_ELI_MKEYLEN           (G_ELI_DATAIVKEYLEN + SHA512_MDLEN)
141 #define G_ELI_OVERWRITES        5
142 /* Switch data encryption key every 2^20 blocks. */
143 #define G_ELI_KEY_SHIFT         20
144
145 #define G_ELI_CRYPTO_UNKNOWN    0
146 #define G_ELI_CRYPTO_HW         1
147 #define G_ELI_CRYPTO_SW         2
148 #define G_ELI_CRYPTO_SW_ACCEL   3
149
150 #ifdef _KERNEL
151 #if (MAX_KEY_BYTES < G_ELI_DATAIVKEYLEN)
152 #error "MAX_KEY_BYTES is less than G_ELI_DATAKEYLEN"
153 #endif
154
155 extern int g_eli_debug;
156 extern u_int g_eli_overwrites;
157 extern u_int g_eli_batch;
158
159 #define G_ELI_DEBUG(lvl, ...) \
160     _GEOM_DEBUG("GEOM_ELI", g_eli_debug, (lvl), NULL, __VA_ARGS__)
161 #define G_ELI_LOGREQ(lvl, bp, ...) \
162     _GEOM_DEBUG("GEOM_ELI", g_eli_debug, (lvl), (bp), __VA_ARGS__)
163
164 struct g_eli_worker {
165         struct g_eli_softc      *w_softc;
166         struct proc             *w_proc;
167         void                    *w_first_key;
168         u_int                    w_number;
169         crypto_session_t         w_sid;
170         boolean_t                w_active;
171         LIST_ENTRY(g_eli_worker) w_next;
172 };
173
174 #endif  /* _KERNEL */
175
176 struct g_eli_softc {
177         struct g_geom   *sc_geom;
178         u_int            sc_version;
179         u_int            sc_crypto;
180         uint8_t          sc_mkey[G_ELI_DATAIVKEYLEN];
181         uint8_t          sc_ekey[G_ELI_DATAKEYLEN];
182         TAILQ_HEAD(, g_eli_key) sc_ekeys_queue;
183         RB_HEAD(g_eli_key_tree, g_eli_key) sc_ekeys_tree;
184         struct mtx       sc_ekeys_lock;
185         uint64_t         sc_ekeys_total;
186         uint64_t         sc_ekeys_allocated;
187         u_int            sc_ealgo;
188         u_int            sc_ekeylen;
189         uint8_t          sc_akey[G_ELI_AUTHKEYLEN];
190         u_int            sc_aalgo;
191         u_int            sc_akeylen;
192         u_int            sc_alen;
193         SHA256_CTX       sc_akeyctx;
194         uint8_t          sc_ivkey[G_ELI_IVKEYLEN];
195         SHA256_CTX       sc_ivctx;
196         int              sc_nkey;
197         uint32_t         sc_flags;
198         int              sc_inflight;
199         off_t            sc_mediasize;
200         size_t           sc_sectorsize;
201         off_t            sc_provsize;
202         u_int            sc_bytes_per_sector;
203         u_int            sc_data_per_sector;
204 #ifndef _KERNEL
205         int              sc_cpubind;
206 #else /* _KERNEL */
207         boolean_t        sc_cpubind;
208
209         /* Only for software cryptography. */
210         struct bio_queue_head sc_queue;
211         struct mtx       sc_queue_mtx;
212         LIST_HEAD(, g_eli_worker) sc_workers;
213 #endif /* _KERNEL */
214 };
215 #define sc_name          sc_geom->name
216
217 #define G_ELI_KEY_MAGIC 0xe11341c
218
219 struct g_eli_key {
220         /* Key value, must be first in the structure. */
221         uint8_t         gek_key[G_ELI_DATAKEYLEN];
222         /* Magic. */
223         int             gek_magic;
224         /* Key number. */
225         uint64_t        gek_keyno;
226         /* Reference counter. */
227         int             gek_count;
228         /* Keeps keys sorted by most recent use. */
229         TAILQ_ENTRY(g_eli_key) gek_next;
230         /* Keeps keys sorted by number. */
231         RB_ENTRY(g_eli_key) gek_link;
232 };
233
234 struct g_eli_metadata {
235         char            md_magic[16];   /* Magic value. */
236         uint32_t        md_version;     /* Version number. */
237         uint32_t        md_flags;       /* Additional flags. */
238         uint16_t        md_ealgo;       /* Encryption algorithm. */
239         uint16_t        md_keylen;      /* Key length. */
240         uint16_t        md_aalgo;       /* Authentication algorithm. */
241         uint64_t        md_provsize;    /* Provider's size. */
242         uint32_t        md_sectorsize;  /* Sector size. */
243         uint8_t         md_keys;        /* Available keys. */
244         int32_t         md_iterations;  /* Number of iterations for PKCS#5v2. */
245         uint8_t         md_salt[G_ELI_SALTLEN]; /* Salt. */
246                         /* Encrypted master key (IV-key, Data-key, HMAC). */
247         uint8_t         md_mkeys[G_ELI_MAXMKEYS * G_ELI_MKEYLEN];
248         u_char          md_hash[16];    /* MD5 hash. */
249 } __packed;
250 #ifndef _OpenSSL_
251 static __inline void
252 eli_metadata_encode_v0(struct g_eli_metadata *md, u_char **datap)
253 {
254         u_char *p;
255
256         p = *datap;
257         le32enc(p, md->md_flags);       p += sizeof(md->md_flags);
258         le16enc(p, md->md_ealgo);       p += sizeof(md->md_ealgo);
259         le16enc(p, md->md_keylen);      p += sizeof(md->md_keylen);
260         le64enc(p, md->md_provsize);    p += sizeof(md->md_provsize);
261         le32enc(p, md->md_sectorsize);  p += sizeof(md->md_sectorsize);
262         *p = md->md_keys;               p += sizeof(md->md_keys);
263         le32enc(p, md->md_iterations);  p += sizeof(md->md_iterations);
264         bcopy(md->md_salt, p, sizeof(md->md_salt)); p += sizeof(md->md_salt);
265         bcopy(md->md_mkeys, p, sizeof(md->md_mkeys)); p += sizeof(md->md_mkeys);
266         *datap = p;
267 }
268 static __inline void
269 eli_metadata_encode_v1v2v3v4v5v6v7(struct g_eli_metadata *md, u_char **datap)
270 {
271         u_char *p;
272
273         p = *datap;
274         le32enc(p, md->md_flags);       p += sizeof(md->md_flags);
275         le16enc(p, md->md_ealgo);       p += sizeof(md->md_ealgo);
276         le16enc(p, md->md_keylen);      p += sizeof(md->md_keylen);
277         le16enc(p, md->md_aalgo);       p += sizeof(md->md_aalgo);
278         le64enc(p, md->md_provsize);    p += sizeof(md->md_provsize);
279         le32enc(p, md->md_sectorsize);  p += sizeof(md->md_sectorsize);
280         *p = md->md_keys;               p += sizeof(md->md_keys);
281         le32enc(p, md->md_iterations);  p += sizeof(md->md_iterations);
282         bcopy(md->md_salt, p, sizeof(md->md_salt)); p += sizeof(md->md_salt);
283         bcopy(md->md_mkeys, p, sizeof(md->md_mkeys)); p += sizeof(md->md_mkeys);
284         *datap = p;
285 }
286 static __inline void
287 eli_metadata_encode(struct g_eli_metadata *md, u_char *data)
288 {
289         uint32_t hash[4];
290         MD5_CTX ctx;
291         u_char *p;
292
293         p = data;
294         bcopy(md->md_magic, p, sizeof(md->md_magic));
295         p += sizeof(md->md_magic);
296         le32enc(p, md->md_version);
297         p += sizeof(md->md_version);
298         switch (md->md_version) {
299         case G_ELI_VERSION_00:
300                 eli_metadata_encode_v0(md, &p);
301                 break;
302         case G_ELI_VERSION_01:
303         case G_ELI_VERSION_02:
304         case G_ELI_VERSION_03:
305         case G_ELI_VERSION_04:
306         case G_ELI_VERSION_05:
307         case G_ELI_VERSION_06:
308         case G_ELI_VERSION_07:
309                 eli_metadata_encode_v1v2v3v4v5v6v7(md, &p);
310                 break;
311         default:
312 #ifdef _KERNEL
313                 panic("%s: Unsupported version %u.", __func__,
314                     (u_int)md->md_version);
315 #else
316                 assert(!"Unsupported metadata version.");
317 #endif
318         }
319         MD5Init(&ctx);
320         MD5Update(&ctx, data, p - data);
321         MD5Final((void *)hash, &ctx);
322         bcopy(hash, md->md_hash, sizeof(md->md_hash));
323         bcopy(md->md_hash, p, sizeof(md->md_hash));
324 }
325 static __inline int
326 eli_metadata_decode_v0(const u_char *data, struct g_eli_metadata *md)
327 {
328         uint32_t hash[4];
329         MD5_CTX ctx;
330         const u_char *p;
331
332         p = data + sizeof(md->md_magic) + sizeof(md->md_version);
333         md->md_flags = le32dec(p);      p += sizeof(md->md_flags);
334         md->md_ealgo = le16dec(p);      p += sizeof(md->md_ealgo);
335         md->md_keylen = le16dec(p);     p += sizeof(md->md_keylen);
336         md->md_provsize = le64dec(p);   p += sizeof(md->md_provsize);
337         md->md_sectorsize = le32dec(p); p += sizeof(md->md_sectorsize);
338         md->md_keys = *p;               p += sizeof(md->md_keys);
339         md->md_iterations = le32dec(p); p += sizeof(md->md_iterations);
340         bcopy(p, md->md_salt, sizeof(md->md_salt)); p += sizeof(md->md_salt);
341         bcopy(p, md->md_mkeys, sizeof(md->md_mkeys)); p += sizeof(md->md_mkeys);
342         MD5Init(&ctx);
343         MD5Update(&ctx, data, p - data);
344         MD5Final((void *)hash, &ctx);
345         bcopy(hash, md->md_hash, sizeof(md->md_hash));
346         if (bcmp(md->md_hash, p, 16) != 0)
347                 return (EINVAL);
348         return (0);
349 }
350
351 static __inline int
352 eli_metadata_decode_v1v2v3v4v5v6v7(const u_char *data, struct g_eli_metadata *md)
353 {
354         uint32_t hash[4];
355         MD5_CTX ctx;
356         const u_char *p;
357
358         p = data + sizeof(md->md_magic) + sizeof(md->md_version);
359         md->md_flags = le32dec(p);      p += sizeof(md->md_flags);
360         md->md_ealgo = le16dec(p);      p += sizeof(md->md_ealgo);
361         md->md_keylen = le16dec(p);     p += sizeof(md->md_keylen);
362         md->md_aalgo = le16dec(p);      p += sizeof(md->md_aalgo);
363         md->md_provsize = le64dec(p);   p += sizeof(md->md_provsize);
364         md->md_sectorsize = le32dec(p); p += sizeof(md->md_sectorsize);
365         md->md_keys = *p;               p += sizeof(md->md_keys);
366         md->md_iterations = le32dec(p); p += sizeof(md->md_iterations);
367         bcopy(p, md->md_salt, sizeof(md->md_salt)); p += sizeof(md->md_salt);
368         bcopy(p, md->md_mkeys, sizeof(md->md_mkeys)); p += sizeof(md->md_mkeys);
369         MD5Init(&ctx);
370         MD5Update(&ctx, data, p - data);
371         MD5Final((void *)hash, &ctx);
372         bcopy(hash, md->md_hash, sizeof(md->md_hash));
373         if (bcmp(md->md_hash, p, 16) != 0)
374                 return (EINVAL);
375         return (0);
376 }
377 static __inline int
378 eli_metadata_decode(const u_char *data, struct g_eli_metadata *md)
379 {
380         int error;
381
382         bcopy(data, md->md_magic, sizeof(md->md_magic));
383         if (strcmp(md->md_magic, G_ELI_MAGIC) != 0)
384                 return (EINVAL);
385         md->md_version = le32dec(data + sizeof(md->md_magic));
386         switch (md->md_version) {
387         case G_ELI_VERSION_00:
388                 error = eli_metadata_decode_v0(data, md);
389                 break;
390         case G_ELI_VERSION_01:
391         case G_ELI_VERSION_02:
392         case G_ELI_VERSION_03:
393         case G_ELI_VERSION_04:
394         case G_ELI_VERSION_05:
395         case G_ELI_VERSION_06:
396         case G_ELI_VERSION_07:
397                 error = eli_metadata_decode_v1v2v3v4v5v6v7(data, md);
398                 break;
399         default:
400                 error = EOPNOTSUPP;
401                 break;
402         }
403         return (error);
404 }
405 #endif  /* !_OpenSSL */
406
407 static __inline u_int
408 g_eli_str2ealgo(const char *name)
409 {
410
411         if (strcasecmp("null", name) == 0)
412                 return (CRYPTO_NULL_CBC);
413         else if (strcasecmp("null-cbc", name) == 0)
414                 return (CRYPTO_NULL_CBC);
415         else if (strcasecmp("aes", name) == 0)
416                 return (CRYPTO_AES_XTS);
417         else if (strcasecmp("aes-cbc", name) == 0)
418                 return (CRYPTO_AES_CBC);
419         else if (strcasecmp("aes-xts", name) == 0)
420                 return (CRYPTO_AES_XTS);
421         else if (strcasecmp("camellia", name) == 0)
422                 return (CRYPTO_CAMELLIA_CBC);
423         else if (strcasecmp("camellia-cbc", name) == 0)
424                 return (CRYPTO_CAMELLIA_CBC);
425         return (CRYPTO_ALGORITHM_MIN - 1);
426 }
427
428 static __inline u_int
429 g_eli_str2aalgo(const char *name)
430 {
431
432         if (strcasecmp("hmac/sha1", name) == 0)
433                 return (CRYPTO_SHA1_HMAC);
434         else if (strcasecmp("hmac/ripemd160", name) == 0)
435                 return (CRYPTO_RIPEMD160_HMAC);
436         else if (strcasecmp("hmac/sha256", name) == 0)
437                 return (CRYPTO_SHA2_256_HMAC);
438         else if (strcasecmp("hmac/sha384", name) == 0)
439                 return (CRYPTO_SHA2_384_HMAC);
440         else if (strcasecmp("hmac/sha512", name) == 0)
441                 return (CRYPTO_SHA2_512_HMAC);
442         return (CRYPTO_ALGORITHM_MIN - 1);
443 }
444
445 static __inline const char *
446 g_eli_algo2str(u_int algo)
447 {
448
449         switch (algo) {
450         case CRYPTO_NULL_CBC:
451                 return ("NULL");
452         case CRYPTO_AES_CBC:
453                 return ("AES-CBC");
454         case CRYPTO_AES_XTS:
455                 return ("AES-XTS");
456         case CRYPTO_CAMELLIA_CBC:
457                 return ("CAMELLIA-CBC");
458         case CRYPTO_SHA1_HMAC:
459                 return ("HMAC/SHA1");
460         case CRYPTO_RIPEMD160_HMAC:
461                 return ("HMAC/RIPEMD160");
462         case CRYPTO_SHA2_256_HMAC:
463                 return ("HMAC/SHA256");
464         case CRYPTO_SHA2_384_HMAC:
465                 return ("HMAC/SHA384");
466         case CRYPTO_SHA2_512_HMAC:
467                 return ("HMAC/SHA512");
468         }
469         return ("unknown");
470 }
471
472 static __inline void
473 eli_metadata_dump(const struct g_eli_metadata *md)
474 {
475         static const char hex[] = "0123456789abcdef";
476         char str[sizeof(md->md_mkeys) * 2 + 1];
477         u_int i;
478
479         printf("     magic: %s\n", md->md_magic);
480         printf("   version: %u\n", (u_int)md->md_version);
481         printf("     flags: 0x%x\n", (u_int)md->md_flags);
482         printf("     ealgo: %s\n", g_eli_algo2str(md->md_ealgo));
483         printf("    keylen: %u\n", (u_int)md->md_keylen);
484         if (md->md_flags & G_ELI_FLAG_AUTH)
485                 printf("     aalgo: %s\n", g_eli_algo2str(md->md_aalgo));
486         printf("  provsize: %ju\n", (uintmax_t)md->md_provsize);
487         printf("sectorsize: %u\n", (u_int)md->md_sectorsize);
488         printf("      keys: 0x%02x\n", (u_int)md->md_keys);
489         printf("iterations: %d\n", (int)md->md_iterations);
490         bzero(str, sizeof(str));
491         for (i = 0; i < sizeof(md->md_salt); i++) {
492                 str[i * 2] = hex[md->md_salt[i] >> 4];
493                 str[i * 2 + 1] = hex[md->md_salt[i] & 0x0f];
494         }
495         printf("      Salt: %s\n", str);
496         bzero(str, sizeof(str));
497         for (i = 0; i < sizeof(md->md_mkeys); i++) {
498                 str[i * 2] = hex[md->md_mkeys[i] >> 4];
499                 str[i * 2 + 1] = hex[md->md_mkeys[i] & 0x0f];
500         }
501         printf("Master Key: %s\n", str);
502         bzero(str, sizeof(str));
503         for (i = 0; i < 16; i++) {
504                 str[i * 2] = hex[md->md_hash[i] >> 4];
505                 str[i * 2 + 1] = hex[md->md_hash[i] & 0x0f];
506         }
507         printf("  MD5 hash: %s\n", str);
508 }
509
510 #ifdef _KERNEL
511 static __inline bool
512 eli_metadata_crypto_supported(const struct g_eli_metadata *md)
513 {
514
515         switch (md->md_ealgo) {
516         case CRYPTO_NULL_CBC:
517         case CRYPTO_AES_CBC:
518         case CRYPTO_CAMELLIA_CBC:
519         case CRYPTO_AES_XTS:
520                 break;
521         default:
522                 return (false);
523         }
524         if (md->md_flags & G_ELI_FLAG_AUTH) {
525                 switch (md->md_aalgo) {
526                 case CRYPTO_SHA1_HMAC:
527                 case CRYPTO_RIPEMD160_HMAC:
528                 case CRYPTO_SHA2_256_HMAC:
529                 case CRYPTO_SHA2_384_HMAC:
530                 case CRYPTO_SHA2_512_HMAC:
531                         break;
532                 default:
533                         return (false);
534                 }
535         }
536         return (true);
537 }
538 #endif
539
540 static __inline u_int
541 g_eli_keylen(u_int algo, u_int keylen)
542 {
543
544         switch (algo) {
545         case CRYPTO_NULL_CBC:
546                 if (keylen == 0)
547                         keylen = 64 * 8;
548                 else {
549                         if (keylen > 64 * 8)
550                                 keylen = 0;
551                 }
552                 return (keylen);
553         case CRYPTO_AES_CBC:
554         case CRYPTO_CAMELLIA_CBC:
555                 switch (keylen) {
556                 case 0:
557                         return (128);
558                 case 128:
559                 case 192:
560                 case 256:
561                         return (keylen);
562                 default:
563                         return (0);
564                 }
565         case CRYPTO_AES_XTS:
566                 switch (keylen) {
567                 case 0:
568                         return (128);
569                 case 128:
570                 case 256:
571                         return (keylen);
572                 default:
573                         return (0);
574                 }
575         default:
576                 return (0);
577         }
578 }
579
580 static __inline u_int
581 g_eli_ivlen(u_int algo)
582 {
583
584         switch (algo) {
585         case CRYPTO_AES_XTS:
586                 return (AES_XTS_IV_LEN);
587         case CRYPTO_AES_CBC:
588                 return (AES_BLOCK_LEN);
589         case CRYPTO_CAMELLIA_CBC:
590                 return (CAMELLIA_BLOCK_LEN);
591         }
592         return (0);
593 }
594
595 static __inline u_int
596 g_eli_hashlen(u_int algo)
597 {
598
599         switch (algo) {
600         case CRYPTO_SHA1_HMAC:
601                 return (20);
602         case CRYPTO_RIPEMD160_HMAC:
603                 return (20);
604         case CRYPTO_SHA2_256_HMAC:
605                 return (32);
606         case CRYPTO_SHA2_384_HMAC:
607                 return (48);
608         case CRYPTO_SHA2_512_HMAC:
609                 return (64);
610         }
611         return (0);
612 }
613
614 static __inline off_t
615 eli_mediasize(const struct g_eli_softc *sc, off_t mediasize, u_int sectorsize)
616 {
617
618         if ((sc->sc_flags & G_ELI_FLAG_ONETIME) == 0) {
619                 mediasize -= sectorsize;
620         }
621         if ((sc->sc_flags & G_ELI_FLAG_AUTH) == 0) {
622                 mediasize -= (mediasize % sc->sc_sectorsize);
623         } else {
624                 mediasize /= sc->sc_bytes_per_sector;
625                 mediasize *= sc->sc_sectorsize;
626         }
627
628         return (mediasize);
629 }
630
631 static __inline void
632 eli_metadata_softc(struct g_eli_softc *sc, const struct g_eli_metadata *md,
633     u_int sectorsize, off_t mediasize)
634 {
635
636         sc->sc_version = md->md_version;
637         sc->sc_inflight = 0;
638         sc->sc_crypto = G_ELI_CRYPTO_UNKNOWN;
639         sc->sc_flags = md->md_flags;
640         /* Backward compatibility. */
641         if (md->md_version < G_ELI_VERSION_04)
642                 sc->sc_flags |= G_ELI_FLAG_NATIVE_BYTE_ORDER;
643         if (md->md_version < G_ELI_VERSION_05)
644                 sc->sc_flags |= G_ELI_FLAG_SINGLE_KEY;
645         if (md->md_version < G_ELI_VERSION_06 &&
646             (sc->sc_flags & G_ELI_FLAG_AUTH) != 0) {
647                 sc->sc_flags |= G_ELI_FLAG_FIRST_KEY;
648         }
649         if (md->md_version < G_ELI_VERSION_07)
650                 sc->sc_flags |= G_ELI_FLAG_ENC_IVKEY;
651         sc->sc_ealgo = md->md_ealgo;
652
653         if (sc->sc_flags & G_ELI_FLAG_AUTH) {
654                 sc->sc_akeylen = sizeof(sc->sc_akey) * 8;
655                 sc->sc_aalgo = md->md_aalgo;
656                 sc->sc_alen = g_eli_hashlen(sc->sc_aalgo);
657
658                 sc->sc_data_per_sector = sectorsize - sc->sc_alen;
659                 /*
660                  * Some hash functions (like SHA1 and RIPEMD160) generates hash
661                  * which length is not multiple of 128 bits, but we want data
662                  * length to be multiple of 128, so we can encrypt without
663                  * padding. The line below rounds down data length to multiple
664                  * of 128 bits.
665                  */
666                 sc->sc_data_per_sector -= sc->sc_data_per_sector % 16;
667
668                 sc->sc_bytes_per_sector =
669                     (md->md_sectorsize - 1) / sc->sc_data_per_sector + 1;
670                 sc->sc_bytes_per_sector *= sectorsize;
671         }
672         sc->sc_provsize = mediasize;
673         sc->sc_sectorsize = md->md_sectorsize;
674         sc->sc_mediasize = eli_mediasize(sc, mediasize, sectorsize);
675         sc->sc_ekeylen = md->md_keylen;
676 }
677
678 #ifdef _KERNEL
679 int g_eli_read_metadata(struct g_class *mp, struct g_provider *pp,
680     struct g_eli_metadata *md);
681 struct g_geom *g_eli_create(struct gctl_req *req, struct g_class *mp,
682     struct g_provider *bpp, const struct g_eli_metadata *md,
683     const u_char *mkey, int nkey);
684 int g_eli_destroy(struct g_eli_softc *sc, boolean_t force);
685
686 int g_eli_access(struct g_provider *pp, int dr, int dw, int de);
687 void g_eli_config(struct gctl_req *req, struct g_class *mp, const char *verb);
688
689 void g_eli_read_done(struct bio *bp);
690 void g_eli_write_done(struct bio *bp);
691 int g_eli_crypto_rerun(struct cryptop *crp);
692
693 void g_eli_crypto_read(struct g_eli_softc *sc, struct bio *bp, boolean_t fromworker);
694 void g_eli_crypto_run(struct g_eli_worker *wr, struct bio *bp);
695
696 void g_eli_auth_read(struct g_eli_softc *sc, struct bio *bp);
697 void g_eli_auth_run(struct g_eli_worker *wr, struct bio *bp);
698 #endif
699 void g_eli_crypto_ivgen(struct g_eli_softc *sc, off_t offset, u_char *iv,
700     size_t size);
701
702 void g_eli_mkey_hmac(unsigned char *mkey, const unsigned char *key);
703 int g_eli_mkey_decrypt(const struct g_eli_metadata *md,
704     const unsigned char *key, unsigned char *mkey, unsigned keyp);
705 int g_eli_mkey_decrypt_any(const struct g_eli_metadata *md,
706     const unsigned char *key, unsigned char *mkey, unsigned *nkeyp);
707 int g_eli_mkey_encrypt(unsigned algo, const unsigned char *key, unsigned keylen,
708     unsigned char *mkey);
709 #ifdef _KERNEL
710 void g_eli_mkey_propagate(struct g_eli_softc *sc, const unsigned char *mkey);
711 #endif
712
713 int g_eli_crypto_encrypt(u_int algo, u_char *data, size_t datasize,
714     const u_char *key, size_t keysize);
715 int g_eli_crypto_decrypt(u_int algo, u_char *data, size_t datasize,
716     const u_char *key, size_t keysize);
717
718 struct hmac_ctx {
719         SHA512_CTX      innerctx;
720         SHA512_CTX      outerctx;
721 };
722
723 void g_eli_crypto_hmac_init(struct hmac_ctx *ctx, const char *hkey,
724     size_t hkeylen);
725 void g_eli_crypto_hmac_update(struct hmac_ctx *ctx, const uint8_t *data,
726     size_t datasize);
727 void g_eli_crypto_hmac_final(struct hmac_ctx *ctx, uint8_t *md, size_t mdsize);
728 void g_eli_crypto_hmac(const char *hkey, size_t hkeysize,
729     const uint8_t *data, size_t datasize, uint8_t *md, size_t mdsize);
730
731 void g_eli_key_fill(struct g_eli_softc *sc, struct g_eli_key *key,
732     uint64_t keyno);
733 #ifdef _KERNEL
734 void g_eli_key_init(struct g_eli_softc *sc);
735 void g_eli_key_destroy(struct g_eli_softc *sc);
736 void g_eli_key_resize(struct g_eli_softc *sc);
737 uint8_t *g_eli_key_hold(struct g_eli_softc *sc, off_t offset, size_t blocksize);
738 void g_eli_key_drop(struct g_eli_softc *sc, uint8_t *rawkey);
739 #endif
740 #endif  /* !_G_ELI_H_ */