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> 338275d1aaSTim Chen #include <linux/init.h> 348275d1aaSTim Chen #include <linux/module.h> 358275d1aaSTim Chen #include <linux/mm.h> 368275d1aaSTim Chen #include <linux/cryptohash.h> 378275d1aaSTim Chen #include <linux/types.h> 388275d1aaSTim Chen #include <crypto/sha.h> 391631030aSArd Biesheuvel #include <crypto/sha256_base.h> 40df6b35f4SIngo Molnar #include <asm/fpu/api.h> 418275d1aaSTim Chen #include <linux/string.h> 428275d1aaSTim Chen 431631030aSArd Biesheuvel asmlinkage void sha256_transform_ssse3(u32 *digest, const char *data, 448275d1aaSTim Chen u64 rounds); 45*5dda42fcStim typedef void (sha256_transform_fn)(u32 *digest, const char *data, u64 rounds); 468275d1aaSTim Chen 47*5dda42fcStim static int sha256_update(struct shash_desc *desc, const u8 *data, 48*5dda42fcStim unsigned int len, sha256_transform_fn *sha256_xform) 498275d1aaSTim Chen { 508275d1aaSTim Chen struct sha256_state *sctx = shash_desc_ctx(desc); 518275d1aaSTim Chen 521631030aSArd Biesheuvel if (!irq_fpu_usable() || 531631030aSArd Biesheuvel (sctx->count % SHA256_BLOCK_SIZE) + len < SHA256_BLOCK_SIZE) 541631030aSArd Biesheuvel return crypto_sha256_update(desc, data, len); 551631030aSArd Biesheuvel 561631030aSArd Biesheuvel /* make sure casting to sha256_block_fn() is safe */ 571631030aSArd Biesheuvel BUILD_BUG_ON(offsetof(struct sha256_state, state) != 0); 581631030aSArd Biesheuvel 591631030aSArd Biesheuvel kernel_fpu_begin(); 601631030aSArd Biesheuvel sha256_base_do_update(desc, data, len, 61*5dda42fcStim (sha256_block_fn *)sha256_xform); 621631030aSArd Biesheuvel kernel_fpu_end(); 638275d1aaSTim Chen 648275d1aaSTim Chen return 0; 658275d1aaSTim Chen } 668275d1aaSTim Chen 67*5dda42fcStim static int sha256_finup(struct shash_desc *desc, const u8 *data, 68*5dda42fcStim unsigned int len, u8 *out, sha256_transform_fn *sha256_xform) 691631030aSArd Biesheuvel { 701631030aSArd Biesheuvel if (!irq_fpu_usable()) 711631030aSArd Biesheuvel return crypto_sha256_finup(desc, data, len, out); 721631030aSArd Biesheuvel 738275d1aaSTim Chen kernel_fpu_begin(); 741631030aSArd Biesheuvel if (len) 751631030aSArd Biesheuvel sha256_base_do_update(desc, data, len, 76*5dda42fcStim (sha256_block_fn *)sha256_xform); 77*5dda42fcStim sha256_base_do_finalize(desc, (sha256_block_fn *)sha256_xform); 788275d1aaSTim Chen kernel_fpu_end(); 798275d1aaSTim Chen 801631030aSArd Biesheuvel return sha256_base_finish(desc, out); 818275d1aaSTim Chen } 828275d1aaSTim Chen 83*5dda42fcStim static int sha256_ssse3_update(struct shash_desc *desc, const u8 *data, 84*5dda42fcStim unsigned int len) 85*5dda42fcStim { 86*5dda42fcStim return sha256_update(desc, data, len, sha256_transform_ssse3); 87*5dda42fcStim } 88*5dda42fcStim 89*5dda42fcStim static int sha256_ssse3_finup(struct shash_desc *desc, const u8 *data, 90*5dda42fcStim unsigned int len, u8 *out) 91*5dda42fcStim { 92*5dda42fcStim return sha256_finup(desc, data, len, out, sha256_transform_ssse3); 93*5dda42fcStim } 94*5dda42fcStim 958275d1aaSTim Chen /* Add padding and return the message digest. */ 968275d1aaSTim Chen static int sha256_ssse3_final(struct shash_desc *desc, u8 *out) 978275d1aaSTim Chen { 981631030aSArd Biesheuvel return sha256_ssse3_finup(desc, NULL, 0, out); 99a710f761SJussi Kivilinna } 100a710f761SJussi Kivilinna 101*5dda42fcStim static struct shash_alg sha256_ssse3_algs[] = { { 1028275d1aaSTim Chen .digestsize = SHA256_DIGEST_SIZE, 1031631030aSArd Biesheuvel .init = sha256_base_init, 1048275d1aaSTim Chen .update = sha256_ssse3_update, 1058275d1aaSTim Chen .final = sha256_ssse3_final, 1061631030aSArd Biesheuvel .finup = sha256_ssse3_finup, 1078275d1aaSTim Chen .descsize = sizeof(struct sha256_state), 1088275d1aaSTim Chen .base = { 1098275d1aaSTim Chen .cra_name = "sha256", 1108275d1aaSTim Chen .cra_driver_name = "sha256-ssse3", 1118275d1aaSTim Chen .cra_priority = 150, 1128275d1aaSTim Chen .cra_flags = CRYPTO_ALG_TYPE_SHASH, 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_flags = CRYPTO_ALG_TYPE_SHASH, 128a710f761SJussi Kivilinna .cra_blocksize = SHA224_BLOCK_SIZE, 129a710f761SJussi Kivilinna .cra_module = THIS_MODULE, 130a710f761SJussi Kivilinna } 131a710f761SJussi Kivilinna } }; 1328275d1aaSTim Chen 133*5dda42fcStim static int register_sha256_ssse3(void) 134*5dda42fcStim { 135*5dda42fcStim if (boot_cpu_has(X86_FEATURE_SSSE3)) 136*5dda42fcStim return crypto_register_shashes(sha256_ssse3_algs, 137*5dda42fcStim ARRAY_SIZE(sha256_ssse3_algs)); 138*5dda42fcStim return 0; 139*5dda42fcStim } 140*5dda42fcStim 141*5dda42fcStim static void unregister_sha256_ssse3(void) 142*5dda42fcStim { 143*5dda42fcStim if (boot_cpu_has(X86_FEATURE_SSSE3)) 144*5dda42fcStim crypto_unregister_shashes(sha256_ssse3_algs, 145*5dda42fcStim ARRAY_SIZE(sha256_ssse3_algs)); 146*5dda42fcStim } 147*5dda42fcStim 1488275d1aaSTim Chen #ifdef CONFIG_AS_AVX 149*5dda42fcStim asmlinkage void sha256_transform_avx(u32 *digest, const char *data, 150*5dda42fcStim u64 rounds); 151*5dda42fcStim 152*5dda42fcStim static int sha256_avx_update(struct shash_desc *desc, const u8 *data, 153*5dda42fcStim unsigned int len) 154*5dda42fcStim { 155*5dda42fcStim return sha256_update(desc, data, len, sha256_transform_avx); 156*5dda42fcStim } 157*5dda42fcStim 158*5dda42fcStim static int sha256_avx_finup(struct shash_desc *desc, const u8 *data, 159*5dda42fcStim unsigned int len, u8 *out) 160*5dda42fcStim { 161*5dda42fcStim return sha256_finup(desc, data, len, out, sha256_transform_avx); 162*5dda42fcStim } 163*5dda42fcStim 164*5dda42fcStim static int sha256_avx_final(struct shash_desc *desc, u8 *out) 165*5dda42fcStim { 166*5dda42fcStim return sha256_avx_finup(desc, NULL, 0, out); 167*5dda42fcStim } 168*5dda42fcStim 169*5dda42fcStim static struct shash_alg sha256_avx_algs[] = { { 170*5dda42fcStim .digestsize = SHA256_DIGEST_SIZE, 171*5dda42fcStim .init = sha256_base_init, 172*5dda42fcStim .update = sha256_avx_update, 173*5dda42fcStim .final = sha256_avx_final, 174*5dda42fcStim .finup = sha256_avx_finup, 175*5dda42fcStim .descsize = sizeof(struct sha256_state), 176*5dda42fcStim .base = { 177*5dda42fcStim .cra_name = "sha256", 178*5dda42fcStim .cra_driver_name = "sha256-avx", 179*5dda42fcStim .cra_priority = 160, 180*5dda42fcStim .cra_flags = CRYPTO_ALG_TYPE_SHASH, 181*5dda42fcStim .cra_blocksize = SHA256_BLOCK_SIZE, 182*5dda42fcStim .cra_module = THIS_MODULE, 183*5dda42fcStim } 184*5dda42fcStim }, { 185*5dda42fcStim .digestsize = SHA224_DIGEST_SIZE, 186*5dda42fcStim .init = sha224_base_init, 187*5dda42fcStim .update = sha256_avx_update, 188*5dda42fcStim .final = sha256_avx_final, 189*5dda42fcStim .finup = sha256_avx_finup, 190*5dda42fcStim .descsize = sizeof(struct sha256_state), 191*5dda42fcStim .base = { 192*5dda42fcStim .cra_name = "sha224", 193*5dda42fcStim .cra_driver_name = "sha224-avx", 194*5dda42fcStim .cra_priority = 160, 195*5dda42fcStim .cra_flags = CRYPTO_ALG_TYPE_SHASH, 196*5dda42fcStim .cra_blocksize = SHA224_BLOCK_SIZE, 197*5dda42fcStim .cra_module = THIS_MODULE, 198*5dda42fcStim } 199*5dda42fcStim } }; 200*5dda42fcStim 201*5dda42fcStim static bool avx_usable(void) 2028275d1aaSTim Chen { 20370d51eb6SIngo Molnar if (!cpu_has_xfeatures(XSTATE_SSE | XSTATE_YMM, NULL)) { 20470d51eb6SIngo Molnar if (cpu_has_avx) 2058275d1aaSTim Chen pr_info("AVX detected but unusable.\n"); 2068275d1aaSTim Chen return false; 2078275d1aaSTim Chen } 2088275d1aaSTim Chen 2098275d1aaSTim Chen return true; 2108275d1aaSTim Chen } 211*5dda42fcStim 212*5dda42fcStim static int register_sha256_avx(void) 213*5dda42fcStim { 214*5dda42fcStim if (avx_usable()) 215*5dda42fcStim return crypto_register_shashes(sha256_avx_algs, 216*5dda42fcStim ARRAY_SIZE(sha256_avx_algs)); 217*5dda42fcStim return 0; 218*5dda42fcStim } 219*5dda42fcStim 220*5dda42fcStim static void unregister_sha256_avx(void) 221*5dda42fcStim { 222*5dda42fcStim if (avx_usable()) 223*5dda42fcStim crypto_unregister_shashes(sha256_avx_algs, 224*5dda42fcStim ARRAY_SIZE(sha256_avx_algs)); 225*5dda42fcStim } 226*5dda42fcStim 227*5dda42fcStim #else 228*5dda42fcStim static inline int register_sha256_avx(void) { return 0; } 229*5dda42fcStim static inline void unregister_sha256_avx(void) { } 230*5dda42fcStim #endif 231*5dda42fcStim 232*5dda42fcStim #if defined(CONFIG_AS_AVX2) && defined(CONFIG_AS_AVX) 233*5dda42fcStim asmlinkage void sha256_transform_rorx(u32 *digest, const char *data, 234*5dda42fcStim u64 rounds); 235*5dda42fcStim 236*5dda42fcStim static int sha256_avx2_update(struct shash_desc *desc, const u8 *data, 237*5dda42fcStim unsigned int len) 238*5dda42fcStim { 239*5dda42fcStim return sha256_update(desc, data, len, sha256_transform_rorx); 240*5dda42fcStim } 241*5dda42fcStim 242*5dda42fcStim static int sha256_avx2_finup(struct shash_desc *desc, const u8 *data, 243*5dda42fcStim unsigned int len, u8 *out) 244*5dda42fcStim { 245*5dda42fcStim return sha256_finup(desc, data, len, out, sha256_transform_rorx); 246*5dda42fcStim } 247*5dda42fcStim 248*5dda42fcStim static int sha256_avx2_final(struct shash_desc *desc, u8 *out) 249*5dda42fcStim { 250*5dda42fcStim return sha256_avx2_finup(desc, NULL, 0, out); 251*5dda42fcStim } 252*5dda42fcStim 253*5dda42fcStim static struct shash_alg sha256_avx2_algs[] = { { 254*5dda42fcStim .digestsize = SHA256_DIGEST_SIZE, 255*5dda42fcStim .init = sha256_base_init, 256*5dda42fcStim .update = sha256_avx2_update, 257*5dda42fcStim .final = sha256_avx2_final, 258*5dda42fcStim .finup = sha256_avx2_finup, 259*5dda42fcStim .descsize = sizeof(struct sha256_state), 260*5dda42fcStim .base = { 261*5dda42fcStim .cra_name = "sha256", 262*5dda42fcStim .cra_driver_name = "sha256-avx2", 263*5dda42fcStim .cra_priority = 170, 264*5dda42fcStim .cra_flags = CRYPTO_ALG_TYPE_SHASH, 265*5dda42fcStim .cra_blocksize = SHA256_BLOCK_SIZE, 266*5dda42fcStim .cra_module = THIS_MODULE, 267*5dda42fcStim } 268*5dda42fcStim }, { 269*5dda42fcStim .digestsize = SHA224_DIGEST_SIZE, 270*5dda42fcStim .init = sha224_base_init, 271*5dda42fcStim .update = sha256_avx2_update, 272*5dda42fcStim .final = sha256_avx2_final, 273*5dda42fcStim .finup = sha256_avx2_finup, 274*5dda42fcStim .descsize = sizeof(struct sha256_state), 275*5dda42fcStim .base = { 276*5dda42fcStim .cra_name = "sha224", 277*5dda42fcStim .cra_driver_name = "sha224-avx2", 278*5dda42fcStim .cra_priority = 170, 279*5dda42fcStim .cra_flags = CRYPTO_ALG_TYPE_SHASH, 280*5dda42fcStim .cra_blocksize = SHA224_BLOCK_SIZE, 281*5dda42fcStim .cra_module = THIS_MODULE, 282*5dda42fcStim } 283*5dda42fcStim } }; 284*5dda42fcStim 285*5dda42fcStim static bool avx2_usable(void) 286*5dda42fcStim { 287*5dda42fcStim if (avx_usable() && boot_cpu_has(X86_FEATURE_AVX2) && 288*5dda42fcStim boot_cpu_has(X86_FEATURE_BMI2)) 289*5dda42fcStim return true; 290*5dda42fcStim 291*5dda42fcStim return false; 292*5dda42fcStim } 293*5dda42fcStim 294*5dda42fcStim static int register_sha256_avx2(void) 295*5dda42fcStim { 296*5dda42fcStim if (avx2_usable()) 297*5dda42fcStim return crypto_register_shashes(sha256_avx2_algs, 298*5dda42fcStim ARRAY_SIZE(sha256_avx2_algs)); 299*5dda42fcStim return 0; 300*5dda42fcStim } 301*5dda42fcStim 302*5dda42fcStim static void unregister_sha256_avx2(void) 303*5dda42fcStim { 304*5dda42fcStim if (avx2_usable()) 305*5dda42fcStim crypto_unregister_shashes(sha256_avx2_algs, 306*5dda42fcStim ARRAY_SIZE(sha256_avx2_algs)); 307*5dda42fcStim } 308*5dda42fcStim 309*5dda42fcStim #else 310*5dda42fcStim static inline int register_sha256_avx2(void) { return 0; } 311*5dda42fcStim static inline void unregister_sha256_avx2(void) { } 312*5dda42fcStim #endif 313*5dda42fcStim 314*5dda42fcStim #ifdef CONFIG_AS_SHA256_NI 315*5dda42fcStim asmlinkage void sha256_ni_transform(u32 *digest, const char *data, 316*5dda42fcStim u64 rounds); /*unsigned int rounds);*/ 317*5dda42fcStim 318*5dda42fcStim static int sha256_ni_update(struct shash_desc *desc, const u8 *data, 319*5dda42fcStim unsigned int len) 320*5dda42fcStim { 321*5dda42fcStim return sha256_update(desc, data, len, sha256_ni_transform); 322*5dda42fcStim } 323*5dda42fcStim 324*5dda42fcStim static int sha256_ni_finup(struct shash_desc *desc, const u8 *data, 325*5dda42fcStim unsigned int len, u8 *out) 326*5dda42fcStim { 327*5dda42fcStim return sha256_finup(desc, data, len, out, sha256_ni_transform); 328*5dda42fcStim } 329*5dda42fcStim 330*5dda42fcStim static int sha256_ni_final(struct shash_desc *desc, u8 *out) 331*5dda42fcStim { 332*5dda42fcStim return sha256_ni_finup(desc, NULL, 0, out); 333*5dda42fcStim } 334*5dda42fcStim 335*5dda42fcStim static struct shash_alg sha256_ni_algs[] = { { 336*5dda42fcStim .digestsize = SHA256_DIGEST_SIZE, 337*5dda42fcStim .init = sha256_base_init, 338*5dda42fcStim .update = sha256_ni_update, 339*5dda42fcStim .final = sha256_ni_final, 340*5dda42fcStim .finup = sha256_ni_finup, 341*5dda42fcStim .descsize = sizeof(struct sha256_state), 342*5dda42fcStim .base = { 343*5dda42fcStim .cra_name = "sha256", 344*5dda42fcStim .cra_driver_name = "sha256-ni", 345*5dda42fcStim .cra_priority = 250, 346*5dda42fcStim .cra_flags = CRYPTO_ALG_TYPE_SHASH, 347*5dda42fcStim .cra_blocksize = SHA256_BLOCK_SIZE, 348*5dda42fcStim .cra_module = THIS_MODULE, 349*5dda42fcStim } 350*5dda42fcStim }, { 351*5dda42fcStim .digestsize = SHA224_DIGEST_SIZE, 352*5dda42fcStim .init = sha224_base_init, 353*5dda42fcStim .update = sha256_ni_update, 354*5dda42fcStim .final = sha256_ni_final, 355*5dda42fcStim .finup = sha256_ni_finup, 356*5dda42fcStim .descsize = sizeof(struct sha256_state), 357*5dda42fcStim .base = { 358*5dda42fcStim .cra_name = "sha224", 359*5dda42fcStim .cra_driver_name = "sha224-ni", 360*5dda42fcStim .cra_priority = 250, 361*5dda42fcStim .cra_flags = CRYPTO_ALG_TYPE_SHASH, 362*5dda42fcStim .cra_blocksize = SHA224_BLOCK_SIZE, 363*5dda42fcStim .cra_module = THIS_MODULE, 364*5dda42fcStim } 365*5dda42fcStim } }; 366*5dda42fcStim 367*5dda42fcStim static int register_sha256_ni(void) 368*5dda42fcStim { 369*5dda42fcStim if (boot_cpu_has(X86_FEATURE_SHA_NI)) 370*5dda42fcStim return crypto_register_shashes(sha256_ni_algs, 371*5dda42fcStim ARRAY_SIZE(sha256_ni_algs)); 372*5dda42fcStim return 0; 373*5dda42fcStim } 374*5dda42fcStim 375*5dda42fcStim static void unregister_sha256_ni(void) 376*5dda42fcStim { 377*5dda42fcStim if (boot_cpu_has(X86_FEATURE_SHA_NI)) 378*5dda42fcStim crypto_unregister_shashes(sha256_ni_algs, 379*5dda42fcStim ARRAY_SIZE(sha256_ni_algs)); 380*5dda42fcStim } 381*5dda42fcStim 382*5dda42fcStim #else 383*5dda42fcStim static inline int register_sha256_ni(void) { return 0; } 384*5dda42fcStim static inline void unregister_sha256_ni(void) { } 3858275d1aaSTim Chen #endif 3868275d1aaSTim Chen 3878275d1aaSTim Chen static int __init sha256_ssse3_mod_init(void) 3888275d1aaSTim Chen { 389*5dda42fcStim if (register_sha256_ssse3()) 390*5dda42fcStim goto fail; 39195fca7dfStim 392*5dda42fcStim if (register_sha256_avx()) { 393*5dda42fcStim unregister_sha256_ssse3(); 394*5dda42fcStim goto fail; 39595fca7dfStim } 3968275d1aaSTim Chen 397*5dda42fcStim if (register_sha256_avx2()) { 398*5dda42fcStim unregister_sha256_avx(); 399*5dda42fcStim unregister_sha256_ssse3(); 400*5dda42fcStim goto fail; 40195fca7dfStim } 4028275d1aaSTim Chen 403*5dda42fcStim if (register_sha256_ni()) { 404*5dda42fcStim unregister_sha256_avx2(); 405*5dda42fcStim unregister_sha256_avx(); 406*5dda42fcStim unregister_sha256_ssse3(); 407*5dda42fcStim goto fail; 4088275d1aaSTim Chen } 4098275d1aaSTim Chen 410*5dda42fcStim return 0; 411*5dda42fcStim fail: 4128275d1aaSTim Chen return -ENODEV; 4138275d1aaSTim Chen } 4148275d1aaSTim Chen 4158275d1aaSTim Chen static void __exit sha256_ssse3_mod_fini(void) 4168275d1aaSTim Chen { 417*5dda42fcStim unregister_sha256_ni(); 418*5dda42fcStim unregister_sha256_avx2(); 419*5dda42fcStim unregister_sha256_avx(); 420*5dda42fcStim unregister_sha256_ssse3(); 4218275d1aaSTim Chen } 4228275d1aaSTim Chen 4238275d1aaSTim Chen module_init(sha256_ssse3_mod_init); 4248275d1aaSTim Chen module_exit(sha256_ssse3_mod_fini); 4258275d1aaSTim Chen 4268275d1aaSTim Chen MODULE_LICENSE("GPL"); 4278275d1aaSTim Chen MODULE_DESCRIPTION("SHA256 Secure Hash Algorithm, Supplemental SSE3 accelerated"); 4288275d1aaSTim Chen 4295d26a105SKees Cook MODULE_ALIAS_CRYPTO("sha256"); 4305d26a105SKees Cook MODULE_ALIAS_CRYPTO("sha224"); 431