17d969014SDaniel P. Berrange /* 27d969014SDaniel P. Berrange * QEMU Crypto block device encryption 37d969014SDaniel P. Berrange * 47d969014SDaniel P. Berrange * Copyright (c) 2015-2016 Red Hat, Inc. 57d969014SDaniel P. Berrange * 67d969014SDaniel P. Berrange * This library is free software; you can redistribute it and/or 77d969014SDaniel P. Berrange * modify it under the terms of the GNU Lesser General Public 87d969014SDaniel P. Berrange * License as published by the Free Software Foundation; either 9b7cbb874SThomas Huth * version 2.1 of the License, or (at your option) any later version. 107d969014SDaniel P. Berrange * 117d969014SDaniel P. Berrange * This library is distributed in the hope that it will be useful, 127d969014SDaniel P. Berrange * but WITHOUT ANY WARRANTY; without even the implied warranty of 137d969014SDaniel P. Berrange * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 147d969014SDaniel P. Berrange * Lesser General Public License for more details. 157d969014SDaniel P. Berrange * 167d969014SDaniel P. Berrange * You should have received a copy of the GNU Lesser General Public 177d969014SDaniel P. Berrange * License along with this library; if not, see <http://www.gnu.org/licenses/>. 187d969014SDaniel P. Berrange * 197d969014SDaniel P. Berrange */ 207d969014SDaniel P. Berrange 21121d0712SMarkus Armbruster #ifndef QCRYPTO_BLOCKPRIV_H 22121d0712SMarkus Armbruster #define QCRYPTO_BLOCKPRIV_H 237d969014SDaniel P. Berrange 247d969014SDaniel P. Berrange #include "crypto/block.h" 25c972fa12SVladimir Sementsov-Ogievskiy #include "qemu/thread.h" 267d969014SDaniel P. Berrange 277d969014SDaniel P. Berrange typedef struct QCryptoBlockDriver QCryptoBlockDriver; 287d969014SDaniel P. Berrange 297d969014SDaniel P. Berrange struct QCryptoBlock { 307d969014SDaniel P. Berrange QCryptoBlockFormat format; 317d969014SDaniel P. Berrange 327d969014SDaniel P. Berrange const QCryptoBlockDriver *driver; 337d969014SDaniel P. Berrange void *opaque; 347d969014SDaniel P. Berrange 35af206c28SStefan Hajnoczi /* Cipher parameters */ 36*a092c513SMarkus Armbruster QCryptoCipherAlgo alg; 37af206c28SStefan Hajnoczi QCryptoCipherMode mode; 38af206c28SStefan Hajnoczi uint8_t *key; 39af206c28SStefan Hajnoczi size_t nkey; 40af206c28SStefan Hajnoczi 41af206c28SStefan Hajnoczi QCryptoCipher **free_ciphers; 42af206c28SStefan Hajnoczi size_t max_free_ciphers; 43c972fa12SVladimir Sementsov-Ogievskiy size_t n_free_ciphers; 447d969014SDaniel P. Berrange QCryptoIVGen *ivgen; 45c972fa12SVladimir Sementsov-Ogievskiy QemuMutex mutex; 46c972fa12SVladimir Sementsov-Ogievskiy 47ef834aa2SMarkus Armbruster QCryptoHashAlgo kdfhash; 487d969014SDaniel P. Berrange size_t niv; 497d969014SDaniel P. Berrange uint64_t payload_offset; /* In bytes */ 50850f49deSDaniel P. Berrange uint64_t sector_size; /* In bytes */ 51d74523a3SHyman Huang 52d74523a3SHyman Huang bool detached_header; /* True if disk has a detached LUKS header */ 537d969014SDaniel P. Berrange }; 547d969014SDaniel P. Berrange 557d969014SDaniel P. Berrange struct QCryptoBlockDriver { 567d969014SDaniel P. Berrange int (*open)(QCryptoBlock *block, 577d969014SDaniel P. Berrange QCryptoBlockOpenOptions *options, 581cd9a787SDaniel P. Berrange const char *optprefix, 597d969014SDaniel P. Berrange QCryptoBlockReadFunc readfunc, 607d969014SDaniel P. Berrange void *opaque, 617d969014SDaniel P. Berrange unsigned int flags, 627d969014SDaniel P. Berrange Error **errp); 637d969014SDaniel P. Berrange 647d969014SDaniel P. Berrange int (*create)(QCryptoBlock *block, 657d969014SDaniel P. Berrange QCryptoBlockCreateOptions *options, 661cd9a787SDaniel P. Berrange const char *optprefix, 677d969014SDaniel P. Berrange QCryptoBlockInitFunc initfunc, 687d969014SDaniel P. Berrange QCryptoBlockWriteFunc writefunc, 697d969014SDaniel P. Berrange void *opaque, 707d969014SDaniel P. Berrange Error **errp); 717d969014SDaniel P. Berrange 7243cbd06dSMaxim Levitsky int (*amend)(QCryptoBlock *block, 7343cbd06dSMaxim Levitsky QCryptoBlockReadFunc readfunc, 7443cbd06dSMaxim Levitsky QCryptoBlockWriteFunc writefunc, 7543cbd06dSMaxim Levitsky void *opaque, 7643cbd06dSMaxim Levitsky QCryptoBlockAmendOptions *options, 7743cbd06dSMaxim Levitsky bool force, 7843cbd06dSMaxim Levitsky Error **errp); 7943cbd06dSMaxim Levitsky 8040c85028SDaniel P. Berrange int (*get_info)(QCryptoBlock *block, 8140c85028SDaniel P. Berrange QCryptoBlockInfo *info, 8240c85028SDaniel P. Berrange Error **errp); 8340c85028SDaniel P. Berrange 847d969014SDaniel P. Berrange void (*cleanup)(QCryptoBlock *block); 857d969014SDaniel P. Berrange 867d969014SDaniel P. Berrange int (*encrypt)(QCryptoBlock *block, 877d969014SDaniel P. Berrange uint64_t startsector, 887d969014SDaniel P. Berrange uint8_t *buf, 897d969014SDaniel P. Berrange size_t len, 907d969014SDaniel P. Berrange Error **errp); 917d969014SDaniel P. Berrange int (*decrypt)(QCryptoBlock *block, 927d969014SDaniel P. Berrange uint64_t startsector, 937d969014SDaniel P. Berrange uint8_t *buf, 947d969014SDaniel P. Berrange size_t len, 957d969014SDaniel P. Berrange Error **errp); 967d969014SDaniel P. Berrange 977d969014SDaniel P. Berrange bool (*has_format)(const uint8_t *buf, 987d969014SDaniel P. Berrange size_t buflen); 997d969014SDaniel P. Berrange }; 1007d969014SDaniel P. Berrange 1017d969014SDaniel P. Berrange 1020270417cSVladimir Sementsov-Ogievskiy int qcrypto_block_cipher_decrypt_helper(QCryptoCipher *cipher, 1037d969014SDaniel P. Berrange size_t niv, 1047d969014SDaniel P. Berrange QCryptoIVGen *ivgen, 1057d969014SDaniel P. Berrange int sectorsize, 1064609742aSDaniel P. Berrange uint64_t offset, 1077d969014SDaniel P. Berrange uint8_t *buf, 1087d969014SDaniel P. Berrange size_t len, 1097d969014SDaniel P. Berrange Error **errp); 1107d969014SDaniel P. Berrange 1110270417cSVladimir Sementsov-Ogievskiy int qcrypto_block_cipher_encrypt_helper(QCryptoCipher *cipher, 1127d969014SDaniel P. Berrange size_t niv, 1137d969014SDaniel P. Berrange QCryptoIVGen *ivgen, 1147d969014SDaniel P. Berrange int sectorsize, 1154609742aSDaniel P. Berrange uint64_t offset, 1167d969014SDaniel P. Berrange uint8_t *buf, 1177d969014SDaniel P. Berrange size_t len, 1187d969014SDaniel P. Berrange Error **errp); 1197d969014SDaniel P. Berrange 1200f0d596cSVladimir Sementsov-Ogievskiy int qcrypto_block_decrypt_helper(QCryptoBlock *block, 1210f0d596cSVladimir Sementsov-Ogievskiy int sectorsize, 1220f0d596cSVladimir Sementsov-Ogievskiy uint64_t offset, 1230f0d596cSVladimir Sementsov-Ogievskiy uint8_t *buf, 1240f0d596cSVladimir Sementsov-Ogievskiy size_t len, 1250f0d596cSVladimir Sementsov-Ogievskiy Error **errp); 1260f0d596cSVladimir Sementsov-Ogievskiy 1270f0d596cSVladimir Sementsov-Ogievskiy int qcrypto_block_encrypt_helper(QCryptoBlock *block, 1280f0d596cSVladimir Sementsov-Ogievskiy int sectorsize, 1290f0d596cSVladimir Sementsov-Ogievskiy uint64_t offset, 1300f0d596cSVladimir Sementsov-Ogievskiy uint8_t *buf, 1310f0d596cSVladimir Sementsov-Ogievskiy size_t len, 1320f0d596cSVladimir Sementsov-Ogievskiy Error **errp); 1330f0d596cSVladimir Sementsov-Ogievskiy 134c972fa12SVladimir Sementsov-Ogievskiy int qcrypto_block_init_cipher(QCryptoBlock *block, 135*a092c513SMarkus Armbruster QCryptoCipherAlgo alg, 136c972fa12SVladimir Sementsov-Ogievskiy QCryptoCipherMode mode, 137c972fa12SVladimir Sementsov-Ogievskiy const uint8_t *key, size_t nkey, 138af206c28SStefan Hajnoczi Error **errp); 139c972fa12SVladimir Sementsov-Ogievskiy 140c972fa12SVladimir Sementsov-Ogievskiy void qcrypto_block_free_cipher(QCryptoBlock *block); 141c972fa12SVladimir Sementsov-Ogievskiy 142121d0712SMarkus Armbruster #endif /* QCRYPTO_BLOCKPRIV_H */ 143