1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include "aes_core.h"
5
6
7 typedef void (*block128_f)(const unsigned char in[16],
8 unsigned char out[16],
9 const void *key);
10
rk_crypto_cfb128_encrypt(const unsigned char * in,unsigned char * out,size_t len,const void * key,unsigned char ivec[16],int * num,int enc,block128_f block)11 static void rk_crypto_cfb128_encrypt(const unsigned char *in, unsigned char *out,
12 size_t len, const void *key,
13 unsigned char ivec[16], int *num,
14 int enc, block128_f block)
15 {
16 unsigned int n;
17 size_t l = 0;
18 n = *num;
19 if (enc) {
20
21 while (l < len) {
22 if (n == 0) {
23 (*block)(ivec, ivec, key);
24 }
25 out[l] = ivec[n] ^= in[l];
26 ++l;
27 n = (n+1) % 16;
28 }
29 *num = n;
30 } else {
31 while (l < len) {
32 unsigned char c;
33 if (n == 0) {
34 (*block)(ivec, ivec, key);
35 }
36 out[l] = ivec[n] ^ (c = in[l]); ivec[n] = c;
37 ++l;
38 n = (n+1) % 16;
39 }
40 *num=n;
41 }
42 }
43
rk_aes_cfb128_encrypt(const unsigned char * in,unsigned char * out,size_t length,const RK_AES_KEY * key,unsigned char * ivec,int * num,const int enc)44 static void rk_aes_cfb128_encrypt(const unsigned char *in, unsigned char *out,
45 size_t length, const RK_AES_KEY *key,
46 unsigned char *ivec, int *num, const int enc)
47 {
48 rk_crypto_cfb128_encrypt(in,out,length,key,ivec,num,enc,(block128_f)rk_aes_encrypt);
49 }
50
rk_aes_cfb_encrypt(const unsigned char * in,unsigned char * out,unsigned long length,const unsigned char * key,const int key_len,unsigned char * ivec,const int enc)51 int rk_aes_cfb_encrypt(const unsigned char *in, unsigned char *out,
52 unsigned long length, const unsigned char *key, const int key_len,
53 unsigned char *ivec, const int enc)
54 {
55 RK_AES_KEY ks1;
56 int num = 0;
57
58 if (in == NULL || out ==NULL || key == NULL)
59 return -1;
60
61 if (key_len != 128 / 8 && key_len != 192 / 8 && key_len != 256 / 8)
62 return -2;
63
64 rk_aes_set_encrypt_key(key, key_len * 8, &ks1);
65 rk_aes_cfb128_encrypt(in, out, length, &ks1, ivec, &num, enc);
66
67 return 0;
68 }
69
70
71