cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

aegis128-neon.c (2087B)


      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}