/************************************************* * Bit/Word Operations Header File * * (C) 1999-2008 Jack Lloyd * *************************************************/ #ifndef BOTAN_BIT_OPS_H__ #define BOTAN_BIT_OPS_H__ #include namespace Botan { /************************************************* * Word Rotation Functions * *************************************************/ template inline T rotate_left(T input, u32bit rot) { return static_cast((input << rot) | (input >> (8*sizeof(T)-rot)));; } template inline T rotate_right(T input, u32bit rot) { return static_cast((input >> rot) | (input << (8*sizeof(T)-rot))); } /************************************************* * Byte Swapping Functions * *************************************************/ inline u16bit reverse_bytes(u16bit input) { return rotate_left(input, 8); } inline u32bit reverse_bytes(u32bit input) { input = ((input & 0xFF00FF00) >> 8) | ((input & 0x00FF00FF) << 8); return rotate_left(input, 16); } inline u64bit reverse_bytes(u64bit input) { u32bit hi = ((input >> 40) & 0x00FF00FF) | ((input >> 24) & 0xFF00FF00); u32bit lo = ((input & 0xFF00FF00) >> 8) | ((input & 0x00FF00FF) << 8); hi = (hi << 16) | (hi >> 16); lo = (lo << 16) | (lo >> 16); return (static_cast(lo) << 32) | hi; } /************************************************* * XOR Arrays * *************************************************/ inline void xor_buf(byte data[], const byte mask[], u32bit length) { while(length >= 8) { data[0] ^= mask[0]; data[1] ^= mask[1]; data[2] ^= mask[2]; data[3] ^= mask[3]; data[4] ^= mask[4]; data[5] ^= mask[5]; data[6] ^= mask[6]; data[7] ^= mask[7]; data += 8; mask += 8; length -= 8; } for(u32bit j = 0; j != length; ++j) data[j] ^= mask[j]; } /************************************************* * XOR Arrays * *************************************************/ inline void xor_buf(byte out[], const byte in[], const byte mask[], u32bit length) { while(length >= 8) { out[0] = in[0] ^ mask[0]; out[1] = in[1] ^ mask[1]; out[2] = in[2] ^ mask[2]; out[3] = in[3] ^ mask[3]; out[4] = in[4] ^ mask[4]; out[5] = in[5] ^ mask[5]; out[6] = in[6] ^ mask[6]; out[7] = in[7] ^ mask[7]; in += 8; out += 8; mask += 8; length -= 8; } for(u32bit j = 0; j != length; ++j) out[j] = in[j] ^ mask[j]; } /************************************************* * Simple Bit Manipulation * *************************************************/ bool power_of_2(u64bit); u32bit high_bit(u64bit); u32bit low_bit(u64bit); u32bit significant_bytes(u64bit); u32bit hamming_weight(u64bit); } #endif