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