1/*-
2 * Copyright (c) 2015 Allan Jude <allanjude@FreeBSD.org>
3 * Copyright (c) 2005-2011 Pawel Jakub Dawidek <pawel@dawidek.net>
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 *
27 * $FreeBSD: stable/11/stand/libsa/geli/geliboot.h 344399 2019-02-20 23:55:35Z kevans $
28 */
29
30#include <crypto/intake.h>
31
32#ifndef _GELIBOOT_H_
33#define _GELIBOOT_H_
34
35#include <geom/eli/g_eli.h>
36
37#ifndef DEV_BSIZE
38#define DEV_BSIZE 			512
39#endif
40#ifndef DEV_GELIBOOT_BSIZE
41#define DEV_GELIBOOT_BSIZE		4096
42#endif
43
44#ifndef MIN
45#define    MIN(a,b) (((a) < (b)) ? (a) : (b))
46#endif
47
48#define	GELI_MAX_KEYS			64
49#define	GELI_PW_MAXLEN			256
50#define	GELI_KEYBUF_SIZE		(sizeof(struct keybuf) + \
51    (GELI_MAX_KEYS * sizeof(struct keybuf_ent)))
52
53extern void pwgets(char *buf, int n, int hide);
54
55typedef u_char geli_ukey[G_ELI_USERKEYLEN];
56
57/*
58 * An opaque struct used internally by geliboot functions. Returned by
59 * geli_taste(), a pointer to one of these is essentially a device handle. There
60 * is no need to release or free or "give back" the pointer.
61 */
62struct geli_dev;
63
64/* Forward decls. */
65struct open_file;
66struct preloaded_file;
67
68/*
69 * Low-level interface, used by early-stage bootloaders...
70 */
71
72/* Read callback function type for geli_taste(). */
73typedef int (*geli_readfunc)(void *vdev, void *readpriv, off_t offbytes,
74    void *buf, size_t sizebytes);
75
76struct geli_dev * geli_taste(geli_readfunc readfunc, void *readpriv,
77    daddr_t lastsector, const char *namefmt, ...);
78int geli_read(struct geli_dev *gdev, off_t offset, u_char *buf, size_t bytes);
79int geli_havekey(struct geli_dev *gdev);
80int geli_passphrase(struct geli_dev *gdev, char *pw);
81
82/*
83 * Libsa device-and-file-level interface.
84 */
85void geli_probe_and_attach(struct open_file *f);
86
87/*
88 * Manage key data.
89 */
90void geli_add_key(geli_ukey key);
91void geli_import_key_buffer(struct keybuf *keybuf);
92void geli_export_key_buffer(struct keybuf *keybuf);
93void geli_export_key_metadata(struct preloaded_file *kfp);
94
95#endif /* _GELIBOOT_H_ */
96