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)
75 if (mode == ECBEncrypt || mode == CBCEncrypt)
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);
T * alloc(size_t count)
Allocates exactly the specified number of elements and returns a pointer to an UNINITIALIZED storage ...
WvEncoderStream chains a series of encoders on the input and output ports of the underlying stream to...
Unified support for streams, that is, sequences of bytes that may or may not be ready for read/write ...
Specialization of WvBufBase for unsigned char type buffers intended for use with raw memory buffers...
size_t used() const
Returns the number of elements in the buffer currently available for reading.
virtual bool _encode(WvBuf &in, WvBuf &out, bool flush)
Template method implementation of encode().
An encoder implementing the TripleDES encryption method.
virtual bool _reset()
Template method implementation of reset().
const T * get(size_t count)
Reads exactly the specified number of elements and returns a pointer to a storage location owned by t...