Path: blob/a-new-beginning/SharedDependencies/Sources/cryptopp/blumshub.cpp
2 views
// blumshub.cpp - originally written and placed in the public domain by Wei Dai12#include "pch.h"3#include "blumshub.h"4#include "integer.h"56NAMESPACE_BEGIN(CryptoPP)78PublicBlumBlumShub::PublicBlumBlumShub(const Integer &n, const Integer &seed)9: modn(n),10current(modn.Square(modn.Square(seed))),11maxBits(BitPrecision(n.BitCount())-1),12bitsLeft(maxBits)13{14}1516unsigned int PublicBlumBlumShub::GenerateBit()17{18if (bitsLeft==0)19{20current = modn.Square(current);21bitsLeft = maxBits;22}2324return static_cast<unsigned int>(current.GetBit(--bitsLeft));25}2627byte PublicBlumBlumShub::GenerateByte()28{29byte b=0;30for (int i=0; i<8; i++)31b = byte((b << 1) | PublicBlumBlumShub::GenerateBit());32return b;33}3435void PublicBlumBlumShub::GenerateBlock(byte *output, size_t size)36{37while (size--)38*output++ = PublicBlumBlumShub::GenerateByte();39}4041void PublicBlumBlumShub::ProcessData(byte *outString, const byte *inString, size_t length)42{43while (length--)44*outString++ = *inString++ ^ PublicBlumBlumShub::GenerateByte();45}4647BlumBlumShub::BlumBlumShub(const Integer &p, const Integer &q, const Integer &seed)48: PublicBlumBlumShub(p*q, seed),49p(p), q(q),50x0(modn.Square(seed))51{52}5354void BlumBlumShub::Seek(lword index)55{56Integer i(Integer::POSITIVE, index);57i *= 8;58Integer e = a_exp_b_mod_c (2, i / maxBits + 1, (p-1)*(q-1));59current = modn.Exponentiate(x0, e);60bitsLeft = maxBits - i % maxBits;61}6263NAMESPACE_END646566