📄 int_api.h
字号:
/****************************************************************************
* *
* cryptlib Internal API Header File *
* Copyright Peter Gutmann 1992-2005 *
* *
****************************************************************************/
#ifndef _INTAPI_DEFINED
#define _INTAPI_DEFINED
/* Internal forms of various external functions. These work with internal
resources that are marked as being inaccessible to the corresponding
external functions, and don't perform all the checking that their
external equivalents perform, since the parameters have already been
checked by cryptlib */
int iCryptCreateSignatureEx( void *signature, int *signatureLength,
const int sigMaxLength,
const CRYPT_FORMAT_TYPE formatType,
const CRYPT_CONTEXT iSignContext,
const CRYPT_CONTEXT iHashContext,
const CRYPT_CERTIFICATE iExtraData,
const CRYPT_SESSION iTspSession );
int iCryptCheckSignatureEx( const void *signature, const int signatureLength,
const CRYPT_FORMAT_TYPE formatType,
const CRYPT_HANDLE iSigCheckKey,
const CRYPT_CONTEXT iHashContext,
CRYPT_HANDLE *extraData );
int iCryptImportKeyEx( const void *encryptedKey, const int encryptedKeyLength,
const CRYPT_FORMAT_TYPE formatType,
const CRYPT_CONTEXT iImportKey,
const CRYPT_CONTEXT iSessionKeyContext,
CRYPT_CONTEXT *iReturnedContext );
int iCryptExportKeyEx( void *encryptedKey, int *encryptedKeyLength,
const int encryptedKeyMaxLength,
const CRYPT_FORMAT_TYPE formatType,
const CRYPT_CONTEXT iSessionKeyContext,
const CRYPT_CONTEXT iExportKey,
const CRYPT_CONTEXT iAuxContext );
/* Copy a string attribute to external storage, with various range checks
to follow the cryptlib external API semantics */
int attributeCopy( RESOURCE_DATA *msgData, const void *attribute,
const int attributeLength );
/* Check whether a password is valid or not. Currently this just checks that
it contains at least one character, but stronger checking can be
substituted if required */
#ifdef UNICODE_CHARS
#define isBadPassword( password ) \
( !isReadPtr( password, sizeof( wchar_t ) ) || \
( wcslen( password ) < 1 ) )
#else
#define isBadPassword( password ) \
( !isReadPtr( password, 1 ) || \
( strlen( password ) < 1 ) )
#endif /* Unicode vs. ASCII environments */
/* Check whether a given algorithm is available for use. This is performed
frequently enough that we have a special krnlSendMessage() wrapper
function for it rather than having to explicitly query the system
object */
BOOLEAN algoAvailable( const CRYPT_ALGO_TYPE cryptAlgo );
/* For a given algorithm pair, check whether the first is stronger than the
second */
BOOLEAN isStrongerHash( const CRYPT_ALGO_TYPE algorithm1,
const CRYPT_ALGO_TYPE algorithm2 );
/* Compare two strings in a case-insensitive manner for those systems that
don't have this function. PalmOS has strcasecmp()/strncasecmp(), but
these aren't i18n-aware, so we have to use a system function instead */
#if defined( __UNIX__ ) && !( defined( __CYGWIN__ ) )
#if defined( __TANDEM_NSK__ ) || defined( __TANDEM_OSS__ )
#include <strings.h>
#endif /* Tandem */
#define strnicmp strncasecmp
#define stricmp strcasecmp
#elif defined( __WINCE__ )
#define strnicmp _strnicmp
#define stricmp _stricmp
#elif defined __PALMOS__
#include <StringMgr.h>
#define strnicmp StrNCaselessCompare
#define stricmp StrCaselessCompare
#elif defined( __xxxOS___ )
int strnicmp( const char *src, const char *dest, const int length );
int stricmp( const char *src, const char *dest );
#endif /* OS-specific case-insensitive string compares */
/* Sanitise a string before passing it back to the user. This is used to
clear potential problem characters (for example control characters)
from strings passed back from untrusted sources */
char *sanitiseString( char *string );
/* MIME header-line parsing routines. The caller declares a state variable
of type MIME_STATE, calls initMIMEstate() to initialise it, calls
addMIMEchar() for each consecutive char to add to the line buffer, and
finally calls endMIMEstate() to retrive the total character count */
typedef BYTE MIME_STATE[ 128 ];
void initMIMEstate( MIME_STATE *mimeState, const int maxSize );
int addMIMEchar( MIME_STATE *mimeState, char *buffer, int ch );
int endMIMEstate( MIME_STATE *mimeState );
/* Get system-specific hardware capabilities */
#define SYSCAP_FLAG_NONE 0x00 /* No special HW capabilities */
#define SYSCAP_FLAG_RDTSC 0x01 /* x86 RDTSC instruction support */
#define SYSCAP_FLAG_XSTORE 0x02 /* Via XSTORE instruction support */
#define SYSCAP_FLAG_XCRYPT 0x04 /* Via XCRYPT instruction support */
#define SYSCAP_FLAG_XSHA 0x08 /* Via XSHA instruction support */
int getSysCaps( void );
/* Windows NT/2000/XP support ACL-based access control mechanisms for system
objects, so when we create objects such as files and threads we give them
an ACL that allows only the creator access. The following functions
return the security info needed when creating objects */
#ifdef __WINDOWS__
#ifdef __WIN32__
void *initACLInfo( const int access );
void *getACLInfo( void *securityInfoPtr );
void freeACLInfo( void *securityInfoPtr );
#else
#define initACLInfo( x ) NULL
#define getACLInfo( x ) NULL
#define freeACLInfo( x )
#endif /* __WIN32__ */
#endif /* __WINDOWS__ */
/****************************************************************************
* *
* Data Encode/Decode Functions *
* *
****************************************************************************/
/* Special-case certificate functions. The indirect-import function works
somewhat like the import cert messages, but reads certs by sending
get_next_cert messages to the message source and provides extended control
over the format of the imported object. The public-key read function
converts an X.509 SubjectPublicKeyInfo record into a context. The first
parameter for this function is actually a STREAM *, but we can't use this
here since STREAM * hasn't been defined yet.
Neither of these are strictly speaking certificate functions, but the
best (meaning least inappropriate) place to put them is with the cert-
management code */
int iCryptImportCertIndirect( CRYPT_CERTIFICATE *iCertificate,
const CRYPT_HANDLE iCertSource,
const CRYPT_KEYID_TYPE keyIDtype,
const void *keyID, const int keyIDlength,
const int options );
int iCryptReadSubjectPublicKey( void *streamPtr, CRYPT_CONTEXT *iCryptContext,
const BOOLEAN deferredLoad );
/* Get information on encoded object data. The first parameter for this
function is actually a STREAM *, but we can't use this here since
STREAM * hasn't been defined yet */
int queryAsn1Object( void *streamPtr, QUERY_INFO *queryInfo );
int queryPgpObject( void *streamPtr, QUERY_INFO *queryInfo );
/* Export/import data to/from a stream without the overhead of going via a
dynbuf. The first parameter for these functions is actually a STREAM *,
but we can't use this here since STREAM * hasn't been defined yet */
int exportAttributeToStream( void *streamPtr, const CRYPT_HANDLE cryptHandle,
const CRYPT_ATTRIBUTE_TYPE attributeType,
const int attributeLength );
int exportCertToStream( void *streamPtr,
const CRYPT_CERTIFICATE cryptCertificate,
const CRYPT_CERTFORMAT_TYPE certFormatType );
int importCertFromStream( void *streamPtr,
CRYPT_CERTIFICATE *cryptCertificate,
const int length,
const CRYPT_CERTTYPE_TYPE certType );
/* base64/SMIME-en/decode routines */
CRYPT_CERTFORMAT_TYPE base64checkHeader( const char *data,
const int dataLength, int *startPos );
int base64encodeLen( const int dataLength,
const CRYPT_CERTTYPE_TYPE certType );
int base64encode( char *dest, const int destMaxLen, const void *src,
const int srcLen, const CRYPT_CERTTYPE_TYPE certType );
int base64decodeLen( const char *data, const int dataLength );
int base64decode( void *dest, const int destMaxLen, const char *src,
const int srcLen, const CRYPT_CERTFORMAT_TYPE format );
/* User data en/decode routines */
BOOLEAN isPKIUserValue( const char *encVal, const int encValueLength );
int adjustPKIUserValue( BYTE *value, const int noCodeGroups );
int encodePKIUserValue( char *encVal, const BYTE *value,
const int noCodeGroups );
int decodePKIUserValue( BYTE *value, const char *encVal,
const int encValueLength );
/****************************************************************************
* *
* List Manipulation Functions *
* *
****************************************************************************/
/* Insert a new element into singly-linked and doubly-lined lists. This is
the sort of thing we'd really need templates for */
#define insertSingleListElement( listHead, insertPoint, newElement ) \
{ \
if( *( listHead ) == NULL ) \
/* It's an empty list, make this the new list */ \
*( listHead ) = ( newElement ); \
else \
if( ( insertPoint ) == NULL ) \
{ \
/* We're inserting at the start of the list, make this the \
new first element */ \
( newElement )->next = *( listHead ); \
*( listHead ) = ( newElement ); \
} \
else \
{ \
/* Insert the element in the middle or the end of the list */ \
( newElement )->next = ( insertPoint )->next; \
( insertPoint )->next = ( newElement ); \
} \
}
#define insertDoubleListElements( listHead, insertPoint, newStartElement, newEndElement ) \
{ \
if( *( listHead ) == NULL ) \
/* If it's an empty list, make this the new list */ \
*( listHead ) = ( newStartElement ); \
else \
if( ( insertPoint ) == NULL ) \
{ \
/* We're inserting at the start of the list, make this the \
new first element */ \
( newEndElement )->next = *( listHead ); \
( *( listHead ) )->prev = ( newEndElement ); \
*( listHead ) = ( newStartElement ); \
} \
else \
{ \
/* Insert the element in the middle or the end of the list */ \
( newEndElement )->next = ( insertPoint )->next; \
\
/* Update the links for the next and previous elements */ \
if( ( insertPoint )->next != NULL ) \
( insertPoint )->next->prev = ( newEndElement ); \
( insertPoint )->next = ( newStartElement ); \
( newStartElement )->prev = ( insertPoint ); \
} \
}
#define insertDoubleListElement( listHead, insertPoint, newElement ) \
insertDoubleListElements( listHead, insertPoint, newElement, newElement )
#define deleteSingleListElement( listHead, listPrev, element ) \
{ \
if( element == *( listHead ) ) \
/* Special case for first item */ \
*( listHead ) = element->next; \
else \
/* Delete from middle or end of the list */ \
listPrev->next = element->next; \
}
#define deleteDoubleListElement( listHead, element ) \
{ \
if( element == *( listHead ) ) \
{ \
/* Special case for first item */ \
*( listHead ) = element->next; \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -