xref: /OK3568_Linux_fs/external/security/librkcrypto/test/c_mode/sm4_cbc_mac.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include "sm4_core.h"
5 
xor(const unsigned char * a,const unsigned char * b,unsigned char * c)6 static int xor(const unsigned char *a, const unsigned char *b,unsigned char *c)
7 {
8 	int i = 0;
9 
10 	if(a == NULL || b == NULL || c ==NULL)
11 		return -1;
12 
13 	for(i = 0; i < 16; i++){
14 		*c = *a ^ *b;
15 		c++;
16 		b++;
17 		a++;
18 	}
19 
20 	return 0;
21 }
22 
rk_sm4_cbc_mac_encrypt(void * ctx,const unsigned char * in,unsigned int length,unsigned char * out,const int enc)23 static int rk_sm4_cbc_mac_encrypt(void *ctx, const unsigned char *in, unsigned int length, unsigned char *out,
24 		const int enc)
25 {
26 	unsigned int i = 0;
27 	int ret = 0;
28 	unsigned char tmp[16];
29 	memset(out, 0x00, 16);
30 	memset(tmp, 0x00, 16);
31 
32 	for(i=0; i<(length/16); i++){
33 		xor(in + 16 * i, out, out);
34 		rk_sm4_crypt_ecb(ctx, out, out);
35 	};
36 
37 	if(length%16){
38 		memcpy(tmp, in + 16 * i, length%16);
39 		xor(tmp, out, out);
40 		rk_sm4_crypt_ecb(ctx, out, out);
41 	}
42 	return ret;
43 }
44 
compare_string(char * a,char * b,unsigned int len)45 static int compare_string(char *a, char *b, unsigned int len)
46 {
47 	unsigned int i;
48 
49 	if((a == NULL) || (b == NULL))
50 		return -1;
51 
52 	for (i = 0; i < len; i++){
53 		if(*a != *b)
54 			return -1;
55 		a++;
56 		b++;
57 	}
58 	return 0;
59 }
rk_sm4_cbc_mac_op(const unsigned char * in,unsigned char * out,unsigned int length,const unsigned char * key,const unsigned int key_len,const int enc)60 int rk_sm4_cbc_mac_op(const unsigned char *in, unsigned char *out,
61         unsigned int length, const unsigned char *key, const unsigned int key_len,
62         const int enc)
63 {
64     sm4_context ctx;
65 	int ret = 0;
66 	unsigned char tmp_out[16]={0};
67 	unsigned int out_len = 16;
68 
69 	if (in == NULL || out ==NULL || key == NULL)
70 		return -1;
71 
72 	if (key_len != 16)
73 		return -2;
74 
75 	if(length == 0)
76 		return -3;
77 
78     rk_sm4_setkey_enc(&ctx, key);
79 	ret = rk_sm4_cbc_mac_encrypt(&ctx, in, length, tmp_out, enc);
80 
81 	if(enc)
82 		memcpy(out, tmp_out, out_len);
83 	else
84 		ret = compare_string((char*)out, (char*)tmp_out,out_len);
85 
86 	return ret;
87 }
88 
89 
90 
91 
92