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