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 78