block.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475
  1. /*
  2. * QEMU Crypto block device encryption
  3. *
  4. * Copyright (c) 2015-2016 Red Hat, Inc.
  5. *
  6. * This library is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 2.1 of the License, or (at your option) any later version.
  10. *
  11. * This library is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public
  17. * License along with this library; if not, see <http://www.gnu.org/licenses/>.
  18. *
  19. */
  20. #include "qemu/osdep.h"
  21. #include "qapi/error.h"
  22. #include "blockpriv.h"
  23. #include "block-qcow.h"
  24. #include "block-luks.h"
  25. static const QCryptoBlockDriver *qcrypto_block_drivers[] = {
  26. [Q_CRYPTO_BLOCK_FORMAT_QCOW] = &qcrypto_block_driver_qcow,
  27. [Q_CRYPTO_BLOCK_FORMAT_LUKS] = &qcrypto_block_driver_luks,
  28. };
  29. bool qcrypto_block_has_format(QCryptoBlockFormat format,
  30. const uint8_t *buf,
  31. size_t len)
  32. {
  33. const QCryptoBlockDriver *driver;
  34. if (format >= G_N_ELEMENTS(qcrypto_block_drivers) ||
  35. !qcrypto_block_drivers[format]) {
  36. return false;
  37. }
  38. driver = qcrypto_block_drivers[format];
  39. return driver->has_format(buf, len);
  40. }
  41. QCryptoBlock *qcrypto_block_open(QCryptoBlockOpenOptions *options,
  42. const char *optprefix,
  43. QCryptoBlockReadFunc readfunc,
  44. void *opaque,
  45. unsigned int flags,
  46. size_t n_threads,
  47. Error **errp)
  48. {
  49. QCryptoBlock *block = g_new0(QCryptoBlock, 1);
  50. block->format = options->format;
  51. if (options->format >= G_N_ELEMENTS(qcrypto_block_drivers) ||
  52. !qcrypto_block_drivers[options->format]) {
  53. error_setg(errp, "Unsupported block driver %s",
  54. QCryptoBlockFormat_str(options->format));
  55. g_free(block);
  56. return NULL;
  57. }
  58. block->driver = qcrypto_block_drivers[options->format];
  59. if (block->driver->open(block, options, optprefix,
  60. readfunc, opaque, flags, n_threads, errp) < 0)
  61. {
  62. g_free(block);
  63. return NULL;
  64. }
  65. qemu_mutex_init(&block->mutex);
  66. return block;
  67. }
  68. QCryptoBlock *qcrypto_block_create(QCryptoBlockCreateOptions *options,
  69. const char *optprefix,
  70. QCryptoBlockInitFunc initfunc,
  71. QCryptoBlockWriteFunc writefunc,
  72. void *opaque,
  73. Error **errp)
  74. {
  75. QCryptoBlock *block = g_new0(QCryptoBlock, 1);
  76. block->format = options->format;
  77. if (options->format >= G_N_ELEMENTS(qcrypto_block_drivers) ||
  78. !qcrypto_block_drivers[options->format]) {
  79. error_setg(errp, "Unsupported block driver %s",
  80. QCryptoBlockFormat_str(options->format));
  81. g_free(block);
  82. return NULL;
  83. }
  84. block->driver = qcrypto_block_drivers[options->format];
  85. if (block->driver->create(block, options, optprefix, initfunc,
  86. writefunc, opaque, errp) < 0) {
  87. g_free(block);
  88. return NULL;
  89. }
  90. qemu_mutex_init(&block->mutex);
  91. return block;
  92. }
  93. static ssize_t qcrypto_block_headerlen_hdr_init_func(QCryptoBlock *block,
  94. size_t headerlen, void *opaque, Error **errp)
  95. {
  96. size_t *headerlenp = opaque;
  97. /* Stash away the payload size */
  98. *headerlenp = headerlen;
  99. return 0;
  100. }
  101. static ssize_t qcrypto_block_headerlen_hdr_write_func(QCryptoBlock *block,
  102. size_t offset, const uint8_t *buf, size_t buflen,
  103. void *opaque, Error **errp)
  104. {
  105. /* Discard the bytes, we're not actually writing to an image */
  106. return buflen;
  107. }
  108. bool
  109. qcrypto_block_calculate_payload_offset(QCryptoBlockCreateOptions *create_opts,
  110. const char *optprefix,
  111. size_t *len,
  112. Error **errp)
  113. {
  114. /* Fake LUKS creation in order to determine the payload size */
  115. g_autoptr(QCryptoBlock) crypto =
  116. qcrypto_block_create(create_opts, optprefix,
  117. qcrypto_block_headerlen_hdr_init_func,
  118. qcrypto_block_headerlen_hdr_write_func,
  119. len, errp);
  120. return crypto != NULL;
  121. }
  122. int qcrypto_block_amend_options(QCryptoBlock *block,
  123. QCryptoBlockReadFunc readfunc,
  124. QCryptoBlockWriteFunc writefunc,
  125. void *opaque,
  126. QCryptoBlockAmendOptions *options,
  127. bool force,
  128. Error **errp)
  129. {
  130. if (options->format != block->format) {
  131. error_setg(errp,
  132. "Cannot amend encryption format");
  133. return -1;
  134. }
  135. if (!block->driver->amend) {
  136. error_setg(errp,
  137. "Crypto format %s doesn't support format options amendment",
  138. QCryptoBlockFormat_str(block->format));
  139. return -1;
  140. }
  141. return block->driver->amend(block,
  142. readfunc,
  143. writefunc,
  144. opaque,
  145. options,
  146. force,
  147. errp);
  148. }
  149. QCryptoBlockInfo *qcrypto_block_get_info(QCryptoBlock *block,
  150. Error **errp)
  151. {
  152. QCryptoBlockInfo *info = g_new0(QCryptoBlockInfo, 1);
  153. info->format = block->format;
  154. if (block->driver->get_info &&
  155. block->driver->get_info(block, info, errp) < 0) {
  156. g_free(info);
  157. return NULL;
  158. }
  159. return info;
  160. }
  161. int qcrypto_block_decrypt(QCryptoBlock *block,
  162. uint64_t offset,
  163. uint8_t *buf,
  164. size_t len,
  165. Error **errp)
  166. {
  167. return block->driver->decrypt(block, offset, buf, len, errp);
  168. }
  169. int qcrypto_block_encrypt(QCryptoBlock *block,
  170. uint64_t offset,
  171. uint8_t *buf,
  172. size_t len,
  173. Error **errp)
  174. {
  175. return block->driver->encrypt(block, offset, buf, len, errp);
  176. }
  177. QCryptoCipher *qcrypto_block_get_cipher(QCryptoBlock *block)
  178. {
  179. /* Ciphers should be accessed through pop/push method to be thread-safe.
  180. * Better, they should not be accessed externally at all (note, that
  181. * pop/push are static functions)
  182. * This function is used only in test with one thread (it's safe to skip
  183. * pop/push interface), so it's enough to assert it here:
  184. */
  185. assert(block->n_ciphers <= 1);
  186. return block->ciphers ? block->ciphers[0] : NULL;
  187. }
  188. static QCryptoCipher *qcrypto_block_pop_cipher(QCryptoBlock *block)
  189. {
  190. QCryptoCipher *cipher;
  191. qemu_mutex_lock(&block->mutex);
  192. assert(block->n_free_ciphers > 0);
  193. block->n_free_ciphers--;
  194. cipher = block->ciphers[block->n_free_ciphers];
  195. qemu_mutex_unlock(&block->mutex);
  196. return cipher;
  197. }
  198. static void qcrypto_block_push_cipher(QCryptoBlock *block,
  199. QCryptoCipher *cipher)
  200. {
  201. qemu_mutex_lock(&block->mutex);
  202. assert(block->n_free_ciphers < block->n_ciphers);
  203. block->ciphers[block->n_free_ciphers] = cipher;
  204. block->n_free_ciphers++;
  205. qemu_mutex_unlock(&block->mutex);
  206. }
  207. int qcrypto_block_init_cipher(QCryptoBlock *block,
  208. QCryptoCipherAlgorithm alg,
  209. QCryptoCipherMode mode,
  210. const uint8_t *key, size_t nkey,
  211. size_t n_threads, Error **errp)
  212. {
  213. size_t i;
  214. assert(!block->ciphers && !block->n_ciphers && !block->n_free_ciphers);
  215. block->ciphers = g_new0(QCryptoCipher *, n_threads);
  216. for (i = 0; i < n_threads; i++) {
  217. block->ciphers[i] = qcrypto_cipher_new(alg, mode, key, nkey, errp);
  218. if (!block->ciphers[i]) {
  219. qcrypto_block_free_cipher(block);
  220. return -1;
  221. }
  222. block->n_ciphers++;
  223. block->n_free_ciphers++;
  224. }
  225. return 0;
  226. }
  227. void qcrypto_block_free_cipher(QCryptoBlock *block)
  228. {
  229. size_t i;
  230. if (!block->ciphers) {
  231. return;
  232. }
  233. assert(block->n_ciphers == block->n_free_ciphers);
  234. for (i = 0; i < block->n_ciphers; i++) {
  235. qcrypto_cipher_free(block->ciphers[i]);
  236. }
  237. g_free(block->ciphers);
  238. block->ciphers = NULL;
  239. block->n_ciphers = block->n_free_ciphers = 0;
  240. }
  241. QCryptoIVGen *qcrypto_block_get_ivgen(QCryptoBlock *block)
  242. {
  243. /* ivgen should be accessed under mutex. However, this function is used only
  244. * in test with one thread, so it's enough to assert it here:
  245. */
  246. assert(block->n_ciphers <= 1);
  247. return block->ivgen;
  248. }
  249. QCryptoHashAlgorithm qcrypto_block_get_kdf_hash(QCryptoBlock *block)
  250. {
  251. return block->kdfhash;
  252. }
  253. uint64_t qcrypto_block_get_payload_offset(QCryptoBlock *block)
  254. {
  255. return block->payload_offset;
  256. }
  257. uint64_t qcrypto_block_get_sector_size(QCryptoBlock *block)
  258. {
  259. return block->sector_size;
  260. }
  261. void qcrypto_block_free(QCryptoBlock *block)
  262. {
  263. if (!block) {
  264. return;
  265. }
  266. block->driver->cleanup(block);
  267. qcrypto_block_free_cipher(block);
  268. qcrypto_ivgen_free(block->ivgen);
  269. qemu_mutex_destroy(&block->mutex);
  270. g_free(block);
  271. }
  272. typedef int (*QCryptoCipherEncDecFunc)(QCryptoCipher *cipher,
  273. const void *in,
  274. void *out,
  275. size_t len,
  276. Error **errp);
  277. static int do_qcrypto_block_cipher_encdec(QCryptoCipher *cipher,
  278. size_t niv,
  279. QCryptoIVGen *ivgen,
  280. QemuMutex *ivgen_mutex,
  281. int sectorsize,
  282. uint64_t offset,
  283. uint8_t *buf,
  284. size_t len,
  285. QCryptoCipherEncDecFunc func,
  286. Error **errp)
  287. {
  288. g_autofree uint8_t *iv = niv ? g_new0(uint8_t, niv) : NULL;
  289. int ret = -1;
  290. uint64_t startsector = offset / sectorsize;
  291. assert(QEMU_IS_ALIGNED(offset, sectorsize));
  292. assert(QEMU_IS_ALIGNED(len, sectorsize));
  293. while (len > 0) {
  294. size_t nbytes;
  295. if (niv) {
  296. if (ivgen_mutex) {
  297. qemu_mutex_lock(ivgen_mutex);
  298. }
  299. ret = qcrypto_ivgen_calculate(ivgen, startsector, iv, niv, errp);
  300. if (ivgen_mutex) {
  301. qemu_mutex_unlock(ivgen_mutex);
  302. }
  303. if (ret < 0) {
  304. return -1;
  305. }
  306. if (qcrypto_cipher_setiv(cipher,
  307. iv, niv,
  308. errp) < 0) {
  309. return -1;
  310. }
  311. }
  312. nbytes = len > sectorsize ? sectorsize : len;
  313. if (func(cipher, buf, buf, nbytes, errp) < 0) {
  314. return -1;
  315. }
  316. startsector++;
  317. buf += nbytes;
  318. len -= nbytes;
  319. }
  320. return 0;
  321. }
  322. int qcrypto_block_cipher_decrypt_helper(QCryptoCipher *cipher,
  323. size_t niv,
  324. QCryptoIVGen *ivgen,
  325. int sectorsize,
  326. uint64_t offset,
  327. uint8_t *buf,
  328. size_t len,
  329. Error **errp)
  330. {
  331. return do_qcrypto_block_cipher_encdec(cipher, niv, ivgen, NULL, sectorsize,
  332. offset, buf, len,
  333. qcrypto_cipher_decrypt, errp);
  334. }
  335. int qcrypto_block_cipher_encrypt_helper(QCryptoCipher *cipher,
  336. size_t niv,
  337. QCryptoIVGen *ivgen,
  338. int sectorsize,
  339. uint64_t offset,
  340. uint8_t *buf,
  341. size_t len,
  342. Error **errp)
  343. {
  344. return do_qcrypto_block_cipher_encdec(cipher, niv, ivgen, NULL, sectorsize,
  345. offset, buf, len,
  346. qcrypto_cipher_encrypt, errp);
  347. }
  348. int qcrypto_block_decrypt_helper(QCryptoBlock *block,
  349. int sectorsize,
  350. uint64_t offset,
  351. uint8_t *buf,
  352. size_t len,
  353. Error **errp)
  354. {
  355. int ret;
  356. QCryptoCipher *cipher = qcrypto_block_pop_cipher(block);
  357. ret = do_qcrypto_block_cipher_encdec(cipher, block->niv, block->ivgen,
  358. &block->mutex, sectorsize, offset, buf,
  359. len, qcrypto_cipher_decrypt, errp);
  360. qcrypto_block_push_cipher(block, cipher);
  361. return ret;
  362. }
  363. int qcrypto_block_encrypt_helper(QCryptoBlock *block,
  364. int sectorsize,
  365. uint64_t offset,
  366. uint8_t *buf,
  367. size_t len,
  368. Error **errp)
  369. {
  370. int ret;
  371. QCryptoCipher *cipher = qcrypto_block_pop_cipher(block);
  372. ret = do_qcrypto_block_cipher_encdec(cipher, block->niv, block->ivgen,
  373. &block->mutex, sectorsize, offset, buf,
  374. len, qcrypto_cipher_encrypt, errp);
  375. qcrypto_block_push_cipher(block, cipher);
  376. return ret;
  377. }