]> jfr.im git - irc/quakenet/newserv.git/blob - lib/cbc.c
A4STATS: remove E style escapes and switch to createtable for indices
[irc/quakenet/newserv.git] / lib / cbc.c
1 #include <stdlib.h>
2 #include <string.h>
3
4 #include "cbc.h"
5 #include "rijndael.h"
6
7 rijndaelcbc *rijndaelcbc_init(unsigned char *key, int keybits, unsigned char *iv, int decrypt) {
8 rijndaelcbc *ret = (rijndaelcbc *)malloc(sizeof(rijndaelcbc) + RKLENGTH(keybits) * sizeof(unsigned long));
9 if(!ret)
10 return NULL;
11
12 memcpy(ret->prevblock, iv, 16);
13
14 if(decrypt) {
15 ret->nrounds = rijndaelSetupDecrypt(ret->rk, key, keybits);
16 } else {
17 ret->nrounds = rijndaelSetupEncrypt(ret->rk, key, keybits);
18 }
19
20 return ret;
21 }
22
23 void rijndaelcbc_free(rijndaelcbc *c) {
24 free(c);
25 }
26
27 unsigned char *rijndaelcbc_encrypt(rijndaelcbc *c, unsigned char *ptblock) {
28 int i;
29 unsigned char *p = c->prevblock, *p2 = c->scratch;
30 for(i=0;i<16;i++)
31 *p2++ = *p++ ^ *ptblock++;
32
33 rijndaelEncrypt(c->rk, c->nrounds, c->scratch, c->prevblock);
34 return c->prevblock;
35 }
36
37 unsigned char *rijndaelcbc_decrypt(rijndaelcbc *c, unsigned char *ctblock) {
38 int i;
39 unsigned char *p = c->prevblock, *p2 = c->scratch;
40
41 rijndaelDecrypt(c->rk, c->nrounds, ctblock, c->scratch);
42
43 for(i=0;i<16;i++)
44 *p2++^=*p++;
45
46 memcpy(c->prevblock, ctblock, 16);
47 return c->scratch;
48 }
49