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);
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().