Path: blob/master/arch/x86/crypto/sm4_aesni_avx2_glue.c
170899 views
/* SPDX-License-Identifier: GPL-2.0-or-later */1/*2* SM4 Cipher Algorithm, AES-NI/AVX2 optimized.3* as specified in4* https://tools.ietf.org/id/draft-ribose-cfrg-sm4-10.html5*6* Copyright (c) 2021, Alibaba Group.7* Copyright (c) 2021 Tianjia Zhang <[email protected]>8*/910#include <asm/fpu/api.h>11#include <linux/module.h>12#include <linux/crypto.h>13#include <linux/kernel.h>14#include <crypto/internal/skcipher.h>15#include <crypto/sm4.h>16#include "sm4-avx.h"1718#define SM4_CRYPT16_BLOCK_SIZE (SM4_BLOCK_SIZE * 16)1920asmlinkage void sm4_aesni_avx2_ctr_enc_blk16(const u32 *rk, u8 *dst,21const u8 *src, u8 *iv);22asmlinkage void sm4_aesni_avx2_cbc_dec_blk16(const u32 *rk, u8 *dst,23const u8 *src, u8 *iv);2425static int sm4_skcipher_setkey(struct crypto_skcipher *tfm, const u8 *key,26unsigned int key_len)27{28struct sm4_ctx *ctx = crypto_skcipher_ctx(tfm);2930return sm4_expandkey(ctx, key, key_len);31}3233static int cbc_decrypt(struct skcipher_request *req)34{35return sm4_avx_cbc_decrypt(req, SM4_CRYPT16_BLOCK_SIZE,36sm4_aesni_avx2_cbc_dec_blk16);37}383940static int ctr_crypt(struct skcipher_request *req)41{42return sm4_avx_ctr_crypt(req, SM4_CRYPT16_BLOCK_SIZE,43sm4_aesni_avx2_ctr_enc_blk16);44}4546static struct skcipher_alg sm4_aesni_avx2_skciphers[] = {47{48.base = {49.cra_name = "ecb(sm4)",50.cra_driver_name = "ecb-sm4-aesni-avx2",51.cra_priority = 500,52.cra_blocksize = SM4_BLOCK_SIZE,53.cra_ctxsize = sizeof(struct sm4_ctx),54.cra_module = THIS_MODULE,55},56.min_keysize = SM4_KEY_SIZE,57.max_keysize = SM4_KEY_SIZE,58.walksize = 16 * SM4_BLOCK_SIZE,59.setkey = sm4_skcipher_setkey,60.encrypt = sm4_avx_ecb_encrypt,61.decrypt = sm4_avx_ecb_decrypt,62}, {63.base = {64.cra_name = "cbc(sm4)",65.cra_driver_name = "cbc-sm4-aesni-avx2",66.cra_priority = 500,67.cra_blocksize = SM4_BLOCK_SIZE,68.cra_ctxsize = sizeof(struct sm4_ctx),69.cra_module = THIS_MODULE,70},71.min_keysize = SM4_KEY_SIZE,72.max_keysize = SM4_KEY_SIZE,73.ivsize = SM4_BLOCK_SIZE,74.walksize = 16 * SM4_BLOCK_SIZE,75.setkey = sm4_skcipher_setkey,76.encrypt = sm4_cbc_encrypt,77.decrypt = cbc_decrypt,78}, {79.base = {80.cra_name = "ctr(sm4)",81.cra_driver_name = "ctr-sm4-aesni-avx2",82.cra_priority = 500,83.cra_blocksize = 1,84.cra_ctxsize = sizeof(struct sm4_ctx),85.cra_module = THIS_MODULE,86},87.min_keysize = SM4_KEY_SIZE,88.max_keysize = SM4_KEY_SIZE,89.ivsize = SM4_BLOCK_SIZE,90.chunksize = SM4_BLOCK_SIZE,91.walksize = 16 * SM4_BLOCK_SIZE,92.setkey = sm4_skcipher_setkey,93.encrypt = ctr_crypt,94.decrypt = ctr_crypt,95}96};9798static int __init sm4_init(void)99{100const char *feature_name;101102if (!boot_cpu_has(X86_FEATURE_AVX) ||103!boot_cpu_has(X86_FEATURE_AVX2) ||104!boot_cpu_has(X86_FEATURE_AES) ||105!boot_cpu_has(X86_FEATURE_OSXSAVE)) {106pr_info("AVX2 or AES-NI instructions are not detected.\n");107return -ENODEV;108}109110if (!cpu_has_xfeatures(XFEATURE_MASK_SSE | XFEATURE_MASK_YMM,111&feature_name)) {112pr_info("CPU feature '%s' is not supported.\n", feature_name);113return -ENODEV;114}115116return crypto_register_skciphers(sm4_aesni_avx2_skciphers,117ARRAY_SIZE(sm4_aesni_avx2_skciphers));118}119120static void __exit sm4_exit(void)121{122crypto_unregister_skciphers(sm4_aesni_avx2_skciphers,123ARRAY_SIZE(sm4_aesni_avx2_skciphers));124}125126module_init(sm4_init);127module_exit(sm4_exit);128129MODULE_LICENSE("GPL v2");130MODULE_AUTHOR("Tianjia Zhang <[email protected]>");131MODULE_DESCRIPTION("SM4 Cipher Algorithm, AES-NI/AVX2 optimized");132MODULE_ALIAS_CRYPTO("sm4");133MODULE_ALIAS_CRYPTO("sm4-aesni-avx2");134135136