00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 #ifndef _MODE_HDR_H
00041 #define _MODE_HDR_H
00042
00043
00044
00045
00046
00047
00048 #if !defined( BFR_UNIT )
00049 # if 1
00050 # define BFR_UNIT 64
00051 # elif 0
00052 # define BFR_UNIT 32
00053 # else
00054 # define BFR_UNIT 8
00055 # endif
00056 #endif
00057
00058
00059
00060
00061
00062 #if 1 && !defined( USE_INLINING )
00063 # define USE_INLINING
00064 #endif
00065
00066 #include <string.h>
00067 #include <limits.h>
00068
00069 #if defined( _MSC_VER )
00070 # if _MSC_VER >= 1400
00071 # include <stdlib.h>
00072 # include <intrin.h>
00073 # pragma intrinsic(memset)
00074 # pragma intrinsic(memcpy)
00075 # define rotl32 _rotl
00076 # define rotr32 _rotr
00077 # define rotl64 _rotl64
00078 # define rotr64 _rotl64
00079 # define bswap_32(x) _byteswap_ulong(x)
00080 # define bswap_64(x) _byteswap_uint64(x)
00081 # else
00082 # define rotl32 _lrotl
00083 # define rotr32 _lrotr
00084 # endif
00085 #endif
00086
00087 #if BFR_UNIT == 64
00088 # define NEED_UINT_64T
00089 #endif
00090
00091 #include "brg_endian.h"
00092 #include "brg_types.h"
00093 #include "gcm_aes.h"
00094
00095 #if defined( USE_INLINING )
00096 # if defined( _MSC_VER )
00097 # define mh_inline __inline
00098 # elif defined( __GNUC__ ) || defined( __GNU_LIBRARY__ )
00099 # define mh_inline static inline
00100 # else
00101 # define mh_inline static
00102 # endif
00103 #endif
00104
00105 #if defined(__cplusplus)
00106 extern "C" {
00107 #endif
00108
00109 #define ui8_ptr(x) ptr_cast(x, 8)
00110 #define ui16_ptr(x) ptr_cast(x, 16)
00111 #define ui32_ptr(x) ptr_cast(x, 32)
00112 #define ui64_ptr(x) ptr_cast(x, 64)
00113 #define unit_ptr(x) ptr_cast(x, BFR_UNIT)
00114
00115 #define BUF_INC (BFR_UNIT >> 3)
00116 #define BUF_ADRMASK ((BFR_UNIT >> 3) - 1)
00117
00118
00119
00120 typedef void (*xor_function)(void*, const void* q);
00121
00122
00123
00124 #if defined( mh_inline )
00125
00126 #if !defined( rotl32 ) // NOTE: 0 <= n <= 32 ASSUMED
00127 mh_inline uint_32t rotl32(uint_32t x, int n)
00128 {
00129 return (((x) << n) | ((x) >> (32 - n)));
00130 }
00131 #endif
00132
00133 #if !defined( rotr32 ) // NOTE: 0 <= n <= 32 ASSUMED
00134 mh_inline uint_32t rotr32(uint_32t x, int n)
00135 {
00136 return (((x) >> n) | ((x) << (32 - n)));
00137 }
00138 #endif
00139
00140 #if !defined( rotl64 ) // NOTE: 0 <= n <= 64 ASSUMED
00141 mh_inline uint_64t rotl64(uint_64t x, int n)
00142 {
00143 return (((x) << n) | ((x) >> (64 - n)));
00144 }
00145 #endif
00146
00147 #if !defined( rotr64 ) // NOTE: 0 <= n <= 64 ASSUMED
00148 mh_inline uint_64t rotr64(uint_64t x, int n)
00149 {
00150 return (((x) >> n) | ((x) << (64 - n)));
00151 }
00152 #endif
00153
00154
00155
00156 #if !defined(bswap_32)
00157 mh_inline uint_32t bswap_32(uint_32t x)
00158 {
00159 return ((rotr32((x), 24) & 0x00ff00ff) | (rotr32((x), 8) & 0xff00ff00));
00160 }
00161 #endif
00162
00163 #if !defined(bswap_64)
00164 mh_inline uint_64t bswap_64(uint_64t x)
00165 {
00166 return bswap_32((uint_32t)(x >> 32)) | ((uint_64t)bswap_32((uint_32t)x) << 32);
00167 }
00168 #endif
00169
00170 mh_inline void bswap32_block(void* d, const void* s, int n)
00171 {
00172 while(n--)
00173 ((uint_32t*)d)[n] = bswap_32(((uint_32t*)s)[n]);
00174 }
00175
00176 mh_inline void bswap64_block(void* d, const void* s, int n)
00177 {
00178 while(n--)
00179 ((uint_64t*)d)[n] = bswap_64(((uint_64t*)s)[n]);
00180 }
00181
00182 #else
00183
00184 #if !defined( rotl32 ) // NOTE: 0 <= n <= 32 ASSUMED
00185 # define rotl32(x,n) (((x) << n) | ((x) >> (32 - n)))
00186 #endif
00187
00188 #if !defined( rotr32 ) // NOTE: 0 <= n <= 32 ASSUMED
00189 # define rotr32(x,n) (((x) >> n) | ((x) << (32 - n)))
00190 #endif
00191
00192 #if !defined( rotl64 ) // NOTE: 0 <= n <= 64 ASSUMED
00193 # define rotl64(x,n) (((x) << n) | ((x) >> (64 - n)))
00194 #endif
00195
00196 #if !defined( rotr64 ) // NOTE: 0 <= n <= 64 ASSUMED
00197 # define rotr64(x,n) (((x) >> n) | ((x) << (64 - n)))
00198 #endif
00199
00200 #if !defined(bswap_32)
00201 # define bswap_32(x) ((rotr32((x), 24) & 0x00ff00ff) | (rotr32((x), 8) & 0xff00ff00))
00202 #endif
00203
00204 #if !defined(bswap_64)
00205 # define bswap_64(x) (bswap_32((uint_32t)(x >> 32)) | ((uint_64t)bswap_32((uint_32t)x) << 32))
00206 #endif
00207
00208 #define bswap32_block(d,s,n) \
00209 { int _i = (n); while(_i--) ui32_ptr(d)[_i] = bswap_32(ui32_ptr(s)[_i]); }
00210
00211 #define bswap64_block(d,s,n) \
00212 { int _i = (n); while(_i--) ui64_ptr(d)[_i] = bswap_64(ui64_ptr(s)[_i]); }
00213
00214 #endif
00215
00216
00217
00218 #if defined( mh_inline )
00219
00220 mh_inline void move_block(void* p, const void* q)
00221 {
00222 memcpy(p, q, 16);
00223 }
00224
00225 mh_inline void move_block_aligned( void *p, const void *q)
00226 {
00227 #if BFR_UNIT == 8
00228 move_block(p, q);
00229 #else
00230 unit_ptr(p)[0] = unit_ptr(q)[0]; unit_ptr(p)[1] = unit_ptr(q)[1];
00231 # if BFR_UNIT == 32
00232 unit_ptr(p)[2] = unit_ptr(q)[2]; unit_ptr(p)[3] = unit_ptr(q)[3];
00233 # endif
00234 #endif
00235 }
00236
00237 mh_inline void xor_block(void* p, const void* q)
00238 {
00239 ui8_ptr(p)[ 0] ^= ui8_ptr(q)[ 0]; ui8_ptr(p)[ 1] ^= ui8_ptr(q)[ 1];
00240 ui8_ptr(p)[ 2] ^= ui8_ptr(q)[ 2]; ui8_ptr(p)[ 3] ^= ui8_ptr(q)[ 3];
00241 ui8_ptr(p)[ 4] ^= ui8_ptr(q)[ 4]; ui8_ptr(p)[ 5] ^= ui8_ptr(q)[ 5];
00242 ui8_ptr(p)[ 6] ^= ui8_ptr(q)[ 6]; ui8_ptr(p)[ 7] ^= ui8_ptr(q)[ 7];
00243 ui8_ptr(p)[ 8] ^= ui8_ptr(q)[ 8]; ui8_ptr(p)[ 9] ^= ui8_ptr(q)[ 9];
00244 ui8_ptr(p)[10] ^= ui8_ptr(q)[10]; ui8_ptr(p)[11] ^= ui8_ptr(q)[11];
00245 ui8_ptr(p)[12] ^= ui8_ptr(q)[12]; ui8_ptr(p)[13] ^= ui8_ptr(q)[13];
00246 ui8_ptr(p)[14] ^= ui8_ptr(q)[14]; ui8_ptr(p)[15] ^= ui8_ptr(q)[15];
00247 }
00248
00249 mh_inline void xor_block_aligned( void *p, const void *q)
00250 {
00251 #if BFR_UNIT == 8
00252 xor_block(p, q);
00253 #else
00254 unit_ptr(p)[0] ^= unit_ptr(q)[0]; unit_ptr(p)[1] ^= unit_ptr(q)[1];
00255 # if BFR_UNIT == 32
00256 unit_ptr(p)[2] ^= unit_ptr(q)[2]; unit_ptr(p)[3] ^= unit_ptr(q)[3];
00257 # endif
00258 #endif
00259 }
00260
00261 #else
00262
00263 #define move_block(p,q) memcpy((p), (q), 16)
00264
00265 #if BFR_UNIT == 64
00266 # define move_block_aligned(p,q) \
00267 ui64_ptr(p)[0] = ui64_ptr(q)[0], ui64_ptr(p)[1] = ui64_ptr(q)[1]
00268 #elif BFR_UNIT == 32
00269 # define move_block_aligned(p,q) \
00270 ui32_ptr(p)[0] = ui32_ptr(q)[0], ui32_ptr(p)[1] = ui32_ptr(q)[1], \
00271 ui32_ptr(p)[2] = ui32_ptr(q)[2], ui32_ptr(p)[3] = ui32_ptr(q)[3]
00272 #else
00273 # define move_block_aligned(p,q) move_block(p,q)
00274 #endif
00275
00276 #define xor_block(p,q) \
00277 ui8_ptr(p)[ 0] ^= ui8_ptr(q)[ 0], ui8_ptr(p)[ 1] ^= ui8_ptr(q)[ 1], \
00278 ui8_ptr(p)[ 2] ^= ui8_ptr(q)[ 2], ui8_ptr(p)[ 3] ^= ui8_ptr(q)[ 3], \
00279 ui8_ptr(p)[ 4] ^= ui8_ptr(q)[ 4], ui8_ptr(p)[ 5] ^= ui8_ptr(q)[ 5], \
00280 ui8_ptr(p)[ 6] ^= ui8_ptr(q)[ 6], ui8_ptr(p)[ 7] ^= ui8_ptr(q)[ 7], \
00281 ui8_ptr(p)[ 8] ^= ui8_ptr(q)[ 8], ui8_ptr(p)[ 9] ^= ui8_ptr(q)[ 9], \
00282 ui8_ptr(p)[10] ^= ui8_ptr(q)[10], ui8_ptr(p)[11] ^= ui8_ptr(q)[11], \
00283 ui8_ptr(p)[12] ^= ui8_ptr(q)[12], ui8_ptr(p)[13] ^= ui8_ptr(q)[13], \
00284 ui8_ptr(p)[14] ^= ui8_ptr(q)[14], ui8_ptr(p)[15] ^= ui8_ptr(q)[15]
00285
00286 #if BFR_UNIT == 64
00287 # define xor_block_aligned(p,q) \
00288 ui64_ptr(p)[0] ^= ui64_ptr(q)[0], ui64_ptr(p)[1] ^= ui64_ptr(q)[1]
00289 #elif BFR_UNIT == 32
00290 # define xor_block_aligned(p,q) \
00291 ui32_ptr(p)[0] ^= ui32_ptr(q)[0], ui32_ptr(p)[1] ^= ui32_ptr(q)[1], \
00292 ui32_ptr(p)[2] ^= ui32_ptr(q)[2], ui32_ptr(p)[3] ^= ui32_ptr(q)[3]
00293 #else
00294 # define xor_block_aligned(p,q) xor_block(p,q)
00295 #endif
00296
00297 #endif
00298
00299
00300
00301 #if PLATFORM_BYTE_ORDER == IS_BIG_ENDIAN
00302 # define uint_32t_to_le(x) (x) = bswap_32((x))
00303 # define uint_64t_to_le(x) (x) = bswap_64((x))
00304 # define uint_32t_to_be(x)
00305 # define uint_64t_to_be(x)
00306 #else
00307 # define uint_32t_to_le(x)
00308 # define uint_64t_to_le(x)
00309 # define uint_32t_to_be(x) (x) = bswap_32((x))
00310 # define uint_64t_to_be(x) (x) = bswap_64((x))
00311 #endif
00312
00313 #if defined(__cplusplus)
00314 }
00315 #endif
00316
00317 #endif