xref: /optee_os/core/crypto/sm4_accel.c (revision 8b5fb12e2fdef8168274f7efe616eb4f6529ba25)
1*8b5fb12eSXu Yizhou // SPDX-License-Identifier: BSD-2-Clause
2*8b5fb12eSXu Yizhou /*
3*8b5fb12eSXu Yizhou  * Copyright (c) Hisilicon Technologies Co., Ltd. 2023. All rights reserved.
4*8b5fb12eSXu Yizhou  *
5*8b5fb12eSXu Yizhou  * SM4 optimization for ARMv8
6*8b5fb12eSXu Yizhou  */
7*8b5fb12eSXu Yizhou 
8*8b5fb12eSXu Yizhou #include "sm4.h"
9*8b5fb12eSXu Yizhou #include <assert.h>
10*8b5fb12eSXu Yizhou #include <string.h>
11*8b5fb12eSXu Yizhou #include <crypto/crypto_accel.h>
12*8b5fb12eSXu Yizhou 
sm4_setkey_enc(struct sm4_context * ctx,const uint8_t key[16])13*8b5fb12eSXu Yizhou void sm4_setkey_enc(struct sm4_context *ctx, const uint8_t key[16])
14*8b5fb12eSXu Yizhou {
15*8b5fb12eSXu Yizhou 	ctx->mode = SM4_ENCRYPT;
16*8b5fb12eSXu Yizhou 	crypto_accel_sm4_setkey_enc(ctx->sk, key);
17*8b5fb12eSXu Yizhou }
18*8b5fb12eSXu Yizhou 
sm4_setkey_dec(struct sm4_context * ctx,const uint8_t key[16])19*8b5fb12eSXu Yizhou void sm4_setkey_dec(struct sm4_context *ctx, const uint8_t key[16])
20*8b5fb12eSXu Yizhou {
21*8b5fb12eSXu Yizhou 	ctx->mode = SM4_DECRYPT;
22*8b5fb12eSXu Yizhou 	crypto_accel_sm4_setkey_dec(ctx->sk, key);
23*8b5fb12eSXu Yizhou }
24*8b5fb12eSXu Yizhou 
sm4_crypt_ecb(struct sm4_context * ctx,size_t length,const uint8_t * input,uint8_t * output)25*8b5fb12eSXu Yizhou void sm4_crypt_ecb(struct sm4_context *ctx, size_t length, const uint8_t *input,
26*8b5fb12eSXu Yizhou 		   uint8_t *output)
27*8b5fb12eSXu Yizhou {
28*8b5fb12eSXu Yizhou 	assert(!(length % 16));
29*8b5fb12eSXu Yizhou 
30*8b5fb12eSXu Yizhou 	crypto_accel_sm4_ecb_enc(output, input, ctx->sk, length);
31*8b5fb12eSXu Yizhou }
32*8b5fb12eSXu Yizhou 
sm4_crypt_cbc(struct sm4_context * ctx,size_t length,uint8_t iv[16],const uint8_t * input,uint8_t * output)33*8b5fb12eSXu Yizhou void sm4_crypt_cbc(struct sm4_context *ctx, size_t length, uint8_t iv[16],
34*8b5fb12eSXu Yizhou 		   const uint8_t *input, uint8_t *output)
35*8b5fb12eSXu Yizhou {
36*8b5fb12eSXu Yizhou 	assert(!(length % 16));
37*8b5fb12eSXu Yizhou 
38*8b5fb12eSXu Yizhou 	if (ctx->mode == SM4_ENCRYPT)
39*8b5fb12eSXu Yizhou 		crypto_accel_sm4_cbc_enc(output, input, ctx->sk, length, iv);
40*8b5fb12eSXu Yizhou 	else
41*8b5fb12eSXu Yizhou 		/* SM4_DECRYPT */
42*8b5fb12eSXu Yizhou 		crypto_accel_sm4_cbc_dec(output, input, ctx->sk, length, iv);
43*8b5fb12eSXu Yizhou }
44*8b5fb12eSXu Yizhou 
sm4_crypt_ctr(struct sm4_context * ctx,size_t length,uint8_t ctr[16],const uint8_t * input,uint8_t * output)45*8b5fb12eSXu Yizhou void sm4_crypt_ctr(struct sm4_context *ctx, size_t length, uint8_t ctr[16],
46*8b5fb12eSXu Yizhou 		   const uint8_t *input, uint8_t *output)
47*8b5fb12eSXu Yizhou {
48*8b5fb12eSXu Yizhou 	assert(!(length % 16));
49*8b5fb12eSXu Yizhou 
50*8b5fb12eSXu Yizhou 	crypto_accel_sm4_ctr_enc(output, input, ctx->sk, length, ctr);
51*8b5fb12eSXu Yizhou }
52*8b5fb12eSXu Yizhou 
sm4_crypt_xts(struct sm4_context * ctx,struct sm4_context * ctx_ek,struct sm4_context * ctx_dk __unused,size_t len,uint8_t * iv,const uint8_t * input,uint8_t * output)53*8b5fb12eSXu Yizhou void sm4_crypt_xts(struct sm4_context *ctx, struct sm4_context *ctx_ek,
54*8b5fb12eSXu Yizhou 		   struct sm4_context *ctx_dk __unused, size_t len, uint8_t *iv,
55*8b5fb12eSXu Yizhou 		   const uint8_t *input, uint8_t *output)
56*8b5fb12eSXu Yizhou {
57*8b5fb12eSXu Yizhou 	assert(len >= 16);
58*8b5fb12eSXu Yizhou 
59*8b5fb12eSXu Yizhou 	if (ctx->mode == SM4_ENCRYPT)
60*8b5fb12eSXu Yizhou 		crypto_accel_sm4_xts_enc(output, input, ctx->sk, ctx_ek->sk,
61*8b5fb12eSXu Yizhou 					 len, iv);
62*8b5fb12eSXu Yizhou 	else
63*8b5fb12eSXu Yizhou 		crypto_accel_sm4_xts_dec(output, input, ctx->sk, ctx_ek->sk,
64*8b5fb12eSXu Yizhou 					 len, iv);
65*8b5fb12eSXu Yizhou }
66