Hi Patrick, > entropy coming from a source which doesn't support the > CryptoPP::RandomNumberGenerator... I'm not sure what exactly you're trying to accomplish, but here goes...
* the library offers a NullRNG object if you need to satisfy an API, but don't have a pseudo random source. It is located in cryptlib classes. * given a seed, you can use IncorporateEntropy (const byte *input, size_t length) of RandomNumberGenerator to try and keep objects in lock step. I suppose you would use this case if you are trying to create the same key given the same inputs in different libraries (similar to validation parameters?). See http://cryptopp.com/docs/ref/class_random_number_generator.html Jeff On 9/1/08, Patrick <[EMAIL PROTECTED]> wrote: > > Hello all, > > I need to be able to initialise an ECC private key with entropy coming > from a source which doesn't support the > CryptoPP::RandomNumberGenerator interface. All the ECC examples I have > found use: > > #define ECC_CURVE CryptoPP::ASN1::secp256k1() > CryptoPP::ECIES< ECC_ALGORITHM >::PrivateKey PrivateKey; > CryptoPP::AutoSeededRandomPool rng; > PrivateKey.Initialize( rng, ECC_CURVE ); > > or something similar to create the private key. I've traced through > the code this calls and tried to generate a way of doing this without > passing an rng, as shown below. The code seems to work but I'm a > little nervous and was hoping for a free code review from those more > familiar with the library. Apologies for the cheek but if someone can > confirm the following is not fatally flawed I would be very grateful? > > Thanks for looking, > Patrick > > PS : thank you, Jeffrey Walton, for your codeProject examples (if you > happen to read this) > > //following code butchered from CryptoPP functions: > // DL_PrivateKeyImpl -> void GenerateRandom(RandomNumberGenerator > &rng, const NameValuePairs ¶ms) > // void Integer::Randomize(RandomNumberGenerator &rng, const Integer > &min, const Integer &max) > // void Integer::Randomize(RandomNumberGenerator &rng, size_t nbits) > > #define ECC_ALGORITHM CryptoPP::ECP > #define ECC_CURVE CryptoPP::ASN1::secp256k1() > > //get the range of the ECC exponent > CryptoPP::Integer themin = CryptoPP::Integer::One(); > CryptoPP::Integer themax = > CryptoPP::DL_GroupParameters_EC<CryptoPP::ECP>(ECC_CURVE).GetMaxExponent(); > CryptoPP::Integer Range = themax - themin; > //calc the number of bits of randomness required > const unsigned int nbits = Range.BitCount(); > const size_t nbytes = nbits/8 + 1; > //generate random value within the range and assign to x > CryptoPP::Integer x; > do > { > //will use other source of randomness here > CryptoPP::AutoSeededRandomPool rng; > CryptoPP::SecByteBlock buf(nbytes); > rng.GenerateBlock( buf, buf.SizeInBytes() ); > > if (nbytes) > buf[0] = (byte)CryptoPP::Crop(buf[0], nbits % 8); > x = CryptoPP::Integer(buf, nbytes, > CryptoPP::Integer::UNSIGNED); > }while (x > Range); > x += themin; > //set up the private key > CryptoPP::ECIES< ECC_ALGORITHM >::PrivateKey PrivateKey; > PrivateKey.Initialize( ECC_CURVE, x ); > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the "Crypto++ Users" Google Group. To unsubscribe, send an email to [EMAIL PROTECTED] More information about Crypto++ and this group is available at http://www.cryptopp.com. -~----------~----~----~----~------~----~------~--~---
