linux/arch/arm64/crypto/sm4-ce-glue.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2
   3#include <asm/neon.h>
   4#include <asm/simd.h>
   5#include <crypto/sm4.h>
   6#include <crypto/internal/simd.h>
   7#include <linux/module.h>
   8#include <linux/cpufeature.h>
   9#include <linux/crypto.h>
  10#include <linux/types.h>
  11
  12MODULE_ALIAS_CRYPTO("sm4");
  13MODULE_ALIAS_CRYPTO("sm4-ce");
  14MODULE_DESCRIPTION("SM4 symmetric cipher using ARMv8 Crypto Extensions");
  15MODULE_AUTHOR("Ard Biesheuvel <ard.biesheuvel@linaro.org>");
  16MODULE_LICENSE("GPL v2");
  17
  18asmlinkage void sm4_ce_do_crypt(const u32 *rk, void *out, const void *in);
  19
  20static int sm4_ce_setkey(struct crypto_tfm *tfm, const u8 *key,
  21                       unsigned int key_len)
  22{
  23        struct sm4_ctx *ctx = crypto_tfm_ctx(tfm);
  24
  25        return sm4_expandkey(ctx, key, key_len);
  26}
  27
  28static void sm4_ce_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
  29{
  30        const struct sm4_ctx *ctx = crypto_tfm_ctx(tfm);
  31
  32        if (!crypto_simd_usable()) {
  33                sm4_crypt_block(ctx->rkey_enc, out, in);
  34        } else {
  35                kernel_neon_begin();
  36                sm4_ce_do_crypt(ctx->rkey_enc, out, in);
  37                kernel_neon_end();
  38        }
  39}
  40
  41static void sm4_ce_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
  42{
  43        const struct sm4_ctx *ctx = crypto_tfm_ctx(tfm);
  44
  45        if (!crypto_simd_usable()) {
  46                sm4_crypt_block(ctx->rkey_dec, out, in);
  47        } else {
  48                kernel_neon_begin();
  49                sm4_ce_do_crypt(ctx->rkey_dec, out, in);
  50                kernel_neon_end();
  51        }
  52}
  53
  54static struct crypto_alg sm4_ce_alg = {
  55        .cra_name                       = "sm4",
  56        .cra_driver_name                = "sm4-ce",
  57        .cra_priority                   = 200,
  58        .cra_flags                      = CRYPTO_ALG_TYPE_CIPHER,
  59        .cra_blocksize                  = SM4_BLOCK_SIZE,
  60        .cra_ctxsize                    = sizeof(struct sm4_ctx),
  61        .cra_module                     = THIS_MODULE,
  62        .cra_u.cipher = {
  63                .cia_min_keysize        = SM4_KEY_SIZE,
  64                .cia_max_keysize        = SM4_KEY_SIZE,
  65                .cia_setkey             = sm4_ce_setkey,
  66                .cia_encrypt            = sm4_ce_encrypt,
  67                .cia_decrypt            = sm4_ce_decrypt
  68        }
  69};
  70
  71static int __init sm4_ce_mod_init(void)
  72{
  73        return crypto_register_alg(&sm4_ce_alg);
  74}
  75
  76static void __exit sm4_ce_mod_fini(void)
  77{
  78        crypto_unregister_alg(&sm4_ce_alg);
  79}
  80
  81module_cpu_feature_match(SM4, sm4_ce_mod_init);
  82module_exit(sm4_ce_mod_fini);
  83