static int GCC_RSA_GenerateBlock(byte *output, size_t size, unsigned int safety) { CRYPTOPP_ASSERT((output && size) || !(output || size)); #if CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_X32 word64 val; #else word32 val; #endif char rc; while (size) { __asm__ volatile( #if CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_X32 ".byte 0x48, 0x0f, 0xc7, 0xf8;\n" // rdseed rax #else ".byte 0x0f, 0xc7, 0xf8;\n" // rdseed eax #endif "setc %1; " : "=a" (val), "=qm" (rc) : : "cc" ); if (rc) { if (size >= sizeof(val)) { #if defined(CRYPTOPP_ALLOW_UNALIGNED_DATA_ACCESS) && (CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_X32) *((word64*)(void *)output) = val; #elif defined(CRYPTOPP_ALLOW_UNALIGNED_DATA_ACCESS) && (CRYPTOPP_BOOL_X86) *((word32*)(void *)output) = val; #else memcpy(output, &val, sizeof(val)); #endif output += sizeof(val); size -= sizeof(val); } else { memcpy(output, &val, size); size = 0; } } else { if (!safety--) { CRYPTOPP_ASSERT(0); return 0; } } } SecureWipeBuffer(&val, 1); return int(size == 0); }
static int ALL_RSI_GenerateBlock(byte *output, size_t size, unsigned int safety) { CRYPTOPP_ASSERT((output && size) || !(output || size)); #if CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 word32 val; #else word64 val; #endif while (size >= sizeof(val)) { #if CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 if (_rdseed32_step((word32*)output)) #else // Cast due to GCC, http://github.com/weidai11/cryptopp/issues/236 if (_rdseed64_step(reinterpret_cast<unsigned long long*>(output))) #endif { output += sizeof(val); size -= sizeof(val); } else { if (!safety--) { CRYPTOPP_ASSERT(0); return 0; } } } if (size) { #if CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 if (_rdseed32_step(&val)) #else // Cast due to GCC, http://github.com/weidai11/cryptopp/issues/236 if (_rdseed64_step(reinterpret_cast<unsigned long long*>(&val))) #endif { memcpy(output, &val, size); size = 0; } else { if (!safety--) { CRYPTOPP_ASSERT(0); return 0; } } } SecureWipeBuffer(&val, 1); return int(size == 0); }
static int ALL_RSI_GenerateBlock(byte *output, size_t size, unsigned int safety) { assert((output && size) || !(output || size)); #if CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 word32 val; #else word64 val; #endif while (size >= sizeof(val)) { #if CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 if (_rdseed32_step((word32*)output)) #else if (_rdseed64_step((word64*)output)) #endif { output += sizeof(val); size -= sizeof(val); } else { if (!safety--) { assert(0); return 0; } } } if (size) { #if CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 if (_rdseed32_step(&val)) #else if (_rdseed64_step(&val)) #endif { memcpy(output, &val, size); size = 0; } else { if (!safety--) { assert(0); return 0; } } } SecureWipeBuffer(&val, 1); return int(size == 0); }
void CAST256::Base::UncheckedSetKey(const byte *userKey, unsigned int keylength, const NameValuePairs &) { AssertValidKeyLength(keylength); word32 kappa[8]; GetUserKey(BIG_ENDIAN_ORDER, kappa, 8, userKey, keylength); for(int i=0; i<12; ++i) { Omega(2*i,kappa); Omega(2*i+1,kappa); K[8*i]=kappa[0] & 31; K[8*i+1]=kappa[2] & 31; K[8*i+2]=kappa[4] & 31; K[8*i+3]=kappa[6] & 31; K[8*i+4]=kappa[7]; K[8*i+5]=kappa[5]; K[8*i+6]=kappa[3]; K[8*i+7]=kappa[1]; } if (!IsForwardTransformation()) { for(int j=0; j<6; ++j) { for(int i=0; i<4; ++i) { int i1=8*j+i; int i2=8*(11-j)+i; CRYPTOPP_ASSERT(i1<i2); std::swap(K[i1],K[i2]); std::swap(K[i1+4],K[i2+4]); } } } SecureWipeBuffer(kappa, 8); }