2 * GRUB -- GRand Unified Bootloader
3 * Copyright (C) 2002,2003,2004,2005,2006,2007,2008,2009 Free Software Foundation, Inc.
5 * GRUB is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * GRUB is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
19 #ifndef GRUB_CRYPTODISK_HEADER
20 #define GRUB_CRYPTODISK_HEADER 1
22 #include <grub/disk.h>
23 #include <grub/crypto.h>
24 #include <grub/list.h>
28 GRUB_CRYPTODISK_MODE_ECB
,
29 GRUB_CRYPTODISK_MODE_CBC
,
30 GRUB_CRYPTODISK_MODE_PCBC
,
31 GRUB_CRYPTODISK_MODE_XTS
,
32 GRUB_CRYPTODISK_MODE_LRW
33 } grub_cryptodisk_mode_t
;
37 GRUB_CRYPTODISK_MODE_IV_NULL
,
38 GRUB_CRYPTODISK_MODE_IV_PLAIN
,
39 GRUB_CRYPTODISK_MODE_IV_PLAIN64
,
40 GRUB_CRYPTODISK_MODE_IV_ESSIV
,
41 GRUB_CRYPTODISK_MODE_IV_BENBI
,
42 GRUB_CRYPTODISK_MODE_IV_BYTECOUNT64
,
43 GRUB_CRYPTODISK_MODE_IV_BYTECOUNT64_HASH
44 } grub_cryptodisk_mode_iv_t
;
46 #define GRUB_CRYPTODISK_MAX_UUID_LENGTH 71
48 #define GRUB_CRYPTODISK_GF_LOG_SIZE 7
49 #define GRUB_CRYPTODISK_GF_SIZE (1U << GRUB_CRYPTODISK_GF_LOG_SIZE)
50 #define GRUB_CRYPTODISK_GF_LOG_BYTES (GRUB_CRYPTODISK_GF_LOG_SIZE - 3)
51 #define GRUB_CRYPTODISK_GF_BYTES (1U << GRUB_CRYPTODISK_GF_LOG_BYTES)
53 struct grub_cryptodisk
;
55 typedef gcry_err_code_t
56 (*grub_cryptodisk_rekey_func_t
) (struct grub_cryptodisk
*dev
,
57 grub_uint64_t zoneno
);
59 struct grub_cryptodisk
61 struct grub_cryptodisk
*next
;
62 struct grub_cryptodisk
**prev
;
65 grub_disk_addr_t offset
;
66 grub_disk_addr_t total_length
;
67 grub_disk_t source_disk
;
69 grub_crypto_cipher_handle_t cipher
;
70 grub_crypto_cipher_handle_t secondary_cipher
;
71 grub_crypto_cipher_handle_t essiv_cipher
;
72 const gcry_md_spec_t
*essiv_hash
, *hash
, *iv_hash
;
73 grub_cryptodisk_mode_t mode
;
74 grub_cryptodisk_mode_iv_t mode_iv
;
76 unsigned long id
, source_id
;
77 enum grub_disk_dev_id source_dev_id
;
78 char uuid
[GRUB_CRYPTODISK_MAX_UUID_LENGTH
+ 1];
79 grub_uint8_t lrw_key
[GRUB_CRYPTODISK_GF_BYTES
];
80 grub_uint8_t
*lrw_precalc
;
81 grub_uint8_t iv_prefix
[64];
82 grub_size_t iv_prefix_len
;
89 grub_cryptodisk_rekey_func_t rekey
;
91 grub_uint8_t rekey_key
[64];
92 grub_uint64_t last_rekey
;
93 int rekey_derived_size
;
95 typedef struct grub_cryptodisk
*grub_cryptodisk_t
;
97 struct grub_cryptodisk_dev
99 struct grub_cryptodisk_dev
*next
;
100 struct grub_cryptodisk_dev
**prev
;
102 grub_cryptodisk_t (*scan
) (grub_disk_t disk
, const char *check_uuid
,
104 grub_err_t (*recover_key
) (grub_disk_t disk
, grub_cryptodisk_t dev
);
106 typedef struct grub_cryptodisk_dev
*grub_cryptodisk_dev_t
;
108 extern grub_cryptodisk_dev_t
EXPORT_VAR (grub_cryptodisk_list
);
110 #ifndef GRUB_LST_GENERATOR
112 grub_cryptodisk_dev_register (grub_cryptodisk_dev_t cr
)
114 grub_list_push (GRUB_AS_LIST_P (&grub_cryptodisk_list
), GRUB_AS_LIST (cr
));
119 grub_cryptodisk_dev_unregister (grub_cryptodisk_dev_t cr
)
121 grub_list_remove (GRUB_AS_LIST (cr
));
124 #define FOR_CRYPTODISK_DEVS(var) FOR_LIST_ELEMENTS((var), (grub_cryptodisk_list))
127 grub_cryptodisk_setkey (grub_cryptodisk_t dev
,
128 grub_uint8_t
*key
, grub_size_t keysize
);
130 grub_cryptodisk_decrypt (struct grub_cryptodisk
*dev
,
131 grub_uint8_t
* data
, grub_size_t len
,
132 grub_disk_addr_t sector
);
134 grub_cryptodisk_insert (grub_cryptodisk_t newdev
, const char *name
,
138 grub_cryptodisk_cheat_insert (grub_cryptodisk_t newdev
, const char *name
,
139 grub_disk_t source
, const char *cheat
);
141 grub_util_cryptodisk_print_abstraction (grub_disk_t disk
);
143 grub_util_get_geli_uuid (const char *dev
);
146 grub_cryptodisk_t
grub_cryptodisk_get_by_uuid (const char *uuid
);
147 grub_cryptodisk_t
grub_cryptodisk_get_by_source_disk (grub_disk_t disk
);