1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- #include "os.h"
- #include <mp.h>
- #include <libsec.h>
- // Because of the way that non multiple of 8
- // buffers are handled, the decryptor must
- // be fed buffers of the same size as the
- // encryptor
- // If the length is not a multiple of 8, I encrypt
- // the overflow to be compatible with lacy's cryptlib
- void
- des3CBCencrypt(uchar *p, int len, DES3state *s)
- {
- uchar *p2, *ip, *eip;
- for(; len >= 8; len -= 8){
- p2 = p;
- ip = s->ivec;
- for(eip = ip+8; ip < eip; )
- *p2++ ^= *ip++;
- triple_block_cipher(s->expanded, p, DES3EDE);
- memmove(s->ivec, p, 8);
- p += 8;
- }
- if(len > 0){
- ip = s->ivec;
- triple_block_cipher(s->expanded, ip, DES3EDE);
- for(eip = ip+len; ip < eip; )
- *p++ ^= *ip++;
- }
- }
- void
- des3CBCdecrypt(uchar *p, int len, DES3state *s)
- {
- uchar *ip, *eip, *tp;
- uchar tmp[8];
- for(; len >= 8; len -= 8){
- memmove(tmp, p, 8);
- triple_block_cipher(s->expanded, p, DES3DED);
- tp = tmp;
- ip = s->ivec;
- for(eip = ip+8; ip < eip; ){
- *p++ ^= *ip;
- *ip++ = *tp++;
- }
- }
- if(len > 0){
- ip = s->ivec;
- triple_block_cipher(s->expanded, ip, DES3EDE);
- for(eip = ip+len; ip < eip; )
- *p++ ^= *ip++;
- }
- }
|