18c2ecf20Sopenharmony_ci/*
28c2ecf20Sopenharmony_ci * Cryptographic API.
38c2ecf20Sopenharmony_ci *
48c2ecf20Sopenharmony_ci * Glue code for the SHA512 Secure Hash Algorithm assembler
58c2ecf20Sopenharmony_ci * implementation using supplemental SSE3 / AVX / AVX2 instructions.
68c2ecf20Sopenharmony_ci *
78c2ecf20Sopenharmony_ci * This file is based on sha512_generic.c
88c2ecf20Sopenharmony_ci *
98c2ecf20Sopenharmony_ci * Copyright (C) 2013 Intel Corporation
108c2ecf20Sopenharmony_ci * Author: Tim Chen <tim.c.chen@linux.intel.com>
118c2ecf20Sopenharmony_ci *
128c2ecf20Sopenharmony_ci * This program is free software; you can redistribute it and/or modify it
138c2ecf20Sopenharmony_ci * under the terms of the GNU General Public License as published by the Free
148c2ecf20Sopenharmony_ci * Software Foundation; either version 2 of the License, or (at your option)
158c2ecf20Sopenharmony_ci * any later version.
168c2ecf20Sopenharmony_ci *
178c2ecf20Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
188c2ecf20Sopenharmony_ci * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
198c2ecf20Sopenharmony_ci * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
208c2ecf20Sopenharmony_ci * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
218c2ecf20Sopenharmony_ci * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
228c2ecf20Sopenharmony_ci * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
238c2ecf20Sopenharmony_ci * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
248c2ecf20Sopenharmony_ci * SOFTWARE.
258c2ecf20Sopenharmony_ci *
268c2ecf20Sopenharmony_ci */
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ci#define pr_fmt(fmt)	KBUILD_MODNAME ": " fmt
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_ci#include <crypto/internal/hash.h>
318c2ecf20Sopenharmony_ci#include <crypto/internal/simd.h>
328c2ecf20Sopenharmony_ci#include <linux/init.h>
338c2ecf20Sopenharmony_ci#include <linux/module.h>
348c2ecf20Sopenharmony_ci#include <linux/mm.h>
358c2ecf20Sopenharmony_ci#include <linux/string.h>
368c2ecf20Sopenharmony_ci#include <linux/types.h>
378c2ecf20Sopenharmony_ci#include <crypto/sha.h>
388c2ecf20Sopenharmony_ci#include <crypto/sha512_base.h>
398c2ecf20Sopenharmony_ci#include <asm/simd.h>
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ciasmlinkage void sha512_transform_ssse3(struct sha512_state *state,
428c2ecf20Sopenharmony_ci				       const u8 *data, int blocks);
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_cistatic int sha512_update(struct shash_desc *desc, const u8 *data,
458c2ecf20Sopenharmony_ci		       unsigned int len, sha512_block_fn *sha512_xform)
468c2ecf20Sopenharmony_ci{
478c2ecf20Sopenharmony_ci	struct sha512_state *sctx = shash_desc_ctx(desc);
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ci	if (!crypto_simd_usable() ||
508c2ecf20Sopenharmony_ci	    (sctx->count[0] % SHA512_BLOCK_SIZE) + len < SHA512_BLOCK_SIZE)
518c2ecf20Sopenharmony_ci		return crypto_sha512_update(desc, data, len);
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_ci	/*
548c2ecf20Sopenharmony_ci	 * Make sure struct sha512_state begins directly with the SHA512
558c2ecf20Sopenharmony_ci	 * 512-bit internal state, as this is what the asm functions expect.
568c2ecf20Sopenharmony_ci	 */
578c2ecf20Sopenharmony_ci	BUILD_BUG_ON(offsetof(struct sha512_state, state) != 0);
588c2ecf20Sopenharmony_ci
598c2ecf20Sopenharmony_ci	kernel_fpu_begin();
608c2ecf20Sopenharmony_ci	sha512_base_do_update(desc, data, len, sha512_xform);
618c2ecf20Sopenharmony_ci	kernel_fpu_end();
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ci	return 0;
648c2ecf20Sopenharmony_ci}
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_cistatic int sha512_finup(struct shash_desc *desc, const u8 *data,
678c2ecf20Sopenharmony_ci	      unsigned int len, u8 *out, sha512_block_fn *sha512_xform)
688c2ecf20Sopenharmony_ci{
698c2ecf20Sopenharmony_ci	if (!crypto_simd_usable())
708c2ecf20Sopenharmony_ci		return crypto_sha512_finup(desc, data, len, out);
718c2ecf20Sopenharmony_ci
728c2ecf20Sopenharmony_ci	kernel_fpu_begin();
738c2ecf20Sopenharmony_ci	if (len)
748c2ecf20Sopenharmony_ci		sha512_base_do_update(desc, data, len, sha512_xform);
758c2ecf20Sopenharmony_ci	sha512_base_do_finalize(desc, sha512_xform);
768c2ecf20Sopenharmony_ci	kernel_fpu_end();
778c2ecf20Sopenharmony_ci
788c2ecf20Sopenharmony_ci	return sha512_base_finish(desc, out);
798c2ecf20Sopenharmony_ci}
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_cistatic int sha512_ssse3_update(struct shash_desc *desc, const u8 *data,
828c2ecf20Sopenharmony_ci		       unsigned int len)
838c2ecf20Sopenharmony_ci{
848c2ecf20Sopenharmony_ci	return sha512_update(desc, data, len, sha512_transform_ssse3);
858c2ecf20Sopenharmony_ci}
868c2ecf20Sopenharmony_ci
878c2ecf20Sopenharmony_cistatic int sha512_ssse3_finup(struct shash_desc *desc, const u8 *data,
888c2ecf20Sopenharmony_ci	      unsigned int len, u8 *out)
898c2ecf20Sopenharmony_ci{
908c2ecf20Sopenharmony_ci	return sha512_finup(desc, data, len, out, sha512_transform_ssse3);
918c2ecf20Sopenharmony_ci}
928c2ecf20Sopenharmony_ci
938c2ecf20Sopenharmony_ci/* Add padding and return the message digest. */
948c2ecf20Sopenharmony_cistatic int sha512_ssse3_final(struct shash_desc *desc, u8 *out)
958c2ecf20Sopenharmony_ci{
968c2ecf20Sopenharmony_ci	return sha512_ssse3_finup(desc, NULL, 0, out);
978c2ecf20Sopenharmony_ci}
988c2ecf20Sopenharmony_ci
998c2ecf20Sopenharmony_cistatic struct shash_alg sha512_ssse3_algs[] = { {
1008c2ecf20Sopenharmony_ci	.digestsize	=	SHA512_DIGEST_SIZE,
1018c2ecf20Sopenharmony_ci	.init		=	sha512_base_init,
1028c2ecf20Sopenharmony_ci	.update		=	sha512_ssse3_update,
1038c2ecf20Sopenharmony_ci	.final		=	sha512_ssse3_final,
1048c2ecf20Sopenharmony_ci	.finup		=	sha512_ssse3_finup,
1058c2ecf20Sopenharmony_ci	.descsize	=	sizeof(struct sha512_state),
1068c2ecf20Sopenharmony_ci	.base		=	{
1078c2ecf20Sopenharmony_ci		.cra_name	=	"sha512",
1088c2ecf20Sopenharmony_ci		.cra_driver_name =	"sha512-ssse3",
1098c2ecf20Sopenharmony_ci		.cra_priority	=	150,
1108c2ecf20Sopenharmony_ci		.cra_blocksize	=	SHA512_BLOCK_SIZE,
1118c2ecf20Sopenharmony_ci		.cra_module	=	THIS_MODULE,
1128c2ecf20Sopenharmony_ci	}
1138c2ecf20Sopenharmony_ci},  {
1148c2ecf20Sopenharmony_ci	.digestsize	=	SHA384_DIGEST_SIZE,
1158c2ecf20Sopenharmony_ci	.init		=	sha384_base_init,
1168c2ecf20Sopenharmony_ci	.update		=	sha512_ssse3_update,
1178c2ecf20Sopenharmony_ci	.final		=	sha512_ssse3_final,
1188c2ecf20Sopenharmony_ci	.finup		=	sha512_ssse3_finup,
1198c2ecf20Sopenharmony_ci	.descsize	=	sizeof(struct sha512_state),
1208c2ecf20Sopenharmony_ci	.base		=	{
1218c2ecf20Sopenharmony_ci		.cra_name	=	"sha384",
1228c2ecf20Sopenharmony_ci		.cra_driver_name =	"sha384-ssse3",
1238c2ecf20Sopenharmony_ci		.cra_priority	=	150,
1248c2ecf20Sopenharmony_ci		.cra_blocksize	=	SHA384_BLOCK_SIZE,
1258c2ecf20Sopenharmony_ci		.cra_module	=	THIS_MODULE,
1268c2ecf20Sopenharmony_ci	}
1278c2ecf20Sopenharmony_ci} };
1288c2ecf20Sopenharmony_ci
1298c2ecf20Sopenharmony_cistatic int register_sha512_ssse3(void)
1308c2ecf20Sopenharmony_ci{
1318c2ecf20Sopenharmony_ci	if (boot_cpu_has(X86_FEATURE_SSSE3))
1328c2ecf20Sopenharmony_ci		return crypto_register_shashes(sha512_ssse3_algs,
1338c2ecf20Sopenharmony_ci			ARRAY_SIZE(sha512_ssse3_algs));
1348c2ecf20Sopenharmony_ci	return 0;
1358c2ecf20Sopenharmony_ci}
1368c2ecf20Sopenharmony_ci
1378c2ecf20Sopenharmony_cistatic void unregister_sha512_ssse3(void)
1388c2ecf20Sopenharmony_ci{
1398c2ecf20Sopenharmony_ci	if (boot_cpu_has(X86_FEATURE_SSSE3))
1408c2ecf20Sopenharmony_ci		crypto_unregister_shashes(sha512_ssse3_algs,
1418c2ecf20Sopenharmony_ci			ARRAY_SIZE(sha512_ssse3_algs));
1428c2ecf20Sopenharmony_ci}
1438c2ecf20Sopenharmony_ci
1448c2ecf20Sopenharmony_ciasmlinkage void sha512_transform_avx(struct sha512_state *state,
1458c2ecf20Sopenharmony_ci				     const u8 *data, int blocks);
1468c2ecf20Sopenharmony_cistatic bool avx_usable(void)
1478c2ecf20Sopenharmony_ci{
1488c2ecf20Sopenharmony_ci	if (!cpu_has_xfeatures(XFEATURE_MASK_SSE | XFEATURE_MASK_YMM, NULL)) {
1498c2ecf20Sopenharmony_ci		if (boot_cpu_has(X86_FEATURE_AVX))
1508c2ecf20Sopenharmony_ci			pr_info("AVX detected but unusable.\n");
1518c2ecf20Sopenharmony_ci		return false;
1528c2ecf20Sopenharmony_ci	}
1538c2ecf20Sopenharmony_ci
1548c2ecf20Sopenharmony_ci	return true;
1558c2ecf20Sopenharmony_ci}
1568c2ecf20Sopenharmony_ci
1578c2ecf20Sopenharmony_cistatic int sha512_avx_update(struct shash_desc *desc, const u8 *data,
1588c2ecf20Sopenharmony_ci		       unsigned int len)
1598c2ecf20Sopenharmony_ci{
1608c2ecf20Sopenharmony_ci	return sha512_update(desc, data, len, sha512_transform_avx);
1618c2ecf20Sopenharmony_ci}
1628c2ecf20Sopenharmony_ci
1638c2ecf20Sopenharmony_cistatic int sha512_avx_finup(struct shash_desc *desc, const u8 *data,
1648c2ecf20Sopenharmony_ci	      unsigned int len, u8 *out)
1658c2ecf20Sopenharmony_ci{
1668c2ecf20Sopenharmony_ci	return sha512_finup(desc, data, len, out, sha512_transform_avx);
1678c2ecf20Sopenharmony_ci}
1688c2ecf20Sopenharmony_ci
1698c2ecf20Sopenharmony_ci/* Add padding and return the message digest. */
1708c2ecf20Sopenharmony_cistatic int sha512_avx_final(struct shash_desc *desc, u8 *out)
1718c2ecf20Sopenharmony_ci{
1728c2ecf20Sopenharmony_ci	return sha512_avx_finup(desc, NULL, 0, out);
1738c2ecf20Sopenharmony_ci}
1748c2ecf20Sopenharmony_ci
1758c2ecf20Sopenharmony_cistatic struct shash_alg sha512_avx_algs[] = { {
1768c2ecf20Sopenharmony_ci	.digestsize	=	SHA512_DIGEST_SIZE,
1778c2ecf20Sopenharmony_ci	.init		=	sha512_base_init,
1788c2ecf20Sopenharmony_ci	.update		=	sha512_avx_update,
1798c2ecf20Sopenharmony_ci	.final		=	sha512_avx_final,
1808c2ecf20Sopenharmony_ci	.finup		=	sha512_avx_finup,
1818c2ecf20Sopenharmony_ci	.descsize	=	sizeof(struct sha512_state),
1828c2ecf20Sopenharmony_ci	.base		=	{
1838c2ecf20Sopenharmony_ci		.cra_name	=	"sha512",
1848c2ecf20Sopenharmony_ci		.cra_driver_name =	"sha512-avx",
1858c2ecf20Sopenharmony_ci		.cra_priority	=	160,
1868c2ecf20Sopenharmony_ci		.cra_blocksize	=	SHA512_BLOCK_SIZE,
1878c2ecf20Sopenharmony_ci		.cra_module	=	THIS_MODULE,
1888c2ecf20Sopenharmony_ci	}
1898c2ecf20Sopenharmony_ci},  {
1908c2ecf20Sopenharmony_ci	.digestsize	=	SHA384_DIGEST_SIZE,
1918c2ecf20Sopenharmony_ci	.init		=	sha384_base_init,
1928c2ecf20Sopenharmony_ci	.update		=	sha512_avx_update,
1938c2ecf20Sopenharmony_ci	.final		=	sha512_avx_final,
1948c2ecf20Sopenharmony_ci	.finup		=	sha512_avx_finup,
1958c2ecf20Sopenharmony_ci	.descsize	=	sizeof(struct sha512_state),
1968c2ecf20Sopenharmony_ci	.base		=	{
1978c2ecf20Sopenharmony_ci		.cra_name	=	"sha384",
1988c2ecf20Sopenharmony_ci		.cra_driver_name =	"sha384-avx",
1998c2ecf20Sopenharmony_ci		.cra_priority	=	160,
2008c2ecf20Sopenharmony_ci		.cra_blocksize	=	SHA384_BLOCK_SIZE,
2018c2ecf20Sopenharmony_ci		.cra_module	=	THIS_MODULE,
2028c2ecf20Sopenharmony_ci	}
2038c2ecf20Sopenharmony_ci} };
2048c2ecf20Sopenharmony_ci
2058c2ecf20Sopenharmony_cistatic int register_sha512_avx(void)
2068c2ecf20Sopenharmony_ci{
2078c2ecf20Sopenharmony_ci	if (avx_usable())
2088c2ecf20Sopenharmony_ci		return crypto_register_shashes(sha512_avx_algs,
2098c2ecf20Sopenharmony_ci			ARRAY_SIZE(sha512_avx_algs));
2108c2ecf20Sopenharmony_ci	return 0;
2118c2ecf20Sopenharmony_ci}
2128c2ecf20Sopenharmony_ci
2138c2ecf20Sopenharmony_cistatic void unregister_sha512_avx(void)
2148c2ecf20Sopenharmony_ci{
2158c2ecf20Sopenharmony_ci	if (avx_usable())
2168c2ecf20Sopenharmony_ci		crypto_unregister_shashes(sha512_avx_algs,
2178c2ecf20Sopenharmony_ci			ARRAY_SIZE(sha512_avx_algs));
2188c2ecf20Sopenharmony_ci}
2198c2ecf20Sopenharmony_ci
2208c2ecf20Sopenharmony_ciasmlinkage void sha512_transform_rorx(struct sha512_state *state,
2218c2ecf20Sopenharmony_ci				      const u8 *data, int blocks);
2228c2ecf20Sopenharmony_ci
2238c2ecf20Sopenharmony_cistatic int sha512_avx2_update(struct shash_desc *desc, const u8 *data,
2248c2ecf20Sopenharmony_ci		       unsigned int len)
2258c2ecf20Sopenharmony_ci{
2268c2ecf20Sopenharmony_ci	return sha512_update(desc, data, len, sha512_transform_rorx);
2278c2ecf20Sopenharmony_ci}
2288c2ecf20Sopenharmony_ci
2298c2ecf20Sopenharmony_cistatic int sha512_avx2_finup(struct shash_desc *desc, const u8 *data,
2308c2ecf20Sopenharmony_ci	      unsigned int len, u8 *out)
2318c2ecf20Sopenharmony_ci{
2328c2ecf20Sopenharmony_ci	return sha512_finup(desc, data, len, out, sha512_transform_rorx);
2338c2ecf20Sopenharmony_ci}
2348c2ecf20Sopenharmony_ci
2358c2ecf20Sopenharmony_ci/* Add padding and return the message digest. */
2368c2ecf20Sopenharmony_cistatic int sha512_avx2_final(struct shash_desc *desc, u8 *out)
2378c2ecf20Sopenharmony_ci{
2388c2ecf20Sopenharmony_ci	return sha512_avx2_finup(desc, NULL, 0, out);
2398c2ecf20Sopenharmony_ci}
2408c2ecf20Sopenharmony_ci
2418c2ecf20Sopenharmony_cistatic struct shash_alg sha512_avx2_algs[] = { {
2428c2ecf20Sopenharmony_ci	.digestsize	=	SHA512_DIGEST_SIZE,
2438c2ecf20Sopenharmony_ci	.init		=	sha512_base_init,
2448c2ecf20Sopenharmony_ci	.update		=	sha512_avx2_update,
2458c2ecf20Sopenharmony_ci	.final		=	sha512_avx2_final,
2468c2ecf20Sopenharmony_ci	.finup		=	sha512_avx2_finup,
2478c2ecf20Sopenharmony_ci	.descsize	=	sizeof(struct sha512_state),
2488c2ecf20Sopenharmony_ci	.base		=	{
2498c2ecf20Sopenharmony_ci		.cra_name	=	"sha512",
2508c2ecf20Sopenharmony_ci		.cra_driver_name =	"sha512-avx2",
2518c2ecf20Sopenharmony_ci		.cra_priority	=	170,
2528c2ecf20Sopenharmony_ci		.cra_blocksize	=	SHA512_BLOCK_SIZE,
2538c2ecf20Sopenharmony_ci		.cra_module	=	THIS_MODULE,
2548c2ecf20Sopenharmony_ci	}
2558c2ecf20Sopenharmony_ci},  {
2568c2ecf20Sopenharmony_ci	.digestsize	=	SHA384_DIGEST_SIZE,
2578c2ecf20Sopenharmony_ci	.init		=	sha384_base_init,
2588c2ecf20Sopenharmony_ci	.update		=	sha512_avx2_update,
2598c2ecf20Sopenharmony_ci	.final		=	sha512_avx2_final,
2608c2ecf20Sopenharmony_ci	.finup		=	sha512_avx2_finup,
2618c2ecf20Sopenharmony_ci	.descsize	=	sizeof(struct sha512_state),
2628c2ecf20Sopenharmony_ci	.base		=	{
2638c2ecf20Sopenharmony_ci		.cra_name	=	"sha384",
2648c2ecf20Sopenharmony_ci		.cra_driver_name =	"sha384-avx2",
2658c2ecf20Sopenharmony_ci		.cra_priority	=	170,
2668c2ecf20Sopenharmony_ci		.cra_blocksize	=	SHA384_BLOCK_SIZE,
2678c2ecf20Sopenharmony_ci		.cra_module	=	THIS_MODULE,
2688c2ecf20Sopenharmony_ci	}
2698c2ecf20Sopenharmony_ci} };
2708c2ecf20Sopenharmony_ci
2718c2ecf20Sopenharmony_cistatic bool avx2_usable(void)
2728c2ecf20Sopenharmony_ci{
2738c2ecf20Sopenharmony_ci	if (avx_usable() && boot_cpu_has(X86_FEATURE_AVX2) &&
2748c2ecf20Sopenharmony_ci		    boot_cpu_has(X86_FEATURE_BMI2))
2758c2ecf20Sopenharmony_ci		return true;
2768c2ecf20Sopenharmony_ci
2778c2ecf20Sopenharmony_ci	return false;
2788c2ecf20Sopenharmony_ci}
2798c2ecf20Sopenharmony_ci
2808c2ecf20Sopenharmony_cistatic int register_sha512_avx2(void)
2818c2ecf20Sopenharmony_ci{
2828c2ecf20Sopenharmony_ci	if (avx2_usable())
2838c2ecf20Sopenharmony_ci		return crypto_register_shashes(sha512_avx2_algs,
2848c2ecf20Sopenharmony_ci			ARRAY_SIZE(sha512_avx2_algs));
2858c2ecf20Sopenharmony_ci	return 0;
2868c2ecf20Sopenharmony_ci}
2878c2ecf20Sopenharmony_ci
2888c2ecf20Sopenharmony_cistatic void unregister_sha512_avx2(void)
2898c2ecf20Sopenharmony_ci{
2908c2ecf20Sopenharmony_ci	if (avx2_usable())
2918c2ecf20Sopenharmony_ci		crypto_unregister_shashes(sha512_avx2_algs,
2928c2ecf20Sopenharmony_ci			ARRAY_SIZE(sha512_avx2_algs));
2938c2ecf20Sopenharmony_ci}
2948c2ecf20Sopenharmony_ci
2958c2ecf20Sopenharmony_cistatic int __init sha512_ssse3_mod_init(void)
2968c2ecf20Sopenharmony_ci{
2978c2ecf20Sopenharmony_ci
2988c2ecf20Sopenharmony_ci	if (register_sha512_ssse3())
2998c2ecf20Sopenharmony_ci		goto fail;
3008c2ecf20Sopenharmony_ci
3018c2ecf20Sopenharmony_ci	if (register_sha512_avx()) {
3028c2ecf20Sopenharmony_ci		unregister_sha512_ssse3();
3038c2ecf20Sopenharmony_ci		goto fail;
3048c2ecf20Sopenharmony_ci	}
3058c2ecf20Sopenharmony_ci
3068c2ecf20Sopenharmony_ci	if (register_sha512_avx2()) {
3078c2ecf20Sopenharmony_ci		unregister_sha512_avx();
3088c2ecf20Sopenharmony_ci		unregister_sha512_ssse3();
3098c2ecf20Sopenharmony_ci		goto fail;
3108c2ecf20Sopenharmony_ci	}
3118c2ecf20Sopenharmony_ci
3128c2ecf20Sopenharmony_ci	return 0;
3138c2ecf20Sopenharmony_cifail:
3148c2ecf20Sopenharmony_ci	return -ENODEV;
3158c2ecf20Sopenharmony_ci}
3168c2ecf20Sopenharmony_ci
3178c2ecf20Sopenharmony_cistatic void __exit sha512_ssse3_mod_fini(void)
3188c2ecf20Sopenharmony_ci{
3198c2ecf20Sopenharmony_ci	unregister_sha512_avx2();
3208c2ecf20Sopenharmony_ci	unregister_sha512_avx();
3218c2ecf20Sopenharmony_ci	unregister_sha512_ssse3();
3228c2ecf20Sopenharmony_ci}
3238c2ecf20Sopenharmony_ci
3248c2ecf20Sopenharmony_cimodule_init(sha512_ssse3_mod_init);
3258c2ecf20Sopenharmony_cimodule_exit(sha512_ssse3_mod_fini);
3268c2ecf20Sopenharmony_ci
3278c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL");
3288c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("SHA512 Secure Hash Algorithm, Supplemental SSE3 accelerated");
3298c2ecf20Sopenharmony_ci
3308c2ecf20Sopenharmony_ciMODULE_ALIAS_CRYPTO("sha512");
3318c2ecf20Sopenharmony_ciMODULE_ALIAS_CRYPTO("sha512-ssse3");
3328c2ecf20Sopenharmony_ciMODULE_ALIAS_CRYPTO("sha512-avx");
3338c2ecf20Sopenharmony_ciMODULE_ALIAS_CRYPTO("sha512-avx2");
3348c2ecf20Sopenharmony_ciMODULE_ALIAS_CRYPTO("sha384");
3358c2ecf20Sopenharmony_ciMODULE_ALIAS_CRYPTO("sha384-ssse3");
3368c2ecf20Sopenharmony_ciMODULE_ALIAS_CRYPTO("sha384-avx");
3378c2ecf20Sopenharmony_ciMODULE_ALIAS_CRYPTO("sha384-avx2");
338