Blob


1 #include "os.h"
2 #include <mp.h>
3 #include <libsec.h>
5 /* Because of the way that non multiple of 8 */
6 /* buffers are handled, the decryptor must */
7 /* be fed buffers of the same size as the */
8 /* encryptor */
11 /* If the length is not a multiple of 8, I encrypt */
12 /* the overflow to be compatible with lacy's cryptlib */
13 void
14 desCBCencrypt(uchar *p, int len, DESstate *s)
15 {
16 uchar *p2, *ip, *eip;
18 for(; len >= 8; len -= 8){
19 p2 = p;
20 ip = s->ivec;
21 for(eip = ip+8; ip < eip; )
22 *p2++ ^= *ip++;
23 block_cipher(s->expanded, p, 0);
24 memmove(s->ivec, p, 8);
25 p += 8;
26 }
28 if(len > 0){
29 ip = s->ivec;
30 block_cipher(s->expanded, ip, 0);
31 for(eip = ip+len; ip < eip; )
32 *p++ ^= *ip++;
33 }
34 }
36 void
37 desCBCdecrypt(uchar *p, int len, DESstate *s)
38 {
39 uchar *ip, *eip, *tp;
40 uchar tmp[8];
42 for(; len >= 8; len -= 8){
43 memmove(tmp, p, 8);
44 block_cipher(s->expanded, p, 1);
45 tp = tmp;
46 ip = s->ivec;
47 for(eip = ip+8; ip < eip; ){
48 *p++ ^= *ip;
49 *ip++ = *tp++;
50 }
51 }
53 if(len > 0){
54 ip = s->ivec;
55 block_cipher(s->expanded, ip, 0);
56 for(eip = ip+len; ip < eip; )
57 *p++ ^= *ip++;
58 }
59 }