Esempio n. 1
0
void rnd_get_state(struct rnd *rnd, uint32_t state[])
{
	state[0] = H32(rnd->s1);
	state[1] = L32(rnd->s1);
	state[2] = H32(rnd->s2);
	state[3] = L32(rnd->s2);
}
Esempio n. 2
0
static inline uint64_t next_rnd(struct rnd *rnd)
{
	uint64_t x1 = L32(rnd->s1)*A1+H32(rnd->s1);
	uint64_t x2 = L32(rnd->s2)*A2+H32(rnd->s2);
	rnd->s1 = x1;
	rnd->s2 = x2;
	return x1 + x2;
}
Esempio n. 3
0
static inline uint64_t next_mwc32_m2_64(struct state_mwc32_m2_64 *state)
{
	uint64_t x = L32(state->s1)*A1+H32(state->s1);
	state->s1 = x;	
	uint64_t z1 = Z1 * H32(x);
	uint64_t z2 = Z2 * L32(x);
	return z1 + FLIP32(z2);
}
Esempio n. 4
0
static inline uint64_t next_mwc32_m2_32(struct state_mwc32_m2_32 *state)
{
	uint64_t x = state->s1*A1+state->c;
	state->s1 = x;
	state->c = H32(x);
	uint64_t z1 = Z1 * H32(x);
	uint64_t z2 = Z2 * L32(x);
	return z1 + FLIP32(z2);
}
Esempio n. 5
0
static void EncryptBufferXTS8Byte(unsigned __int8 *buffer,
						GST_LARGEST_COMPILER_UINT length,
						const UINT64_STRUCT *startDataUnitNo,
						unsigned int startCipherBlockNo,
						unsigned __int8 *ks,
						unsigned __int8 *ks2,
						int cipher)
{
	unsigned __int8 finalCarry;
	unsigned __int8 whiteningValue [BYTES_PER_XTS_BLOCK_SMALL];
	unsigned __int8 byteBufUnitNo [BYTES_PER_XTS_BLOCK_SMALL];
	unsigned __int32 *whiteningValuePtr32 = (unsigned __int32 *)whiteningValue;
	unsigned __int32 *bufPtr = (unsigned __int32 *)buffer;
	unsigned __int32 startBlock = startCipherBlockNo, endBlock, block;
	GST_LARGEST_COMPILER_UINT blockCount;
	UINT64_STRUCT dataUnitNo;
	unsigned __int8 xor_ks[MAX_EXPANDED_KEY];

	dataUnitNo.LowPart = startDataUnitNo->LowPart;
	dataUnitNo.HighPart = startDataUnitNo->HighPart;

	*((unsigned __int32 *) byteBufUnitNo) = (unsigned __int32) LE32 (dataUnitNo.LowPart);
	*((unsigned __int32 *) byteBufUnitNo + 1) = (unsigned __int32) LE32 (dataUnitNo.HighPart);

	if (length % BYTES_PER_XTS_BLOCK_SMALL)
		GST_THROW_FATAL_EXCEPTION;

	blockCount = length / BYTES_PER_XTS_BLOCK_SMALL;
	
	memcpy(xor_ks, ks, CipherGetKeyScheduleSize(cipher));

	while (blockCount > 0)
	{
		if (blockCount < BLOCKS_PER_XTS_DATA_UNIT_SMALL)
			endBlock = startBlock + (unsigned __int32) blockCount;
		else
			endBlock = BLOCKS_PER_XTS_DATA_UNIT_SMALL;

		whiteningValuePtr32 = (unsigned __int32 *) whiteningValue;

		//Generate first whitening value
		*whiteningValuePtr32 = *((unsigned __int32 *) byteBufUnitNo);
		*(whiteningValuePtr32+1) = *((unsigned __int32 *) byteBufUnitNo+1);
		EncipherBlock (cipher, whiteningValue, ks2);

		//XOR ks with the current DataUnitNo
		XorKeySchedule(cipher, ks, xor_ks, byteBufUnitNo, 8);

		//Generate subsequent whitening values for blocks
		for (block = 0; block < endBlock; block++)
		{
			if (block >= startBlock)
			{
				//Pre-whitening
				*bufPtr++ ^= *whiteningValuePtr32++;
				*bufPtr-- ^= *whiteningValuePtr32--;

				//Actual encryption
				EncipherBlock(cipher, bufPtr, xor_ks);

				//Post-whitening
				*bufPtr++ ^= *whiteningValuePtr32++;
				*bufPtr++ ^= *whiteningValuePtr32;
			}
			else
				whiteningValuePtr32++;

			//Derive the next whitening value
#if BYTE_ORDER == LITTLE_ENDIAN

			//Little-endian platforms
			finalCarry = (*whiteningValuePtr32 & 0x80000000) ? 135 : 0;

			*whiteningValuePtr32-- <<= 1;

			if (*whiteningValuePtr32 & 0x80000000)
				*(whiteningValuePtr32 + 1) |= 1;

			*whiteningValuePtr32 <<= 1;
#else
			//Big-endian platforms
			finalCarry = (*whiteningValuePtr32 & 0x80) ? 135 : 0;

			*whiteningValuePtr32 = LE32 (L32 (*whiteningValuePtr32) << 1);

			whiteningValuePtr32--;

			if (*whiteningValuePtr32 & 0x80)
				*(whiteningValuePtr32 + 1) |= 0x01000000;

			*whiteningValuePtr32 = LE32 (LE32 (*whiteningValuePtr32) << 1);
#endif
			whiteningValue[0] ^= finalCarry;
		}
		blockCount -= endBlock - startBlock;
		startBlock = 0;
		if (!++dataUnitNo.LowPart)
			dataUnitNo.HighPart++;
		*((unsigned __int32 *) byteBufUnitNo) = (unsigned __int32) LE32 (dataUnitNo.LowPart);
		*((unsigned __int32 *) byteBufUnitNo+1) = (unsigned __int32) LE32 (dataUnitNo.HighPart);
	}
	FAST_ERASE32(whiteningValue, sizeof(whiteningValue));
}
Esempio n. 6
0
static inline uint64_t next_mwc32_r(struct state_mwc32_r *state)
{
	uint64_t x = L32(state->s1)*A1+H32(state->s1);
	state->s1 = x;
	return x + RR64(x,25);
}