xref: /OK3568_Linux_fs/external/security/librkcrypto/test/cmode_adapter.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (c) 2022 Rockchip Electronics Co. Ltd.
3*4882a593Smuzhiyun  */
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun #include "c_model.h"
6*4882a593Smuzhiyun #include "cmode_adapter.h"
7*4882a593Smuzhiyun 
soft_cipher(uint32_t algo,uint32_t mode,uint32_t operation,uint8_t * key,uint32_t key_len,uint8_t * iv,uint8_t * in,uint32_t in_len,uint8_t * out)8*4882a593Smuzhiyun RK_RES soft_cipher(uint32_t algo, uint32_t mode, uint32_t operation,
9*4882a593Smuzhiyun 		   uint8_t *key, uint32_t key_len, uint8_t *iv,
10*4882a593Smuzhiyun 		   uint8_t *in, uint32_t in_len, uint8_t *out)
11*4882a593Smuzhiyun {
12*4882a593Smuzhiyun 	int ret;
13*4882a593Smuzhiyun 	int is_enc = (operation == RK_OP_CIPHER_ENC) ? 1 : 0;
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun 	if (algo == RK_ALGO_DES || algo == RK_ALGO_TDES) {
16*4882a593Smuzhiyun 		switch (mode) {
17*4882a593Smuzhiyun 		case RK_CIPHER_MODE_ECB:
18*4882a593Smuzhiyun 			ret = rk_des_ecb_encrypt(in, out, in_len, key, key_len, is_enc);
19*4882a593Smuzhiyun 			break;
20*4882a593Smuzhiyun 		case RK_CIPHER_MODE_CBC:
21*4882a593Smuzhiyun 			ret = rk_des_cbc_encrypt(in, out, in_len, key, key_len, iv, is_enc);
22*4882a593Smuzhiyun 			break;
23*4882a593Smuzhiyun 		case RK_CIPHER_MODE_CFB:
24*4882a593Smuzhiyun 			ret = rk_des_cfb_encrypt(in, out, in_len, key, key_len, iv, is_enc);
25*4882a593Smuzhiyun 			break;
26*4882a593Smuzhiyun 		case RK_CIPHER_MODE_OFB:
27*4882a593Smuzhiyun 			ret = rk_des_ofb_encrypt(in, out, in_len, key, key_len, iv, is_enc);
28*4882a593Smuzhiyun 			break;
29*4882a593Smuzhiyun 		default:
30*4882a593Smuzhiyun 			return RK_CRYPTO_ERR_PARAMETER;
31*4882a593Smuzhiyun 		}
32*4882a593Smuzhiyun 	} else if (algo == RK_ALGO_AES) {
33*4882a593Smuzhiyun 		switch (mode) {
34*4882a593Smuzhiyun 		case RK_CIPHER_MODE_ECB:
35*4882a593Smuzhiyun 			ret = rk_aes_ecb_encrypt(in, out, in_len, key, key_len, is_enc);
36*4882a593Smuzhiyun 			break;
37*4882a593Smuzhiyun 		case RK_CIPHER_MODE_CBC:
38*4882a593Smuzhiyun 			ret = rk_aes_cbc_encrypt(in, out, in_len, key, key_len, iv, is_enc);
39*4882a593Smuzhiyun 			break;
40*4882a593Smuzhiyun 		case RK_CIPHER_MODE_CFB:
41*4882a593Smuzhiyun 			ret = rk_aes_cfb_encrypt(in, out, in_len, key, key_len, iv, is_enc);
42*4882a593Smuzhiyun 			break;
43*4882a593Smuzhiyun 		case RK_CIPHER_MODE_OFB:
44*4882a593Smuzhiyun 			ret = rk_aes_ofb_encrypt(in, out, in_len, key, key_len, iv, is_enc);
45*4882a593Smuzhiyun 			break;
46*4882a593Smuzhiyun 		case RK_CIPHER_MODE_CTS:
47*4882a593Smuzhiyun 			ret = rk_aes_cts_encrypt(in, out, in_len, key, key_len, iv, is_enc);
48*4882a593Smuzhiyun 			break;
49*4882a593Smuzhiyun 		case RK_CIPHER_MODE_CTR:
50*4882a593Smuzhiyun 			ret = rk_aes_ctr_encrypt(in, out, in_len, key, key_len, iv, is_enc);
51*4882a593Smuzhiyun 			break;
52*4882a593Smuzhiyun 		case RK_CIPHER_MODE_XTS:
53*4882a593Smuzhiyun 			ret = rk_aes_xts_encrypt(in, out, in_len, key, key_len, iv, is_enc);
54*4882a593Smuzhiyun 			break;
55*4882a593Smuzhiyun 		default:
56*4882a593Smuzhiyun 			return RK_CRYPTO_ERR_PARAMETER;
57*4882a593Smuzhiyun 		}
58*4882a593Smuzhiyun 	} else if (algo == RK_ALGO_SM4) {
59*4882a593Smuzhiyun 		switch (mode) {
60*4882a593Smuzhiyun 		case RK_CIPHER_MODE_ECB:
61*4882a593Smuzhiyun 			ret = rk_sm4_ecb_encrypt(in, out, in_len, key, key_len, is_enc);
62*4882a593Smuzhiyun 			break;
63*4882a593Smuzhiyun 		case RK_CIPHER_MODE_CBC:
64*4882a593Smuzhiyun 			ret = rk_sm4_cbc_encrypt(in, out, in_len, key, key_len, iv, is_enc);
65*4882a593Smuzhiyun 			break;
66*4882a593Smuzhiyun 		case RK_CIPHER_MODE_CFB:
67*4882a593Smuzhiyun 			ret = rk_sm4_cfb_encrypt(in, out, in_len, key, key_len, iv, is_enc);
68*4882a593Smuzhiyun 			break;
69*4882a593Smuzhiyun 		case RK_CIPHER_MODE_OFB:
70*4882a593Smuzhiyun 			ret = rk_sm4_ofb_encrypt(in, out, in_len, key, key_len, iv, is_enc);
71*4882a593Smuzhiyun 			break;
72*4882a593Smuzhiyun 		case RK_CIPHER_MODE_CTS:
73*4882a593Smuzhiyun 			ret = rk_sm4_cts_encrypt(in, out, in_len, key, key_len, iv, is_enc);
74*4882a593Smuzhiyun 			break;
75*4882a593Smuzhiyun 		case RK_CIPHER_MODE_CTR:
76*4882a593Smuzhiyun 			ret = rk_sm4_ctr_encrypt(in, out, in_len, key, key_len, iv, is_enc);
77*4882a593Smuzhiyun 			break;
78*4882a593Smuzhiyun 		case RK_CIPHER_MODE_XTS:
79*4882a593Smuzhiyun 			ret = rk_sm4_xts_encrypt(in, out, in_len, key, key_len, iv, is_enc);
80*4882a593Smuzhiyun 			break;
81*4882a593Smuzhiyun 		default:
82*4882a593Smuzhiyun 			return RK_CRYPTO_ERR_PARAMETER;
83*4882a593Smuzhiyun 		}
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun 	} else {
86*4882a593Smuzhiyun 		return RK_CRYPTO_ERR_PARAMETER;
87*4882a593Smuzhiyun 	}
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun 	return ret == 0 ? RK_CRYPTO_SUCCESS : RK_CRYPTO_ERR_GENERIC;
90*4882a593Smuzhiyun }
91*4882a593Smuzhiyun 
soft_ae(uint32_t algo,uint32_t mode,uint32_t operation,uint8_t * key,uint32_t key_len,uint8_t * iv,uint32_t iv_len,uint8_t * aad,uint32_t aad_len,uint32_t tag_len,uint8_t * in,uint32_t in_len,uint8_t * out,uint8_t * tag)92*4882a593Smuzhiyun RK_RES soft_ae(uint32_t algo, uint32_t mode, uint32_t operation,
93*4882a593Smuzhiyun 	       uint8_t *key, uint32_t key_len, uint8_t *iv, uint32_t iv_len,
94*4882a593Smuzhiyun 	       uint8_t *aad, uint32_t aad_len, uint32_t tag_len,
95*4882a593Smuzhiyun 	       uint8_t *in, uint32_t in_len, uint8_t *out, uint8_t *tag)
96*4882a593Smuzhiyun {
97*4882a593Smuzhiyun 	int ret;
98*4882a593Smuzhiyun 	int is_enc = (operation == RK_OP_CIPHER_ENC) ? 1 : 0;
99*4882a593Smuzhiyun 	struct aes_ae_in aes_in;
100*4882a593Smuzhiyun 	struct aes_ae_out aes_out;
101*4882a593Smuzhiyun 	struct sm4_ae_in sm4_in;
102*4882a593Smuzhiyun 	struct sm4_ae_out sm4_out;
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun 	aes_in.key      = key;
105*4882a593Smuzhiyun 	aes_in.src      = in;
106*4882a593Smuzhiyun 	aes_in.iv       = iv;
107*4882a593Smuzhiyun 	aes_in.aad      = aad;
108*4882a593Smuzhiyun 	aes_in.key_len  = key_len;
109*4882a593Smuzhiyun 	aes_in.src_len  = in_len;
110*4882a593Smuzhiyun 	aes_in.iv_len   = iv_len;
111*4882a593Smuzhiyun 	aes_in.aad_len  = aad_len;
112*4882a593Smuzhiyun 	aes_in.tag_size = tag_len;
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun 	aes_out.dest = out;
115*4882a593Smuzhiyun 	aes_out.tag  = tag;
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun 	memcpy(&sm4_in, &aes_in, sizeof(aes_in));
118*4882a593Smuzhiyun 	memcpy(&sm4_out, &aes_out, sizeof(aes_out));
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun 	if (algo == RK_ALGO_AES) {
121*4882a593Smuzhiyun 		switch (mode) {
122*4882a593Smuzhiyun 		case RK_CIPHER_MODE_GCM:
123*4882a593Smuzhiyun 			ret = rk_aes_gcm_encrypt(&aes_in, &aes_out, is_enc);
124*4882a593Smuzhiyun 			break;
125*4882a593Smuzhiyun 		case RK_CIPHER_MODE_CCM:
126*4882a593Smuzhiyun 			ret = rk_aes_ccm_encrypt(&aes_in, &aes_out, is_enc);
127*4882a593Smuzhiyun 			break;
128*4882a593Smuzhiyun 		default:
129*4882a593Smuzhiyun 			return RK_CRYPTO_ERR_PARAMETER;
130*4882a593Smuzhiyun 		}
131*4882a593Smuzhiyun 	} else if (algo == RK_ALGO_SM4) {
132*4882a593Smuzhiyun 		switch (mode) {
133*4882a593Smuzhiyun 		case RK_CIPHER_MODE_GCM:
134*4882a593Smuzhiyun 			ret = rk_sm4_gcm_encrypt(&sm4_in, &sm4_out, is_enc);
135*4882a593Smuzhiyun 			break;
136*4882a593Smuzhiyun 		case RK_CIPHER_MODE_CCM:
137*4882a593Smuzhiyun 			ret = rk_sm4_ccm_op(&sm4_in, &sm4_out, is_enc);
138*4882a593Smuzhiyun 			break;
139*4882a593Smuzhiyun 		default:
140*4882a593Smuzhiyun 			return RK_CRYPTO_ERR_PARAMETER;
141*4882a593Smuzhiyun 		}
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun 	} else {
144*4882a593Smuzhiyun 		return RK_CRYPTO_ERR_PARAMETER;
145*4882a593Smuzhiyun 	}
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun 	return ret == 0 ? RK_CRYPTO_SUCCESS : RK_CRYPTO_ERR_GENERIC;
148*4882a593Smuzhiyun }
149*4882a593Smuzhiyun 
soft_hash(uint32_t algo,const uint8_t * in,uint32_t in_len,uint8_t * out,uint32_t * out_len)150*4882a593Smuzhiyun RK_RES soft_hash(uint32_t algo, const uint8_t *in, uint32_t in_len, uint8_t *out, uint32_t *out_len)
151*4882a593Smuzhiyun {
152*4882a593Smuzhiyun 	int ret = -1;
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun 	switch (algo) {
155*4882a593Smuzhiyun 	case RK_ALGO_MD5:
156*4882a593Smuzhiyun 		ret = rk_hash_md5(in, in_len, out, out_len);
157*4882a593Smuzhiyun 		break;
158*4882a593Smuzhiyun 	case RK_ALGO_SHA1:
159*4882a593Smuzhiyun 		ret = rk_hash_sha1(in, in_len, out, out_len);
160*4882a593Smuzhiyun 		break;
161*4882a593Smuzhiyun 	case RK_ALGO_SHA256:
162*4882a593Smuzhiyun 		ret = rk_hash_sha256(in, in_len, out, out_len);
163*4882a593Smuzhiyun 		break;
164*4882a593Smuzhiyun 	case RK_ALGO_SHA224:
165*4882a593Smuzhiyun 		ret = rk_hash_sha224(in, in_len, out, out_len);
166*4882a593Smuzhiyun 		break;
167*4882a593Smuzhiyun 	case RK_ALGO_SHA384:
168*4882a593Smuzhiyun 		ret = rk_hash_sha384(in, in_len, out, out_len);
169*4882a593Smuzhiyun 		break;
170*4882a593Smuzhiyun 	case RK_ALGO_SHA512:
171*4882a593Smuzhiyun 		ret = rk_hash_sha512(in, in_len, out, out_len);
172*4882a593Smuzhiyun 		break;
173*4882a593Smuzhiyun 	case RK_ALGO_SHA512_224:
174*4882a593Smuzhiyun 		ret = rk_hash_sha512_224(in, in_len, out, out_len);
175*4882a593Smuzhiyun 		break;
176*4882a593Smuzhiyun 	case RK_ALGO_SHA512_256:
177*4882a593Smuzhiyun 		ret = rk_hash_sha512_256(in, in_len, out, out_len);
178*4882a593Smuzhiyun 		break;
179*4882a593Smuzhiyun 	case RK_ALGO_SM3:
180*4882a593Smuzhiyun 		ret = rk_hash_sm3(in, in_len, out, out_len);
181*4882a593Smuzhiyun 		break;
182*4882a593Smuzhiyun 	default:
183*4882a593Smuzhiyun 		return RK_CRYPTO_ERR_PARAMETER;
184*4882a593Smuzhiyun 	}
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun 	return ret == 0 ? RK_CRYPTO_SUCCESS : RK_CRYPTO_ERR_GENERIC;
187*4882a593Smuzhiyun }
188*4882a593Smuzhiyun 
soft_hmac(uint32_t algo,const uint8_t * key,uint32_t key_len,const uint8_t * in,uint32_t in_len,uint8_t * out,uint32_t * out_len)189*4882a593Smuzhiyun RK_RES soft_hmac(uint32_t algo, const uint8_t *key, uint32_t key_len,
190*4882a593Smuzhiyun 		 const uint8_t *in,  uint32_t in_len, uint8_t *out, uint32_t *out_len)
191*4882a593Smuzhiyun {
192*4882a593Smuzhiyun 	int ret = -1;
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun 	switch (algo) {
195*4882a593Smuzhiyun 	case RK_ALGO_HMAC_MD5:
196*4882a593Smuzhiyun 		ret = rk_hmac_md5(key, key_len, in, in_len, out, out_len);
197*4882a593Smuzhiyun 		break;
198*4882a593Smuzhiyun 	case RK_ALGO_HMAC_SHA1:
199*4882a593Smuzhiyun 		ret = rk_hmac_sha1(key, key_len, in, in_len, out, out_len);
200*4882a593Smuzhiyun 		break;
201*4882a593Smuzhiyun 	case RK_ALGO_HMAC_SHA256:
202*4882a593Smuzhiyun 		ret = rk_hmac_sha256(key, key_len, in, in_len, out, out_len);
203*4882a593Smuzhiyun 		break;
204*4882a593Smuzhiyun 	case RK_ALGO_HMAC_SHA512:
205*4882a593Smuzhiyun 		ret = rk_hmac_sha512(key, key_len, in, in_len, out, out_len);
206*4882a593Smuzhiyun 		break;
207*4882a593Smuzhiyun 	case RK_ALGO_HMAC_SM3:
208*4882a593Smuzhiyun 		ret = rk_hmac_sm3(key, key_len, in, in_len, out, out_len);
209*4882a593Smuzhiyun 		break;
210*4882a593Smuzhiyun 	default:
211*4882a593Smuzhiyun 		return RK_CRYPTO_ERR_PARAMETER;
212*4882a593Smuzhiyun 	}
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun 	return ret == 0 ? RK_CRYPTO_SUCCESS : RK_CRYPTO_ERR_GENERIC;
215*4882a593Smuzhiyun }
216*4882a593Smuzhiyun 
217