]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - 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
index 34317ed2071e6fadbfd04979ac796d329f2637fb..74c6e1cd73eee15321baf92fa96bb78c10a779ff 100644 (file)
@@ -22,43 +22,56 @@ struct poly1305_state {
 };
 
 struct poly1305_desc_ctx {
-       /* key */
-       struct poly1305_key r;
-       /* finalize key */
-       u32 s[4];
-       /* accumulator */
-       struct poly1305_state h;
        /* partial buffer */
        u8 buf[POLY1305_BLOCK_SIZE];
        /* bytes used in partial buffer */
        unsigned int buflen;
-       /* r key has been set */
-       bool rset;
-       /* s key has been set */
+       /* how many keys have been set in r[] */
+       unsigned short rset;
+       /* whether s[] has been set */
        bool sset;
+       /* finalize key */
+       u32 s[4];
+       /* accumulator */
+       struct poly1305_state h;
+       /* key */
+       struct poly1305_key r[CONFIG_CRYPTO_LIB_POLY1305_RSIZE];
 };
 
-/*
- * Poly1305 core functions.  These implement the ε-almost-∆-universal hash
- * function underlying the Poly1305 MAC, i.e. they don't add an encrypted nonce
- * ("s key") at the end.  They also only support block-aligned inputs.
- */
-void poly1305_core_setkey(struct poly1305_key *key, const u8 *raw_key);
-static inline void poly1305_core_init(struct poly1305_state *state)
+void poly1305_init_arch(struct poly1305_desc_ctx *desc, const u8 *key);
+void poly1305_init_generic(struct poly1305_desc_ctx *desc, const u8 *key);
+
+static inline void poly1305_init(struct poly1305_desc_ctx *desc, const u8 *key)
+{
+       if (IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305))
+               poly1305_init_arch(desc, key);
+       else
+               poly1305_init_generic(desc, key);
+}
+
+void poly1305_update_arch(struct poly1305_desc_ctx *desc, const u8 *src,
+                         unsigned int nbytes);
+void poly1305_update_generic(struct poly1305_desc_ctx *desc, const u8 *src,
+                            unsigned int nbytes);
+
+static inline void poly1305_update(struct poly1305_desc_ctx *desc,
+                                  const u8 *src, unsigned int nbytes)
 {
-       memset(state->h, 0, sizeof(state->h));
+       if (IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305))
+               poly1305_update_arch(desc, src, nbytes);
+       else
+               poly1305_update_generic(desc, src, nbytes);
 }
-void poly1305_core_blocks(struct poly1305_state *state,
-                         const struct poly1305_key *key,
-                         const void *src, unsigned int nblocks);
-void poly1305_core_emit(const struct poly1305_state *state, void *dst);
 
-/* Crypto API helper functions for the Poly1305 MAC */
-int crypto_poly1305_init(struct shash_desc *desc);
-unsigned int crypto_poly1305_setdesckey(struct poly1305_desc_ctx *dctx,
-                                       const u8 *src, unsigned int srclen);
-int crypto_poly1305_update(struct shash_desc *desc,
-                          const u8 *src, unsigned int srclen);
-int crypto_poly1305_final(struct shash_desc *desc, u8 *dst);
+void poly1305_final_arch(struct poly1305_desc_ctx *desc, u8 *digest);
+void poly1305_final_generic(struct poly1305_desc_ctx *desc, u8 *digest);
+
+static inline void poly1305_final(struct poly1305_desc_ctx *desc, u8 *digest)
+{
+       if (IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305))
+               poly1305_final_arch(desc, digest);
+       else
+               poly1305_final_generic(desc, digest);
+}
 
 #endif