18275d1aaSTim Chen /* 28275d1aaSTim Chen * Cryptographic API. 38275d1aaSTim Chen * 48275d1aaSTim Chen * Glue code for the SHA256 Secure Hash Algorithm assembler 58275d1aaSTim Chen * implementation using supplemental SSE3 / AVX / AVX2 instructions. 68275d1aaSTim Chen * 78275d1aaSTim Chen * This file is based on sha256_generic.c 88275d1aaSTim Chen * 98275d1aaSTim Chen * Copyright (C) 2013 Intel Corporation. 108275d1aaSTim Chen * 118275d1aaSTim Chen * Author: 128275d1aaSTim Chen * Tim Chen <tim.c.chen@linux.intel.com> 138275d1aaSTim Chen * 148275d1aaSTim Chen * This program is free software; you can redistribute it and/or modify it 158275d1aaSTim Chen * under the terms of the GNU General Public License as published by the Free 168275d1aaSTim Chen * Software Foundation; either version 2 of the License, or (at your option) 178275d1aaSTim Chen * any later version. 188275d1aaSTim Chen * 198275d1aaSTim Chen * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 208275d1aaSTim Chen * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 218275d1aaSTim Chen * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 228275d1aaSTim Chen * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 238275d1aaSTim Chen * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 248275d1aaSTim Chen * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 258275d1aaSTim Chen * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 268275d1aaSTim Chen * SOFTWARE. 278275d1aaSTim Chen */ 288275d1aaSTim Chen 298275d1aaSTim Chen 308275d1aaSTim Chen #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 318275d1aaSTim Chen 328275d1aaSTim Chen #include <crypto/internal/hash.h> 33f2abe0d7SEric Biggers #include <crypto/internal/simd.h> 348275d1aaSTim Chen #include <linux/init.h> 358275d1aaSTim Chen #include <linux/module.h> 368275d1aaSTim Chen #include <linux/mm.h> 378275d1aaSTim Chen #include <linux/cryptohash.h> 388275d1aaSTim Chen #include <linux/types.h> 398275d1aaSTim Chen #include <crypto/sha.h> 401631030aSArd Biesheuvel #include <crypto/sha256_base.h> 418275d1aaSTim Chen #include <linux/string.h> 42f2abe0d7SEric Biggers #include <asm/simd.h> 438275d1aaSTim Chen 441631030aSArd Biesheuvel asmlinkage void sha256_transform_ssse3(u32 *digest, const char *data, 458275d1aaSTim Chen u64 rounds); 465dda42fcStim typedef void (sha256_transform_fn)(u32 *digest, const char *data, u64 rounds); 478275d1aaSTim Chen 48*eb7d6ba8SHans de Goede static int _sha256_update(struct shash_desc *desc, const u8 *data, 495dda42fcStim unsigned int len, sha256_transform_fn *sha256_xform) 508275d1aaSTim Chen { 518275d1aaSTim Chen struct sha256_state *sctx = shash_desc_ctx(desc); 528275d1aaSTim Chen 53f2abe0d7SEric Biggers if (!crypto_simd_usable() || 541631030aSArd Biesheuvel (sctx->count % SHA256_BLOCK_SIZE) + len < SHA256_BLOCK_SIZE) 551631030aSArd Biesheuvel return crypto_sha256_update(desc, data, len); 561631030aSArd Biesheuvel 571631030aSArd Biesheuvel /* make sure casting to sha256_block_fn() is safe */ 581631030aSArd Biesheuvel BUILD_BUG_ON(offsetof(struct sha256_state, state) != 0); 591631030aSArd Biesheuvel 601631030aSArd Biesheuvel kernel_fpu_begin(); 611631030aSArd Biesheuvel sha256_base_do_update(desc, data, len, 625dda42fcStim (sha256_block_fn *)sha256_xform); 631631030aSArd Biesheuvel kernel_fpu_end(); 648275d1aaSTim Chen 658275d1aaSTim Chen return 0; 668275d1aaSTim Chen } 678275d1aaSTim Chen 685dda42fcStim static int sha256_finup(struct shash_desc *desc, const u8 *data, 695dda42fcStim unsigned int len, u8 *out, sha256_transform_fn *sha256_xform) 701631030aSArd Biesheuvel { 71f2abe0d7SEric Biggers if (!crypto_simd_usable()) 721631030aSArd Biesheuvel return crypto_sha256_finup(desc, data, len, out); 731631030aSArd Biesheuvel 748275d1aaSTim Chen kernel_fpu_begin(); 751631030aSArd Biesheuvel if (len) 761631030aSArd Biesheuvel sha256_base_do_update(desc, data, len, 775dda42fcStim (sha256_block_fn *)sha256_xform); 785dda42fcStim sha256_base_do_finalize(desc, (sha256_block_fn *)sha256_xform); 798275d1aaSTim Chen kernel_fpu_end(); 808275d1aaSTim Chen 811631030aSArd Biesheuvel return sha256_base_finish(desc, out); 828275d1aaSTim Chen } 838275d1aaSTim Chen 845dda42fcStim static int sha256_ssse3_update(struct shash_desc *desc, const u8 *data, 855dda42fcStim unsigned int len) 865dda42fcStim { 87*eb7d6ba8SHans de Goede return _sha256_update(desc, data, len, sha256_transform_ssse3); 885dda42fcStim } 895dda42fcStim 905dda42fcStim static int sha256_ssse3_finup(struct shash_desc *desc, const u8 *data, 915dda42fcStim unsigned int len, u8 *out) 925dda42fcStim { 935dda42fcStim return sha256_finup(desc, data, len, out, sha256_transform_ssse3); 945dda42fcStim } 955dda42fcStim 968275d1aaSTim Chen /* Add padding and return the message digest. */ 978275d1aaSTim Chen static int sha256_ssse3_final(struct shash_desc *desc, u8 *out) 988275d1aaSTim Chen { 991631030aSArd Biesheuvel return sha256_ssse3_finup(desc, NULL, 0, out); 100a710f761SJussi Kivilinna } 101a710f761SJussi Kivilinna 1025dda42fcStim static struct shash_alg sha256_ssse3_algs[] = { { 1038275d1aaSTim Chen .digestsize = SHA256_DIGEST_SIZE, 1041631030aSArd Biesheuvel .init = sha256_base_init, 1058275d1aaSTim Chen .update = sha256_ssse3_update, 1068275d1aaSTim Chen .final = sha256_ssse3_final, 1071631030aSArd Biesheuvel .finup = sha256_ssse3_finup, 1088275d1aaSTim Chen .descsize = sizeof(struct sha256_state), 1098275d1aaSTim Chen .base = { 1108275d1aaSTim Chen .cra_name = "sha256", 1118275d1aaSTim Chen .cra_driver_name = "sha256-ssse3", 1128275d1aaSTim Chen .cra_priority = 150, 1138275d1aaSTim Chen .cra_blocksize = SHA256_BLOCK_SIZE, 1148275d1aaSTim Chen .cra_module = THIS_MODULE, 1158275d1aaSTim Chen } 116a710f761SJussi Kivilinna }, { 117a710f761SJussi Kivilinna .digestsize = SHA224_DIGEST_SIZE, 1181631030aSArd Biesheuvel .init = sha224_base_init, 119a710f761SJussi Kivilinna .update = sha256_ssse3_update, 1201631030aSArd Biesheuvel .final = sha256_ssse3_final, 1211631030aSArd Biesheuvel .finup = sha256_ssse3_finup, 122a710f761SJussi Kivilinna .descsize = sizeof(struct sha256_state), 123a710f761SJussi Kivilinna .base = { 124a710f761SJussi Kivilinna .cra_name = "sha224", 125a710f761SJussi Kivilinna .cra_driver_name = "sha224-ssse3", 126a710f761SJussi Kivilinna .cra_priority = 150, 127a710f761SJussi Kivilinna .cra_blocksize = SHA224_BLOCK_SIZE, 128a710f761SJussi Kivilinna .cra_module = THIS_MODULE, 129a710f761SJussi Kivilinna } 130a710f761SJussi Kivilinna } }; 1318275d1aaSTim Chen 1325dda42fcStim static int register_sha256_ssse3(void) 1335dda42fcStim { 1345dda42fcStim if (boot_cpu_has(X86_FEATURE_SSSE3)) 1355dda42fcStim return crypto_register_shashes(sha256_ssse3_algs, 1365dda42fcStim ARRAY_SIZE(sha256_ssse3_algs)); 1375dda42fcStim return 0; 1385dda42fcStim } 1395dda42fcStim 1405dda42fcStim static void unregister_sha256_ssse3(void) 1415dda42fcStim { 1425dda42fcStim if (boot_cpu_has(X86_FEATURE_SSSE3)) 1435dda42fcStim crypto_unregister_shashes(sha256_ssse3_algs, 1445dda42fcStim ARRAY_SIZE(sha256_ssse3_algs)); 1455dda42fcStim } 1465dda42fcStim 1478275d1aaSTim Chen #ifdef CONFIG_AS_AVX 1485dda42fcStim asmlinkage void sha256_transform_avx(u32 *digest, const char *data, 1495dda42fcStim u64 rounds); 1505dda42fcStim 1515dda42fcStim static int sha256_avx_update(struct shash_desc *desc, const u8 *data, 1525dda42fcStim unsigned int len) 1535dda42fcStim { 154*eb7d6ba8SHans de Goede return _sha256_update(desc, data, len, sha256_transform_avx); 1555dda42fcStim } 1565dda42fcStim 1575dda42fcStim static int sha256_avx_finup(struct shash_desc *desc, const u8 *data, 1585dda42fcStim unsigned int len, u8 *out) 1595dda42fcStim { 1605dda42fcStim return sha256_finup(desc, data, len, out, sha256_transform_avx); 1615dda42fcStim } 1625dda42fcStim 1635dda42fcStim static int sha256_avx_final(struct shash_desc *desc, u8 *out) 1645dda42fcStim { 1655dda42fcStim return sha256_avx_finup(desc, NULL, 0, out); 1665dda42fcStim } 1675dda42fcStim 1685dda42fcStim static struct shash_alg sha256_avx_algs[] = { { 1695dda42fcStim .digestsize = SHA256_DIGEST_SIZE, 1705dda42fcStim .init = sha256_base_init, 1715dda42fcStim .update = sha256_avx_update, 1725dda42fcStim .final = sha256_avx_final, 1735dda42fcStim .finup = sha256_avx_finup, 1745dda42fcStim .descsize = sizeof(struct sha256_state), 1755dda42fcStim .base = { 1765dda42fcStim .cra_name = "sha256", 1775dda42fcStim .cra_driver_name = "sha256-avx", 1785dda42fcStim .cra_priority = 160, 1795dda42fcStim .cra_blocksize = SHA256_BLOCK_SIZE, 1805dda42fcStim .cra_module = THIS_MODULE, 1815dda42fcStim } 1825dda42fcStim }, { 1835dda42fcStim .digestsize = SHA224_DIGEST_SIZE, 1845dda42fcStim .init = sha224_base_init, 1855dda42fcStim .update = sha256_avx_update, 1865dda42fcStim .final = sha256_avx_final, 1875dda42fcStim .finup = sha256_avx_finup, 1885dda42fcStim .descsize = sizeof(struct sha256_state), 1895dda42fcStim .base = { 1905dda42fcStim .cra_name = "sha224", 1915dda42fcStim .cra_driver_name = "sha224-avx", 1925dda42fcStim .cra_priority = 160, 1935dda42fcStim .cra_blocksize = SHA224_BLOCK_SIZE, 1945dda42fcStim .cra_module = THIS_MODULE, 1955dda42fcStim } 1965dda42fcStim } }; 1975dda42fcStim 1985dda42fcStim static bool avx_usable(void) 1998275d1aaSTim Chen { 200d91cab78SDave Hansen if (!cpu_has_xfeatures(XFEATURE_MASK_SSE | XFEATURE_MASK_YMM, NULL)) { 201da154e82SBorislav Petkov if (boot_cpu_has(X86_FEATURE_AVX)) 2028275d1aaSTim Chen pr_info("AVX detected but unusable.\n"); 2038275d1aaSTim Chen return false; 2048275d1aaSTim Chen } 2058275d1aaSTim Chen 2068275d1aaSTim Chen return true; 2078275d1aaSTim Chen } 2085dda42fcStim 2095dda42fcStim static int register_sha256_avx(void) 2105dda42fcStim { 2115dda42fcStim if (avx_usable()) 2125dda42fcStim return crypto_register_shashes(sha256_avx_algs, 2135dda42fcStim ARRAY_SIZE(sha256_avx_algs)); 2145dda42fcStim return 0; 2155dda42fcStim } 2165dda42fcStim 2175dda42fcStim static void unregister_sha256_avx(void) 2185dda42fcStim { 2195dda42fcStim if (avx_usable()) 2205dda42fcStim crypto_unregister_shashes(sha256_avx_algs, 2215dda42fcStim ARRAY_SIZE(sha256_avx_algs)); 2225dda42fcStim } 2235dda42fcStim 2245dda42fcStim #else 2255dda42fcStim static inline int register_sha256_avx(void) { return 0; } 2265dda42fcStim static inline void unregister_sha256_avx(void) { } 2275dda42fcStim #endif 2285dda42fcStim 2295dda42fcStim #if defined(CONFIG_AS_AVX2) && defined(CONFIG_AS_AVX) 2305dda42fcStim asmlinkage void sha256_transform_rorx(u32 *digest, const char *data, 2315dda42fcStim u64 rounds); 2325dda42fcStim 2335dda42fcStim static int sha256_avx2_update(struct shash_desc *desc, const u8 *data, 2345dda42fcStim unsigned int len) 2355dda42fcStim { 236*eb7d6ba8SHans de Goede return _sha256_update(desc, data, len, sha256_transform_rorx); 2375dda42fcStim } 2385dda42fcStim 2395dda42fcStim static int sha256_avx2_finup(struct shash_desc *desc, const u8 *data, 2405dda42fcStim unsigned int len, u8 *out) 2415dda42fcStim { 2425dda42fcStim return sha256_finup(desc, data, len, out, sha256_transform_rorx); 2435dda42fcStim } 2445dda42fcStim 2455dda42fcStim static int sha256_avx2_final(struct shash_desc *desc, u8 *out) 2465dda42fcStim { 2475dda42fcStim return sha256_avx2_finup(desc, NULL, 0, out); 2485dda42fcStim } 2495dda42fcStim 2505dda42fcStim static struct shash_alg sha256_avx2_algs[] = { { 2515dda42fcStim .digestsize = SHA256_DIGEST_SIZE, 2525dda42fcStim .init = sha256_base_init, 2535dda42fcStim .update = sha256_avx2_update, 2545dda42fcStim .final = sha256_avx2_final, 2555dda42fcStim .finup = sha256_avx2_finup, 2565dda42fcStim .descsize = sizeof(struct sha256_state), 2575dda42fcStim .base = { 2585dda42fcStim .cra_name = "sha256", 2595dda42fcStim .cra_driver_name = "sha256-avx2", 2605dda42fcStim .cra_priority = 170, 2615dda42fcStim .cra_blocksize = SHA256_BLOCK_SIZE, 2625dda42fcStim .cra_module = THIS_MODULE, 2635dda42fcStim } 2645dda42fcStim }, { 2655dda42fcStim .digestsize = SHA224_DIGEST_SIZE, 2665dda42fcStim .init = sha224_base_init, 2675dda42fcStim .update = sha256_avx2_update, 2685dda42fcStim .final = sha256_avx2_final, 2695dda42fcStim .finup = sha256_avx2_finup, 2705dda42fcStim .descsize = sizeof(struct sha256_state), 2715dda42fcStim .base = { 2725dda42fcStim .cra_name = "sha224", 2735dda42fcStim .cra_driver_name = "sha224-avx2", 2745dda42fcStim .cra_priority = 170, 2755dda42fcStim .cra_blocksize = SHA224_BLOCK_SIZE, 2765dda42fcStim .cra_module = THIS_MODULE, 2775dda42fcStim } 2785dda42fcStim } }; 2795dda42fcStim 2805dda42fcStim static bool avx2_usable(void) 2815dda42fcStim { 2825dda42fcStim if (avx_usable() && boot_cpu_has(X86_FEATURE_AVX2) && 2835dda42fcStim boot_cpu_has(X86_FEATURE_BMI2)) 2845dda42fcStim return true; 2855dda42fcStim 2865dda42fcStim return false; 2875dda42fcStim } 2885dda42fcStim 2895dda42fcStim static int register_sha256_avx2(void) 2905dda42fcStim { 2915dda42fcStim if (avx2_usable()) 2925dda42fcStim return crypto_register_shashes(sha256_avx2_algs, 2935dda42fcStim ARRAY_SIZE(sha256_avx2_algs)); 2945dda42fcStim return 0; 2955dda42fcStim } 2965dda42fcStim 2975dda42fcStim static void unregister_sha256_avx2(void) 2985dda42fcStim { 2995dda42fcStim if (avx2_usable()) 3005dda42fcStim crypto_unregister_shashes(sha256_avx2_algs, 3015dda42fcStim ARRAY_SIZE(sha256_avx2_algs)); 3025dda42fcStim } 3035dda42fcStim 3045dda42fcStim #else 3055dda42fcStim static inline int register_sha256_avx2(void) { return 0; } 3065dda42fcStim static inline void unregister_sha256_avx2(void) { } 3075dda42fcStim #endif 3085dda42fcStim 3095dda42fcStim #ifdef CONFIG_AS_SHA256_NI 3105dda42fcStim asmlinkage void sha256_ni_transform(u32 *digest, const char *data, 3115dda42fcStim u64 rounds); /*unsigned int rounds);*/ 3125dda42fcStim 3135dda42fcStim static int sha256_ni_update(struct shash_desc *desc, const u8 *data, 3145dda42fcStim unsigned int len) 3155dda42fcStim { 316*eb7d6ba8SHans de Goede return _sha256_update(desc, data, len, sha256_ni_transform); 3175dda42fcStim } 3185dda42fcStim 3195dda42fcStim static int sha256_ni_finup(struct shash_desc *desc, const u8 *data, 3205dda42fcStim unsigned int len, u8 *out) 3215dda42fcStim { 3225dda42fcStim return sha256_finup(desc, data, len, out, sha256_ni_transform); 3235dda42fcStim } 3245dda42fcStim 3255dda42fcStim static int sha256_ni_final(struct shash_desc *desc, u8 *out) 3265dda42fcStim { 3275dda42fcStim return sha256_ni_finup(desc, NULL, 0, out); 3285dda42fcStim } 3295dda42fcStim 3305dda42fcStim static struct shash_alg sha256_ni_algs[] = { { 3315dda42fcStim .digestsize = SHA256_DIGEST_SIZE, 3325dda42fcStim .init = sha256_base_init, 3335dda42fcStim .update = sha256_ni_update, 3345dda42fcStim .final = sha256_ni_final, 3355dda42fcStim .finup = sha256_ni_finup, 3365dda42fcStim .descsize = sizeof(struct sha256_state), 3375dda42fcStim .base = { 3385dda42fcStim .cra_name = "sha256", 3395dda42fcStim .cra_driver_name = "sha256-ni", 3405dda42fcStim .cra_priority = 250, 3415dda42fcStim .cra_blocksize = SHA256_BLOCK_SIZE, 3425dda42fcStim .cra_module = THIS_MODULE, 3435dda42fcStim } 3445dda42fcStim }, { 3455dda42fcStim .digestsize = SHA224_DIGEST_SIZE, 3465dda42fcStim .init = sha224_base_init, 3475dda42fcStim .update = sha256_ni_update, 3485dda42fcStim .final = sha256_ni_final, 3495dda42fcStim .finup = sha256_ni_finup, 3505dda42fcStim .descsize = sizeof(struct sha256_state), 3515dda42fcStim .base = { 3525dda42fcStim .cra_name = "sha224", 3535dda42fcStim .cra_driver_name = "sha224-ni", 3545dda42fcStim .cra_priority = 250, 3555dda42fcStim .cra_blocksize = SHA224_BLOCK_SIZE, 3565dda42fcStim .cra_module = THIS_MODULE, 3575dda42fcStim } 3585dda42fcStim } }; 3595dda42fcStim 3605dda42fcStim static int register_sha256_ni(void) 3615dda42fcStim { 3625dda42fcStim if (boot_cpu_has(X86_FEATURE_SHA_NI)) 3635dda42fcStim return crypto_register_shashes(sha256_ni_algs, 3645dda42fcStim ARRAY_SIZE(sha256_ni_algs)); 3655dda42fcStim return 0; 3665dda42fcStim } 3675dda42fcStim 3685dda42fcStim static void unregister_sha256_ni(void) 3695dda42fcStim { 3705dda42fcStim if (boot_cpu_has(X86_FEATURE_SHA_NI)) 3715dda42fcStim crypto_unregister_shashes(sha256_ni_algs, 3725dda42fcStim ARRAY_SIZE(sha256_ni_algs)); 3735dda42fcStim } 3745dda42fcStim 3755dda42fcStim #else 3765dda42fcStim static inline int register_sha256_ni(void) { return 0; } 3775dda42fcStim static inline void unregister_sha256_ni(void) { } 3788275d1aaSTim Chen #endif 3798275d1aaSTim Chen 3808275d1aaSTim Chen static int __init sha256_ssse3_mod_init(void) 3818275d1aaSTim Chen { 3825dda42fcStim if (register_sha256_ssse3()) 3835dda42fcStim goto fail; 3848275d1aaSTim Chen 3855dda42fcStim if (register_sha256_avx()) { 3865dda42fcStim unregister_sha256_ssse3(); 3875dda42fcStim goto fail; 3888275d1aaSTim Chen } 3898275d1aaSTim Chen 3905dda42fcStim if (register_sha256_avx2()) { 3915dda42fcStim unregister_sha256_avx(); 3925dda42fcStim unregister_sha256_ssse3(); 3935dda42fcStim goto fail; 3948275d1aaSTim Chen } 3958275d1aaSTim Chen 3965dda42fcStim if (register_sha256_ni()) { 3975dda42fcStim unregister_sha256_avx2(); 3985dda42fcStim unregister_sha256_avx(); 3995dda42fcStim unregister_sha256_ssse3(); 4005dda42fcStim goto fail; 4018275d1aaSTim Chen } 4028275d1aaSTim Chen 4035dda42fcStim return 0; 4045dda42fcStim fail: 4058275d1aaSTim Chen return -ENODEV; 4068275d1aaSTim Chen } 4078275d1aaSTim Chen 4088275d1aaSTim Chen static void __exit sha256_ssse3_mod_fini(void) 4098275d1aaSTim Chen { 4105dda42fcStim unregister_sha256_ni(); 4115dda42fcStim unregister_sha256_avx2(); 4125dda42fcStim unregister_sha256_avx(); 4135dda42fcStim unregister_sha256_ssse3(); 4148275d1aaSTim Chen } 4158275d1aaSTim Chen 4168275d1aaSTim Chen module_init(sha256_ssse3_mod_init); 4178275d1aaSTim Chen module_exit(sha256_ssse3_mod_fini); 4188275d1aaSTim Chen 4198275d1aaSTim Chen MODULE_LICENSE("GPL"); 4208275d1aaSTim Chen MODULE_DESCRIPTION("SHA256 Secure Hash Algorithm, Supplemental SSE3 accelerated"); 4218275d1aaSTim Chen 4225d26a105SKees Cook MODULE_ALIAS_CRYPTO("sha256"); 4231a445e8eSStephan Mueller MODULE_ALIAS_CRYPTO("sha256-ssse3"); 4241a445e8eSStephan Mueller MODULE_ALIAS_CRYPTO("sha256-avx"); 4251a445e8eSStephan Mueller MODULE_ALIAS_CRYPTO("sha256-avx2"); 4265d26a105SKees Cook MODULE_ALIAS_CRYPTO("sha224"); 4271a445e8eSStephan Mueller MODULE_ALIAS_CRYPTO("sha224-ssse3"); 4281a445e8eSStephan Mueller MODULE_ALIAS_CRYPTO("sha224-avx"); 4291a445e8eSStephan Mueller MODULE_ALIAS_CRYPTO("sha224-avx2"); 4301a445e8eSStephan Mueller #ifdef CONFIG_AS_SHA256_NI 4311a445e8eSStephan Mueller MODULE_ALIAS_CRYPTO("sha256-ni"); 4321a445e8eSStephan Mueller MODULE_ALIAS_CRYPTO("sha224-ni"); 4331a445e8eSStephan Mueller #endif 434