7#include "wvtripledes.h"
9#include <openssl/rand.h>
13WvTripleDESEncoder::WvTripleDESEncoder(Mode _mode,
const void *_key1,
14 const void *_key2,
const void *_key3) :
17 setkey(_key1, _key2, _key3);
32 memset(ivec, 0,
sizeof(ivec));
38void 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));
55void 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,
144WvTripleDESStream::WvTripleDESStream(
WvStream *_cloned,
const void *_key1,
145 const void *_key2,
const void *_key3,
151 _key1, _key2, _key3),
true);
153 _key1, _key2, _key3),
true);
const T * get(size_t count)
Reads exactly the specified number of elements and returns a pointer to a storage location owned by t...
T * alloc(size_t count)
Allocates exactly the specified number of elements and returns a pointer to an UNINITIALIZED storage ...
size_t used() const
Returns the number of elements in the buffer currently available for reading.
Specialization of WvBufBase for unsigned char type buffers intended for use with raw memory buffers.
WvEncoderStream chains a series of encoders on the input and output ports of the underlying stream to...
bool flush(WvBuf &inbuf, WvBuf &outbuf, bool finish=false)
Flushes the encoder and optionally finishes it.
Unified support for streams, that is, sequences of bytes that may or may not be ready for read/write ...
An encoder implementing the TripleDES encryption method.
virtual bool _encode(WvBuf &in, WvBuf &out, bool flush)
Template method implementation of encode().
virtual bool _reset()
Template method implementation of reset().