/* */ #include "DHTUtil.h" #include "MessageDigestHelper.h" #include #include #include #ifdef HAVE_LIBGCRYPT # include #elif HAVE_LIBSSL # include # include "SimpleRandomizer.h" #endif // HAVE_LIBSSL namespace aria2 { void DHTUtil::generateRandomKey(unsigned char* key) { unsigned char bytes[40]; generateRandomData(bytes, sizeof(bytes)); MessageDigestHelper::digest(key, 20, MessageDigestContext::SHA1, bytes, sizeof(bytes)); } void DHTUtil::generateRandomData(unsigned char* data, size_t length) { #ifdef HAVE_LIBGCRYPT gcry_randomize(data, length, GCRY_STRONG_RANDOM); #elif HAVE_LIBSSL if(RAND_bytes(data, length) != 1) { for(size_t i = 0; i < length; ++i) { data[i] = SimpleRandomizer::getInstance()->getRandomNumber(UINT8_MAX+1); } } #else std::ifstream i("/dev/urandom"); i.read(data, length); #endif // HAVE_LIBSSL } void DHTUtil::flipBit(unsigned char* data, size_t length, size_t bitIndex) { size_t byteIndex = bitIndex/8; assert(byteIndex <= length); unsigned char mask = 128 >> (bitIndex%8); data[byteIndex] ^= mask; } } // namespace aria2