block.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410
  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. QCryptoBlockInfo *qcrypto_block_get_info(QCryptoBlock *block,
  94. Error **errp)
  95. {
  96. QCryptoBlockInfo *info = g_new0(QCryptoBlockInfo, 1);
  97. info->format = block->format;
  98. if (block->driver->get_info &&
  99. block->driver->get_info(block, info, errp) < 0) {
  100. g_free(info);
  101. return NULL;
  102. }
  103. return info;
  104. }
  105. int qcrypto_block_decrypt(QCryptoBlock *block,
  106. uint64_t offset,
  107. uint8_t *buf,
  108. size_t len,
  109. Error **errp)
  110. {
  111. return block->driver->decrypt(block, offset, buf, len, errp);
  112. }
  113. int qcrypto_block_encrypt(QCryptoBlock *block,
  114. uint64_t offset,
  115. uint8_t *buf,
  116. size_t len,
  117. Error **errp)
  118. {
  119. return block->driver->encrypt(block, offset, buf, len, errp);
  120. }
  121. QCryptoCipher *qcrypto_block_get_cipher(QCryptoBlock *block)
  122. {
  123. /* Ciphers should be accessed through pop/push method to be thread-safe.
  124. * Better, they should not be accessed externally at all (note, that
  125. * pop/push are static functions)
  126. * This function is used only in test with one thread (it's safe to skip
  127. * pop/push interface), so it's enough to assert it here:
  128. */
  129. assert(block->n_ciphers <= 1);
  130. return block->ciphers ? block->ciphers[0] : NULL;
  131. }
  132. static QCryptoCipher *qcrypto_block_pop_cipher(QCryptoBlock *block)
  133. {
  134. QCryptoCipher *cipher;
  135. qemu_mutex_lock(&block->mutex);
  136. assert(block->n_free_ciphers > 0);
  137. block->n_free_ciphers--;
  138. cipher = block->ciphers[block->n_free_ciphers];
  139. qemu_mutex_unlock(&block->mutex);
  140. return cipher;
  141. }
  142. static void qcrypto_block_push_cipher(QCryptoBlock *block,
  143. QCryptoCipher *cipher)
  144. {
  145. qemu_mutex_lock(&block->mutex);
  146. assert(block->n_free_ciphers < block->n_ciphers);
  147. block->ciphers[block->n_free_ciphers] = cipher;
  148. block->n_free_ciphers++;
  149. qemu_mutex_unlock(&block->mutex);
  150. }
  151. int qcrypto_block_init_cipher(QCryptoBlock *block,
  152. QCryptoCipherAlgorithm alg,
  153. QCryptoCipherMode mode,
  154. const uint8_t *key, size_t nkey,
  155. size_t n_threads, Error **errp)
  156. {
  157. size_t i;
  158. assert(!block->ciphers && !block->n_ciphers && !block->n_free_ciphers);
  159. block->ciphers = g_new0(QCryptoCipher *, n_threads);
  160. for (i = 0; i < n_threads; i++) {
  161. block->ciphers[i] = qcrypto_cipher_new(alg, mode, key, nkey, errp);
  162. if (!block->ciphers[i]) {
  163. qcrypto_block_free_cipher(block);
  164. return -1;
  165. }
  166. block->n_ciphers++;
  167. block->n_free_ciphers++;
  168. }
  169. return 0;
  170. }
  171. void qcrypto_block_free_cipher(QCryptoBlock *block)
  172. {
  173. size_t i;
  174. if (!block->ciphers) {
  175. return;
  176. }
  177. assert(block->n_ciphers == block->n_free_ciphers);
  178. for (i = 0; i < block->n_ciphers; i++) {
  179. qcrypto_cipher_free(block->ciphers[i]);
  180. }
  181. g_free(block->ciphers);
  182. block->ciphers = NULL;
  183. block->n_ciphers = block->n_free_ciphers = 0;
  184. }
  185. QCryptoIVGen *qcrypto_block_get_ivgen(QCryptoBlock *block)
  186. {
  187. /* ivgen should be accessed under mutex. However, this function is used only
  188. * in test with one thread, so it's enough to assert it here:
  189. */
  190. assert(block->n_ciphers <= 1);
  191. return block->ivgen;
  192. }
  193. QCryptoHashAlgorithm qcrypto_block_get_kdf_hash(QCryptoBlock *block)
  194. {
  195. return block->kdfhash;
  196. }
  197. uint64_t qcrypto_block_get_payload_offset(QCryptoBlock *block)
  198. {
  199. return block->payload_offset;
  200. }
  201. uint64_t qcrypto_block_get_sector_size(QCryptoBlock *block)
  202. {
  203. return block->sector_size;
  204. }
  205. void qcrypto_block_free(QCryptoBlock *block)
  206. {
  207. if (!block) {
  208. return;
  209. }
  210. block->driver->cleanup(block);
  211. qcrypto_block_free_cipher(block);
  212. qcrypto_ivgen_free(block->ivgen);
  213. qemu_mutex_destroy(&block->mutex);
  214. g_free(block);
  215. }
  216. typedef int (*QCryptoCipherEncDecFunc)(QCryptoCipher *cipher,
  217. const void *in,
  218. void *out,
  219. size_t len,
  220. Error **errp);
  221. static int do_qcrypto_block_cipher_encdec(QCryptoCipher *cipher,
  222. size_t niv,
  223. QCryptoIVGen *ivgen,
  224. QemuMutex *ivgen_mutex,
  225. int sectorsize,
  226. uint64_t offset,
  227. uint8_t *buf,
  228. size_t len,
  229. QCryptoCipherEncDecFunc func,
  230. Error **errp)
  231. {
  232. g_autofree uint8_t *iv = niv ? g_new0(uint8_t, niv) : NULL;
  233. int ret = -1;
  234. uint64_t startsector = offset / sectorsize;
  235. assert(QEMU_IS_ALIGNED(offset, sectorsize));
  236. assert(QEMU_IS_ALIGNED(len, sectorsize));
  237. while (len > 0) {
  238. size_t nbytes;
  239. if (niv) {
  240. if (ivgen_mutex) {
  241. qemu_mutex_lock(ivgen_mutex);
  242. }
  243. ret = qcrypto_ivgen_calculate(ivgen, startsector, iv, niv, errp);
  244. if (ivgen_mutex) {
  245. qemu_mutex_unlock(ivgen_mutex);
  246. }
  247. if (ret < 0) {
  248. return -1;
  249. }
  250. if (qcrypto_cipher_setiv(cipher,
  251. iv, niv,
  252. errp) < 0) {
  253. return -1;
  254. }
  255. }
  256. nbytes = len > sectorsize ? sectorsize : len;
  257. if (func(cipher, buf, buf, nbytes, errp) < 0) {
  258. return -1;
  259. }
  260. startsector++;
  261. buf += nbytes;
  262. len -= nbytes;
  263. }
  264. return 0;
  265. }
  266. int qcrypto_block_cipher_decrypt_helper(QCryptoCipher *cipher,
  267. size_t niv,
  268. QCryptoIVGen *ivgen,
  269. int sectorsize,
  270. uint64_t offset,
  271. uint8_t *buf,
  272. size_t len,
  273. Error **errp)
  274. {
  275. return do_qcrypto_block_cipher_encdec(cipher, niv, ivgen, NULL, sectorsize,
  276. offset, buf, len,
  277. qcrypto_cipher_decrypt, errp);
  278. }
  279. int qcrypto_block_cipher_encrypt_helper(QCryptoCipher *cipher,
  280. size_t niv,
  281. QCryptoIVGen *ivgen,
  282. int sectorsize,
  283. uint64_t offset,
  284. uint8_t *buf,
  285. size_t len,
  286. Error **errp)
  287. {
  288. return do_qcrypto_block_cipher_encdec(cipher, niv, ivgen, NULL, sectorsize,
  289. offset, buf, len,
  290. qcrypto_cipher_encrypt, errp);
  291. }
  292. int qcrypto_block_decrypt_helper(QCryptoBlock *block,
  293. int sectorsize,
  294. uint64_t offset,
  295. uint8_t *buf,
  296. size_t len,
  297. Error **errp)
  298. {
  299. int ret;
  300. QCryptoCipher *cipher = qcrypto_block_pop_cipher(block);
  301. ret = do_qcrypto_block_cipher_encdec(cipher, block->niv, block->ivgen,
  302. &block->mutex, sectorsize, offset, buf,
  303. len, qcrypto_cipher_decrypt, errp);
  304. qcrypto_block_push_cipher(block, cipher);
  305. return ret;
  306. }
  307. int qcrypto_block_encrypt_helper(QCryptoBlock *block,
  308. int sectorsize,
  309. uint64_t offset,
  310. uint8_t *buf,
  311. size_t len,
  312. Error **errp)
  313. {
  314. int ret;
  315. QCryptoCipher *cipher = qcrypto_block_pop_cipher(block);
  316. ret = do_qcrypto_block_cipher_encdec(cipher, block->niv, block->ivgen,
  317. &block->mutex, sectorsize, offset, buf,
  318. len, qcrypto_cipher_encrypt, errp);
  319. qcrypto_block_push_cipher(block, cipher);
  320. return ret;
  321. }