| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 | 
							
- #ifndef DPFPP_PRG_AES_IMPL_H__
 
- #define DPFPP_PRG_AES_IMPL_H__
 
- #include "prg.h"
 
- #include "aes.h"
 
- namespace dpf
 
- {
 
- template<>
 
- inline void PRG(const AES_KEY & prgkey, const __m128i & seed, void * outbuf, const uint32_t len, const uint32_t from)
 
- {
 
- 	__m128i * outbuf128 = reinterpret_cast<__m128i *>(outbuf);
 
- 	for (size_t i = 0; i < len; ++i)
 
- 	{
 
- 		outbuf128[i] = _mm_xor_si128(seed, _mm_set_epi64x(0, from+i));
 
- 	}
 
- 	AES_ecb_encrypt_blks(outbuf128, static_cast<unsigned int>(len), &prgkey);
 
- 	for (size_t i = 0; i < len; ++i) 
 
- 	{
 
- 		outbuf128[i] = _mm_xor_si128(outbuf128[i], _mm_set_epi64x(0, from+i));
 
- 		outbuf128[i] = _mm_xor_si128(outbuf128[i], seed);
 
- 	}
 
- } // PRG<AES_KEY>
 
- inline void PRG_aes(const AES_KEY & prgkey, const __m128i & seed, void * outbuf, const uint32_t len, const uint32_t from = 0)
 
- {
 
- 	__m128i * outbuf128 = reinterpret_cast<__m128i *>(outbuf);
 
- 	for (size_t i = 0; i < len; ++i)
 
- 	{
 
- 		outbuf128[i] = _mm_xor_si128(seed, _mm_set_epi64x(0, from+i));
 
- 	}
 
- 	AES_ecb_encrypt_blks(outbuf128, static_cast<unsigned int>(len), &prgkey);
 
- 	for (size_t i = 0; i < len; ++i) 
 
- 	{
 
- 		outbuf128[i] = _mm_xor_si128(outbuf128[i], _mm_set_epi64x(0, from+i));
 
- 		outbuf128[i] = _mm_xor_si128(outbuf128[i], seed);
 
- 	}
 
- } // PRG<AES_KEY>
 
- inline void PRG_aes(const AES_KEY & prgkey, const __m256i & seed, void * outbuf, const uint32_t len, const uint32_t from = 0)
 
- {
 
- 	 __m256i * outbuf256 = reinterpret_cast<__m256i *>(outbuf);
 
- 	 for (size_t i = 0; i < len; ++i)
 
- 	 {
 
- 	 	outbuf256[i] = _mm256_xor_si256(seed, _mm256_set_epi64x(0, 0, 0, from+i));
 
- 	 }
 
- 	
 
- 	// AES_ecb_encrypt_blks(reinterpret_cast<__m128i *>(outbuf256), static_cast<unsigned int>(len), &prgkey);
 
- 	
 
- 	 for (size_t i = 0; i < len; ++i) 
 
- 	 {
 
- 		outbuf256[i] = _mm256_xor_si256(outbuf256[i], _mm256_set_epi64x(0, 0, 0, from+i));
 
- 		outbuf256[i] = _mm256_xor_si256(outbuf256[i], seed);
 
- 	 }
 
- } // PRG<AES_KEY>
 
- inline std::ostream & operator<<(std::ostream & os, const AES_KEY & prgkey)
 
- {
 
- 	return os.write(reinterpret_cast<const char *>(&prgkey.rd_key[0]), sizeof(__m128i));
 
- } // operator<<
 
- } // namespace dpf
 
- #endif // DPFPP_PRG_AES_IMPL_H
 
 
  |