Branch data Line data Source code
1 : : /*
2 : : * Copyright (c) 2010, XenSource Inc.
3 : : * All rights reserved.
4 : : *
5 : : * Redistribution and use in source and binary forms, with or without
6 : : * modification, are permitted provided that the following conditions are met:
7 : : * * Redistributions of source code must retain the above copyright
8 : : * notice, this list of conditions and the following disclaimer.
9 : : * * Redistributions in binary form must reproduce the above copyright
10 : : * notice, this list of conditions and the following disclaimer in the
11 : : * documentation and/or other materials provided with the distribution.
12 : : * * Neither the name of XenSource Inc. nor the names of its contributors
13 : : * may be used to endorse or promote products derived from this software
14 : : * without specific prior written permission.
15 : : *
16 : : * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 : : * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 : : * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 : : * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
20 : : * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21 : : * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22 : : * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23 : : * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
24 : : * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25 : : * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26 : : * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 : : */
28 : :
29 : : /*
30 : : * Copyright (c) 2014 Citrix Systems, Inc.
31 : : */
32 : :
33 : :
34 : : extern struct crypto_blkcipher *xts_aes_setup(void);
35 : :
36 : : int xts_aes_setkey(struct crypto_blkcipher *cipher, const uint8_t *key, unsigned int keysize);
37 : :
38 : : typedef uint64_t sector_t;
39 : :
40 : : static inline void
41 : : xts_aes_plain_iv_generate(uint8_t *iv, int iv_size, sector_t sector)
42 : : {
43 : 0 : memset(iv, 0, iv_size);
44 : 0 : *(uint32_t *)iv = sector & 0xffffffff; /* LITTLE ENDIAN */
45 : : }
46 : :
47 : : static inline int
48 : 0 : xts_aes_plain_encrypt(struct crypto_blkcipher *xts_tfm, sector_t sector,
49 : : uint8_t *dst_buf, uint8_t *src_buf, unsigned int nbytes)
50 : : {
51 : : uint8_t iv[16];
52 : : int dstlen;
53 : : xts_aes_plain_iv_generate(iv, 16, sector);
54 : :
55 : 0 : if (!EVP_CipherInit_ex(xts_tfm->en_ctx, NULL, NULL, NULL, iv, -1))
56 : 0 : return -1;
57 : 0 : if (!EVP_CipherUpdate(xts_tfm->en_ctx, dst_buf, &dstlen, src_buf, nbytes))
58 : : return -2;
59 : : /* no need to finalize with XTS when multiple of blocksize */
60 : 0 : return 0;
61 : : }
62 : :
63 : : static inline int
64 : 0 : xts_aes_plain_decrypt(struct crypto_blkcipher *xts_tfm, sector_t sector,
65 : : uint8_t *dst_buf, uint8_t *src_buf, unsigned int nbytes)
66 : : {
67 : : uint8_t iv[16];
68 : : int dstlen;
69 : : xts_aes_plain_iv_generate(iv, 16, sector);
70 : :
71 : 0 : if (!EVP_CipherInit_ex(xts_tfm->de_ctx, NULL, NULL, NULL, iv, -1))
72 : 0 : return -1;
73 : 0 : if (!EVP_CipherUpdate(xts_tfm->de_ctx, dst_buf, &dstlen, src_buf, nbytes))
74 : : return -2;
75 : : /* no need to finalize with XTS when multiple of blocksize */
76 : 0 : return 0;
77 : : }
|