6 static const char *mode_cbc_encrypt(Byte *data, int blocks,
7 const Byte *iv, Byte *chain,
8 const BlockCipherAlgInfo *alg, int encr,
9 int blocksize, const void *sch) {
10 memcpy(chain,iv,blocksize);
16 memxor(data, chain, blocksize);
17 alg->encrypt.crypt(sch, data, data);
18 memcpy(chain, data, blocksize);
21 blocks--; data += blocksize;
26 static const char *mode_cbc_decrypt(Byte *data, int blocks,
27 const Byte *iv, Byte *chain,
28 const BlockCipherAlgInfo *alg, int encr,
29 int blocksize, const void *sch) {
32 memcpy(chain,iv,blocksize);
38 memcpy(chain + (cchain^blocksize), data, blocksize);
39 alg->decrypt.crypt(sch, data, data);
40 memxor(data, chain + cchain, blocksize);
44 blocks--; data += blocksize;
49 static const char *mode_ecb(Byte *data, int blocks,
50 const Byte *iv, Byte *chain,
51 const BlockCipherAlgInfo *alg, int encr,
52 int blocksize, const void *sch) {
55 (encr ? &alg->encrypt : &alg->decrypt)->crypt(sch, data, data);
57 blocks--; data += blocksize;
62 const BlockCipherModeInfo blockciphermodeinfos[]= {
63 { "cbc", 1, 2, mode_cbc_encrypt, mode_cbc_decrypt },
64 { "ecb", 0, 0, mode_ecb, mode_ecb },