1 /* SPDX-License-Identifier: GPL-2.0-or-later */
3 * AEGIS common definitions
5 * Copyright (c) 2018 Ondrej Mosnacek <omosnacek@gmail.com>
6 * Copyright (c) 2018 Red Hat, Inc. All rights reserved.
9 #ifndef _CRYPTO_AEGIS_H
10 #define _CRYPTO_AEGIS_H
12 #include <crypto/aes.h>
13 #include <linux/bitops.h>
14 #include <linux/types.h>
16 #define AEGIS_BLOCK_SIZE 16
19 __le64 words64
[AEGIS_BLOCK_SIZE
/ sizeof(__le64
)];
20 __le32 words32
[AEGIS_BLOCK_SIZE
/ sizeof(__le32
)];
21 u8 bytes
[AEGIS_BLOCK_SIZE
];
26 extern int aegis128_have_aes_insn
;
28 #define AEGIS_BLOCK_ALIGN (__alignof__(union aegis_block))
29 #define AEGIS_ALIGNED(p) IS_ALIGNED((uintptr_t)p, AEGIS_BLOCK_ALIGN)
31 bool crypto_aegis128_have_simd(void);
32 void crypto_aegis128_update_simd(struct aegis_state
*state
, const void *msg
);
33 void crypto_aegis128_init_simd(struct aegis_state
*state
,
34 const union aegis_block
*key
,
36 void crypto_aegis128_encrypt_chunk_simd(struct aegis_state
*state
, u8
*dst
,
37 const u8
*src
, unsigned int size
);
38 void crypto_aegis128_decrypt_chunk_simd(struct aegis_state
*state
, u8
*dst
,
39 const u8
*src
, unsigned int size
);
40 int crypto_aegis128_final_simd(struct aegis_state
*state
,
41 union aegis_block
*tag_xor
,
42 unsigned int assoclen
,
43 unsigned int cryptlen
,
44 unsigned int authsize
);
46 static __always_inline
void crypto_aegis_block_xor(union aegis_block
*dst
,
47 const union aegis_block
*src
)
49 dst
->words64
[0] ^= src
->words64
[0];
50 dst
->words64
[1] ^= src
->words64
[1];
53 static __always_inline
void crypto_aegis_block_and(union aegis_block
*dst
,
54 const union aegis_block
*src
)
56 dst
->words64
[0] &= src
->words64
[0];
57 dst
->words64
[1] &= src
->words64
[1];
60 static __always_inline
void crypto_aegis_aesenc(union aegis_block
*dst
,
61 const union aegis_block
*src
,
62 const union aegis_block
*key
)
64 const u8
*s
= src
->bytes
;
65 const u32
*t
= crypto_ft_tab
[0];
68 d0
= t
[s
[ 0]] ^ rol32(t
[s
[ 5]], 8) ^ rol32(t
[s
[10]], 16) ^ rol32(t
[s
[15]], 24);
69 d1
= t
[s
[ 4]] ^ rol32(t
[s
[ 9]], 8) ^ rol32(t
[s
[14]], 16) ^ rol32(t
[s
[ 3]], 24);
70 d2
= t
[s
[ 8]] ^ rol32(t
[s
[13]], 8) ^ rol32(t
[s
[ 2]], 16) ^ rol32(t
[s
[ 7]], 24);
71 d3
= t
[s
[12]] ^ rol32(t
[s
[ 1]], 8) ^ rol32(t
[s
[ 6]], 16) ^ rol32(t
[s
[11]], 24);
73 dst
->words32
[0] = cpu_to_le32(d0
) ^ key
->words32
[0];
74 dst
->words32
[1] = cpu_to_le32(d1
) ^ key
->words32
[1];
75 dst
->words32
[2] = cpu_to_le32(d2
) ^ key
->words32
[2];
76 dst
->words32
[3] = cpu_to_le32(d3
) ^ key
->words32
[3];
79 #endif /* _CRYPTO_AEGIS_H */