18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Cryptographic API. 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Glue code for the SHA1 Secure Hash Algorithm assembler implementation using 68c2ecf20Sopenharmony_ci * Supplemental SSE3 instructions. 78c2ecf20Sopenharmony_ci * 88c2ecf20Sopenharmony_ci * This file is based on sha1_generic.c 98c2ecf20Sopenharmony_ci * 108c2ecf20Sopenharmony_ci * Copyright (c) Alan Smithee. 118c2ecf20Sopenharmony_ci * Copyright (c) Andrew McDonald <andrew@mcdonald.org.uk> 128c2ecf20Sopenharmony_ci * Copyright (c) Jean-Francois Dive <jef@linuxbe.org> 138c2ecf20Sopenharmony_ci * Copyright (c) Mathias Krause <minipli@googlemail.com> 148c2ecf20Sopenharmony_ci * Copyright (c) Chandramouli Narayanan <mouli@linux.intel.com> 158c2ecf20Sopenharmony_ci */ 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci#include <crypto/internal/hash.h> 208c2ecf20Sopenharmony_ci#include <crypto/internal/simd.h> 218c2ecf20Sopenharmony_ci#include <linux/init.h> 228c2ecf20Sopenharmony_ci#include <linux/module.h> 238c2ecf20Sopenharmony_ci#include <linux/mm.h> 248c2ecf20Sopenharmony_ci#include <linux/types.h> 258c2ecf20Sopenharmony_ci#include <crypto/sha.h> 268c2ecf20Sopenharmony_ci#include <crypto/sha1_base.h> 278c2ecf20Sopenharmony_ci#include <asm/simd.h> 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_cistatic int sha1_update(struct shash_desc *desc, const u8 *data, 308c2ecf20Sopenharmony_ci unsigned int len, sha1_block_fn *sha1_xform) 318c2ecf20Sopenharmony_ci{ 328c2ecf20Sopenharmony_ci struct sha1_state *sctx = shash_desc_ctx(desc); 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci if (!crypto_simd_usable() || 358c2ecf20Sopenharmony_ci (sctx->count % SHA1_BLOCK_SIZE) + len < SHA1_BLOCK_SIZE) 368c2ecf20Sopenharmony_ci return crypto_sha1_update(desc, data, len); 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci /* 398c2ecf20Sopenharmony_ci * Make sure struct sha1_state begins directly with the SHA1 408c2ecf20Sopenharmony_ci * 160-bit internal state, as this is what the asm functions expect. 418c2ecf20Sopenharmony_ci */ 428c2ecf20Sopenharmony_ci BUILD_BUG_ON(offsetof(struct sha1_state, state) != 0); 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci kernel_fpu_begin(); 458c2ecf20Sopenharmony_ci sha1_base_do_update(desc, data, len, sha1_xform); 468c2ecf20Sopenharmony_ci kernel_fpu_end(); 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci return 0; 498c2ecf20Sopenharmony_ci} 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_cistatic int sha1_finup(struct shash_desc *desc, const u8 *data, 528c2ecf20Sopenharmony_ci unsigned int len, u8 *out, sha1_block_fn *sha1_xform) 538c2ecf20Sopenharmony_ci{ 548c2ecf20Sopenharmony_ci if (!crypto_simd_usable()) 558c2ecf20Sopenharmony_ci return crypto_sha1_finup(desc, data, len, out); 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_ci kernel_fpu_begin(); 588c2ecf20Sopenharmony_ci if (len) 598c2ecf20Sopenharmony_ci sha1_base_do_update(desc, data, len, sha1_xform); 608c2ecf20Sopenharmony_ci sha1_base_do_finalize(desc, sha1_xform); 618c2ecf20Sopenharmony_ci kernel_fpu_end(); 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ci return sha1_base_finish(desc, out); 648c2ecf20Sopenharmony_ci} 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_ciasmlinkage void sha1_transform_ssse3(struct sha1_state *state, 678c2ecf20Sopenharmony_ci const u8 *data, int blocks); 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_cistatic int sha1_ssse3_update(struct shash_desc *desc, const u8 *data, 708c2ecf20Sopenharmony_ci unsigned int len) 718c2ecf20Sopenharmony_ci{ 728c2ecf20Sopenharmony_ci return sha1_update(desc, data, len, sha1_transform_ssse3); 738c2ecf20Sopenharmony_ci} 748c2ecf20Sopenharmony_ci 758c2ecf20Sopenharmony_cistatic int sha1_ssse3_finup(struct shash_desc *desc, const u8 *data, 768c2ecf20Sopenharmony_ci unsigned int len, u8 *out) 778c2ecf20Sopenharmony_ci{ 788c2ecf20Sopenharmony_ci return sha1_finup(desc, data, len, out, sha1_transform_ssse3); 798c2ecf20Sopenharmony_ci} 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_ci/* Add padding and return the message digest. */ 828c2ecf20Sopenharmony_cistatic int sha1_ssse3_final(struct shash_desc *desc, u8 *out) 838c2ecf20Sopenharmony_ci{ 848c2ecf20Sopenharmony_ci return sha1_ssse3_finup(desc, NULL, 0, out); 858c2ecf20Sopenharmony_ci} 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_cistatic struct shash_alg sha1_ssse3_alg = { 888c2ecf20Sopenharmony_ci .digestsize = SHA1_DIGEST_SIZE, 898c2ecf20Sopenharmony_ci .init = sha1_base_init, 908c2ecf20Sopenharmony_ci .update = sha1_ssse3_update, 918c2ecf20Sopenharmony_ci .final = sha1_ssse3_final, 928c2ecf20Sopenharmony_ci .finup = sha1_ssse3_finup, 938c2ecf20Sopenharmony_ci .descsize = sizeof(struct sha1_state), 948c2ecf20Sopenharmony_ci .base = { 958c2ecf20Sopenharmony_ci .cra_name = "sha1", 968c2ecf20Sopenharmony_ci .cra_driver_name = "sha1-ssse3", 978c2ecf20Sopenharmony_ci .cra_priority = 150, 988c2ecf20Sopenharmony_ci .cra_blocksize = SHA1_BLOCK_SIZE, 998c2ecf20Sopenharmony_ci .cra_module = THIS_MODULE, 1008c2ecf20Sopenharmony_ci } 1018c2ecf20Sopenharmony_ci}; 1028c2ecf20Sopenharmony_ci 1038c2ecf20Sopenharmony_cistatic int register_sha1_ssse3(void) 1048c2ecf20Sopenharmony_ci{ 1058c2ecf20Sopenharmony_ci if (boot_cpu_has(X86_FEATURE_SSSE3)) 1068c2ecf20Sopenharmony_ci return crypto_register_shash(&sha1_ssse3_alg); 1078c2ecf20Sopenharmony_ci return 0; 1088c2ecf20Sopenharmony_ci} 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_cistatic void unregister_sha1_ssse3(void) 1118c2ecf20Sopenharmony_ci{ 1128c2ecf20Sopenharmony_ci if (boot_cpu_has(X86_FEATURE_SSSE3)) 1138c2ecf20Sopenharmony_ci crypto_unregister_shash(&sha1_ssse3_alg); 1148c2ecf20Sopenharmony_ci} 1158c2ecf20Sopenharmony_ci 1168c2ecf20Sopenharmony_ciasmlinkage void sha1_transform_avx(struct sha1_state *state, 1178c2ecf20Sopenharmony_ci const u8 *data, int blocks); 1188c2ecf20Sopenharmony_ci 1198c2ecf20Sopenharmony_cistatic int sha1_avx_update(struct shash_desc *desc, const u8 *data, 1208c2ecf20Sopenharmony_ci unsigned int len) 1218c2ecf20Sopenharmony_ci{ 1228c2ecf20Sopenharmony_ci return sha1_update(desc, data, len, sha1_transform_avx); 1238c2ecf20Sopenharmony_ci} 1248c2ecf20Sopenharmony_ci 1258c2ecf20Sopenharmony_cistatic int sha1_avx_finup(struct shash_desc *desc, const u8 *data, 1268c2ecf20Sopenharmony_ci unsigned int len, u8 *out) 1278c2ecf20Sopenharmony_ci{ 1288c2ecf20Sopenharmony_ci return sha1_finup(desc, data, len, out, sha1_transform_avx); 1298c2ecf20Sopenharmony_ci} 1308c2ecf20Sopenharmony_ci 1318c2ecf20Sopenharmony_cistatic int sha1_avx_final(struct shash_desc *desc, u8 *out) 1328c2ecf20Sopenharmony_ci{ 1338c2ecf20Sopenharmony_ci return sha1_avx_finup(desc, NULL, 0, out); 1348c2ecf20Sopenharmony_ci} 1358c2ecf20Sopenharmony_ci 1368c2ecf20Sopenharmony_cistatic struct shash_alg sha1_avx_alg = { 1378c2ecf20Sopenharmony_ci .digestsize = SHA1_DIGEST_SIZE, 1388c2ecf20Sopenharmony_ci .init = sha1_base_init, 1398c2ecf20Sopenharmony_ci .update = sha1_avx_update, 1408c2ecf20Sopenharmony_ci .final = sha1_avx_final, 1418c2ecf20Sopenharmony_ci .finup = sha1_avx_finup, 1428c2ecf20Sopenharmony_ci .descsize = sizeof(struct sha1_state), 1438c2ecf20Sopenharmony_ci .base = { 1448c2ecf20Sopenharmony_ci .cra_name = "sha1", 1458c2ecf20Sopenharmony_ci .cra_driver_name = "sha1-avx", 1468c2ecf20Sopenharmony_ci .cra_priority = 160, 1478c2ecf20Sopenharmony_ci .cra_blocksize = SHA1_BLOCK_SIZE, 1488c2ecf20Sopenharmony_ci .cra_module = THIS_MODULE, 1498c2ecf20Sopenharmony_ci } 1508c2ecf20Sopenharmony_ci}; 1518c2ecf20Sopenharmony_ci 1528c2ecf20Sopenharmony_cistatic bool avx_usable(void) 1538c2ecf20Sopenharmony_ci{ 1548c2ecf20Sopenharmony_ci if (!cpu_has_xfeatures(XFEATURE_MASK_SSE | XFEATURE_MASK_YMM, NULL)) { 1558c2ecf20Sopenharmony_ci if (boot_cpu_has(X86_FEATURE_AVX)) 1568c2ecf20Sopenharmony_ci pr_info("AVX detected but unusable.\n"); 1578c2ecf20Sopenharmony_ci return false; 1588c2ecf20Sopenharmony_ci } 1598c2ecf20Sopenharmony_ci 1608c2ecf20Sopenharmony_ci return true; 1618c2ecf20Sopenharmony_ci} 1628c2ecf20Sopenharmony_ci 1638c2ecf20Sopenharmony_cistatic int register_sha1_avx(void) 1648c2ecf20Sopenharmony_ci{ 1658c2ecf20Sopenharmony_ci if (avx_usable()) 1668c2ecf20Sopenharmony_ci return crypto_register_shash(&sha1_avx_alg); 1678c2ecf20Sopenharmony_ci return 0; 1688c2ecf20Sopenharmony_ci} 1698c2ecf20Sopenharmony_ci 1708c2ecf20Sopenharmony_cistatic void unregister_sha1_avx(void) 1718c2ecf20Sopenharmony_ci{ 1728c2ecf20Sopenharmony_ci if (avx_usable()) 1738c2ecf20Sopenharmony_ci crypto_unregister_shash(&sha1_avx_alg); 1748c2ecf20Sopenharmony_ci} 1758c2ecf20Sopenharmony_ci 1768c2ecf20Sopenharmony_ci#define SHA1_AVX2_BLOCK_OPTSIZE 4 /* optimal 4*64 bytes of SHA1 blocks */ 1778c2ecf20Sopenharmony_ci 1788c2ecf20Sopenharmony_ciasmlinkage void sha1_transform_avx2(struct sha1_state *state, 1798c2ecf20Sopenharmony_ci const u8 *data, int blocks); 1808c2ecf20Sopenharmony_ci 1818c2ecf20Sopenharmony_cistatic bool avx2_usable(void) 1828c2ecf20Sopenharmony_ci{ 1838c2ecf20Sopenharmony_ci if (avx_usable() && boot_cpu_has(X86_FEATURE_AVX2) 1848c2ecf20Sopenharmony_ci && boot_cpu_has(X86_FEATURE_BMI1) 1858c2ecf20Sopenharmony_ci && boot_cpu_has(X86_FEATURE_BMI2)) 1868c2ecf20Sopenharmony_ci return true; 1878c2ecf20Sopenharmony_ci 1888c2ecf20Sopenharmony_ci return false; 1898c2ecf20Sopenharmony_ci} 1908c2ecf20Sopenharmony_ci 1918c2ecf20Sopenharmony_cistatic void sha1_apply_transform_avx2(struct sha1_state *state, 1928c2ecf20Sopenharmony_ci const u8 *data, int blocks) 1938c2ecf20Sopenharmony_ci{ 1948c2ecf20Sopenharmony_ci /* Select the optimal transform based on data block size */ 1958c2ecf20Sopenharmony_ci if (blocks >= SHA1_AVX2_BLOCK_OPTSIZE) 1968c2ecf20Sopenharmony_ci sha1_transform_avx2(state, data, blocks); 1978c2ecf20Sopenharmony_ci else 1988c2ecf20Sopenharmony_ci sha1_transform_avx(state, data, blocks); 1998c2ecf20Sopenharmony_ci} 2008c2ecf20Sopenharmony_ci 2018c2ecf20Sopenharmony_cistatic int sha1_avx2_update(struct shash_desc *desc, const u8 *data, 2028c2ecf20Sopenharmony_ci unsigned int len) 2038c2ecf20Sopenharmony_ci{ 2048c2ecf20Sopenharmony_ci return sha1_update(desc, data, len, sha1_apply_transform_avx2); 2058c2ecf20Sopenharmony_ci} 2068c2ecf20Sopenharmony_ci 2078c2ecf20Sopenharmony_cistatic int sha1_avx2_finup(struct shash_desc *desc, const u8 *data, 2088c2ecf20Sopenharmony_ci unsigned int len, u8 *out) 2098c2ecf20Sopenharmony_ci{ 2108c2ecf20Sopenharmony_ci return sha1_finup(desc, data, len, out, sha1_apply_transform_avx2); 2118c2ecf20Sopenharmony_ci} 2128c2ecf20Sopenharmony_ci 2138c2ecf20Sopenharmony_cistatic int sha1_avx2_final(struct shash_desc *desc, u8 *out) 2148c2ecf20Sopenharmony_ci{ 2158c2ecf20Sopenharmony_ci return sha1_avx2_finup(desc, NULL, 0, out); 2168c2ecf20Sopenharmony_ci} 2178c2ecf20Sopenharmony_ci 2188c2ecf20Sopenharmony_cistatic struct shash_alg sha1_avx2_alg = { 2198c2ecf20Sopenharmony_ci .digestsize = SHA1_DIGEST_SIZE, 2208c2ecf20Sopenharmony_ci .init = sha1_base_init, 2218c2ecf20Sopenharmony_ci .update = sha1_avx2_update, 2228c2ecf20Sopenharmony_ci .final = sha1_avx2_final, 2238c2ecf20Sopenharmony_ci .finup = sha1_avx2_finup, 2248c2ecf20Sopenharmony_ci .descsize = sizeof(struct sha1_state), 2258c2ecf20Sopenharmony_ci .base = { 2268c2ecf20Sopenharmony_ci .cra_name = "sha1", 2278c2ecf20Sopenharmony_ci .cra_driver_name = "sha1-avx2", 2288c2ecf20Sopenharmony_ci .cra_priority = 170, 2298c2ecf20Sopenharmony_ci .cra_blocksize = SHA1_BLOCK_SIZE, 2308c2ecf20Sopenharmony_ci .cra_module = THIS_MODULE, 2318c2ecf20Sopenharmony_ci } 2328c2ecf20Sopenharmony_ci}; 2338c2ecf20Sopenharmony_ci 2348c2ecf20Sopenharmony_cistatic int register_sha1_avx2(void) 2358c2ecf20Sopenharmony_ci{ 2368c2ecf20Sopenharmony_ci if (avx2_usable()) 2378c2ecf20Sopenharmony_ci return crypto_register_shash(&sha1_avx2_alg); 2388c2ecf20Sopenharmony_ci return 0; 2398c2ecf20Sopenharmony_ci} 2408c2ecf20Sopenharmony_ci 2418c2ecf20Sopenharmony_cistatic void unregister_sha1_avx2(void) 2428c2ecf20Sopenharmony_ci{ 2438c2ecf20Sopenharmony_ci if (avx2_usable()) 2448c2ecf20Sopenharmony_ci crypto_unregister_shash(&sha1_avx2_alg); 2458c2ecf20Sopenharmony_ci} 2468c2ecf20Sopenharmony_ci 2478c2ecf20Sopenharmony_ci#ifdef CONFIG_AS_SHA1_NI 2488c2ecf20Sopenharmony_ciasmlinkage void sha1_ni_transform(struct sha1_state *digest, const u8 *data, 2498c2ecf20Sopenharmony_ci int rounds); 2508c2ecf20Sopenharmony_ci 2518c2ecf20Sopenharmony_cistatic int sha1_ni_update(struct shash_desc *desc, const u8 *data, 2528c2ecf20Sopenharmony_ci unsigned int len) 2538c2ecf20Sopenharmony_ci{ 2548c2ecf20Sopenharmony_ci return sha1_update(desc, data, len, sha1_ni_transform); 2558c2ecf20Sopenharmony_ci} 2568c2ecf20Sopenharmony_ci 2578c2ecf20Sopenharmony_cistatic int sha1_ni_finup(struct shash_desc *desc, const u8 *data, 2588c2ecf20Sopenharmony_ci unsigned int len, u8 *out) 2598c2ecf20Sopenharmony_ci{ 2608c2ecf20Sopenharmony_ci return sha1_finup(desc, data, len, out, sha1_ni_transform); 2618c2ecf20Sopenharmony_ci} 2628c2ecf20Sopenharmony_ci 2638c2ecf20Sopenharmony_cistatic int sha1_ni_final(struct shash_desc *desc, u8 *out) 2648c2ecf20Sopenharmony_ci{ 2658c2ecf20Sopenharmony_ci return sha1_ni_finup(desc, NULL, 0, out); 2668c2ecf20Sopenharmony_ci} 2678c2ecf20Sopenharmony_ci 2688c2ecf20Sopenharmony_cistatic struct shash_alg sha1_ni_alg = { 2698c2ecf20Sopenharmony_ci .digestsize = SHA1_DIGEST_SIZE, 2708c2ecf20Sopenharmony_ci .init = sha1_base_init, 2718c2ecf20Sopenharmony_ci .update = sha1_ni_update, 2728c2ecf20Sopenharmony_ci .final = sha1_ni_final, 2738c2ecf20Sopenharmony_ci .finup = sha1_ni_finup, 2748c2ecf20Sopenharmony_ci .descsize = sizeof(struct sha1_state), 2758c2ecf20Sopenharmony_ci .base = { 2768c2ecf20Sopenharmony_ci .cra_name = "sha1", 2778c2ecf20Sopenharmony_ci .cra_driver_name = "sha1-ni", 2788c2ecf20Sopenharmony_ci .cra_priority = 250, 2798c2ecf20Sopenharmony_ci .cra_blocksize = SHA1_BLOCK_SIZE, 2808c2ecf20Sopenharmony_ci .cra_module = THIS_MODULE, 2818c2ecf20Sopenharmony_ci } 2828c2ecf20Sopenharmony_ci}; 2838c2ecf20Sopenharmony_ci 2848c2ecf20Sopenharmony_cistatic int register_sha1_ni(void) 2858c2ecf20Sopenharmony_ci{ 2868c2ecf20Sopenharmony_ci if (boot_cpu_has(X86_FEATURE_SHA_NI)) 2878c2ecf20Sopenharmony_ci return crypto_register_shash(&sha1_ni_alg); 2888c2ecf20Sopenharmony_ci return 0; 2898c2ecf20Sopenharmony_ci} 2908c2ecf20Sopenharmony_ci 2918c2ecf20Sopenharmony_cistatic void unregister_sha1_ni(void) 2928c2ecf20Sopenharmony_ci{ 2938c2ecf20Sopenharmony_ci if (boot_cpu_has(X86_FEATURE_SHA_NI)) 2948c2ecf20Sopenharmony_ci crypto_unregister_shash(&sha1_ni_alg); 2958c2ecf20Sopenharmony_ci} 2968c2ecf20Sopenharmony_ci 2978c2ecf20Sopenharmony_ci#else 2988c2ecf20Sopenharmony_cistatic inline int register_sha1_ni(void) { return 0; } 2998c2ecf20Sopenharmony_cistatic inline void unregister_sha1_ni(void) { } 3008c2ecf20Sopenharmony_ci#endif 3018c2ecf20Sopenharmony_ci 3028c2ecf20Sopenharmony_cistatic int __init sha1_ssse3_mod_init(void) 3038c2ecf20Sopenharmony_ci{ 3048c2ecf20Sopenharmony_ci if (register_sha1_ssse3()) 3058c2ecf20Sopenharmony_ci goto fail; 3068c2ecf20Sopenharmony_ci 3078c2ecf20Sopenharmony_ci if (register_sha1_avx()) { 3088c2ecf20Sopenharmony_ci unregister_sha1_ssse3(); 3098c2ecf20Sopenharmony_ci goto fail; 3108c2ecf20Sopenharmony_ci } 3118c2ecf20Sopenharmony_ci 3128c2ecf20Sopenharmony_ci if (register_sha1_avx2()) { 3138c2ecf20Sopenharmony_ci unregister_sha1_avx(); 3148c2ecf20Sopenharmony_ci unregister_sha1_ssse3(); 3158c2ecf20Sopenharmony_ci goto fail; 3168c2ecf20Sopenharmony_ci } 3178c2ecf20Sopenharmony_ci 3188c2ecf20Sopenharmony_ci if (register_sha1_ni()) { 3198c2ecf20Sopenharmony_ci unregister_sha1_avx2(); 3208c2ecf20Sopenharmony_ci unregister_sha1_avx(); 3218c2ecf20Sopenharmony_ci unregister_sha1_ssse3(); 3228c2ecf20Sopenharmony_ci goto fail; 3238c2ecf20Sopenharmony_ci } 3248c2ecf20Sopenharmony_ci 3258c2ecf20Sopenharmony_ci return 0; 3268c2ecf20Sopenharmony_cifail: 3278c2ecf20Sopenharmony_ci return -ENODEV; 3288c2ecf20Sopenharmony_ci} 3298c2ecf20Sopenharmony_ci 3308c2ecf20Sopenharmony_cistatic void __exit sha1_ssse3_mod_fini(void) 3318c2ecf20Sopenharmony_ci{ 3328c2ecf20Sopenharmony_ci unregister_sha1_ni(); 3338c2ecf20Sopenharmony_ci unregister_sha1_avx2(); 3348c2ecf20Sopenharmony_ci unregister_sha1_avx(); 3358c2ecf20Sopenharmony_ci unregister_sha1_ssse3(); 3368c2ecf20Sopenharmony_ci} 3378c2ecf20Sopenharmony_ci 3388c2ecf20Sopenharmony_cimodule_init(sha1_ssse3_mod_init); 3398c2ecf20Sopenharmony_cimodule_exit(sha1_ssse3_mod_fini); 3408c2ecf20Sopenharmony_ci 3418c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL"); 3428c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("SHA1 Secure Hash Algorithm, Supplemental SSE3 accelerated"); 3438c2ecf20Sopenharmony_ci 3448c2ecf20Sopenharmony_ciMODULE_ALIAS_CRYPTO("sha1"); 3458c2ecf20Sopenharmony_ciMODULE_ALIAS_CRYPTO("sha1-ssse3"); 3468c2ecf20Sopenharmony_ciMODULE_ALIAS_CRYPTO("sha1-avx"); 3478c2ecf20Sopenharmony_ciMODULE_ALIAS_CRYPTO("sha1-avx2"); 3488c2ecf20Sopenharmony_ci#ifdef CONFIG_AS_SHA1_NI 3498c2ecf20Sopenharmony_ciMODULE_ALIAS_CRYPTO("sha1-ni"); 3508c2ecf20Sopenharmony_ci#endif 351