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

sha1-ce-glue.c (2227B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * sha1-ce-glue.c - SHA-1 secure hash using ARMv8 Crypto Extensions
      4 *
      5 * Copyright (C) 2015 Linaro Ltd <ard.biesheuvel@linaro.org>
      6 */
      7
      8#include <crypto/internal/hash.h>
      9#include <crypto/internal/simd.h>
     10#include <crypto/sha1.h>
     11#include <crypto/sha1_base.h>
     12#include <linux/cpufeature.h>
     13#include <linux/crypto.h>
     14#include <linux/module.h>
     15
     16#include <asm/hwcap.h>
     17#include <asm/neon.h>
     18#include <asm/simd.h>
     19
     20#include "sha1.h"
     21
     22MODULE_DESCRIPTION("SHA1 secure hash using ARMv8 Crypto Extensions");
     23MODULE_AUTHOR("Ard Biesheuvel <ard.biesheuvel@linaro.org>");
     24MODULE_LICENSE("GPL v2");
     25
     26asmlinkage void sha1_ce_transform(struct sha1_state *sst, u8 const *src,
     27				  int blocks);
     28
     29static int sha1_ce_update(struct shash_desc *desc, const u8 *data,
     30			  unsigned int len)
     31{
     32	struct sha1_state *sctx = shash_desc_ctx(desc);
     33
     34	if (!crypto_simd_usable() ||
     35	    (sctx->count % SHA1_BLOCK_SIZE) + len < SHA1_BLOCK_SIZE)
     36		return sha1_update_arm(desc, data, len);
     37
     38	kernel_neon_begin();
     39	sha1_base_do_update(desc, data, len, sha1_ce_transform);
     40	kernel_neon_end();
     41
     42	return 0;
     43}
     44
     45static int sha1_ce_finup(struct shash_desc *desc, const u8 *data,
     46			 unsigned int len, u8 *out)
     47{
     48	if (!crypto_simd_usable())
     49		return sha1_finup_arm(desc, data, len, out);
     50
     51	kernel_neon_begin();
     52	if (len)
     53		sha1_base_do_update(desc, data, len, sha1_ce_transform);
     54	sha1_base_do_finalize(desc, sha1_ce_transform);
     55	kernel_neon_end();
     56
     57	return sha1_base_finish(desc, out);
     58}
     59
     60static int sha1_ce_final(struct shash_desc *desc, u8 *out)
     61{
     62	return sha1_ce_finup(desc, NULL, 0, out);
     63}
     64
     65static struct shash_alg alg = {
     66	.init			= sha1_base_init,
     67	.update			= sha1_ce_update,
     68	.final			= sha1_ce_final,
     69	.finup			= sha1_ce_finup,
     70	.descsize		= sizeof(struct sha1_state),
     71	.digestsize		= SHA1_DIGEST_SIZE,
     72	.base			= {
     73		.cra_name		= "sha1",
     74		.cra_driver_name	= "sha1-ce",
     75		.cra_priority		= 200,
     76		.cra_blocksize		= SHA1_BLOCK_SIZE,
     77		.cra_module		= THIS_MODULE,
     78	}
     79};
     80
     81static int __init sha1_ce_mod_init(void)
     82{
     83	return crypto_register_shash(&alg);
     84}
     85
     86static void __exit sha1_ce_mod_fini(void)
     87{
     88	crypto_unregister_shash(&alg);
     89}
     90
     91module_cpu_feature_match(SHA1, sha1_ce_mod_init);
     92module_exit(sha1_ce_mod_fini);