linux/crypto/aegis128-neon.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * Copyright (C) 2019 Linaro Ltd <ard.biesheuvel@linaro.org>
   4 */
   5
   6#include <asm/cpufeature.h>
   7#include <asm/neon.h>
   8
   9#include "aegis.h"
  10
  11void crypto_aegis128_init_neon(void *state, const void *key, const void *iv);
  12void crypto_aegis128_update_neon(void *state, const void *msg);
  13void crypto_aegis128_encrypt_chunk_neon(void *state, void *dst, const void *src,
  14                                        unsigned int size);
  15void crypto_aegis128_decrypt_chunk_neon(void *state, void *dst, const void *src,
  16                                        unsigned int size);
  17int crypto_aegis128_final_neon(void *state, void *tag_xor,
  18                               unsigned int assoclen,
  19                               unsigned int cryptlen,
  20                               unsigned int authsize);
  21
  22int aegis128_have_aes_insn __ro_after_init;
  23
  24bool crypto_aegis128_have_simd(void)
  25{
  26        if (cpu_have_feature(cpu_feature(AES))) {
  27                aegis128_have_aes_insn = 1;
  28                return true;
  29        }
  30        return IS_ENABLED(CONFIG_ARM64);
  31}
  32
  33void crypto_aegis128_init_simd(struct aegis_state *state,
  34                               const union aegis_block *key,
  35                               const u8 *iv)
  36{
  37        kernel_neon_begin();
  38        crypto_aegis128_init_neon(state, key, iv);
  39        kernel_neon_end();
  40}
  41
  42void crypto_aegis128_update_simd(struct aegis_state *state, const void *msg)
  43{
  44        kernel_neon_begin();
  45        crypto_aegis128_update_neon(state, msg);
  46        kernel_neon_end();
  47}
  48
  49void crypto_aegis128_encrypt_chunk_simd(struct aegis_state *state, u8 *dst,
  50                                        const u8 *src, unsigned int size)
  51{
  52        kernel_neon_begin();
  53        crypto_aegis128_encrypt_chunk_neon(state, dst, src, size);
  54        kernel_neon_end();
  55}
  56
  57void crypto_aegis128_decrypt_chunk_simd(struct aegis_state *state, u8 *dst,
  58                                        const u8 *src, unsigned int size)
  59{
  60        kernel_neon_begin();
  61        crypto_aegis128_decrypt_chunk_neon(state, dst, src, size);
  62        kernel_neon_end();
  63}
  64
  65int crypto_aegis128_final_simd(struct aegis_state *state,
  66                               union aegis_block *tag_xor,
  67                               unsigned int assoclen,
  68                               unsigned int cryptlen,
  69                               unsigned int authsize)
  70{
  71        int ret;
  72
  73        kernel_neon_begin();
  74        ret = crypto_aegis128_final_neon(state, tag_xor, assoclen, cryptlen,
  75                                         authsize);
  76        kernel_neon_end();
  77
  78        return ret;
  79}
  80