]> asedeno.scripts.mit.edu Git - linux.git/blob - include/crypto/poly1305.h
Merge tag 'platform-drivers-x86-v5.5-1' of git://git.infradead.org/linux-platform...
[linux.git] / include / crypto / poly1305.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Common values for the Poly1305 algorithm
4  */
5
6 #ifndef _CRYPTO_POLY1305_H
7 #define _CRYPTO_POLY1305_H
8
9 #include <linux/types.h>
10 #include <linux/crypto.h>
11
12 #define POLY1305_BLOCK_SIZE     16
13 #define POLY1305_KEY_SIZE       32
14 #define POLY1305_DIGEST_SIZE    16
15
16 struct poly1305_key {
17         u32 r[5];       /* key, base 2^26 */
18 };
19
20 struct poly1305_state {
21         u32 h[5];       /* accumulator, base 2^26 */
22 };
23
24 struct poly1305_desc_ctx {
25         /* partial buffer */
26         u8 buf[POLY1305_BLOCK_SIZE];
27         /* bytes used in partial buffer */
28         unsigned int buflen;
29         /* how many keys have been set in r[] */
30         unsigned short rset;
31         /* whether s[] has been set */
32         bool sset;
33         /* finalize key */
34         u32 s[4];
35         /* accumulator */
36         struct poly1305_state h;
37         /* key */
38         struct poly1305_key r[CONFIG_CRYPTO_LIB_POLY1305_RSIZE];
39 };
40
41 void poly1305_init_arch(struct poly1305_desc_ctx *desc, const u8 *key);
42 void poly1305_init_generic(struct poly1305_desc_ctx *desc, const u8 *key);
43
44 static inline void poly1305_init(struct poly1305_desc_ctx *desc, const u8 *key)
45 {
46         if (IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305))
47                 poly1305_init_arch(desc, key);
48         else
49                 poly1305_init_generic(desc, key);
50 }
51
52 void poly1305_update_arch(struct poly1305_desc_ctx *desc, const u8 *src,
53                           unsigned int nbytes);
54 void poly1305_update_generic(struct poly1305_desc_ctx *desc, const u8 *src,
55                              unsigned int nbytes);
56
57 static inline void poly1305_update(struct poly1305_desc_ctx *desc,
58                                    const u8 *src, unsigned int nbytes)
59 {
60         if (IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305))
61                 poly1305_update_arch(desc, src, nbytes);
62         else
63                 poly1305_update_generic(desc, src, nbytes);
64 }
65
66 void poly1305_final_arch(struct poly1305_desc_ctx *desc, u8 *digest);
67 void poly1305_final_generic(struct poly1305_desc_ctx *desc, u8 *digest);
68
69 static inline void poly1305_final(struct poly1305_desc_ctx *desc, u8 *digest)
70 {
71         if (IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305))
72                 poly1305_final_arch(desc, digest);
73         else
74                 poly1305_final_generic(desc, digest);
75 }
76
77 #endif