162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * SM4 Cipher Algorithm, using ARMv8 NEON 462306a36Sopenharmony_ci * as specified in 562306a36Sopenharmony_ci * https://tools.ietf.org/id/draft-ribose-cfrg-sm4-10.html 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Copyright (C) 2022, Alibaba Group. 862306a36Sopenharmony_ci * Copyright (C) 2022 Tianjia Zhang <tianjia.zhang@linux.alibaba.com> 962306a36Sopenharmony_ci */ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <linux/module.h> 1262306a36Sopenharmony_ci#include <linux/crypto.h> 1362306a36Sopenharmony_ci#include <linux/kernel.h> 1462306a36Sopenharmony_ci#include <linux/cpufeature.h> 1562306a36Sopenharmony_ci#include <asm/neon.h> 1662306a36Sopenharmony_ci#include <asm/simd.h> 1762306a36Sopenharmony_ci#include <crypto/internal/simd.h> 1862306a36Sopenharmony_ci#include <crypto/internal/skcipher.h> 1962306a36Sopenharmony_ci#include <crypto/sm4.h> 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ciasmlinkage void sm4_neon_crypt(const u32 *rkey, u8 *dst, const u8 *src, 2262306a36Sopenharmony_ci unsigned int nblocks); 2362306a36Sopenharmony_ciasmlinkage void sm4_neon_cbc_dec(const u32 *rkey_dec, u8 *dst, const u8 *src, 2462306a36Sopenharmony_ci u8 *iv, unsigned int nblocks); 2562306a36Sopenharmony_ciasmlinkage void sm4_neon_cfb_dec(const u32 *rkey_enc, u8 *dst, const u8 *src, 2662306a36Sopenharmony_ci u8 *iv, unsigned int nblocks); 2762306a36Sopenharmony_ciasmlinkage void sm4_neon_ctr_crypt(const u32 *rkey_enc, u8 *dst, const u8 *src, 2862306a36Sopenharmony_ci u8 *iv, unsigned int nblocks); 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_cistatic int sm4_setkey(struct crypto_skcipher *tfm, const u8 *key, 3162306a36Sopenharmony_ci unsigned int key_len) 3262306a36Sopenharmony_ci{ 3362306a36Sopenharmony_ci struct sm4_ctx *ctx = crypto_skcipher_ctx(tfm); 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci return sm4_expandkey(ctx, key, key_len); 3662306a36Sopenharmony_ci} 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_cistatic int sm4_ecb_do_crypt(struct skcipher_request *req, const u32 *rkey) 3962306a36Sopenharmony_ci{ 4062306a36Sopenharmony_ci struct skcipher_walk walk; 4162306a36Sopenharmony_ci unsigned int nbytes; 4262306a36Sopenharmony_ci int err; 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci err = skcipher_walk_virt(&walk, req, false); 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci while ((nbytes = walk.nbytes) > 0) { 4762306a36Sopenharmony_ci const u8 *src = walk.src.virt.addr; 4862306a36Sopenharmony_ci u8 *dst = walk.dst.virt.addr; 4962306a36Sopenharmony_ci unsigned int nblocks; 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci nblocks = nbytes / SM4_BLOCK_SIZE; 5262306a36Sopenharmony_ci if (nblocks) { 5362306a36Sopenharmony_ci kernel_neon_begin(); 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci sm4_neon_crypt(rkey, dst, src, nblocks); 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci kernel_neon_end(); 5862306a36Sopenharmony_ci } 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci err = skcipher_walk_done(&walk, nbytes % SM4_BLOCK_SIZE); 6162306a36Sopenharmony_ci } 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci return err; 6462306a36Sopenharmony_ci} 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_cistatic int sm4_ecb_encrypt(struct skcipher_request *req) 6762306a36Sopenharmony_ci{ 6862306a36Sopenharmony_ci struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); 6962306a36Sopenharmony_ci struct sm4_ctx *ctx = crypto_skcipher_ctx(tfm); 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci return sm4_ecb_do_crypt(req, ctx->rkey_enc); 7262306a36Sopenharmony_ci} 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_cistatic int sm4_ecb_decrypt(struct skcipher_request *req) 7562306a36Sopenharmony_ci{ 7662306a36Sopenharmony_ci struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); 7762306a36Sopenharmony_ci struct sm4_ctx *ctx = crypto_skcipher_ctx(tfm); 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci return sm4_ecb_do_crypt(req, ctx->rkey_dec); 8062306a36Sopenharmony_ci} 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_cistatic int sm4_cbc_encrypt(struct skcipher_request *req) 8362306a36Sopenharmony_ci{ 8462306a36Sopenharmony_ci struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); 8562306a36Sopenharmony_ci struct sm4_ctx *ctx = crypto_skcipher_ctx(tfm); 8662306a36Sopenharmony_ci struct skcipher_walk walk; 8762306a36Sopenharmony_ci unsigned int nbytes; 8862306a36Sopenharmony_ci int err; 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci err = skcipher_walk_virt(&walk, req, false); 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci while ((nbytes = walk.nbytes) > 0) { 9362306a36Sopenharmony_ci const u8 *iv = walk.iv; 9462306a36Sopenharmony_ci const u8 *src = walk.src.virt.addr; 9562306a36Sopenharmony_ci u8 *dst = walk.dst.virt.addr; 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci while (nbytes >= SM4_BLOCK_SIZE) { 9862306a36Sopenharmony_ci crypto_xor_cpy(dst, src, iv, SM4_BLOCK_SIZE); 9962306a36Sopenharmony_ci sm4_crypt_block(ctx->rkey_enc, dst, dst); 10062306a36Sopenharmony_ci iv = dst; 10162306a36Sopenharmony_ci src += SM4_BLOCK_SIZE; 10262306a36Sopenharmony_ci dst += SM4_BLOCK_SIZE; 10362306a36Sopenharmony_ci nbytes -= SM4_BLOCK_SIZE; 10462306a36Sopenharmony_ci } 10562306a36Sopenharmony_ci if (iv != walk.iv) 10662306a36Sopenharmony_ci memcpy(walk.iv, iv, SM4_BLOCK_SIZE); 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci err = skcipher_walk_done(&walk, nbytes); 10962306a36Sopenharmony_ci } 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci return err; 11262306a36Sopenharmony_ci} 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_cistatic int sm4_cbc_decrypt(struct skcipher_request *req) 11562306a36Sopenharmony_ci{ 11662306a36Sopenharmony_ci struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); 11762306a36Sopenharmony_ci struct sm4_ctx *ctx = crypto_skcipher_ctx(tfm); 11862306a36Sopenharmony_ci struct skcipher_walk walk; 11962306a36Sopenharmony_ci unsigned int nbytes; 12062306a36Sopenharmony_ci int err; 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci err = skcipher_walk_virt(&walk, req, false); 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci while ((nbytes = walk.nbytes) > 0) { 12562306a36Sopenharmony_ci const u8 *src = walk.src.virt.addr; 12662306a36Sopenharmony_ci u8 *dst = walk.dst.virt.addr; 12762306a36Sopenharmony_ci unsigned int nblocks; 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci nblocks = nbytes / SM4_BLOCK_SIZE; 13062306a36Sopenharmony_ci if (nblocks) { 13162306a36Sopenharmony_ci kernel_neon_begin(); 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci sm4_neon_cbc_dec(ctx->rkey_dec, dst, src, 13462306a36Sopenharmony_ci walk.iv, nblocks); 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci kernel_neon_end(); 13762306a36Sopenharmony_ci } 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci err = skcipher_walk_done(&walk, nbytes % SM4_BLOCK_SIZE); 14062306a36Sopenharmony_ci } 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci return err; 14362306a36Sopenharmony_ci} 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_cistatic int sm4_cfb_encrypt(struct skcipher_request *req) 14662306a36Sopenharmony_ci{ 14762306a36Sopenharmony_ci struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); 14862306a36Sopenharmony_ci struct sm4_ctx *ctx = crypto_skcipher_ctx(tfm); 14962306a36Sopenharmony_ci struct skcipher_walk walk; 15062306a36Sopenharmony_ci unsigned int nbytes; 15162306a36Sopenharmony_ci int err; 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci err = skcipher_walk_virt(&walk, req, false); 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_ci while ((nbytes = walk.nbytes) > 0) { 15662306a36Sopenharmony_ci u8 keystream[SM4_BLOCK_SIZE]; 15762306a36Sopenharmony_ci const u8 *iv = walk.iv; 15862306a36Sopenharmony_ci const u8 *src = walk.src.virt.addr; 15962306a36Sopenharmony_ci u8 *dst = walk.dst.virt.addr; 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ci while (nbytes >= SM4_BLOCK_SIZE) { 16262306a36Sopenharmony_ci sm4_crypt_block(ctx->rkey_enc, keystream, iv); 16362306a36Sopenharmony_ci crypto_xor_cpy(dst, src, keystream, SM4_BLOCK_SIZE); 16462306a36Sopenharmony_ci iv = dst; 16562306a36Sopenharmony_ci src += SM4_BLOCK_SIZE; 16662306a36Sopenharmony_ci dst += SM4_BLOCK_SIZE; 16762306a36Sopenharmony_ci nbytes -= SM4_BLOCK_SIZE; 16862306a36Sopenharmony_ci } 16962306a36Sopenharmony_ci if (iv != walk.iv) 17062306a36Sopenharmony_ci memcpy(walk.iv, iv, SM4_BLOCK_SIZE); 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci /* tail */ 17362306a36Sopenharmony_ci if (walk.nbytes == walk.total && nbytes > 0) { 17462306a36Sopenharmony_ci sm4_crypt_block(ctx->rkey_enc, keystream, walk.iv); 17562306a36Sopenharmony_ci crypto_xor_cpy(dst, src, keystream, nbytes); 17662306a36Sopenharmony_ci nbytes = 0; 17762306a36Sopenharmony_ci } 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_ci err = skcipher_walk_done(&walk, nbytes); 18062306a36Sopenharmony_ci } 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ci return err; 18362306a36Sopenharmony_ci} 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_cistatic int sm4_cfb_decrypt(struct skcipher_request *req) 18662306a36Sopenharmony_ci{ 18762306a36Sopenharmony_ci struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); 18862306a36Sopenharmony_ci struct sm4_ctx *ctx = crypto_skcipher_ctx(tfm); 18962306a36Sopenharmony_ci struct skcipher_walk walk; 19062306a36Sopenharmony_ci unsigned int nbytes; 19162306a36Sopenharmony_ci int err; 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_ci err = skcipher_walk_virt(&walk, req, false); 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_ci while ((nbytes = walk.nbytes) > 0) { 19662306a36Sopenharmony_ci const u8 *src = walk.src.virt.addr; 19762306a36Sopenharmony_ci u8 *dst = walk.dst.virt.addr; 19862306a36Sopenharmony_ci unsigned int nblocks; 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_ci nblocks = nbytes / SM4_BLOCK_SIZE; 20162306a36Sopenharmony_ci if (nblocks) { 20262306a36Sopenharmony_ci kernel_neon_begin(); 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_ci sm4_neon_cfb_dec(ctx->rkey_enc, dst, src, 20562306a36Sopenharmony_ci walk.iv, nblocks); 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_ci kernel_neon_end(); 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci dst += nblocks * SM4_BLOCK_SIZE; 21062306a36Sopenharmony_ci src += nblocks * SM4_BLOCK_SIZE; 21162306a36Sopenharmony_ci nbytes -= nblocks * SM4_BLOCK_SIZE; 21262306a36Sopenharmony_ci } 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_ci /* tail */ 21562306a36Sopenharmony_ci if (walk.nbytes == walk.total && nbytes > 0) { 21662306a36Sopenharmony_ci u8 keystream[SM4_BLOCK_SIZE]; 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci sm4_crypt_block(ctx->rkey_enc, keystream, walk.iv); 21962306a36Sopenharmony_ci crypto_xor_cpy(dst, src, keystream, nbytes); 22062306a36Sopenharmony_ci nbytes = 0; 22162306a36Sopenharmony_ci } 22262306a36Sopenharmony_ci 22362306a36Sopenharmony_ci err = skcipher_walk_done(&walk, nbytes); 22462306a36Sopenharmony_ci } 22562306a36Sopenharmony_ci 22662306a36Sopenharmony_ci return err; 22762306a36Sopenharmony_ci} 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_cistatic int sm4_ctr_crypt(struct skcipher_request *req) 23062306a36Sopenharmony_ci{ 23162306a36Sopenharmony_ci struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); 23262306a36Sopenharmony_ci struct sm4_ctx *ctx = crypto_skcipher_ctx(tfm); 23362306a36Sopenharmony_ci struct skcipher_walk walk; 23462306a36Sopenharmony_ci unsigned int nbytes; 23562306a36Sopenharmony_ci int err; 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_ci err = skcipher_walk_virt(&walk, req, false); 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_ci while ((nbytes = walk.nbytes) > 0) { 24062306a36Sopenharmony_ci const u8 *src = walk.src.virt.addr; 24162306a36Sopenharmony_ci u8 *dst = walk.dst.virt.addr; 24262306a36Sopenharmony_ci unsigned int nblocks; 24362306a36Sopenharmony_ci 24462306a36Sopenharmony_ci nblocks = nbytes / SM4_BLOCK_SIZE; 24562306a36Sopenharmony_ci if (nblocks) { 24662306a36Sopenharmony_ci kernel_neon_begin(); 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_ci sm4_neon_ctr_crypt(ctx->rkey_enc, dst, src, 24962306a36Sopenharmony_ci walk.iv, nblocks); 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_ci kernel_neon_end(); 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_ci dst += nblocks * SM4_BLOCK_SIZE; 25462306a36Sopenharmony_ci src += nblocks * SM4_BLOCK_SIZE; 25562306a36Sopenharmony_ci nbytes -= nblocks * SM4_BLOCK_SIZE; 25662306a36Sopenharmony_ci } 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_ci /* tail */ 25962306a36Sopenharmony_ci if (walk.nbytes == walk.total && nbytes > 0) { 26062306a36Sopenharmony_ci u8 keystream[SM4_BLOCK_SIZE]; 26162306a36Sopenharmony_ci 26262306a36Sopenharmony_ci sm4_crypt_block(ctx->rkey_enc, keystream, walk.iv); 26362306a36Sopenharmony_ci crypto_inc(walk.iv, SM4_BLOCK_SIZE); 26462306a36Sopenharmony_ci crypto_xor_cpy(dst, src, keystream, nbytes); 26562306a36Sopenharmony_ci nbytes = 0; 26662306a36Sopenharmony_ci } 26762306a36Sopenharmony_ci 26862306a36Sopenharmony_ci err = skcipher_walk_done(&walk, nbytes); 26962306a36Sopenharmony_ci } 27062306a36Sopenharmony_ci 27162306a36Sopenharmony_ci return err; 27262306a36Sopenharmony_ci} 27362306a36Sopenharmony_ci 27462306a36Sopenharmony_cistatic struct skcipher_alg sm4_algs[] = { 27562306a36Sopenharmony_ci { 27662306a36Sopenharmony_ci .base = { 27762306a36Sopenharmony_ci .cra_name = "ecb(sm4)", 27862306a36Sopenharmony_ci .cra_driver_name = "ecb-sm4-neon", 27962306a36Sopenharmony_ci .cra_priority = 200, 28062306a36Sopenharmony_ci .cra_blocksize = SM4_BLOCK_SIZE, 28162306a36Sopenharmony_ci .cra_ctxsize = sizeof(struct sm4_ctx), 28262306a36Sopenharmony_ci .cra_module = THIS_MODULE, 28362306a36Sopenharmony_ci }, 28462306a36Sopenharmony_ci .min_keysize = SM4_KEY_SIZE, 28562306a36Sopenharmony_ci .max_keysize = SM4_KEY_SIZE, 28662306a36Sopenharmony_ci .setkey = sm4_setkey, 28762306a36Sopenharmony_ci .encrypt = sm4_ecb_encrypt, 28862306a36Sopenharmony_ci .decrypt = sm4_ecb_decrypt, 28962306a36Sopenharmony_ci }, { 29062306a36Sopenharmony_ci .base = { 29162306a36Sopenharmony_ci .cra_name = "cbc(sm4)", 29262306a36Sopenharmony_ci .cra_driver_name = "cbc-sm4-neon", 29362306a36Sopenharmony_ci .cra_priority = 200, 29462306a36Sopenharmony_ci .cra_blocksize = SM4_BLOCK_SIZE, 29562306a36Sopenharmony_ci .cra_ctxsize = sizeof(struct sm4_ctx), 29662306a36Sopenharmony_ci .cra_module = THIS_MODULE, 29762306a36Sopenharmony_ci }, 29862306a36Sopenharmony_ci .min_keysize = SM4_KEY_SIZE, 29962306a36Sopenharmony_ci .max_keysize = SM4_KEY_SIZE, 30062306a36Sopenharmony_ci .ivsize = SM4_BLOCK_SIZE, 30162306a36Sopenharmony_ci .setkey = sm4_setkey, 30262306a36Sopenharmony_ci .encrypt = sm4_cbc_encrypt, 30362306a36Sopenharmony_ci .decrypt = sm4_cbc_decrypt, 30462306a36Sopenharmony_ci }, { 30562306a36Sopenharmony_ci .base = { 30662306a36Sopenharmony_ci .cra_name = "cfb(sm4)", 30762306a36Sopenharmony_ci .cra_driver_name = "cfb-sm4-neon", 30862306a36Sopenharmony_ci .cra_priority = 200, 30962306a36Sopenharmony_ci .cra_blocksize = 1, 31062306a36Sopenharmony_ci .cra_ctxsize = sizeof(struct sm4_ctx), 31162306a36Sopenharmony_ci .cra_module = THIS_MODULE, 31262306a36Sopenharmony_ci }, 31362306a36Sopenharmony_ci .min_keysize = SM4_KEY_SIZE, 31462306a36Sopenharmony_ci .max_keysize = SM4_KEY_SIZE, 31562306a36Sopenharmony_ci .ivsize = SM4_BLOCK_SIZE, 31662306a36Sopenharmony_ci .chunksize = SM4_BLOCK_SIZE, 31762306a36Sopenharmony_ci .setkey = sm4_setkey, 31862306a36Sopenharmony_ci .encrypt = sm4_cfb_encrypt, 31962306a36Sopenharmony_ci .decrypt = sm4_cfb_decrypt, 32062306a36Sopenharmony_ci }, { 32162306a36Sopenharmony_ci .base = { 32262306a36Sopenharmony_ci .cra_name = "ctr(sm4)", 32362306a36Sopenharmony_ci .cra_driver_name = "ctr-sm4-neon", 32462306a36Sopenharmony_ci .cra_priority = 200, 32562306a36Sopenharmony_ci .cra_blocksize = 1, 32662306a36Sopenharmony_ci .cra_ctxsize = sizeof(struct sm4_ctx), 32762306a36Sopenharmony_ci .cra_module = THIS_MODULE, 32862306a36Sopenharmony_ci }, 32962306a36Sopenharmony_ci .min_keysize = SM4_KEY_SIZE, 33062306a36Sopenharmony_ci .max_keysize = SM4_KEY_SIZE, 33162306a36Sopenharmony_ci .ivsize = SM4_BLOCK_SIZE, 33262306a36Sopenharmony_ci .chunksize = SM4_BLOCK_SIZE, 33362306a36Sopenharmony_ci .setkey = sm4_setkey, 33462306a36Sopenharmony_ci .encrypt = sm4_ctr_crypt, 33562306a36Sopenharmony_ci .decrypt = sm4_ctr_crypt, 33662306a36Sopenharmony_ci } 33762306a36Sopenharmony_ci}; 33862306a36Sopenharmony_ci 33962306a36Sopenharmony_cistatic int __init sm4_init(void) 34062306a36Sopenharmony_ci{ 34162306a36Sopenharmony_ci return crypto_register_skciphers(sm4_algs, ARRAY_SIZE(sm4_algs)); 34262306a36Sopenharmony_ci} 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_cistatic void __exit sm4_exit(void) 34562306a36Sopenharmony_ci{ 34662306a36Sopenharmony_ci crypto_unregister_skciphers(sm4_algs, ARRAY_SIZE(sm4_algs)); 34762306a36Sopenharmony_ci} 34862306a36Sopenharmony_ci 34962306a36Sopenharmony_cimodule_init(sm4_init); 35062306a36Sopenharmony_cimodule_exit(sm4_exit); 35162306a36Sopenharmony_ci 35262306a36Sopenharmony_ciMODULE_DESCRIPTION("SM4 ECB/CBC/CFB/CTR using ARMv8 NEON"); 35362306a36Sopenharmony_ciMODULE_ALIAS_CRYPTO("sm4-neon"); 35462306a36Sopenharmony_ciMODULE_ALIAS_CRYPTO("sm4"); 35562306a36Sopenharmony_ciMODULE_ALIAS_CRYPTO("ecb(sm4)"); 35662306a36Sopenharmony_ciMODULE_ALIAS_CRYPTO("cbc(sm4)"); 35762306a36Sopenharmony_ciMODULE_ALIAS_CRYPTO("cfb(sm4)"); 35862306a36Sopenharmony_ciMODULE_ALIAS_CRYPTO("ctr(sm4)"); 35962306a36Sopenharmony_ciMODULE_AUTHOR("Tianjia Zhang <tianjia.zhang@linux.alibaba.com>"); 36062306a36Sopenharmony_ciMODULE_LICENSE("GPL v2"); 361