#pragma once #include #include #include typedef uint32_t Word; typedef Word State[16]; typedef Word Block[16]; /* Implementation in accordance to RFC7539 * https://tools.ietf.org/html/rfc7539 * * Note that there is a difference in the rfc and the version * published by djb. In the rfc one uses 32-bit counter and 96-bit * nounce, whereas the published version of djb uses 64bit counter and * 64bit nounce. * * As a result the maximum data that should be encrypted with this * cipher (for a given key, iv pair). * * 2^32 blocks = 256 GB. * */ typedef uint32_t Counter; typedef Word IV[3]; typedef Word Key[8]; # define BLOCK_SIZE (sizeof(State)) #define C0 ((Word) 0x61707865) #define C1 ((Word) 0x3320646e) #define C2 ((Word) 0x79622d32) #define C3 ((Word) 0x6b206574) /* Vector types */ # ifdef HAVE_VECTOR_128 /* Type of 128-bit SIMD instructions */ typedef Word Vec __attribute__ ((vector_size (16))); # endif # ifdef HAVE_VECTOR_256 /* Type of 256-bit SIMD instructions */ typedef Word Vec2 __attribute__ ((vector_size (32))); # endif # ifdef HAVE_VECTOR_512 /* Type of 512-bit SIMD instructions */ typedef Word Vec4 __attribute__ ((vector_size (64))); # endif