📄 crypt.h
字号:
/* If we're cross-compiling for another system, the endianness auto-
detection will have been overridden. In this case we force it to be
what the user has specified rather than what we've auto-detected */
#undef DATA_LITTLEENDIAN
#undef DATA_BIGENDIAN
#ifdef CONFIG_LITTLE_ENDIAN
#define DATA_LITTLEENDIAN
#else
#define DATA_BIGENDIAN
#endif /* CONFIG_LITTLE_ENDIAN */
#endif /* Forced big vs.little-endian */
#if !defined( DATA_LITTLEENDIAN ) && !defined( DATA_BIGENDIAN )
#if defined( BIG_ENDIAN ) && defined( LITTLE_ENDIAN ) && defined( BYTE_ORDER )
/* Some systems define both BIG_ENDIAN and LITTLE_ENDIAN, then define
BYTE_ORDER to the appropriate one, so we check this and define the
appropriate value */
#if ( BYTE_ORDER == BIG_ENDIAN ) && !defined( DATA_BIGENDIAN )
#define DATA_BIGENDIAN
#elif ( BYTE_ORDER == LITTLE_ENDIAN ) && !defined( DATA_LITTLEENDIAN )
#define DATA_LITTLEENDIAN
#else
#error BYTE_ORDER is neither BIG_ENDIAN nor LITTLE_ENDIAN
#endif /* BYTE_ORDER-specific define */
#elif defined( _M_I86 ) || defined( _M_IX86 ) || defined( __TURBOC__ ) || \
defined( __OS2__ )
#define DATA_LITTLEENDIAN /* Intel architecture always little-endian */
#elif defined( AMIGA ) || defined( __MWERKS__ ) || defined( SYMANTEC_C ) || \
defined( THINK_C ) || defined( applec ) || defined( __MRC__ )
#define DATA_BIGENDIAN /* Motorola architecture always big-endian */
#elif defined( VMS ) || defined( __VMS )
#define DATA_LITTLEENDIAN /* VAX architecture always little-endian */
#elif defined( __TANDEMNSK__ )
#define DATA_BIGENDIAN /* Tandem NSK architecture always big-endian */
#elif defined( __AS400__ ) || defined( __VMCMS__ ) || defined( __MVS__ )
#define DATA_BIGENDIAN /* IBM big iron always big-endian */
#elif defined __GNUC__
#ifdef BYTES_BIG_ENDIAN
#define DATA_BIGENDIAN /* Big-endian byte order */
#else
#define DATA_LITTLEENDIAN /* Undefined = little-endian byte order */
#endif /* __GNUC__ */
#endif /* Compiler-specific endianness checks */
#endif /* !( DATA_LITTLEENDIAN || DATA_BIGENDIAN ) */
/* The last-resort method. Thanks to Shawn Clifford
<sysop@robot.nuceng.ufl.edu> for this trick.
NB: A number of compilers aren't tough enough for this test */
#if !defined( DATA_LITTLEENDIAN ) && !defined( DATA_BIGENDIAN )
#if ( ( ( unsigned short ) ( 'AB' ) >> 8 ) == 'B' )
#define DATA_LITTLEENDIAN
#elif ( ( ( unsigned short ) ( 'AB' ) >> 8 ) == 'A' )
#define DATA_BIGENDIAN
#else
#error Cannot determine processor endianness - edit crypt.h and recompile
#endif /* Endianness test */
#endif /* !( DATA_LITTLEENDIAN || DATA_BIGENDIAN ) */
/* Sanity check to catch both values being defined */
#if defined( DATA_LITTLEENDIAN ) && defined( DATA_BIGENDIAN )
#error Both DATA_LITTLEENDIAN and DATA_BIGENDIAN are defined
#endif /* DATA_LITTLEENDIAN && DATA_BIGENDIAN */
/* When performing file I/O we need to know how large path names can get in
order to perform range checking and allocate buffers. This gets a bit
tricky since not all systems have PATH_MAX, so we first try for PATH_MAX,
if that fails we try _POSIX_PATH_MAX (which is a generic 255 bytes and if
defined always seems to be less than whatever the real PATH_MAX should be),
if that also fails we grab stdio.h and try and get FILENAME_MAX, with an
extra check for PATH_MAX in case it's defined in stdio.h instead of
limits.h where it should be. FILENAME_MAX isn't really correct since it's
the maximum length of a filename rather than a path, but some environments
treat it as if it were PATH_MAX and in any case it's the best we can do in
the absence of anything better */
#if defined( PATH_MAX )
#define MAX_PATH_LENGTH PATH_MAX
#elif defined( _POSIX_PATH_MAX )
#define MAX_PATH_LENGTH _POSIX_PATH_MAX
#else
#ifndef FILENAME_MAX
#include <stdio.h>
#endif /* FILENAME_MAX */
#ifdef PATH_MAX
#define MAX_PATH_LENGTH PATH_MAX
#else
#define MAX_PATH_LENGTH FILENAME_MAX
#endif /* PATH_MAX or FILENAME_MAX */
#endif /* PATH_MAX */
#ifdef __UNIX__
/* SunOS 4.1.x doesn't define FILENAME_MAX in limits.h, however it does
define a POSIX path length limit so we use that instead. There are a
number of places in various headers in which a max.path length is
defined either as 255 or 1024, but we use the POSIX limit since this is
the only thing defined in limits.h */
#if defined( sun ) && ( OSVERSION == 4 ) && !defined( FILENAME_MAX )
#define FILENAME_MAX _POSIX_PATH_MAX
#endif /* SunOS 4.1.x FILENAME_MAX define */
#endif /* __UNIX__ */
/* SunOS 4 doesn't have memmove(), but Solaris does, so we define memmove()
to bcopy() under 4. In addition SunOS doesn't define the fseek position
indicators so we define these as well */
#if defined( __UNIX__ ) && defined( sun ) && ( OSVERSION == 4 )
#define memmove bcopy
#define SEEK_SET 0
#define SEEK_CUR 1
#define SEEK_END 2
#endif /* SunOS 4 */
/* If we're compiling on IBM mainframes, enable EBCDIC <-> ASCII string
conversion. Since cryptlib uses ASCII internally for all strings, we
need to check to make sure it's been built with ASCII strings enabled
before we go any further */
#ifdef EBCDIC_CHARS
#if 'A' != 0x41
#error cryptlib must be compiled with ASCII literals
#endif /* Check for use of ASCII */
int asciiToEbcdic( char *string, int stringLen );
int ebcdicToAscii( char *string, int stringLen );
char *bufferToEbcdic( char *buffer, const char *string );
char *bufferToAscii( char *buffer, const char *string );
#endif /* IBM mainframes */
/* Since cryptlib uses ASCII internally, we have to force the use of
ASCII-compatible versions of system library functions if the system
uses EBCDIC */
#ifdef EBCDIC_CHARS
#define ASCII_ALPHA 0x01
#define ASCII_LOWER 0x02
#define ASCII_NUMERIC 0x04
#define ASCII_SPACE 0x08
#define ASCII_UPPER 0x10
#define ASCII_HEX 0x20
extern const BYTE asciiCtypeTbl[];
#define isAlnum( ch ) \
( asciiCtypeTbl[ ch ] & ( ASCII_ALPHA | ASCII_NUMERIC ) )
#define isAlpha( ch ) \
( asciiCtypeTbl[ ch ] & ASCII_ALPHA )
#define isDigit( ch ) \
( asciiCtypeTbl[ ch ] & ASCII_NUMERIC )
#define isPrint( ch ) \
( ( ch ) >= 0x20 && ( ch ) <= 0x7E )
#define isXDigit( ch ) \
( asciiCtypeTbl[ ch ] & ASCII_HEX )
#define toLower( ch ) \
( ( asciiCtypeTbl[ ch ] & ASCII_UPPER ) ? ( ch ) + 32 : ( ch ) )
#define toUpper( ch ) \
( ( asciiCtypeTbl[ ch ] & ASCII_LOWER ) ? ( ch ) - 32 : ( ch ) )
int strCompareZ( const char *src, const char *dest );
int strCompare( const char *src, const char *dest, int length );
int sPrintf( char *buffer, const char *format, ... );
int aToI( const char *str );
#else
#define isAlnum( ch ) isalnum( ch )
#define isAlpha( ch ) isalpha( ch )
#define isDigit( ch ) isdigit( ch )
#define isPrint( ch ) isprint( ch )
#define isXDigit( ch ) isxdigit( ch )
#define toLower( ch ) tolower( ch )
#define toUpper( ch ) toupper( ch )
#define strCompareZ( str1, str2 ) \
stricmp( str1, str2 )
#define strCompare( str1, str2, len ) \
strnicmp( str1, str2, len )
#define sPrintf sprintf
#define aToI atoi
#endif /* EBCDIC_CHARS */
/* cryptlib contains a few static functions where are prototyped with block
scope inside a preceding function:
{
static int foo( int bar );
foo( 1 );
}
static int foo( int bar )
{
[...]
}
There are also one or two locations that do the same thing for static
data. Compiler opinions on this vary. Some compile it as is, some don't
allow the 'static', some allow both variants, and some produce warnings
with both but allow them anyway (there are probably more variants with
further compilers). To get around this, we use the following define and
then vary it for broken compilers (the following is the minimum required
to get it to compile, other broken compilers will still produce
warnings) */
#if ( defined( __BORLANDC__ ) && ( __BORLANDC__ < 0x600 ) ) || \
defined( __VMCMS__ ) || defined( __MVS__ ) || defined( __MRC__ ) || \
( defined( __UNIX__ ) && defined( _MPRAS ) )
#define STATIC_FN
#define STATIC_DATA
#else
#define STATIC_FN static
#define STATIC_DATA static
#endif /* Fn.prototyping workarounds for borken compilers */
/* Unlike the equivalent crypto code, the MD5, RIPEMD-160, and SHA-1 hashing
code needs special defines set to enable the use of asm alternatives.
Since this works by triggering redefines of function names in the source
code, we can only do this under Windows because for other systems you'd
need to conditionally alter the makefile as well. Since these two defines
were left accidentally unset for about five years and were only noticed
when someone benchmarked the code against BSAFE, it's unlikely that this
is of any real concern */
#ifdef __WIN32__
#define MD5_ASM
#define SHA1_ASM
#define RMD160_ASM
#endif /* Win32 */
/* Enable use of the AES ASM code where possible */
#ifdef __WIN32__
#define AES_ASM
#endif /* Win32 */
/* Enable use of zlib ASM longest-match code where possible. Actually
neither of the two asm files that come with zlib work, the older
gvmat32.asm uses a custom match that requires wmask = 0x7FFF and
match.asm from the zlib web site (assemble with "ml /Zp /coff /c
match.asm") causes segfaults, so we can't use either */
#if defined( __WIN32__ ) && 0
#define ASMV
#endif /* Win32 */
/* Pull in the cryptlib initialisation options file, which contains the
various USE_xxx defines that enable different cryptlib features */
#include "cryptini.h"
/****************************************************************************
* *
* OS-Specific Macros *
* *
****************************************************************************/
/* cryptlib provides support for a number of extended OS-specific services
such as multithreading, resource locking, bounds checking, and so on.
The macros for the OS-specific services and resource management are
defined in their own include file */
#include "cryptos.h"
/* The cryptlib kernel has its own interface, defined in the kernel include
file */
#include "cryptkrn.h"
/****************************************************************************
* *
* Portability Defines *
* *
****************************************************************************/
/* Read/write values as 16- and 32-bit big-endian data, required for some
non-ASN.1 data formats */
#define mgetWord( memPtr ) \
( ( ( unsigned int ) memPtr[ 0 ] << 8 ) | \
( unsigned int ) memPtr[ 1 ] ); \
memPtr += 2
#define mputWord( memPtr, data ) \
memPtr[ 0 ] = ( BYTE ) ( ( ( data ) >> 8 ) & 0xFF ); \
memPtr[ 1 ] = ( BYTE ) ( ( data ) & 0xFF ); \
memPtr += 2
#define mgetLong( memPtr ) \
( ( ( unsigned long ) memPtr[ 0 ] << 24 ) | \
( ( unsigned long ) memPtr[ 1 ] << 16 ) | \
( ( unsigned long ) memPtr[ 2 ] << 8 ) | \
( unsigned long ) memPtr[ 3 ] ); \
memPtr += 4
#define mputLong( memPtr, data ) \
memPtr[ 0 ] = ( BYTE ) ( ( ( data ) >> 24 ) & 0xFF ); \
memPtr[ 1 ] = ( BYTE ) ( ( ( data ) >> 16 ) & 0xFF ); \
memPtr[ 2 ] = ( BYTE ) ( ( ( data ) >> 8 ) & 0xFF ); \
memPtr[ 3 ] = ( BYTE ) ( ( data ) & 0xFF ); \
memPtr += 4
/* The EOL convention used when outputting text */
#if defined( __MSDOS16__ ) || defined( __MSDOS32__ ) || \
defined( __OS2__ ) || defined( __SYMBIAN32__ ) || \
defined( __WINDOWS__ )
#define EOL "\r\n"
#define EOL_LEN 2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -