84f7f180b0
The XTS (XEX with tweaked-codebook and ciphertext stealing) cipher mode is commonly used in full disk encryption. There is unfortunately no implementation of it in either libgcrypt or nettle, so we need to provide our own. The libtomcrypt project provides a repository of crypto algorithms under a choice of either "public domain" or the "what the fuck public license". So this impl is taken from the libtomcrypt GIT repo and adapted to be compatible with the way we need to call ciphers provided by nettle/gcrypt. Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
87 lines
2.8 KiB
C
87 lines
2.8 KiB
C
/*
|
|
* QEMU Crypto XTS cipher mode
|
|
*
|
|
* Copyright (c) 2015-2016 Red Hat, Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
* This code is originally derived from public domain / WTFPL code in
|
|
* LibTomCrypt crytographic library http://libtom.org. The XTS code
|
|
* was donated by Elliptic Semiconductor Inc (www.ellipticsemi.com)
|
|
* to the LibTom Projects
|
|
*
|
|
*/
|
|
|
|
|
|
#ifndef QCRYPTO_XTS_H_
|
|
#define QCRYPTO_XTS_H_
|
|
|
|
#include "qemu-common.h"
|
|
#include "qapi/error.h"
|
|
|
|
|
|
#define XTS_BLOCK_SIZE 16
|
|
|
|
typedef void xts_cipher_func(const void *ctx,
|
|
size_t length,
|
|
uint8_t *dst,
|
|
const uint8_t *src);
|
|
|
|
/**
|
|
* xts_decrypt:
|
|
* @datactx: the cipher context for data decryption
|
|
* @tweakctx: the cipher context for tweak decryption
|
|
* @encfunc: the cipher function for encryption
|
|
* @decfunc: the cipher function for decryption
|
|
* @iv: the initialization vector tweak of XTS_BLOCK_SIZE bytes
|
|
* @length: the length of @dst and @src
|
|
* @dst: buffer to hold the decrypted plaintext
|
|
* @src: buffer providing the ciphertext
|
|
*
|
|
* Decrypts @src into @dst
|
|
*/
|
|
void xts_decrypt(const void *datactx,
|
|
const void *tweakctx,
|
|
xts_cipher_func *encfunc,
|
|
xts_cipher_func *decfunc,
|
|
uint8_t *iv,
|
|
size_t length,
|
|
uint8_t *dst,
|
|
const uint8_t *src);
|
|
|
|
/**
|
|
* xts_decrypt:
|
|
* @datactx: the cipher context for data encryption
|
|
* @tweakctx: the cipher context for tweak encryption
|
|
* @encfunc: the cipher function for encryption
|
|
* @decfunc: the cipher function for decryption
|
|
* @iv: the initialization vector tweak of XTS_BLOCK_SIZE bytes
|
|
* @length: the length of @dst and @src
|
|
* @dst: buffer to hold the encrypted ciphertext
|
|
* @src: buffer providing the plaintext
|
|
*
|
|
* Decrypts @src into @dst
|
|
*/
|
|
void xts_encrypt(const void *datactx,
|
|
const void *tweakctx,
|
|
xts_cipher_func *encfunc,
|
|
xts_cipher_func *decfunc,
|
|
uint8_t *iv,
|
|
size_t length,
|
|
uint8_t *dst,
|
|
const uint8_t *src);
|
|
|
|
|
|
#endif /* QCRYPTO_XTS_H_ */
|