xref: /openbmc/qemu/crypto/blockpriv.h (revision b8eada54b2ad8a7d98d93d5ab4d3e888c5880097)
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