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 u32 words32
[AEGIS_BLOCK_SIZE
/ sizeof(u32
)];
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 u32
*d
= dst
->words32
;
61 const u8
*s
= src
->bytes
;
62 const u32
*k
= key
->words32
;
63 const u32
*t0
= crypto_ft_tab
[0];
64 const u32
*t1
= crypto_ft_tab
[1];
65 const u32
*t2
= crypto_ft_tab
[2];
66 const u32
*t3
= crypto_ft_tab
[3];
69 d0
= t0
[s
[ 0]] ^ t1
[s
[ 5]] ^ t2
[s
[10]] ^ t3
[s
[15]] ^ k
[0];
70 d1
= t0
[s
[ 4]] ^ t1
[s
[ 9]] ^ t2
[s
[14]] ^ t3
[s
[ 3]] ^ k
[1];
71 d2
= t0
[s
[ 8]] ^ t1
[s
[13]] ^ t2
[s
[ 2]] ^ t3
[s
[ 7]] ^ k
[2];
72 d3
= t0
[s
[12]] ^ t1
[s
[ 1]] ^ t2
[s
[ 6]] ^ t3
[s
[11]] ^ k
[3];
80 #endif /* _CRYPTO_AEGIS_H */