mirror of
https://github.com/veracrypt/VeraCrypt.git
synced 2025-11-11 19:08:26 -06:00
149 lines
4.5 KiB
C
149 lines
4.5 KiB
C
/*
|
|
Legal Notice: Some portions of the source code contained in this file were
|
|
derived from the source code of TrueCrypt 7.1a, which is
|
|
Copyright (c) 2003-2012 TrueCrypt Developers Association and which is
|
|
governed by the TrueCrypt License 3.0, also from the source code of
|
|
Encryption for the Masses 2.02a, which is Copyright (c) 1998-2000 Paul Le Roux
|
|
and which is governed by the 'License Agreement for Encryption for the Masses'
|
|
Modifications and additions to the original source code (contained in this file)
|
|
and all other portions of this file are Copyright (c) 2013-2017 IDRIX
|
|
and are governed by the Apache License 2.0 the full text of which is
|
|
contained in the file License.txt included in VeraCrypt binary and source
|
|
code distribution packages. */
|
|
|
|
#ifndef TC_ENDIAN_H
|
|
#define TC_ENDIAN_H
|
|
|
|
#include "Common/Tcdefs.h"
|
|
|
|
#if defined(__cplusplus)
|
|
extern "C"
|
|
{
|
|
#endif
|
|
|
|
#if defined(_WIN32) || defined(_UEFI)
|
|
|
|
# ifndef LITTLE_ENDIAN
|
|
# define LITTLE_ENDIAN 1234
|
|
# endif
|
|
# ifndef BYTE_ORDER
|
|
# define BYTE_ORDER LITTLE_ENDIAN
|
|
# endif
|
|
|
|
#elif !defined(BYTE_ORDER)
|
|
|
|
# ifdef TC_MACOSX
|
|
# include <machine/endian.h>
|
|
# elif defined (TC_BSD)
|
|
# include <sys/endian.h>
|
|
# elif defined (TC_SOLARIS)
|
|
# include <sys/types.h>
|
|
# define LITTLE_ENDIAN 1234
|
|
# define BIG_ENDIAN 4321
|
|
# ifdef _BIG_ENDIAN
|
|
# define BYTE_ORDER BIG_ENDIAN
|
|
# else
|
|
# define BYTE_ORDER LITTLE_ENDIAN
|
|
# endif
|
|
# else
|
|
# include <endian.h>
|
|
# endif
|
|
|
|
# ifndef BYTE_ORDER
|
|
# ifndef __BYTE_ORDER
|
|
# error Byte order cannot be determined (BYTE_ORDER undefined)
|
|
# endif
|
|
|
|
# define BYTE_ORDER __BYTE_ORDER
|
|
# endif
|
|
|
|
# ifndef LITTLE_ENDIAN
|
|
# define LITTLE_ENDIAN __LITTLE_ENDIAN
|
|
# endif
|
|
|
|
# ifndef BIG_ENDIAN
|
|
# define BIG_ENDIAN __BIG_ENDIAN
|
|
# endif
|
|
|
|
#endif // !BYTE_ORDER
|
|
|
|
/* Macros to read and write 16, 32, and 64-bit quantities in a portable manner.
|
|
These functions are implemented as macros rather than true functions as
|
|
the need to adjust the memory pointers makes them somewhat painful to call
|
|
in user code */
|
|
|
|
#define mputInt64(memPtr,data) \
|
|
*memPtr++ = ( unsigned char ) ( ( ( data ) >> 56 ) & 0xFF ), \
|
|
*memPtr++ = ( unsigned char ) ( ( ( data ) >> 48 ) & 0xFF ), \
|
|
*memPtr++ = ( unsigned char ) ( ( ( data ) >> 40 ) & 0xFF ), \
|
|
*memPtr++ = ( unsigned char ) ( ( ( data ) >> 32 ) & 0xFF ), \
|
|
*memPtr++ = ( unsigned char ) ( ( ( data ) >> 24 ) & 0xFF ), \
|
|
*memPtr++ = ( unsigned char ) ( ( ( data ) >> 16 ) & 0xFF ), \
|
|
*memPtr++ = ( unsigned char ) ( ( ( data ) >> 8 ) & 0xFF ), \
|
|
*memPtr++ = ( unsigned char ) ( ( data ) & 0xFF )
|
|
|
|
#define mputLong(memPtr,data) \
|
|
*memPtr++ = ( unsigned char ) ( ( ( data ) >> 24 ) & 0xFF ), \
|
|
*memPtr++ = ( unsigned char ) ( ( ( data ) >> 16 ) & 0xFF ), \
|
|
*memPtr++ = ( unsigned char ) ( ( ( data ) >> 8 ) & 0xFF ), \
|
|
*memPtr++ = ( unsigned char ) ( ( data ) & 0xFF )
|
|
|
|
#define mputWord(memPtr,data) \
|
|
*memPtr++ = ( unsigned char ) ( ( ( data ) >> 8 ) & 0xFF ), \
|
|
*memPtr++ = ( unsigned char ) ( ( data ) & 0xFF )
|
|
|
|
#define mputByte(memPtr,data) \
|
|
*memPtr++ = ( unsigned char ) data
|
|
|
|
#define mputBytes(memPtr,data,len) \
|
|
memcpy (memPtr,data,len); \
|
|
memPtr += len;
|
|
|
|
#define mgetInt64(memPtr) \
|
|
( memPtr += 8, ( ( unsigned __int64 ) memPtr[ -8 ] << 56 ) | ( ( unsigned __int64 ) memPtr[ -7 ] << 48 ) | \
|
|
( ( unsigned __int64 ) memPtr[ -6 ] << 40 ) | ( ( unsigned __int64 ) memPtr[ -5 ] << 32 ) | \
|
|
( ( unsigned __int64 ) memPtr[ -4 ] << 24 ) | ( ( unsigned __int64 ) memPtr[ -3 ] << 16 ) | \
|
|
( ( unsigned __int64 ) memPtr[ -2 ] << 8 ) | ( unsigned __int64 ) memPtr[ -1 ] )
|
|
|
|
#define mgetLong(memPtr) \
|
|
( memPtr += 4, ( ( unsigned __int32 ) memPtr[ -4 ] << 24 ) | ( ( unsigned __int32 ) memPtr[ -3 ] << 16 ) | \
|
|
( ( unsigned __int32 ) memPtr[ -2 ] << 8 ) | ( unsigned __int32 ) memPtr[ -1 ] )
|
|
|
|
#define mgetWord(memPtr) \
|
|
( memPtr += 2, ((( unsigned short ) memPtr[ -2 ] << 8 ) | ( ( unsigned short ) memPtr[ -1 ] )) )
|
|
|
|
#define mgetByte(memPtr) \
|
|
( ( unsigned char ) *memPtr++ )
|
|
|
|
#if BYTE_ORDER == BIG_ENDIAN
|
|
# define LE16(x) MirrorBytes16(x)
|
|
# define LE32(x) MirrorBytes32(x)
|
|
# define LE64(x) MirrorBytes64(x)
|
|
#else
|
|
# define LE16(x) (x)
|
|
# define LE32(x) (x)
|
|
# define LE64(x) (x)
|
|
#endif
|
|
|
|
#if BYTE_ORDER == LITTLE_ENDIAN
|
|
# define BE16(x) MirrorBytes16(x)
|
|
# define BE32(x) MirrorBytes32(x)
|
|
# define BE64(x) MirrorBytes64(x)
|
|
#else
|
|
# define BE16(x) (x)
|
|
# define BE32(x) (x)
|
|
# define BE64(x) (x)
|
|
#endif
|
|
|
|
unsigned __int16 MirrorBytes16 (unsigned __int16 x);
|
|
unsigned __int32 MirrorBytes32 (unsigned __int32 x);
|
|
#ifndef TC_NO_COMPILER_INT64
|
|
uint64 MirrorBytes64 (uint64 x);
|
|
#endif
|
|
|
|
#if defined(__cplusplus)
|
|
}
|
|
#endif
|
|
|
|
#endif /* TC_ENDIAN_H */
|