1*4882a593Smuzhiyun #include <stdio.h>
2*4882a593Smuzhiyun #include <stdlib.h>
3*4882a593Smuzhiyun #include <string.h>
4*4882a593Smuzhiyun #include <assert.h>
5*4882a593Smuzhiyun #include "des_core.h"
6*4882a593Smuzhiyun
rk_crypto_cfb128_encrypt(void * ctx,const unsigned char * in,unsigned char * out,size_t len,unsigned char ivec[DES_BLOCK_SIZE],int * num,int enc,block128_f block)7*4882a593Smuzhiyun static void rk_crypto_cfb128_encrypt(void *ctx, const unsigned char *in, unsigned char *out,
8*4882a593Smuzhiyun size_t len, unsigned char ivec[DES_BLOCK_SIZE], int *num,
9*4882a593Smuzhiyun int enc, block128_f block)
10*4882a593Smuzhiyun {
11*4882a593Smuzhiyun unsigned int n;
12*4882a593Smuzhiyun size_t l = 0;
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun n = *num;
15*4882a593Smuzhiyun if (enc) {
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun while (l<len) {
18*4882a593Smuzhiyun if (n == 0) {
19*4882a593Smuzhiyun (*block)(ivec, ivec, ctx);
20*4882a593Smuzhiyun }
21*4882a593Smuzhiyun out[l] = ivec[n] ^= in[l];
22*4882a593Smuzhiyun ++l;
23*4882a593Smuzhiyun n = (n+1) % DES_BLOCK_SIZE;
24*4882a593Smuzhiyun }
25*4882a593Smuzhiyun *num = n;
26*4882a593Smuzhiyun } else {
27*4882a593Smuzhiyun while (l<len) {
28*4882a593Smuzhiyun unsigned char c;
29*4882a593Smuzhiyun if (n == 0) {
30*4882a593Smuzhiyun (*block)(ivec, ivec, ctx);
31*4882a593Smuzhiyun }
32*4882a593Smuzhiyun out[l] = ivec[n] ^ (c = in[l]); ivec[n] = c;
33*4882a593Smuzhiyun ++l;
34*4882a593Smuzhiyun n = (n+1) % DES_BLOCK_SIZE;
35*4882a593Smuzhiyun }
36*4882a593Smuzhiyun *num=n;
37*4882a593Smuzhiyun }
38*4882a593Smuzhiyun }
39*4882a593Smuzhiyun
rk_des_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)40*4882a593Smuzhiyun int rk_des_cfb_encrypt(const unsigned char *in, unsigned char *out,
41*4882a593Smuzhiyun unsigned long length, const unsigned char *key, const int key_len,
42*4882a593Smuzhiyun unsigned char *ivec, const int enc)
43*4882a593Smuzhiyun {
44*4882a593Smuzhiyun rk_des_context ctx;
45*4882a593Smuzhiyun rk_des3_context ctx3;
46*4882a593Smuzhiyun int num = 0;
47*4882a593Smuzhiyun
48*4882a593Smuzhiyun if (in == NULL || out ==NULL || key == NULL)
49*4882a593Smuzhiyun return -1;
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun if (key_len != 8 && key_len != 16 && key_len != 24)
52*4882a593Smuzhiyun return -2;
53*4882a593Smuzhiyun
54*4882a593Smuzhiyun if(length == 0)
55*4882a593Smuzhiyun return -3;
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun switch(key_len){
58*4882a593Smuzhiyun case 8:
59*4882a593Smuzhiyun rk_des_setkey_enc(&ctx, key);
60*4882a593Smuzhiyun rk_crypto_cfb128_encrypt((void *)&ctx, in, out,length, ivec,
61*4882a593Smuzhiyun &num,enc, rk_des_crypt_ecb);
62*4882a593Smuzhiyun break;
63*4882a593Smuzhiyun case 16:
64*4882a593Smuzhiyun rk_des3_set2key_enc(&ctx3, key);
65*4882a593Smuzhiyun rk_crypto_cfb128_encrypt((void *)&ctx3, in, out,length, ivec,
66*4882a593Smuzhiyun &num,enc, rk_des3_crypt_ecb);
67*4882a593Smuzhiyun break;
68*4882a593Smuzhiyun case 24:
69*4882a593Smuzhiyun rk_des3_set3key_enc(&ctx3, key);
70*4882a593Smuzhiyun rk_crypto_cfb128_encrypt((void *)&ctx3, in, out,length, ivec,
71*4882a593Smuzhiyun &num,enc, rk_des3_crypt_ecb);
72*4882a593Smuzhiyun break;
73*4882a593Smuzhiyun default:
74*4882a593Smuzhiyun return -1;
75*4882a593Smuzhiyun }
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun return 0;
78*4882a593Smuzhiyun }
79*4882a593Smuzhiyun
80