7 #include "wvtripledes.h"
9 #include <openssl/rand.h>
13 WvTripleDESEncoder::WvTripleDESEncoder(Mode _mode,
const void *_key1,
14 const void *_key2,
const void *_key3) :
17 setkey(_key1, _key2, _key3);
32 memset(ivec, 0,
sizeof(ivec));
38 void WvTripleDESEncoder::setkey(
const void *_key1,
const void *_key2,
41 memcpy(key, _key1, DES_KEY_SZ);
42 DES_set_key(&key, &deskey1);
44 memcpy(key, _key2, DES_KEY_SZ);
45 DES_set_key(&key, &deskey2);
47 memcpy(key, _key3, DES_KEY_SZ);
48 DES_set_key(&key, &deskey3);
50 memset(ivec, 0,
sizeof(ivec));
55 void WvTripleDESEncoder::setiv(
const void *_iv)
57 memcpy(ivec, _iv,
sizeof(ivec));
63 size_t len = in.
used();
71 size_t remainder = len & 7;
73 if (remainder != 0 &&
flush)
78 size_t padlen = 8 - remainder;
79 unsigned char *pad = in.
alloc(padlen);
80 RAND_pseudo_bytes(pad, padlen);
95 const unsigned char *data = in.
get(len);
96 unsigned char *crypt = out.
alloc(len);
105 #if OPENSSL_VERSION_NUMBER >= 0x0090705fL \
106 && OPENSSL_VERSION_NUMBER < 0x0090800fL
107 DES_ecb3_encrypt(data, crypt,
108 &deskey1, &deskey2, &deskey3,
109 mode ==
ECBEncrypt ? DES_ENCRYPT : DES_DECRYPT);
111 DES_ecb3_encrypt(
reinterpret_cast<const_DES_cblock*
>(&data),
112 reinterpret_cast<DES_cblock*
>(&crypt),
113 &deskey1, &deskey2, &deskey3,
114 mode ==
ECBEncrypt ? DES_ENCRYPT : DES_DECRYPT);
125 DES_ede3_cfb64_encrypt(data, crypt, len, &deskey1, &deskey2, &deskey3,
127 mode ==
CFBEncrypt ? DES_ENCRYPT : DES_DECRYPT);
130 DES_ede3_cbc_encrypt(data, crypt, len, &deskey1, &deskey2, &deskey3,
134 DES_ede3_cbc_encrypt(data, crypt, len, &deskey1, &deskey2, &deskey3,
144 WvTripleDESStream::WvTripleDESStream(
WvStream *_cloned,
const void *_key1,
145 const void *_key2,
const void *_key3,
151 _key1, _key2, _key3),
true);
153 _key1, _key2, _key3),
true);