📄 int_api.h
字号:
BOOLEAN isPKIUserValue( IN_BUFFER( encValLength ) const char *encVal,
IN_LENGTH_SHORT_MIN( 10 ) const int encValLength );
CHECK_RETVAL STDC_NONNULL_ARG( ( 1, 3, 4 ) ) \
int encodePKIUserValue( OUT_BUFFER( encValMaxLen, *encValLen ) char *encVal,
IN_LENGTH_SHORT_MIN( 10 ) const int encValMaxLen,
OUT_LENGTH_SHORT_Z int *encValLen,
IN_BUFFER( valueLen ) const BYTE *value,
IN_LENGTH_SHORT_MIN( 8 ) const int valueLen,
IN_RANGE( 3, 4 ) const int noCodeGroups );
CHECK_RETVAL STDC_NONNULL_ARG( ( 1, 3, 4 ) ) \
int decodePKIUserValue( OUT_BUFFER( valueMaxLen, *valueLen ) BYTE *value,
IN_LENGTH_SHORT_MIN( 10 ) const int valueMaxLen,
OUT_LENGTH_SHORT_Z int *valueLen,
IN_BUFFER( encValLength ) const char *encVal,
IN_LENGTH_SHORT const int encValLength );
/****************************************************************************
* *
* 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; \
} \
else \
{ \
/* Delete from the middle or the end of the list */ \
element->prev->next = element->next; \
} \
if( element->next != NULL ) \
element->next->prev = element->prev; \
}
/****************************************************************************
* *
* Attribute List Manipulation Functions *
* *
****************************************************************************/
/* In order to work with attribute lists of different types, we need a
means of accessing the type-specific previous and next pointers and the
attribute ID information. The following callback function is passed to
all attribute-list manipulation functions and provides external access
to the required internal fields */
typedef enum {
ATTR_NONE, /* No attribute get type */
ATTR_CURRENT, /* Get details for current attribute */
ATTR_PREV, /* Get details for previous attribute */
ATTR_NEXT, /* Get details for next attribute */
ATTR_LAST /* Last valid attribute get type */
} ATTR_TYPE;
typedef CHECK_RETVAL_PTR \
const void * ( *GETATTRFUNCTION )( IN_OPT const void *attributePtr,
OUT_OPT_ATTRIBUTE_Z \
CRYPT_ATTRIBUTE_TYPE *groupID,
OUT_OPT_ATTRIBUTE_Z \
CRYPT_ATTRIBUTE_TYPE *attributeID,
OUT_OPT_ATTRIBUTE_Z \
CRYPT_ATTRIBUTE_TYPE *instanceID,
IN_ENUM( ATTR ) \
const ATTR_TYPE attrGetType );
CHECK_RETVAL_PTR STDC_NONNULL_ARG( ( 2 ) ) \
void *attributeFindStart( IN_OPT const void *attributePtr,
IN GETATTRFUNCTION getAttrFunction );
CHECK_RETVAL_PTR STDC_NONNULL_ARG( ( 2 ) ) \
void *attributeFindEnd( IN_OPT const void *attributePtr,
IN GETATTRFUNCTION getAttrFunction );
CHECK_RETVAL_PTR STDC_NONNULL_ARG( ( 2 ) ) \
void *attributeFind( IN_OPT const void *attributePtr,
IN GETATTRFUNCTION getAttrFunction,
IN_ATTRIBUTE const CRYPT_ATTRIBUTE_TYPE attributeID,
IN_ENUM_OPT( CRYPT_ATTRIBUTE ) \
const CRYPT_ATTRIBUTE_TYPE instanceID );
CHECK_RETVAL_PTR STDC_NONNULL_ARG( ( 2 ) ) \
void *attributeFindNextInstance( IN_OPT const void *attributePtr,
IN GETATTRFUNCTION getAttrFunction );
CHECK_RETVAL_PTR STDC_NONNULL_ARG( ( 2 ) )\
const void *attributeMoveCursor( IN_OPT const void *currentCursor,
IN GETATTRFUNCTION getAttrFunction,
IN_ATTRIBUTE \
const CRYPT_ATTRIBUTE_TYPE attributeMoveType,
IN_RANGE( CRYPT_CURSOR_LAST, \
CRYPT_CURSOR_FIRST ) /* Values are -ve */
const int cursorMoveType );
/****************************************************************************
* *
* Time Functions *
* *
****************************************************************************/
/* In exceptional circumstances an attempt to read the time can fail,
returning either a garbage value (unsigned time_t) or -1 (signed time_t).
This can be problematic because many crypto protocols and operations use
the time at some point. In order to protect against this, we provide a
safe time-read function that returns either a sane time value or zero,
and for situations where the absolute time isn't critical an approximate
current-time function that returns either a sane time value or an
approximate value hardcoded in at compile time. Finally, we provide a
reliable time function used for operations such as signing certs and
timestamping that tries to get the time from a hardware time source if
one is available */
#include <time.h>
time_t getTime( void );
time_t getApproxTime( void );
time_t getReliableTime( IN_HANDLE const CRYPT_HANDLE cryptHandle );
/* Monotonic timer interface that protect against the system clock being
changed during a timing operation. Even without deliberate fiddling
with the system clock, a timeout during a DST switch can cause something
like a 5s wait to turn into a 1hr 5s wait, so we have to abstract the
standard time API into a monotonic time API. Since these functions are
purely peripheral to other operations (for example handling timeouts for
network I/O), they never fail but simply return good-enough results if
there's a problem (although they assert in debug mode). This is because
we don't want to abort a network session just because we've detected
some trivial clock irregularity */
typedef struct {
time_t endTime;
int origTimeout, timeRemaining;
} MONOTIMER_INFO;
CHECK_RETVAL STDC_NONNULL_ARG( ( 1 ) ) \
int setMonoTimer( INOUT MONOTIMER_INFO *timerInfo,
IN_INT const int duration );
STDC_NONNULL_ARG( ( 1 ) ) \
void extendMonoTimer( INOUT MONOTIMER_INFO *timerInfo,
IN_INT const int duration );
CHECK_RETVAL_BOOL STDC_NONNULL_ARG( ( 1 ) ) \
BOOLEAN checkMonoTimerExpired( INOUT MONOTIMER_INFO *timerInfo );
CHECK_RETVAL_BOOL STDC_NONNULL_ARG( ( 1 ) ) \
BOOLEAN checkMonoTimerExpiryImminent( INOUT MONOTIMER_INFO *timerInfo,
IN_INT const int timeLeft );
/* Hardware timer read routine used for performance evaluation */
CHECK_RETVAL \
long getTickCount( long startTime );
/****************************************************************************
* *
* Checksum/Hash Functions *
* *
****************************************************************************/
/* Hash state information. We can call the hash function with HASH_START,
HASH_CONTINUE, or HASH_END as required to process the input in parts */
typedef enum {
HASH_STATE_NONE, /* No hash state */
HASH_STATE_START, /* Begin hashing */
HASH_STATE_CONTINUE, /* Continue existing hashing */
HASH_STATE_END, /* Complete existing hashing */
HASH_STATE_LAST /* Last valid hash option */
} HASH_STATE;
/* The hash functions are used quite a bit so we provide an internal API for
them to avoid the overhead of having to set up an encryption context
every time they're needed. These take a block of input data and hash it,
leaving the result in the output buffer.
In addition to the hash-step operation, we provide a one-step atomic hash
function that processes a single data quantity and returns its hash */
#if defined( USE_SHA2_512 )
/* SHA2-512: ( 2 + 8 + 16 + 1 ) * sizeof( long long ) */
typedef BYTE HASHINFO[ ( 27 * 8 ) + 8 ];
#elif defined( SYSTEM_64BIT )
/* RIPEMD160: 24 * sizeof( long long ) + 64 */
typedef BYTE HASHINFO[ ( 24 * 8 ) + 64 + 8 ];
#else
/* SHA-256: ( 2 + 8 + 16 + 1 ) * sizeof( long ) */
typedef BYTE HASHINFO[ ( 27 * 4 ) + 8 ];
#endif /* SYSTEM_64BIT */
typedef void ( *HASHFUNCTION )( INOUT_OPT HASHINFO hashInfo,
OUT_BUFFER_OPT_FIXED( outBufMaxLength ) \
BYTE *outBuffer,
IN_LENGTH_HASH const int outBufMaxLength,
IN_BUFFER_OPT( inLength ) const void *inBuffer,
IN_LENGTH_Z const int inLength,
IN_ENUM( HASH_STATE ) \
const HASH_STATE hashState );
typedef STDC_NONNULL_ARG( ( 1, 3 ) ) \
void ( *HASHFUNCTION_ATOMIC )( OUT_BUFFER_FIXED( outBufMaxLength ) \
BYTE *outBuffer,
IN_LENGTH_HASH const int outBufMaxLength,
IN_BUFFER( inLength ) const void *inBuffer,
IN_LENGTH const int inLength );
STDC_NONNULL_ARG( ( 2 ) ) \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -