lubyrack.h
Go to the documentation of this file.
// lubyrack.h - written and placed in the public domain by Wei Dai
//! \file lubyrack.h
//! \brief Classes for the Luby-Rackoff block cipher
#ifndef CRYPTOPP_LUBYRACK_H
#define CRYPTOPP_LUBYRACK_H
#include "simple.h"
#include "secblock.h"
NAMESPACE_BEGIN(CryptoPP)
template <class T> struct DigestSizeDoubleWorkaround // VC60 workaround
{
CRYPTOPP_CONSTANT(RESULT = 2*T::DIGESTSIZE)
};
//! \class LR_Info
//! \brief Luby-Rackoff block cipher information
template <class T>
struct LR_Info : public VariableKeyLength<16, 0, 2*(INT_MAX/2), 2>, public FixedBlockSize<DigestSizeDoubleWorkaround<T>::RESULT>
{
static std::string StaticAlgorithmName() {return std::string("LR/")+T::StaticAlgorithmName();}
};
//! \class LR
//! \brief Luby-Rackoff block cipher
template <class T>
class LR : public LR_Info<T>, public BlockCipherDocumentation
{
class CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl<LR_Info<T> >
{
public:
// VC60 workaround: have to define these functions within class definition
void UncheckedSetKey(const byte *userKey, unsigned int length, const NameValuePairs &params)
{
this->AssertValidKeyLength(length);
L = length/2;
buffer.New(2*S);
digest.New(S);
key.Assign(userKey, 2*L);
}
protected:
CRYPTOPP_CONSTANT(S=T::DIGESTSIZE)
unsigned int L; // key length / 2
SecByteBlock key;
mutable T hm;
mutable SecByteBlock buffer, digest;
};
class CRYPTOPP_NO_VTABLE Enc : public Base
{
public:
#define KL this->key
#define KR this->key+this->L
#define BL this->buffer
#define BR this->buffer+this->S
#define IL inBlock
#define IR inBlock+this->S
#define OL outBlock
#define OR outBlock+this->S
void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const
{
this->hm.Update(KL, this->L);
this->hm.Update(IL, this->S);
this->hm.Final(BR);
xorbuf(BR, IR, this->S);
this->hm.Update(KR, this->L);
this->hm.Update(BR, this->S);
this->hm.Final(BL);
xorbuf(BL, IL, this->S);
this->hm.Update(KL, this->L);
this->hm.Update(BL, this->S);
this->hm.Final(this->digest);
xorbuf(BR, this->digest, this->S);
this->hm.Update(KR, this->L);
this->hm.Update(OR, this->S);
this->hm.Final(this->digest);
xorbuf(BL, this->digest, this->S);
if (xorBlock)
xorbuf(outBlock, xorBlock, this->buffer, 2*this->S);
else
memcpy_s(outBlock, 2*this->S, this->buffer, 2*this->S);
}
};
class CRYPTOPP_NO_VTABLE Dec : public Base
{
public:
void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const
{
this->hm.Update(KR, this->L);
this->hm.Update(IR, this->S);
this->hm.Final(BL);
xorbuf(BL, IL, this->S);
this->hm.Update(KL, this->L);
this->hm.Update(BL, this->S);
this->hm.Final(BR);
xorbuf(BR, IR, this->S);
this->hm.Update(KR, this->L);
this->hm.Update(BR, this->S);
this->hm.Final(this->digest);
xorbuf(BL, this->digest, this->S);
this->hm.Update(KL, this->L);
this->hm.Update(OL, this->S);
this->hm.Final(this->digest);
xorbuf(BR, this->digest, this->S);
if (xorBlock)
xorbuf(outBlock, xorBlock, this->buffer, 2*this->S);
else
memcpy(outBlock, this->buffer, 2*this->S);
}
#undef KL
#undef KR
#undef BL
#undef BR
#undef IL
#undef IR
#undef OL
#undef OR
};
public:
typedef BlockCipherFinal<ENCRYPTION, Enc> Encryption;
typedef BlockCipherFinal<DECRYPTION, Dec> Decryption;
};
NAMESPACE_END
#endif
xorbuf
void xorbuf(byte *buf, const byte *mask, size_t count)
Performs an XOR of a buffer with a mask.
Definition: misc.cpp:28
secblock.h
Classes and functions for secure memory allocations.
SecByteBlock
SecBlock<byte> typedef.
Definition: secblock.h:731
LR
Luby-Rackoff block cipher.
Definition: lubyrack.h:30
FixedBlockSize
Inherited by algorithms with fixed block size.
Definition: seckey.h:34
simple.h
Classes providing basic library services.
BlockCipherImpl
Provides a base implementation of Algorithm and SimpleKeyingInterface for block ciphers.
Definition: seckey.h:326
BlockCipherDocumentation
Provides Encryption and Decryption typedefs used by derived classes to implement a block cipher.
Definition: seckey.h:423
BlockCipherFinal< ENCRYPTION, Enc >
LR_Info
Luby-Rackoff block cipher information.
Definition: lubyrack.h:22
DigestSizeDoubleWorkaround
Definition: lubyrack.h:14
CryptoPP
Crypto++ library namespace.
memcpy_s
void memcpy_s(void *dest, size_t sizeInBytes, const void *src, size_t count)
Bounds checking replacement for memcpy()
Definition: misc.h:356
NameValuePairs
Interface for retrieving values given their names.
Definition: cryptlib.h:277
VariableKeyLength
Inherited by keyed algorithms with variable key length.
Definition: seckey.h:177