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