#ifndef PLATFORM_H #define PLATFORM_H /*************************************************************************** PLATFORM.H -- Platform-specific defines for TWOFISH code Submitters: Bruce Schneier, Counterpane Systems Doug Whiting, Hi/fn John Kelsey, Counterpane Systems Chris Hall, Counterpane Systems David Wagner, UC Berkeley Code Author: Doug Whiting, Hi/fn Version 1.00 April 1998 Copyright 1998, Hi/fn and Counterpane Systems. All rights reserved. Notes: * Tab size is set to 4 characters in this file ***************************************************************************/ typedef unsigned char BYTE; typedef U32 DWORD; /* use intrinsic rotate if possible */ #define ROL(x,n) (((x) << ((n) & 0x1F)) | ((x) >> (32-((n) & 0x1F)))) #define ROR(x,n) (((x) >> ((n) & 0x1F)) | ((x) << (32-((n) & 0x1F)))) #if (0) && defined(__BORLANDC__) && (__BORLANDC__ >= 0x462) #error "!!!This does not work for some reason!!!" #include /* get prototype for _lrotl() , _lrotr() */ #pragma inline __lrotl__ #pragma inline __lrotr__ #undef ROL /* get rid of inefficient definitions */ #undef ROR #define ROL(x,n) __lrotl__(x,n) /* use compiler intrinsic rotations */ #define ROR(x,n) __lrotr__(x,n) #endif #ifdef _MSC_VER #include /* get prototypes for rotation functions */ #undef ROL #undef ROR #pragma intrinsic(_lrotl,_lrotr) /* use intrinsic compiler rotations */ #define ROL(x,n) _lrotl(x,n) #define ROR(x,n) _lrotr(x,n) #endif #ifndef _M_IX86 #ifdef __BORLANDC__ #define _M_IX86 300 /* make sure this is defined for Intel CPUs */ #endif #endif #if defined(_M_IX86) || defined(__i386) #define ALIGN32 0 /* need dword alignment? (no for Pentium) */ #else /* non-Intel platforms */ #define ALIGN32 1 /* (assume need alignment for non-Intel) */ #endif /* BYTEORDER comes from perl's config.h */ #if BYTEORDER == 0x1234 || BYTEORDER == 0x12345678 || defined(__LITTLE_ENDIAN__) #define LittleEndian 1 #define Bswap(x) (x) /* NOP for little-endian machines */ #define ADDR_XOR 0 /* NOP for little-endian machines */ #else #define Bswap(x) ((ROR(x,8) & 0xFF00FF00) | (ROL(x,8) & 0x00FF00FF)) #define ADDR_XOR 3 /* convert byte address in dword */ #endif /* Macros for extracting bytes from dwords (correct for endianness) */ #define _b(x,N) (((BYTE *)&x)[((N) & 3) ^ ADDR_XOR]) /* pick bytes out of a dword */ #define b0(x) _b(x,0) /* extract LSB of DWORD */ #define b1(x) _b(x,1) #define b2(x) _b(x,2) #define b3(x) _b(x,3) /* extract MSB of DWORD */ #endif