]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libsec/port/desCBC.c
libsec: generalize pbkdf2_hmac_sha1() to pbkdf2_x() passing the hmac as an argument
[plan9front.git] / sys / src / libsec / port / desCBC.c
1 #include "os.h"
2 #include <mp.h>
3 #include <libsec.h>
4
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
9
10
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;
17
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         }
27
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 }
35
36 void
37 desCBCdecrypt(uchar *p, int len, DESstate *s)
38 {
39         uchar *ip, *eip, *tp;
40         uchar tmp[8];
41
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         }
52
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 }