Implement the init/update/final Poly1305 library routines in the
accelerated SIMD driver for x86 so they are accessible to users of
the Poly1305 library interface.

Signed-off-by: Ard Biesheuvel <ard.biesheu...@linaro.org>
---
 arch/x86/crypto/poly1305_glue.c | 57 +++++++++++++++-----
 crypto/Kconfig                  |  2 +
 2 files changed, 45 insertions(+), 14 deletions(-)

diff --git a/arch/x86/crypto/poly1305_glue.c b/arch/x86/crypto/poly1305_glue.c
index b43b93c95e79..05f87535d41e 100644
--- a/arch/x86/crypto/poly1305_glue.c
+++ b/arch/x86/crypto/poly1305_glue.c
@@ -85,18 +85,11 @@ static unsigned int poly1305_simd_blocks(struct 
poly1305_desc_ctx *dctx,
        return srclen;
 }
 
-static int poly1305_simd_update(struct shash_desc *desc,
-                               const u8 *src, unsigned int srclen)
+static int poly1305_simd_do_update(struct poly1305_desc_ctx *dctx,
+                                  const u8 *src, unsigned int srclen)
 {
-       struct poly1305_desc_ctx *dctx = shash_desc_ctx(desc);
        unsigned int bytes;
 
-       /* kernel_fpu_begin/end is costly, use fallback for small updates */
-       if (srclen <= 288 || !crypto_simd_usable())
-               return crypto_poly1305_update(desc, src, srclen);
-
-       kernel_fpu_begin();
-
        if (unlikely(dctx->buflen)) {
                bytes = min(srclen, POLY1305_BLOCK_SIZE - dctx->buflen);
                memcpy(dctx->buf + dctx->buflen, src, bytes);
@@ -117,8 +110,6 @@ static int poly1305_simd_update(struct shash_desc *desc,
                srclen = bytes;
        }
 
-       kernel_fpu_end();
-
        if (unlikely(srclen)) {
                dctx->buflen = srclen;
                memcpy(dctx->buf, src, srclen);
@@ -127,6 +118,47 @@ static int poly1305_simd_update(struct shash_desc *desc,
        return 0;
 }
 
+static int poly1305_simd_update(struct shash_desc *desc,
+                               const u8 *src, unsigned int srclen)
+{
+       struct poly1305_desc_ctx *dctx = shash_desc_ctx(desc);
+       int ret;
+
+       /* kernel_fpu_begin/end is costly, use fallback for small updates */
+       if (srclen <= 288 || !crypto_simd_usable())
+               return crypto_poly1305_update(desc, src, srclen);
+
+       kernel_fpu_begin();
+       ret = poly1305_simd_do_update(dctx, src, srclen);
+       kernel_fpu_end();
+
+       return ret;
+}
+
+void poly1305_init(struct poly1305_desc_ctx *desc, const u8 *key)
+{
+       poly1305_init_generic(desc, key);
+}
+EXPORT_SYMBOL(poly1305_init);
+
+void poly1305_update(struct poly1305_desc_ctx *dctx, const u8 *src,
+                    unsigned int nbytes)
+{
+       if (nbytes <= 288 || !crypto_simd_usable())
+               return poly1305_update_generic(dctx, src, nbytes);
+
+       kernel_fpu_begin();
+       poly1305_simd_do_update(dctx, src, nbytes);
+       kernel_fpu_end();
+}
+EXPORT_SYMBOL(poly1305_update);
+
+void poly1305_final(struct poly1305_desc_ctx *desc, u8 *digest)
+{
+       poly1305_final_generic(desc, digest);
+}
+EXPORT_SYMBOL(poly1305_final);
+
 static struct shash_alg alg = {
        .digestsize     = POLY1305_DIGEST_SIZE,
        .init           = crypto_poly1305_init,
@@ -151,9 +183,6 @@ static int __init poly1305_simd_mod_init(void)
                            boot_cpu_has(X86_FEATURE_AVX) &&
                            boot_cpu_has(X86_FEATURE_AVX2) &&
                            cpu_has_xfeatures(XFEATURE_MASK_SSE | 
XFEATURE_MASK_YMM, NULL);
-       alg.descsize = sizeof(struct poly1305_desc_ctx) + 5 * sizeof(u32);
-       if (poly1305_use_avx2)
-               alg.descsize += 10 * sizeof(u32);
 
        return crypto_register_shash(&alg);
 }
diff --git a/crypto/Kconfig b/crypto/Kconfig
index 88b1d0d20090..8aae0907ca4e 100644
--- a/crypto/Kconfig
+++ b/crypto/Kconfig
@@ -687,6 +687,7 @@ config CRYPTO_ARCH_HAVE_LIB_POLY1305
 
 config CRYPTO_LIB_POLY1305_RSIZE
        int
+       default 4 if X86_64
        default 1
 
 config CRYPTO_LIB_POLY1305
@@ -707,6 +708,7 @@ config CRYPTO_POLY1305_X86_64
        tristate "Poly1305 authenticator algorithm (x86_64/SSE2/AVX2)"
        depends on X86 && 64BIT
        select CRYPTO_POLY1305
+       select CRYPTO_ARCH_HAVE_LIB_POLY1305
        help
          Poly1305 authenticator algorithm, RFC7539.
 
-- 
2.20.1

Reply via email to