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); }
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; }
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); }
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); }
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)); }
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); }