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