00001 #ifndef CRYPTOPP_BLUMSHUB_H
00002 #define CRYPTOPP_BLUMSHUB_H
00003
00004 #include "modarith.h"
00005
00006 NAMESPACE_BEGIN(CryptoPP)
00007
00008 class BlumGoldwasserPublicKey;
00009 class BlumGoldwasserPrivateKey;
00010
00011
00012 class PublicBlumBlumShub : public RandomNumberGenerator,
00013 public StreamTransformation
00014 {
00015 public:
00016 PublicBlumBlumShub(const Integer &n, const Integer &seed);
00017
00018 unsigned int GenerateBit();
00019 byte GenerateByte();
00020
00021 void ProcessData(byte *outString, const byte *inString, size_t length)
00022 {
00023 while (length--)
00024 *outString++ = *inString ^ GenerateByte();
00025 }
00026
00027 bool IsSelfInverting() const {return true;}
00028 bool IsForwardTransformation() const {return true;}
00029
00030 protected:
00031 const ModularArithmetic modn;
00032 const word maxBits;
00033 Integer current;
00034 int bitsLeft;
00035
00036 friend class BlumGoldwasserPublicKey;
00037 friend class BlumGoldwasserPrivateKey;
00038 };
00039
00040
00041 class BlumBlumShub : public PublicBlumBlumShub
00042 {
00043 public:
00044
00045
00046 BlumBlumShub(const Integer &p, const Integer &q, const Integer &seed);
00047
00048 bool IsRandomAccess() const {return true;}
00049 void Seek(lword index);
00050
00051 protected:
00052 const Integer p, q;
00053 const Integer x0;
00054 };
00055
00056 NAMESPACE_END
00057
00058 #endif