1
// lubyrack.h - written and placed in the public domain by Wei Dai
3
#ifndef CRYPTOPP_LUBYRACK_H
4
#define CRYPTOPP_LUBYRACK_H
11
NAMESPACE_BEGIN(CryptoPP)
13
template <class T> struct DigestSizeDoubleWorkaround // VC60 workaround
15
CRYPTOPP_CONSTANT(RESULT = 2*T::DIGESTSIZE)
20
struct LR_Info : public VariableKeyLength<16, 0, 2*(INT_MAX/2), 2>, public FixedBlockSize<DigestSizeDoubleWorkaround<T>::RESULT>
22
static std::string StaticAlgorithmName() {return std::string("LR/")+T::StaticAlgorithmName();}
27
class LR : public LR_Info<T>, public BlockCipherDocumentation
29
class CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl<LR_Info<T> >
32
// VC60 workaround: have to define these functions within class definition
33
void UncheckedSetKey(const byte *userKey, unsigned int length, const NameValuePairs ¶ms)
35
this->AssertValidKeyLength(length);
40
key.Assign(userKey, 2*L);
44
CRYPTOPP_CONSTANT(S=T::DIGESTSIZE)
45
unsigned int L; // key length / 2
49
mutable SecByteBlock buffer, digest;
52
class CRYPTOPP_NO_VTABLE Enc : public Base
57
#define KR this->key+this->L
58
#define BL this->buffer
59
#define BR this->buffer+this->S
61
#define IR inBlock+this->S
63
#define OR outBlock+this->S
65
void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const
67
this->hm.Update(KL, this->L);
68
this->hm.Update(IL, this->S);
70
xorbuf(BR, IR, this->S);
72
this->hm.Update(KR, this->L);
73
this->hm.Update(BR, this->S);
75
xorbuf(BL, IL, this->S);
77
this->hm.Update(KL, this->L);
78
this->hm.Update(BL, this->S);
79
this->hm.Final(this->digest);
80
xorbuf(BR, this->digest, this->S);
82
this->hm.Update(KR, this->L);
83
this->hm.Update(OR, this->S);
84
this->hm.Final(this->digest);
85
xorbuf(BL, this->digest, this->S);
88
xorbuf(outBlock, xorBlock, this->buffer, 2*this->S);
90
memcpy_s(outBlock, 2*this->S, this->buffer, 2*this->S);
94
class CRYPTOPP_NO_VTABLE Dec : public Base
97
void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const
99
this->hm.Update(KR, this->L);
100
this->hm.Update(IR, this->S);
102
xorbuf(BL, IL, this->S);
104
this->hm.Update(KL, this->L);
105
this->hm.Update(BL, this->S);
107
xorbuf(BR, IR, this->S);
109
this->hm.Update(KR, this->L);
110
this->hm.Update(BR, this->S);
111
this->hm.Final(this->digest);
112
xorbuf(BL, this->digest, this->S);
114
this->hm.Update(KL, this->L);
115
this->hm.Update(OL, this->S);
116
this->hm.Final(this->digest);
117
xorbuf(BR, this->digest, this->S);
120
xorbuf(outBlock, xorBlock, this->buffer, 2*this->S);
122
memcpy(outBlock, this->buffer, 2*this->S);
135
typedef BlockCipherFinal<ENCRYPTION, Enc> Encryption;
136
typedef BlockCipherFinal<DECRYPTION, Dec> Decryption;