Crypto++
blumshub.h
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 //! BlumBlumShub without factorization of the modulus
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     void GenerateBlock(byte *output, size_t size);
00021     void ProcessData(byte *outString, const byte *inString, size_t length);
00022 
00023     bool IsSelfInverting() const {return true;}
00024     bool IsForwardTransformation() const {return true;}
00025 
00026 protected:
00027     ModularArithmetic modn;
00028     word maxBits, bitsLeft;
00029     Integer current;
00030 
00031     friend class BlumGoldwasserPublicKey;
00032     friend class BlumGoldwasserPrivateKey;
00033 };
00034 
00035 //! BlumBlumShub with factorization of the modulus
00036 class BlumBlumShub : public PublicBlumBlumShub
00037 {
00038 public:
00039     // Make sure p and q are both primes congruent to 3 mod 4 and at least 512 bits long,
00040     // seed is the secret key and should be about as big as p*q
00041     BlumBlumShub(const Integer &p, const Integer &q, const Integer &seed);
00042     
00043     bool IsRandomAccess() const {return true;}
00044     void Seek(lword index);
00045 
00046 protected:
00047     const Integer p, q;
00048     const Integer x0;
00049 };
00050 
00051 NAMESPACE_END
00052 
00053 #endif