cryptodisk.c 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605
  1. /*
  2. * GRUB -- GRand Unified Bootloader
  3. * Copyright (C) 2003,2007,2010,2011,2019 Free Software Foundation, Inc.
  4. *
  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.
  9. *
  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.
  14. *
  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/>.
  17. */
  18. #include <grub/cryptodisk.h>
  19. #include <grub/mm.h>
  20. #include <grub/misc.h>
  21. #include <grub/dl.h>
  22. #include <grub/extcmd.h>
  23. #include <grub/i18n.h>
  24. #include <grub/fs.h>
  25. #include <grub/file.h>
  26. #include <grub/procfs.h>
  27. #include <grub/partition.h>
  28. #ifdef GRUB_UTIL
  29. #include <grub/emu/hostdisk.h>
  30. #endif
  31. GRUB_MOD_LICENSE ("GPLv3+");
  32. grub_cryptodisk_dev_t grub_cryptodisk_list;
  33. enum
  34. {
  35. OPTION_UUID,
  36. OPTION_ALL,
  37. OPTION_BOOT,
  38. OPTION_PASSWORD,
  39. OPTION_KEYFILE,
  40. OPTION_KEYFILE_OFFSET,
  41. OPTION_KEYFILE_SIZE,
  42. OPTION_HEADER
  43. };
  44. static const struct grub_arg_option options[] =
  45. {
  46. {"uuid", 'u', 0, N_("Mount by UUID."), 0, 0},
  47. /* TRANSLATORS: It's still restricted to cryptodisks only. */
  48. {"all", 'a', 0, N_("Mount all."), 0, 0},
  49. {"boot", 'b', 0, N_("Mount all volumes with `boot' flag set."), 0, 0},
  50. {"password", 'p', 0, N_("Password to open volumes."), 0, ARG_TYPE_STRING},
  51. {"key-file", 'k', 0, N_("Key file"), 0, ARG_TYPE_STRING},
  52. {"keyfile-offset", 'O', 0, N_("Key file offset (bytes)"), 0, ARG_TYPE_INT},
  53. {"keyfile-size", 'S', 0, N_("Key file data size (bytes)"), 0, ARG_TYPE_INT},
  54. {"header", 'H', 0, N_("Read header from file"), 0, ARG_TYPE_STRING},
  55. {0, 0, 0, 0, 0, 0}
  56. };
  57. struct cryptodisk_read_hook_ctx
  58. {
  59. grub_file_t hdr_file;
  60. grub_disk_addr_t part_start;
  61. };
  62. typedef struct cryptodisk_read_hook_ctx *cryptodisk_read_hook_ctx_t;
  63. /* Our irreducible polynom is x^128+x^7+x^2+x+1. Lowest byte of it is: */
  64. #define GF_POLYNOM 0x87
  65. static inline int GF_PER_SECTOR (const struct grub_cryptodisk *dev)
  66. {
  67. return 1U << (dev->log_sector_size - GRUB_CRYPTODISK_GF_LOG_BYTES);
  68. }
  69. static grub_cryptodisk_t cryptodisk_list = NULL;
  70. static grub_uint8_t last_cryptodisk_id = 0;
  71. static void
  72. gf_mul_x (grub_uint8_t *g)
  73. {
  74. int over = 0, over2 = 0;
  75. unsigned j;
  76. for (j = 0; j < GRUB_CRYPTODISK_GF_BYTES; j++)
  77. {
  78. over2 = !!(g[j] & 0x80);
  79. g[j] <<= 1;
  80. g[j] |= over;
  81. over = over2;
  82. }
  83. if (over)
  84. g[0] ^= GF_POLYNOM;
  85. }
  86. static void
  87. gf_mul_x_be (grub_uint8_t *g)
  88. {
  89. int over = 0, over2 = 0;
  90. int j;
  91. for (j = (int) GRUB_CRYPTODISK_GF_BYTES - 1; j >= 0; j--)
  92. {
  93. over2 = !!(g[j] & 0x80);
  94. g[j] <<= 1;
  95. g[j] |= over;
  96. over = over2;
  97. }
  98. if (over)
  99. g[GRUB_CRYPTODISK_GF_BYTES - 1] ^= GF_POLYNOM;
  100. }
  101. static void
  102. gf_mul_be (grub_uint8_t *o, const grub_uint8_t *a, const grub_uint8_t *b)
  103. {
  104. unsigned i;
  105. grub_uint8_t t[GRUB_CRYPTODISK_GF_BYTES];
  106. grub_memset (o, 0, GRUB_CRYPTODISK_GF_BYTES);
  107. grub_memcpy (t, b, GRUB_CRYPTODISK_GF_BYTES);
  108. for (i = 0; i < GRUB_CRYPTODISK_GF_SIZE; i++)
  109. {
  110. if (((a[GRUB_CRYPTODISK_GF_BYTES - i / GRUB_CHAR_BIT - 1] >> (i % GRUB_CHAR_BIT))) & 1)
  111. grub_crypto_xor (o, o, t, GRUB_CRYPTODISK_GF_BYTES);
  112. gf_mul_x_be (t);
  113. }
  114. }
  115. static gcry_err_code_t
  116. grub_crypto_pcbc_decrypt (grub_crypto_cipher_handle_t cipher,
  117. void *out, void *in, grub_size_t size,
  118. void *iv)
  119. {
  120. grub_uint8_t *inptr, *outptr, *end;
  121. grub_uint8_t ivt[GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE];
  122. grub_size_t blocksize;
  123. if (!cipher->cipher->decrypt)
  124. return GPG_ERR_NOT_SUPPORTED;
  125. blocksize = cipher->cipher->blocksize;
  126. if (blocksize == 0 || (((blocksize - 1) & blocksize) != 0)
  127. || ((size & (blocksize - 1)) != 0))
  128. return GPG_ERR_INV_ARG;
  129. if (blocksize > GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE)
  130. return GPG_ERR_INV_ARG;
  131. end = (grub_uint8_t *) in + size;
  132. for (inptr = in, outptr = out; inptr < end;
  133. inptr += blocksize, outptr += blocksize)
  134. {
  135. grub_memcpy (ivt, inptr, blocksize);
  136. cipher->cipher->decrypt (cipher->ctx, outptr, inptr);
  137. grub_crypto_xor (outptr, outptr, iv, blocksize);
  138. grub_crypto_xor (iv, ivt, outptr, blocksize);
  139. }
  140. return GPG_ERR_NO_ERROR;
  141. }
  142. static gcry_err_code_t
  143. grub_crypto_pcbc_encrypt (grub_crypto_cipher_handle_t cipher,
  144. void *out, void *in, grub_size_t size,
  145. void *iv)
  146. {
  147. grub_uint8_t *inptr, *outptr, *end;
  148. grub_uint8_t ivt[GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE];
  149. grub_size_t blocksize;
  150. if (!cipher->cipher->encrypt)
  151. return GPG_ERR_NOT_SUPPORTED;
  152. blocksize = cipher->cipher->blocksize;
  153. if (blocksize > GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE)
  154. return GPG_ERR_INV_ARG;
  155. if (blocksize == 0 || (((blocksize - 1) & blocksize) != 0)
  156. || ((size & (blocksize - 1)) != 0))
  157. return GPG_ERR_INV_ARG;
  158. end = (grub_uint8_t *) in + size;
  159. for (inptr = in, outptr = out; inptr < end;
  160. inptr += blocksize, outptr += blocksize)
  161. {
  162. grub_memcpy (ivt, inptr, blocksize);
  163. grub_crypto_xor (outptr, outptr, iv, blocksize);
  164. cipher->cipher->encrypt (cipher->ctx, outptr, inptr);
  165. grub_crypto_xor (iv, ivt, outptr, blocksize);
  166. }
  167. return GPG_ERR_NO_ERROR;
  168. }
  169. struct lrw_sector
  170. {
  171. grub_uint8_t low[GRUB_CRYPTODISK_GF_BYTES];
  172. grub_uint8_t high[GRUB_CRYPTODISK_GF_BYTES];
  173. grub_uint8_t low_byte, low_byte_c;
  174. };
  175. static void
  176. generate_lrw_sector (struct lrw_sector *sec,
  177. const struct grub_cryptodisk *dev,
  178. const grub_uint8_t *iv)
  179. {
  180. grub_uint8_t idx[GRUB_CRYPTODISK_GF_BYTES];
  181. grub_uint16_t c;
  182. int j;
  183. grub_memcpy (idx, iv, GRUB_CRYPTODISK_GF_BYTES);
  184. sec->low_byte = (idx[GRUB_CRYPTODISK_GF_BYTES - 1]
  185. & (GF_PER_SECTOR (dev) - 1));
  186. sec->low_byte_c = (((GF_PER_SECTOR (dev) - 1) & ~sec->low_byte) + 1);
  187. idx[GRUB_CRYPTODISK_GF_BYTES - 1] &= ~(GF_PER_SECTOR (dev) - 1);
  188. gf_mul_be (sec->low, dev->lrw_key, idx);
  189. if (!sec->low_byte)
  190. return;
  191. c = idx[GRUB_CRYPTODISK_GF_BYTES - 1] + GF_PER_SECTOR (dev);
  192. if (c & 0x100)
  193. {
  194. for (j = GRUB_CRYPTODISK_GF_BYTES - 2; j >= 0; j--)
  195. {
  196. idx[j]++;
  197. if (idx[j] != 0)
  198. break;
  199. }
  200. }
  201. idx[GRUB_CRYPTODISK_GF_BYTES - 1] = c;
  202. gf_mul_be (sec->high, dev->lrw_key, idx);
  203. }
  204. static void __attribute__ ((unused))
  205. lrw_xor (const struct lrw_sector *sec,
  206. const struct grub_cryptodisk *dev,
  207. grub_uint8_t *b)
  208. {
  209. unsigned i;
  210. for (i = 0; i < sec->low_byte_c * GRUB_CRYPTODISK_GF_BYTES;
  211. i += GRUB_CRYPTODISK_GF_BYTES)
  212. grub_crypto_xor (b + i, b + i, sec->low, GRUB_CRYPTODISK_GF_BYTES);
  213. grub_crypto_xor (b, b, dev->lrw_precalc + GRUB_CRYPTODISK_GF_BYTES * sec->low_byte,
  214. sec->low_byte_c * GRUB_CRYPTODISK_GF_BYTES);
  215. if (!sec->low_byte)
  216. return;
  217. for (i = sec->low_byte_c * GRUB_CRYPTODISK_GF_BYTES;
  218. i < (1U << dev->log_sector_size); i += GRUB_CRYPTODISK_GF_BYTES)
  219. grub_crypto_xor (b + i, b + i, sec->high, GRUB_CRYPTODISK_GF_BYTES);
  220. grub_crypto_xor (b + sec->low_byte_c * GRUB_CRYPTODISK_GF_BYTES,
  221. b + sec->low_byte_c * GRUB_CRYPTODISK_GF_BYTES,
  222. dev->lrw_precalc, sec->low_byte * GRUB_CRYPTODISK_GF_BYTES);
  223. }
  224. static gcry_err_code_t
  225. grub_cryptodisk_endecrypt (struct grub_cryptodisk *dev,
  226. grub_uint8_t * data, grub_size_t len,
  227. grub_disk_addr_t sector, grub_size_t log_sector_size,
  228. int do_encrypt)
  229. {
  230. grub_size_t i;
  231. gcry_err_code_t err;
  232. if (dev->cipher->cipher->blocksize > GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE)
  233. return GPG_ERR_INV_ARG;
  234. /* The only mode without IV. */
  235. if (dev->mode == GRUB_CRYPTODISK_MODE_ECB && !dev->rekey)
  236. return (do_encrypt ? grub_crypto_ecb_encrypt (dev->cipher, data, data, len)
  237. : grub_crypto_ecb_decrypt (dev->cipher, data, data, len));
  238. for (i = 0; i < len; i += ((grub_size_t) 1 << log_sector_size))
  239. {
  240. grub_size_t sz = ((dev->cipher->cipher->blocksize
  241. + sizeof (grub_uint32_t) - 1)
  242. / sizeof (grub_uint32_t));
  243. grub_uint32_t iv[(GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE + 3) / 4];
  244. if (dev->rekey)
  245. {
  246. grub_uint64_t zone = sector >> dev->rekey_shift;
  247. if (zone != dev->last_rekey)
  248. {
  249. err = dev->rekey (dev, zone);
  250. if (err)
  251. return err;
  252. dev->last_rekey = zone;
  253. }
  254. }
  255. grub_memset (iv, 0, sizeof (iv));
  256. switch (dev->mode_iv)
  257. {
  258. case GRUB_CRYPTODISK_MODE_IV_NULL:
  259. break;
  260. case GRUB_CRYPTODISK_MODE_IV_BYTECOUNT64_HASH:
  261. {
  262. grub_uint64_t tmp;
  263. void *ctx;
  264. ctx = grub_zalloc (dev->iv_hash->contextsize);
  265. if (!ctx)
  266. return GPG_ERR_OUT_OF_MEMORY;
  267. tmp = grub_cpu_to_le64 (sector << log_sector_size);
  268. dev->iv_hash->init (ctx);
  269. dev->iv_hash->write (ctx, dev->iv_prefix, dev->iv_prefix_len);
  270. dev->iv_hash->write (ctx, &tmp, sizeof (tmp));
  271. dev->iv_hash->final (ctx);
  272. grub_memcpy (iv, dev->iv_hash->read (ctx), sizeof (iv));
  273. grub_free (ctx);
  274. }
  275. break;
  276. case GRUB_CRYPTODISK_MODE_IV_PLAIN64:
  277. case GRUB_CRYPTODISK_MODE_IV_PLAIN:
  278. /*
  279. * The IV is a 32 or 64 bit value of the dm-crypt native sector
  280. * number. If using 32 bit IV mode, zero out the most significant
  281. * 32 bits.
  282. */
  283. {
  284. grub_uint64_t iv64;
  285. iv64 = grub_cpu_to_le64 (sector << (log_sector_size
  286. - GRUB_CRYPTODISK_IV_LOG_SIZE));
  287. grub_set_unaligned64 (iv, iv64);
  288. if (dev->mode_iv == GRUB_CRYPTODISK_MODE_IV_PLAIN)
  289. iv[1] = 0;
  290. }
  291. break;
  292. case GRUB_CRYPTODISK_MODE_IV_BYTECOUNT64:
  293. /* The IV is the 64 bit byte offset of the sector. */
  294. iv[1] = grub_cpu_to_le32 (sector >> (GRUB_TYPE_BITS (iv[1])
  295. - log_sector_size));
  296. iv[0] = grub_cpu_to_le32 ((sector << log_sector_size)
  297. & GRUB_TYPE_U_MAX (iv[0]));
  298. break;
  299. case GRUB_CRYPTODISK_MODE_IV_BENBI:
  300. {
  301. grub_uint64_t num = (sector << dev->benbi_log) + 1;
  302. iv[sz - 2] = grub_cpu_to_be32 (num >> GRUB_TYPE_BITS (iv[0]));
  303. iv[sz - 1] = grub_cpu_to_be32 (num & GRUB_TYPE_U_MAX (iv[0]));
  304. }
  305. break;
  306. case GRUB_CRYPTODISK_MODE_IV_ESSIV:
  307. iv[0] = grub_cpu_to_le32 (sector & GRUB_TYPE_U_MAX (iv[0]));
  308. err = grub_crypto_ecb_encrypt (dev->essiv_cipher, iv, iv,
  309. dev->cipher->cipher->blocksize);
  310. if (err)
  311. return err;
  312. }
  313. switch (dev->mode)
  314. {
  315. case GRUB_CRYPTODISK_MODE_CBC:
  316. if (do_encrypt)
  317. err = grub_crypto_cbc_encrypt (dev->cipher, data + i, data + i,
  318. ((grub_size_t) 1 << log_sector_size), iv);
  319. else
  320. err = grub_crypto_cbc_decrypt (dev->cipher, data + i, data + i,
  321. ((grub_size_t) 1 << log_sector_size), iv);
  322. if (err)
  323. return err;
  324. break;
  325. case GRUB_CRYPTODISK_MODE_PCBC:
  326. if (do_encrypt)
  327. err = grub_crypto_pcbc_encrypt (dev->cipher, data + i, data + i,
  328. ((grub_size_t) 1 << log_sector_size), iv);
  329. else
  330. err = grub_crypto_pcbc_decrypt (dev->cipher, data + i, data + i,
  331. ((grub_size_t) 1 << log_sector_size), iv);
  332. if (err)
  333. return err;
  334. break;
  335. case GRUB_CRYPTODISK_MODE_XTS:
  336. {
  337. unsigned j;
  338. err = grub_crypto_ecb_encrypt (dev->secondary_cipher, iv, iv,
  339. dev->cipher->cipher->blocksize);
  340. if (err)
  341. return err;
  342. for (j = 0; j < (1U << log_sector_size);
  343. j += dev->cipher->cipher->blocksize)
  344. {
  345. grub_crypto_xor (data + i + j, data + i + j, iv,
  346. dev->cipher->cipher->blocksize);
  347. if (do_encrypt)
  348. err = grub_crypto_ecb_encrypt (dev->cipher, data + i + j,
  349. data + i + j,
  350. dev->cipher->cipher->blocksize);
  351. else
  352. err = grub_crypto_ecb_decrypt (dev->cipher, data + i + j,
  353. data + i + j,
  354. dev->cipher->cipher->blocksize);
  355. if (err)
  356. return err;
  357. grub_crypto_xor (data + i + j, data + i + j, iv,
  358. dev->cipher->cipher->blocksize);
  359. gf_mul_x ((grub_uint8_t *) iv);
  360. }
  361. }
  362. break;
  363. case GRUB_CRYPTODISK_MODE_LRW:
  364. {
  365. struct lrw_sector sec;
  366. generate_lrw_sector (&sec, dev, (grub_uint8_t *) iv);
  367. lrw_xor (&sec, dev, data + i);
  368. if (do_encrypt)
  369. err = grub_crypto_ecb_encrypt (dev->cipher, data + i,
  370. data + i,
  371. (1U << log_sector_size));
  372. else
  373. err = grub_crypto_ecb_decrypt (dev->cipher, data + i,
  374. data + i,
  375. (1U << log_sector_size));
  376. if (err)
  377. return err;
  378. lrw_xor (&sec, dev, data + i);
  379. }
  380. break;
  381. case GRUB_CRYPTODISK_MODE_ECB:
  382. if (do_encrypt)
  383. err = grub_crypto_ecb_encrypt (dev->cipher, data + i, data + i,
  384. (1U << log_sector_size));
  385. else
  386. err = grub_crypto_ecb_decrypt (dev->cipher, data + i, data + i,
  387. (1U << log_sector_size));
  388. if (err)
  389. return err;
  390. break;
  391. default:
  392. return GPG_ERR_NOT_IMPLEMENTED;
  393. }
  394. sector++;
  395. }
  396. return GPG_ERR_NO_ERROR;
  397. }
  398. gcry_err_code_t
  399. grub_cryptodisk_decrypt (struct grub_cryptodisk *dev,
  400. grub_uint8_t * data, grub_size_t len,
  401. grub_disk_addr_t sector, grub_size_t log_sector_size)
  402. {
  403. return grub_cryptodisk_endecrypt (dev, data, len, sector, log_sector_size, 0);
  404. }
  405. grub_err_t
  406. grub_cryptodisk_setcipher (grub_cryptodisk_t crypt, const char *ciphername, const char *ciphermode)
  407. {
  408. const char *cipheriv = NULL;
  409. grub_crypto_cipher_handle_t cipher = NULL, secondary_cipher = NULL;
  410. grub_crypto_cipher_handle_t essiv_cipher = NULL;
  411. const gcry_md_spec_t *essiv_hash = NULL;
  412. const struct gcry_cipher_spec *ciph;
  413. grub_cryptodisk_mode_t mode;
  414. grub_cryptodisk_mode_iv_t mode_iv = GRUB_CRYPTODISK_MODE_IV_PLAIN64;
  415. int benbi_log = 0;
  416. grub_err_t ret = GRUB_ERR_NONE;
  417. ciph = grub_crypto_lookup_cipher_by_name (ciphername);
  418. if (!ciph)
  419. {
  420. ret = grub_error (GRUB_ERR_FILE_NOT_FOUND, "Cipher %s isn't available",
  421. ciphername);
  422. goto err;
  423. }
  424. /* Configure the cipher used for the bulk data. */
  425. cipher = grub_crypto_cipher_open (ciph);
  426. if (!cipher)
  427. {
  428. ret = grub_error (GRUB_ERR_FILE_NOT_FOUND, "Cipher %s could not be initialized",
  429. ciphername);
  430. goto err;
  431. }
  432. /* Configure the cipher mode. */
  433. if (grub_strcmp (ciphermode, "ecb") == 0)
  434. {
  435. mode = GRUB_CRYPTODISK_MODE_ECB;
  436. mode_iv = GRUB_CRYPTODISK_MODE_IV_PLAIN;
  437. cipheriv = NULL;
  438. }
  439. else if (grub_strcmp (ciphermode, "plain") == 0)
  440. {
  441. mode = GRUB_CRYPTODISK_MODE_CBC;
  442. mode_iv = GRUB_CRYPTODISK_MODE_IV_PLAIN;
  443. cipheriv = NULL;
  444. }
  445. else if (grub_memcmp (ciphermode, "cbc-", sizeof ("cbc-") - 1) == 0)
  446. {
  447. mode = GRUB_CRYPTODISK_MODE_CBC;
  448. cipheriv = ciphermode + sizeof ("cbc-") - 1;
  449. }
  450. else if (grub_memcmp (ciphermode, "pcbc-", sizeof ("pcbc-") - 1) == 0)
  451. {
  452. mode = GRUB_CRYPTODISK_MODE_PCBC;
  453. cipheriv = ciphermode + sizeof ("pcbc-") - 1;
  454. }
  455. else if (grub_memcmp (ciphermode, "xts-", sizeof ("xts-") - 1) == 0)
  456. {
  457. mode = GRUB_CRYPTODISK_MODE_XTS;
  458. cipheriv = ciphermode + sizeof ("xts-") - 1;
  459. secondary_cipher = grub_crypto_cipher_open (ciph);
  460. if (!secondary_cipher)
  461. {
  462. ret = grub_error (GRUB_ERR_FILE_NOT_FOUND,
  463. "Secondary cipher %s isn't available", ciphername);
  464. goto err;
  465. }
  466. if (cipher->cipher->blocksize != GRUB_CRYPTODISK_GF_BYTES)
  467. {
  468. ret = grub_error (GRUB_ERR_BAD_ARGUMENT,
  469. "Unsupported XTS block size: %" PRIuGRUB_SIZE,
  470. cipher->cipher->blocksize);
  471. goto err;
  472. }
  473. if (secondary_cipher->cipher->blocksize != GRUB_CRYPTODISK_GF_BYTES)
  474. {
  475. ret = grub_error (GRUB_ERR_BAD_ARGUMENT,
  476. "Unsupported XTS block size: %" PRIuGRUB_SIZE,
  477. secondary_cipher->cipher->blocksize);
  478. goto err;
  479. }
  480. }
  481. else if (grub_memcmp (ciphermode, "lrw-", sizeof ("lrw-") - 1) == 0)
  482. {
  483. mode = GRUB_CRYPTODISK_MODE_LRW;
  484. cipheriv = ciphermode + sizeof ("lrw-") - 1;
  485. if (cipher->cipher->blocksize != GRUB_CRYPTODISK_GF_BYTES)
  486. {
  487. ret = grub_error (GRUB_ERR_BAD_ARGUMENT,
  488. "Unsupported LRW block size: %" PRIuGRUB_SIZE,
  489. cipher->cipher->blocksize);
  490. goto err;
  491. }
  492. }
  493. else
  494. {
  495. ret = grub_error (GRUB_ERR_BAD_ARGUMENT, "Unknown cipher mode: %s",
  496. ciphermode);
  497. goto err;
  498. }
  499. if (cipheriv == NULL)
  500. ;
  501. else if (grub_memcmp (cipheriv, "plain64", sizeof ("plain64") - 1) == 0)
  502. mode_iv = GRUB_CRYPTODISK_MODE_IV_PLAIN64;
  503. else if (grub_memcmp (cipheriv, "plain", sizeof ("plain") - 1) == 0)
  504. mode_iv = GRUB_CRYPTODISK_MODE_IV_PLAIN;
  505. else if (grub_memcmp (cipheriv, "benbi", sizeof ("benbi") - 1) == 0)
  506. {
  507. if (cipher->cipher->blocksize & (cipher->cipher->blocksize - 1)
  508. || cipher->cipher->blocksize == 0)
  509. grub_error (GRUB_ERR_BAD_ARGUMENT,
  510. "Unsupported benbi blocksize: %" PRIuGRUB_SIZE,
  511. cipher->cipher->blocksize);
  512. /* FIXME should we return an error here? */
  513. for (benbi_log = 0;
  514. (cipher->cipher->blocksize << benbi_log) < GRUB_DISK_SECTOR_SIZE;
  515. benbi_log++);
  516. mode_iv = GRUB_CRYPTODISK_MODE_IV_BENBI;
  517. }
  518. else if (grub_memcmp (cipheriv, "null", sizeof ("null") - 1) == 0)
  519. mode_iv = GRUB_CRYPTODISK_MODE_IV_NULL;
  520. else if (grub_memcmp (cipheriv, "essiv:", sizeof ("essiv:") - 1) == 0)
  521. {
  522. const char *hash_str = cipheriv + 6;
  523. mode_iv = GRUB_CRYPTODISK_MODE_IV_ESSIV;
  524. /* Configure the hash and cipher used for ESSIV. */
  525. essiv_hash = grub_crypto_lookup_md_by_name (hash_str);
  526. if (!essiv_hash)
  527. {
  528. ret = grub_error (GRUB_ERR_FILE_NOT_FOUND,
  529. "Couldn't load %s hash", hash_str);
  530. goto err;
  531. }
  532. essiv_cipher = grub_crypto_cipher_open (ciph);
  533. if (!essiv_cipher)
  534. {
  535. ret = grub_error (GRUB_ERR_FILE_NOT_FOUND,
  536. "Couldn't load %s cipher", ciphername);
  537. goto err;
  538. }
  539. }
  540. else
  541. {
  542. ret = grub_error (GRUB_ERR_BAD_ARGUMENT, "Unknown IV mode: %s",
  543. cipheriv);
  544. goto err;
  545. }
  546. crypt->cipher = cipher;
  547. crypt->benbi_log = benbi_log;
  548. crypt->mode = mode;
  549. crypt->mode_iv = mode_iv;
  550. crypt->secondary_cipher = secondary_cipher;
  551. crypt->essiv_cipher = essiv_cipher;
  552. crypt->essiv_hash = essiv_hash;
  553. err:
  554. if (ret)
  555. {
  556. grub_crypto_cipher_close (cipher);
  557. grub_crypto_cipher_close (secondary_cipher);
  558. }
  559. return ret;
  560. }
  561. gcry_err_code_t
  562. grub_cryptodisk_setkey (grub_cryptodisk_t dev, grub_uint8_t *key, grub_size_t keysize)
  563. {
  564. gcry_err_code_t err;
  565. int real_keysize;
  566. real_keysize = keysize;
  567. if (dev->mode == GRUB_CRYPTODISK_MODE_XTS)
  568. real_keysize /= 2;
  569. if (dev->mode == GRUB_CRYPTODISK_MODE_LRW)
  570. real_keysize -= dev->cipher->cipher->blocksize;
  571. /* Set the PBKDF2 output as the cipher key. */
  572. err = grub_crypto_cipher_set_key (dev->cipher, key, real_keysize);
  573. if (err)
  574. return err;
  575. grub_memcpy (dev->key, key, keysize);
  576. dev->keysize = keysize;
  577. /* Configure ESSIV if necessary. */
  578. if (dev->mode_iv == GRUB_CRYPTODISK_MODE_IV_ESSIV)
  579. {
  580. grub_size_t essiv_keysize = dev->essiv_hash->mdlen;
  581. grub_uint8_t hashed_key[GRUB_CRYPTO_MAX_MDLEN];
  582. if (essiv_keysize > GRUB_CRYPTO_MAX_MDLEN)
  583. return GPG_ERR_INV_ARG;
  584. grub_crypto_hash (dev->essiv_hash, hashed_key, key, keysize);
  585. err = grub_crypto_cipher_set_key (dev->essiv_cipher,
  586. hashed_key, essiv_keysize);
  587. if (err)
  588. return err;
  589. }
  590. if (dev->mode == GRUB_CRYPTODISK_MODE_XTS)
  591. {
  592. err = grub_crypto_cipher_set_key (dev->secondary_cipher,
  593. key + real_keysize,
  594. keysize / 2);
  595. if (err)
  596. return err;
  597. }
  598. if (dev->mode == GRUB_CRYPTODISK_MODE_LRW)
  599. {
  600. unsigned i;
  601. grub_uint8_t idx[GRUB_CRYPTODISK_GF_BYTES];
  602. grub_free (dev->lrw_precalc);
  603. grub_memcpy (dev->lrw_key, key + real_keysize,
  604. dev->cipher->cipher->blocksize);
  605. dev->lrw_precalc = grub_malloc ((1U << dev->log_sector_size));
  606. if (!dev->lrw_precalc)
  607. return GPG_ERR_OUT_OF_MEMORY;
  608. grub_memset (idx, 0, GRUB_CRYPTODISK_GF_BYTES);
  609. for (i = 0; i < (1U << dev->log_sector_size);
  610. i += GRUB_CRYPTODISK_GF_BYTES)
  611. {
  612. idx[GRUB_CRYPTODISK_GF_BYTES - 1] = i / GRUB_CRYPTODISK_GF_BYTES;
  613. gf_mul_be (dev->lrw_precalc + i, idx, dev->lrw_key);
  614. }
  615. }
  616. return GPG_ERR_NO_ERROR;
  617. }
  618. static int
  619. grub_cryptodisk_iterate (grub_disk_dev_iterate_hook_t hook, void *hook_data,
  620. grub_disk_pull_t pull)
  621. {
  622. grub_cryptodisk_t i;
  623. if (pull != GRUB_DISK_PULL_NONE)
  624. return 0;
  625. for (i = cryptodisk_list; i != NULL; i = i->next)
  626. {
  627. char buf[30];
  628. grub_snprintf (buf, sizeof (buf), "crypto%lu", i->id);
  629. if (hook (buf, hook_data))
  630. return 1;
  631. }
  632. return GRUB_ERR_NONE;
  633. }
  634. static grub_err_t
  635. grub_cryptodisk_open (const char *name, grub_disk_t disk)
  636. {
  637. grub_cryptodisk_t dev;
  638. if (grub_memcmp (name, "crypto", sizeof ("crypto") - 1) != 0)
  639. return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "No such device");
  640. if (grub_memcmp (name, "cryptouuid/", sizeof ("cryptouuid/") - 1) == 0)
  641. {
  642. for (dev = cryptodisk_list; dev != NULL; dev = dev->next)
  643. if (grub_uuidcasecmp (name + sizeof ("cryptouuid/") - 1, dev->uuid, sizeof (dev->uuid)) == 0)
  644. break;
  645. }
  646. else
  647. {
  648. unsigned long id = grub_strtoul (name + sizeof ("crypto") - 1, 0, 0);
  649. if (grub_errno)
  650. return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "No such device");
  651. /* Search for requested device in the list of CRYPTODISK devices. */
  652. for (dev = cryptodisk_list; dev != NULL; dev = dev->next)
  653. if (dev->id == id)
  654. break;
  655. }
  656. if (!dev)
  657. return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "No such device");
  658. #ifdef GRUB_UTIL
  659. if (dev->cheat)
  660. {
  661. grub_uint64_t cheat_dev_size;
  662. unsigned int cheat_log_sector_size;
  663. if (!GRUB_UTIL_FD_IS_VALID (dev->cheat_fd))
  664. dev->cheat_fd = grub_util_fd_open (dev->cheat, GRUB_UTIL_FD_O_RDONLY);
  665. if (!GRUB_UTIL_FD_IS_VALID (dev->cheat_fd))
  666. return grub_error (GRUB_ERR_IO, N_("cannot open `%s': %s"),
  667. dev->cheat, grub_util_fd_strerror ());
  668. /* Use the sector size and count of the cheat device. */
  669. cheat_dev_size = grub_util_get_fd_size (dev->cheat_fd, dev->cheat, &cheat_log_sector_size);
  670. if (cheat_dev_size == -1)
  671. {
  672. const char *errmsg = grub_util_fd_strerror ();
  673. grub_util_fd_close (dev->cheat_fd);
  674. dev->cheat_fd = GRUB_UTIL_FD_INVALID;
  675. return grub_error (GRUB_ERR_IO, N_("failed to query size of device `%s': %s"),
  676. dev->cheat, errmsg);
  677. }
  678. dev->log_sector_size = cheat_log_sector_size;
  679. dev->total_sectors = cheat_dev_size >> cheat_log_sector_size;
  680. }
  681. #endif
  682. if (!dev->source_disk)
  683. {
  684. grub_dprintf ("cryptodisk", "Opening device %s\n", name);
  685. /* Try to open the source disk and populate the requested disk. */
  686. dev->source_disk = grub_disk_open (dev->source);
  687. if (!dev->source_disk)
  688. return grub_errno;
  689. }
  690. disk->data = dev;
  691. disk->log_sector_size = dev->log_sector_size;
  692. disk->total_sectors = dev->total_sectors;
  693. disk->max_agglomerate = GRUB_DISK_MAX_MAX_AGGLOMERATE;
  694. disk->id = dev->id;
  695. dev->ref++;
  696. return GRUB_ERR_NONE;
  697. }
  698. static void
  699. grub_cryptodisk_close (grub_disk_t disk)
  700. {
  701. grub_cryptodisk_t dev = (grub_cryptodisk_t) disk->data;
  702. grub_dprintf ("cryptodisk", "Closing disk\n");
  703. dev->ref--;
  704. if (dev->ref != 0)
  705. return;
  706. #ifdef GRUB_UTIL
  707. if (dev->cheat)
  708. {
  709. grub_util_fd_close (dev->cheat_fd);
  710. dev->cheat_fd = GRUB_UTIL_FD_INVALID;
  711. }
  712. #endif
  713. grub_disk_close (dev->source_disk);
  714. dev->source_disk = NULL;
  715. }
  716. static grub_err_t
  717. grub_cryptodisk_read (grub_disk_t disk, grub_disk_addr_t sector,
  718. grub_size_t size, char *buf)
  719. {
  720. grub_cryptodisk_t dev = (grub_cryptodisk_t) disk->data;
  721. grub_err_t err;
  722. gcry_err_code_t gcry_err;
  723. #ifdef GRUB_UTIL
  724. if (dev->cheat)
  725. {
  726. int r;
  727. r = grub_util_fd_seek (dev->cheat_fd, sector << disk->log_sector_size);
  728. if (r)
  729. return grub_error (GRUB_ERR_BAD_DEVICE, N_("cannot seek `%s': %s"),
  730. dev->cheat, grub_util_fd_strerror ());
  731. if (grub_util_fd_read (dev->cheat_fd, buf, size << disk->log_sector_size)
  732. != (ssize_t) (size << disk->log_sector_size))
  733. return grub_error (GRUB_ERR_READ_ERROR, N_("cannot read `%s': %s"),
  734. dev->cheat, grub_util_fd_strerror ());
  735. return GRUB_ERR_NONE;
  736. }
  737. #endif
  738. grub_dprintf ("cryptodisk",
  739. "Reading %" PRIuGRUB_SIZE " sectors from sector 0x%"
  740. PRIxGRUB_UINT64_T " with offset of %" PRIuGRUB_UINT64_T "\n",
  741. size, sector, dev->offset_sectors);
  742. err = grub_disk_read (dev->source_disk,
  743. grub_disk_from_native_sector (disk, sector + dev->offset_sectors),
  744. 0, size << disk->log_sector_size, buf);
  745. if (err)
  746. {
  747. grub_dprintf ("cryptodisk", "grub_disk_read failed with error %d\n", err);
  748. return err;
  749. }
  750. gcry_err = grub_cryptodisk_endecrypt (dev, (grub_uint8_t *) buf,
  751. size << disk->log_sector_size,
  752. sector, dev->log_sector_size, 0);
  753. return grub_crypto_gcry_error (gcry_err);
  754. }
  755. static grub_err_t
  756. grub_cryptodisk_write (grub_disk_t disk, grub_disk_addr_t sector,
  757. grub_size_t size, const char *buf)
  758. {
  759. grub_cryptodisk_t dev = (grub_cryptodisk_t) disk->data;
  760. gcry_err_code_t gcry_err;
  761. char *tmp;
  762. grub_err_t err;
  763. #ifdef GRUB_UTIL
  764. if (dev->cheat)
  765. {
  766. int r;
  767. r = grub_util_fd_seek (dev->cheat_fd, sector << disk->log_sector_size);
  768. if (r)
  769. return grub_error (GRUB_ERR_BAD_DEVICE, N_("cannot seek `%s': %s"),
  770. dev->cheat, grub_util_fd_strerror ());
  771. if (grub_util_fd_write (dev->cheat_fd, buf, size << disk->log_sector_size)
  772. != (ssize_t) (size << disk->log_sector_size))
  773. return grub_error (GRUB_ERR_READ_ERROR, N_("cannot read `%s': %s"),
  774. dev->cheat, grub_util_fd_strerror ());
  775. return GRUB_ERR_NONE;
  776. }
  777. #endif
  778. tmp = grub_malloc (size << disk->log_sector_size);
  779. if (!tmp)
  780. return grub_errno;
  781. grub_memcpy (tmp, buf, size << disk->log_sector_size);
  782. grub_dprintf ("cryptodisk",
  783. "Writing %" PRIuGRUB_SIZE " sectors to sector 0x%"
  784. PRIxGRUB_UINT64_T " with offset of %" PRIuGRUB_UINT64_T "\n",
  785. size, sector, dev->offset_sectors);
  786. gcry_err = grub_cryptodisk_endecrypt (dev, (grub_uint8_t *) tmp,
  787. size << disk->log_sector_size,
  788. sector, disk->log_sector_size, 1);
  789. if (gcry_err)
  790. {
  791. grub_free (tmp);
  792. return grub_crypto_gcry_error (gcry_err);
  793. }
  794. /* Since ->write was called so disk.mod is loaded but be paranoid */
  795. sector = sector + dev->offset_sectors;
  796. if (grub_disk_write_weak)
  797. err = grub_disk_write_weak (dev->source_disk,
  798. grub_disk_from_native_sector (disk, sector),
  799. 0, size << disk->log_sector_size, tmp);
  800. else
  801. err = grub_error (GRUB_ERR_BUG, "disk.mod not loaded");
  802. grub_free (tmp);
  803. return err;
  804. }
  805. #ifdef GRUB_UTIL
  806. static grub_disk_memberlist_t
  807. grub_cryptodisk_memberlist (grub_disk_t disk)
  808. {
  809. grub_cryptodisk_t dev = (grub_cryptodisk_t) disk->data;
  810. grub_disk_memberlist_t list = NULL;
  811. list = grub_malloc (sizeof (*list));
  812. if (list)
  813. {
  814. list->disk = dev->source_disk;
  815. list->next = NULL;
  816. }
  817. return list;
  818. }
  819. #endif
  820. static void
  821. cryptodisk_cleanup (void)
  822. {
  823. #if 0
  824. grub_cryptodisk_t dev = cryptodisk_list;
  825. grub_cryptodisk_t tmp;
  826. while (dev != NULL)
  827. {
  828. grub_free (dev->source);
  829. grub_free (dev->cipher);
  830. grub_free (dev->secondary_cipher);
  831. grub_free (dev->essiv_cipher);
  832. tmp = dev->next;
  833. grub_free (dev);
  834. dev = tmp;
  835. }
  836. #endif
  837. }
  838. grub_err_t
  839. grub_cryptodisk_insert (grub_cryptodisk_t newdev, const char *name,
  840. grub_disk_t source)
  841. {
  842. newdev->source = grub_strdup (name);
  843. if (!newdev->source)
  844. return grub_errno;
  845. newdev->id = last_cryptodisk_id++;
  846. newdev->source_id = source->id;
  847. newdev->source_dev_id = source->dev->id;
  848. newdev->partition_start = grub_partition_get_start (source->partition);
  849. newdev->next = cryptodisk_list;
  850. cryptodisk_list = newdev;
  851. return GRUB_ERR_NONE;
  852. }
  853. grub_cryptodisk_t
  854. grub_cryptodisk_get_by_uuid (const char *uuid)
  855. {
  856. grub_cryptodisk_t dev;
  857. for (dev = cryptodisk_list; dev != NULL; dev = dev->next)
  858. if (grub_uuidcasecmp (dev->uuid, uuid, sizeof (dev->uuid)) == 0)
  859. return dev;
  860. return NULL;
  861. }
  862. grub_cryptodisk_t
  863. grub_cryptodisk_get_by_source_disk (grub_disk_t disk)
  864. {
  865. grub_cryptodisk_t dev;
  866. for (dev = cryptodisk_list; dev != NULL; dev = dev->next)
  867. if (dev->source_id == disk->id && dev->source_dev_id == disk->dev->id)
  868. if ((disk->partition && grub_partition_get_start (disk->partition) == dev->partition_start) ||
  869. (!disk->partition && dev->partition_start == 0))
  870. return dev;
  871. return NULL;
  872. }
  873. #ifdef GRUB_UTIL
  874. grub_err_t
  875. grub_cryptodisk_cheat_insert (grub_cryptodisk_t newdev, const char *name,
  876. grub_disk_t source, const char *cheat)
  877. {
  878. newdev->cheat = grub_strdup (cheat);
  879. newdev->source = grub_strdup (name);
  880. if (!newdev->source || !newdev->cheat)
  881. {
  882. grub_free (newdev->source);
  883. grub_free (newdev->cheat);
  884. return grub_errno;
  885. }
  886. newdev->cheat_fd = GRUB_UTIL_FD_INVALID;
  887. newdev->source_id = source->id;
  888. newdev->source_dev_id = source->dev->id;
  889. newdev->partition_start = grub_partition_get_start (source->partition);
  890. newdev->id = last_cryptodisk_id++;
  891. newdev->next = cryptodisk_list;
  892. cryptodisk_list = newdev;
  893. return GRUB_ERR_NONE;
  894. }
  895. void
  896. grub_util_cryptodisk_get_abstraction (grub_disk_t disk,
  897. void (*cb) (const char *val, void *data),
  898. void *data)
  899. {
  900. grub_cryptodisk_t dev = (grub_cryptodisk_t) disk->data;
  901. cb ("cryptodisk", data);
  902. cb (dev->modname, data);
  903. if (dev->cipher)
  904. cb (dev->cipher->cipher->modname, data);
  905. if (dev->secondary_cipher)
  906. cb (dev->secondary_cipher->cipher->modname, data);
  907. if (dev->essiv_cipher)
  908. cb (dev->essiv_cipher->cipher->modname, data);
  909. if (dev->hash)
  910. cb (dev->hash->modname, data);
  911. if (dev->essiv_hash)
  912. cb (dev->essiv_hash->modname, data);
  913. if (dev->iv_hash)
  914. cb (dev->iv_hash->modname, data);
  915. }
  916. const char *
  917. grub_util_cryptodisk_get_uuid (grub_disk_t disk)
  918. {
  919. grub_cryptodisk_t dev = (grub_cryptodisk_t) disk->data;
  920. return dev->uuid;
  921. }
  922. #endif
  923. static void
  924. cryptodisk_close (grub_cryptodisk_t dev)
  925. {
  926. grub_crypto_cipher_close (dev->cipher);
  927. grub_crypto_cipher_close (dev->secondary_cipher);
  928. grub_crypto_cipher_close (dev->essiv_cipher);
  929. grub_free (dev);
  930. }
  931. static grub_err_t
  932. cryptodisk_read_hook (grub_disk_addr_t sector, unsigned offset,
  933. unsigned length, char *buf, void *data)
  934. {
  935. cryptodisk_read_hook_ctx_t ctx = data;
  936. if (ctx->hdr_file == NULL)
  937. return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("header file not found"));
  938. if (grub_file_seek (ctx->hdr_file,
  939. ((sector - ctx->part_start) * GRUB_DISK_SECTOR_SIZE) + offset)
  940. == (grub_off_t) -1)
  941. return grub_errno;
  942. if (grub_file_read (ctx->hdr_file, buf, length) != (grub_ssize_t) length)
  943. {
  944. if (grub_errno == GRUB_ERR_NONE)
  945. grub_error (GRUB_ERR_OUT_OF_RANGE, N_("header file too small"));
  946. return grub_errno;
  947. }
  948. return GRUB_ERR_NONE;
  949. }
  950. static grub_cryptodisk_t
  951. grub_cryptodisk_scan_device_real (const char *name,
  952. grub_disk_t source,
  953. grub_cryptomount_args_t cargs)
  954. {
  955. grub_err_t ret = GRUB_ERR_NONE;
  956. grub_cryptodisk_t dev;
  957. grub_cryptodisk_dev_t cr;
  958. struct cryptodisk_read_hook_ctx read_hook_data = {0};
  959. int askpass = 0;
  960. char *part = NULL;
  961. dev = grub_cryptodisk_get_by_source_disk (source);
  962. if (dev)
  963. return dev;
  964. if (cargs->hdr_file != NULL)
  965. {
  966. /*
  967. * Set read hook to read header from a file instead of the source disk.
  968. * Disk read hooks are executed after the data has been read from the
  969. * disk. This is okay, because the read hook is given the read buffer
  970. * before its sent back to the caller. In this case, the hook can then
  971. * overwrite the data read from the disk device with data from the
  972. * header file sent in as the read hook data. This is transparent to the
  973. * read caller. Since the callers of this function have just opened the
  974. * source disk, there are no current read hooks, so there's no need to
  975. * save/restore them nor consider if they should be called or not.
  976. *
  977. * This hook assumes that the header is at the start of the volume, which
  978. * is not the case for some formats (eg. GELI). It also can only be used
  979. * with formats where the detached header file can be written to the
  980. * first blocks of the volume and the volume could still be unlocked.
  981. * So the header file can not be formatted differently from the on-disk
  982. * header. If these assumpts are not met, detached header file processing
  983. * must be specially handled in the cryptodisk backend module.
  984. *
  985. * This hook needs only be set once and will be called potentially many
  986. * times by a backend. This is fine because of the assumptions mentioned
  987. * and the read hook reads from absolute offsets and is stateless.
  988. */
  989. read_hook_data.part_start = grub_partition_get_start (source->partition);
  990. read_hook_data.hdr_file = cargs->hdr_file;
  991. source->read_hook = cryptodisk_read_hook;
  992. source->read_hook_data = (void *) &read_hook_data;
  993. }
  994. FOR_CRYPTODISK_DEVS (cr)
  995. {
  996. /*
  997. * Loop through each cryptodisk backend that is registered (ie. loaded).
  998. * If the scan returns NULL, then the backend being tested does not
  999. * recognize the source disk, so move on to the next backend.
  1000. */
  1001. dev = cr->scan (source, cargs);
  1002. if (grub_errno)
  1003. goto error_no_close;
  1004. if (!dev)
  1005. continue;
  1006. if (!cargs->key_len)
  1007. {
  1008. /* Get the passphrase from the user, if no key data. */
  1009. askpass = 1;
  1010. part = grub_partition_get_name (source->partition);
  1011. grub_printf_ (N_("Enter passphrase for %s%s%s (%s): "), source->name,
  1012. source->partition != NULL ? "," : "",
  1013. part != NULL ? part : N_("UNKNOWN"),
  1014. dev->uuid);
  1015. grub_free (part);
  1016. cargs->key_data = grub_malloc (GRUB_CRYPTODISK_MAX_PASSPHRASE);
  1017. if (cargs->key_data == NULL)
  1018. goto error_no_close;
  1019. if (!grub_password_get ((char *) cargs->key_data, GRUB_CRYPTODISK_MAX_PASSPHRASE))
  1020. {
  1021. grub_error (GRUB_ERR_BAD_ARGUMENT, "passphrase not supplied");
  1022. goto error;
  1023. }
  1024. cargs->key_len = grub_strlen ((char *) cargs->key_data);
  1025. }
  1026. ret = cr->recover_key (source, dev, cargs);
  1027. if (ret != GRUB_ERR_NONE)
  1028. goto error;
  1029. ret = grub_cryptodisk_insert (dev, name, source);
  1030. if (ret != GRUB_ERR_NONE)
  1031. goto error;
  1032. goto cleanup;
  1033. }
  1034. grub_error (GRUB_ERR_BAD_MODULE, "no cryptodisk module can handle this device");
  1035. goto cleanup;
  1036. error:
  1037. cryptodisk_close (dev);
  1038. error_no_close:
  1039. dev = NULL;
  1040. cleanup:
  1041. if (cargs->hdr_file != NULL)
  1042. source->read_hook = NULL;
  1043. if (askpass)
  1044. {
  1045. cargs->key_len = 0;
  1046. grub_free (cargs->key_data);
  1047. }
  1048. return dev;
  1049. }
  1050. #ifdef GRUB_UTIL
  1051. #include <grub/util/misc.h>
  1052. grub_err_t
  1053. grub_cryptodisk_cheat_mount (const char *sourcedev, const char *cheat)
  1054. {
  1055. grub_err_t err;
  1056. grub_cryptodisk_t dev;
  1057. grub_cryptodisk_dev_t cr;
  1058. grub_disk_t source;
  1059. struct grub_cryptomount_args cargs = {0};
  1060. /* Try to open disk. */
  1061. source = grub_disk_open (sourcedev);
  1062. if (!source)
  1063. return grub_errno;
  1064. dev = grub_cryptodisk_get_by_source_disk (source);
  1065. if (dev)
  1066. {
  1067. grub_disk_close (source);
  1068. return GRUB_ERR_NONE;
  1069. }
  1070. FOR_CRYPTODISK_DEVS (cr)
  1071. {
  1072. dev = cr->scan (source, &cargs);
  1073. if (grub_errno)
  1074. return grub_errno;
  1075. if (!dev)
  1076. continue;
  1077. grub_util_info ("cheatmounted %s (%s) at %s", sourcedev, dev->modname,
  1078. cheat);
  1079. err = grub_cryptodisk_cheat_insert (dev, sourcedev, source, cheat);
  1080. grub_disk_close (source);
  1081. if (err)
  1082. grub_free (dev);
  1083. return GRUB_ERR_NONE;
  1084. }
  1085. grub_disk_close (source);
  1086. return GRUB_ERR_NONE;
  1087. }
  1088. #endif
  1089. static int
  1090. grub_cryptodisk_scan_device (const char *name,
  1091. void *data)
  1092. {
  1093. int ret = 0;
  1094. grub_disk_t source;
  1095. grub_cryptodisk_t dev;
  1096. grub_cryptomount_args_t cargs = data;
  1097. grub_errno = GRUB_ERR_NONE;
  1098. /* Try to open disk. */
  1099. source = grub_disk_open (name);
  1100. if (!source)
  1101. {
  1102. grub_print_error ();
  1103. return 0;
  1104. }
  1105. dev = grub_cryptodisk_scan_device_real (name, source, cargs);
  1106. if (dev)
  1107. {
  1108. ret = (cargs->search_uuid != NULL
  1109. && grub_uuidcasecmp (cargs->search_uuid, dev->uuid, sizeof (dev->uuid)) == 0);
  1110. goto cleanup;
  1111. }
  1112. /*
  1113. * Do not print error when err is GRUB_ERR_BAD_MODULE to avoid many unhelpful
  1114. * error messages.
  1115. */
  1116. if (grub_errno == GRUB_ERR_BAD_MODULE)
  1117. grub_error_pop ();
  1118. if (cargs->search_uuid != NULL)
  1119. /* Push error onto stack to save for cryptomount. */
  1120. grub_error_push ();
  1121. else
  1122. grub_print_error ();
  1123. cleanup:
  1124. grub_disk_close (source);
  1125. return ret;
  1126. }
  1127. static grub_err_t
  1128. grub_cmd_cryptomount (grub_extcmd_context_t ctxt, int argc, char **args)
  1129. {
  1130. struct grub_arg_list *state = ctxt->state;
  1131. struct grub_cryptomount_args cargs = {0};
  1132. if (argc < 1 && !state[OPTION_ALL].set && !state[OPTION_BOOT].set)
  1133. return grub_error (GRUB_ERR_BAD_ARGUMENT, "device name required");
  1134. if (grub_cryptodisk_list == NULL)
  1135. return grub_error (GRUB_ERR_BAD_MODULE, "no cryptodisk modules loaded");
  1136. if (state[OPTION_PASSWORD].set) /* password */
  1137. {
  1138. cargs.key_data = (grub_uint8_t *) state[OPTION_PASSWORD].arg;
  1139. cargs.key_len = grub_strlen (state[OPTION_PASSWORD].arg);
  1140. }
  1141. if (state[OPTION_KEYFILE].set) /* keyfile */
  1142. {
  1143. const char *p = NULL;
  1144. grub_file_t keyfile;
  1145. unsigned long long keyfile_offset = 0, keyfile_size = 0;
  1146. if (state[OPTION_KEYFILE_OFFSET].set) /* keyfile-offset */
  1147. {
  1148. grub_errno = GRUB_ERR_NONE;
  1149. keyfile_offset = grub_strtoull (state[OPTION_KEYFILE_OFFSET].arg, &p, 0);
  1150. if (state[OPTION_KEYFILE_OFFSET].arg[0] == '\0' || *p != '\0')
  1151. return grub_error (grub_errno,
  1152. N_("non-numeric or invalid keyfile offset `%s'"),
  1153. state[OPTION_KEYFILE_OFFSET].arg);
  1154. }
  1155. if (state[OPTION_KEYFILE_SIZE].set) /* keyfile-size */
  1156. {
  1157. grub_errno = GRUB_ERR_NONE;
  1158. keyfile_size = grub_strtoull (state[OPTION_KEYFILE_SIZE].arg, &p, 0);
  1159. if (state[OPTION_KEYFILE_SIZE].arg[0] == '\0' || *p != '\0')
  1160. return grub_error (grub_errno,
  1161. N_("non-numeric or invalid keyfile size `%s'"),
  1162. state[OPTION_KEYFILE_SIZE].arg);
  1163. if (keyfile_size == 0)
  1164. return grub_error (GRUB_ERR_OUT_OF_RANGE, N_("key file size is 0"));
  1165. if (keyfile_size > GRUB_CRYPTODISK_MAX_KEYFILE_SIZE)
  1166. return grub_error (GRUB_ERR_OUT_OF_RANGE,
  1167. N_("key file size exceeds maximum (%d)"),
  1168. GRUB_CRYPTODISK_MAX_KEYFILE_SIZE);
  1169. }
  1170. keyfile = grub_file_open (state[OPTION_KEYFILE].arg,
  1171. GRUB_FILE_TYPE_CRYPTODISK_ENCRYPTION_KEY);
  1172. if (keyfile == NULL)
  1173. return grub_errno;
  1174. if (keyfile_offset > keyfile->size)
  1175. return grub_error (GRUB_ERR_OUT_OF_RANGE,
  1176. N_("Keyfile offset, %llu, is greater than"
  1177. "keyfile size, %" PRIuGRUB_UINT64_T),
  1178. keyfile_offset, keyfile->size);
  1179. if (grub_file_seek (keyfile, (grub_off_t) keyfile_offset) == (grub_off_t) -1)
  1180. return grub_errno;
  1181. if (keyfile_size != 0)
  1182. {
  1183. if (keyfile_size > (keyfile->size - keyfile_offset))
  1184. return grub_error (GRUB_ERR_FILE_READ_ERROR,
  1185. N_("keyfile is too small: requested %llu bytes,"
  1186. " but the file only has %" PRIuGRUB_UINT64_T
  1187. " bytes left at offset %llu"),
  1188. keyfile_size,
  1189. (grub_off_t) (keyfile->size - keyfile_offset),
  1190. keyfile_offset);
  1191. cargs.key_len = keyfile_size;
  1192. }
  1193. else
  1194. cargs.key_len = keyfile->size - keyfile_offset;
  1195. cargs.key_data = grub_malloc (cargs.key_len);
  1196. if (cargs.key_data == NULL)
  1197. return GRUB_ERR_OUT_OF_MEMORY;
  1198. if (grub_file_read (keyfile, cargs.key_data, cargs.key_len) != (grub_ssize_t) cargs.key_len)
  1199. return grub_error (GRUB_ERR_FILE_READ_ERROR, (N_("failed to read key file")));
  1200. }
  1201. if (state[OPTION_HEADER].set) /* header */
  1202. {
  1203. if (state[OPTION_UUID].set)
  1204. return grub_error (GRUB_ERR_BAD_ARGUMENT,
  1205. N_("cannot use UUID lookup with detached header"));
  1206. cargs.hdr_file = grub_file_open (state[OPTION_HEADER].arg,
  1207. GRUB_FILE_TYPE_CRYPTODISK_DETACHED_HEADER);
  1208. if (cargs.hdr_file == NULL)
  1209. return grub_errno;
  1210. }
  1211. if (state[OPTION_UUID].set) /* uuid */
  1212. {
  1213. int found_uuid;
  1214. grub_cryptodisk_t dev;
  1215. dev = grub_cryptodisk_get_by_uuid (args[0]);
  1216. if (dev)
  1217. {
  1218. grub_dprintf ("cryptodisk",
  1219. "already mounted as crypto%lu\n", dev->id);
  1220. return GRUB_ERR_NONE;
  1221. }
  1222. cargs.check_boot = state[OPTION_BOOT].set;
  1223. cargs.search_uuid = args[0];
  1224. found_uuid = grub_device_iterate (&grub_cryptodisk_scan_device, &cargs);
  1225. if (found_uuid)
  1226. return GRUB_ERR_NONE;
  1227. else if (grub_errno == GRUB_ERR_NONE)
  1228. {
  1229. /*
  1230. * Try to pop the next error on the stack. If there is not one, then
  1231. * no device matched the given UUID.
  1232. */
  1233. grub_error_pop ();
  1234. if (grub_errno == GRUB_ERR_NONE)
  1235. return grub_error (GRUB_ERR_BAD_ARGUMENT, "no such cryptodisk found, perhaps a needed disk or cryptodisk module is not loaded");
  1236. }
  1237. return grub_errno;
  1238. }
  1239. else if (state[OPTION_ALL].set || (argc == 0 && state[OPTION_BOOT].set)) /* -a|-b */
  1240. {
  1241. cargs.check_boot = state[OPTION_BOOT].set;
  1242. grub_device_iterate (&grub_cryptodisk_scan_device, &cargs);
  1243. return GRUB_ERR_NONE;
  1244. }
  1245. else
  1246. {
  1247. grub_disk_t disk;
  1248. grub_cryptodisk_t dev;
  1249. char *diskname;
  1250. char *disklast = NULL;
  1251. grub_size_t len;
  1252. cargs.check_boot = state[OPTION_BOOT].set;
  1253. diskname = args[0];
  1254. len = grub_strlen (diskname);
  1255. if (len && diskname[0] == '(' && diskname[len - 1] == ')')
  1256. {
  1257. disklast = &diskname[len - 1];
  1258. *disklast = '\0';
  1259. diskname++;
  1260. }
  1261. disk = grub_disk_open (diskname);
  1262. if (!disk)
  1263. {
  1264. if (disklast)
  1265. *disklast = ')';
  1266. return grub_errno;
  1267. }
  1268. dev = grub_cryptodisk_get_by_source_disk (disk);
  1269. if (dev)
  1270. {
  1271. grub_dprintf ("cryptodisk", "already mounted as crypto%lu\n", dev->id);
  1272. grub_disk_close (disk);
  1273. if (disklast)
  1274. *disklast = ')';
  1275. return GRUB_ERR_NONE;
  1276. }
  1277. dev = grub_cryptodisk_scan_device_real (diskname, disk, &cargs);
  1278. grub_disk_close (disk);
  1279. if (disklast)
  1280. *disklast = ')';
  1281. return (dev == NULL) ? grub_errno : GRUB_ERR_NONE;
  1282. }
  1283. }
  1284. static struct grub_disk_dev grub_cryptodisk_dev = {
  1285. .name = "cryptodisk",
  1286. .id = GRUB_DISK_DEVICE_CRYPTODISK_ID,
  1287. .disk_iterate = grub_cryptodisk_iterate,
  1288. .disk_open = grub_cryptodisk_open,
  1289. .disk_close = grub_cryptodisk_close,
  1290. .disk_read = grub_cryptodisk_read,
  1291. .disk_write = grub_cryptodisk_write,
  1292. #ifdef GRUB_UTIL
  1293. .disk_memberlist = grub_cryptodisk_memberlist,
  1294. #endif
  1295. .next = 0
  1296. };
  1297. static char
  1298. hex (grub_uint8_t val)
  1299. {
  1300. if (val < 10)
  1301. return '0' + val;
  1302. return 'a' + val - 10;
  1303. }
  1304. /* Open a file named NAME and initialize FILE. */
  1305. static char *
  1306. luks_script_get (grub_size_t *sz)
  1307. {
  1308. grub_cryptodisk_t i;
  1309. grub_size_t size = 0;
  1310. char *ptr, *ret;
  1311. *sz = 0;
  1312. for (i = cryptodisk_list; i != NULL; i = i->next)
  1313. if (grub_strcmp (i->modname, "luks") == 0 ||
  1314. grub_strcmp (i->modname, "luks2") == 0)
  1315. {
  1316. size += grub_strlen (i->modname);
  1317. size += sizeof ("_mount");
  1318. size += grub_strlen (i->uuid);
  1319. size += grub_strlen (i->cipher->cipher->name);
  1320. /*
  1321. * Add space in the line for (in order) spaces, cipher mode, cipher IV
  1322. * mode, sector offset, sector size and the trailing newline. This is
  1323. * an upper bound on the size of this data. There are 15 extra bytes
  1324. * in an earlier version of this code that are unaccounted for. It is
  1325. * left in the calculations in case it is needed. At worst, its short-
  1326. * lived wasted space.
  1327. */
  1328. size += 5 + 5 + 8 + 20 + 6 + 1 + 15;
  1329. if (i->essiv_hash)
  1330. size += grub_strlen (i->essiv_hash->name);
  1331. size += i->keysize * 2;
  1332. }
  1333. ret = grub_malloc (size + 1);
  1334. if (!ret)
  1335. return 0;
  1336. ptr = ret;
  1337. for (i = cryptodisk_list; i != NULL; i = i->next)
  1338. if (grub_strcmp (i->modname, "luks") == 0 ||
  1339. grub_strcmp (i->modname, "luks2") == 0)
  1340. {
  1341. unsigned j;
  1342. const char *iptr;
  1343. ptr = grub_stpcpy (ptr, i->modname);
  1344. ptr = grub_stpcpy (ptr, "_mount ");
  1345. ptr = grub_stpcpy (ptr, i->uuid);
  1346. *ptr++ = ' ';
  1347. ptr += grub_snprintf (ptr, 21, "%" PRIxGRUB_OFFSET, i->offset_sectors);
  1348. *ptr++ = ' ';
  1349. ptr += grub_snprintf (ptr, 7, "%u", 1 << i->log_sector_size);
  1350. *ptr++ = ' ';
  1351. for (iptr = i->cipher->cipher->name; *iptr; iptr++)
  1352. *ptr++ = grub_tolower (*iptr);
  1353. switch (i->mode)
  1354. {
  1355. case GRUB_CRYPTODISK_MODE_ECB:
  1356. ptr = grub_stpcpy (ptr, "-ecb");
  1357. break;
  1358. case GRUB_CRYPTODISK_MODE_CBC:
  1359. ptr = grub_stpcpy (ptr, "-cbc");
  1360. break;
  1361. case GRUB_CRYPTODISK_MODE_PCBC:
  1362. ptr = grub_stpcpy (ptr, "-pcbc");
  1363. break;
  1364. case GRUB_CRYPTODISK_MODE_XTS:
  1365. ptr = grub_stpcpy (ptr, "-xts");
  1366. break;
  1367. case GRUB_CRYPTODISK_MODE_LRW:
  1368. ptr = grub_stpcpy (ptr, "-lrw");
  1369. break;
  1370. }
  1371. switch (i->mode_iv)
  1372. {
  1373. case GRUB_CRYPTODISK_MODE_IV_NULL:
  1374. ptr = grub_stpcpy (ptr, "-null");
  1375. break;
  1376. case GRUB_CRYPTODISK_MODE_IV_PLAIN:
  1377. ptr = grub_stpcpy (ptr, "-plain");
  1378. break;
  1379. case GRUB_CRYPTODISK_MODE_IV_PLAIN64:
  1380. ptr = grub_stpcpy (ptr, "-plain64");
  1381. break;
  1382. case GRUB_CRYPTODISK_MODE_IV_BENBI:
  1383. ptr = grub_stpcpy (ptr, "-benbi");
  1384. break;
  1385. case GRUB_CRYPTODISK_MODE_IV_ESSIV:
  1386. ptr = grub_stpcpy (ptr, "-essiv:");
  1387. ptr = grub_stpcpy (ptr, i->essiv_hash->name);
  1388. break;
  1389. case GRUB_CRYPTODISK_MODE_IV_BYTECOUNT64:
  1390. case GRUB_CRYPTODISK_MODE_IV_BYTECOUNT64_HASH:
  1391. break;
  1392. }
  1393. *ptr++ = ' ';
  1394. for (j = 0; j < i->keysize; j++)
  1395. {
  1396. *ptr++ = hex (i->key[j] >> 4);
  1397. *ptr++ = hex (i->key[j] & 0xf);
  1398. }
  1399. *ptr++ = '\n';
  1400. }
  1401. *ptr = '\0';
  1402. *sz = ptr - ret;
  1403. return ret;
  1404. }
  1405. struct grub_procfs_entry luks_script =
  1406. {
  1407. .name = "luks_script",
  1408. .get_contents = luks_script_get
  1409. };
  1410. static grub_extcmd_t cmd;
  1411. GRUB_MOD_INIT (cryptodisk)
  1412. {
  1413. grub_disk_dev_register (&grub_cryptodisk_dev);
  1414. cmd = grub_register_extcmd ("cryptomount", grub_cmd_cryptomount, 0,
  1415. N_("[ [-p password] | [-k keyfile"
  1416. " [-O keyoffset] [-S keysize] ] ] [-H file]"
  1417. " <SOURCE|-u UUID|-a|-b>"),
  1418. N_("Mount a crypto device."), options);
  1419. grub_procfs_register ("luks_script", &luks_script);
  1420. }
  1421. GRUB_MOD_FINI (cryptodisk)
  1422. {
  1423. grub_disk_dev_unregister (&grub_cryptodisk_dev);
  1424. cryptodisk_cleanup ();
  1425. grub_unregister_extcmd (cmd);
  1426. grub_procfs_unregister (&luks_script);
  1427. }