]>
Commit | Line | Data |
---|---|---|
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 |