1 /* SPDX-License-Identifier: GPL-2.0 */
3 * AEGIS common definitions
5 * Copyright (c) 2018 Ondrej Mosnacek <omosnacek@gmail.com>
6 * Copyright (c) 2018 Red Hat, Inc. All rights reserved.
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the Free
10 * Software Foundation; either version 2 of the License, or (at your option)
14 #ifndef _CRYPTO_AEGIS_H
15 #define _CRYPTO_AEGIS_H
17 #include <crypto/aes.h>
18 #include <linux/types.h>
20 #define AEGIS_BLOCK_SIZE 16
23 __le64 words64
[AEGIS_BLOCK_SIZE
/ sizeof(__le64
)];
24 __le32 words32
[AEGIS_BLOCK_SIZE
/ sizeof(__le32
)];
25 u8 bytes
[AEGIS_BLOCK_SIZE
];
28 #define AEGIS_BLOCK_ALIGN (__alignof__(union aegis_block))
29 #define AEGIS_ALIGNED(p) IS_ALIGNED((uintptr_t)p, AEGIS_BLOCK_ALIGN)
31 static const union aegis_block crypto_aegis_const
[2] = {
33 cpu_to_le64(U64_C(0x0d08050302010100)),
34 cpu_to_le64(U64_C(0x6279e99059372215)),
37 cpu_to_le64(U64_C(0xf12fc26d55183ddb)),
38 cpu_to_le64(U64_C(0xdd28b57342311120)),
42 static void crypto_aegis_block_xor(union aegis_block
*dst
,
43 const union aegis_block
*src
)
45 dst
->words64
[0] ^= src
->words64
[0];
46 dst
->words64
[1] ^= src
->words64
[1];
49 static void crypto_aegis_block_and(union aegis_block
*dst
,
50 const union aegis_block
*src
)
52 dst
->words64
[0] &= src
->words64
[0];
53 dst
->words64
[1] &= src
->words64
[1];
56 static void crypto_aegis_aesenc(union aegis_block
*dst
,
57 const union aegis_block
*src
,
58 const union aegis_block
*key
)
60 const u8
*s
= src
->bytes
;
61 const u32
*t0
= crypto_ft_tab
[0];
62 const u32
*t1
= crypto_ft_tab
[1];
63 const u32
*t2
= crypto_ft_tab
[2];
64 const u32
*t3
= crypto_ft_tab
[3];
67 d0
= t0
[s
[ 0]] ^ t1
[s
[ 5]] ^ t2
[s
[10]] ^ t3
[s
[15]];
68 d1
= t0
[s
[ 4]] ^ t1
[s
[ 9]] ^ t2
[s
[14]] ^ t3
[s
[ 3]];
69 d2
= t0
[s
[ 8]] ^ t1
[s
[13]] ^ t2
[s
[ 2]] ^ t3
[s
[ 7]];
70 d3
= t0
[s
[12]] ^ t1
[s
[ 1]] ^ t2
[s
[ 6]] ^ t3
[s
[11]];
72 dst
->words32
[0] = cpu_to_le32(d0
) ^ key
->words32
[0];
73 dst
->words32
[1] = cpu_to_le32(d1
) ^ key
->words32
[1];
74 dst
->words32
[2] = cpu_to_le32(d2
) ^ key
->words32
[2];
75 dst
->words32
[3] = cpu_to_le32(d3
) ^ key
->words32
[3];
78 #endif /* _CRYPTO_AEGIS_H */