📄 tsp.c
字号:
return( CRYPT_ERROR_NOTINITED );
}
/* Create a timestamp token and sign it */
setMessageData( &msgData, serialNo, 16 );
status = krnlSendMessage( SYSTEM_OBJECT_HANDLE, IMESSAGE_GETATTRIBUTE_S,
&msgData, CRYPT_IATTRIBUTE_RANDOM_NONCE );
if( cryptStatusError( status ) )
return( status );
sMemOpen( &stream, sessionInfoPtr->receiveBuffer,
sessionInfoPtr->receiveBufSize );
writeSequence( &stream, sizeofShortInteger( 1 ) + \
sizeofOID( OID_TSP_POLICY ) + protocolInfo->msgImprintSize + \
sizeofInteger( serialNo, 16 ) + sizeofGeneralizedTime() + \
protocolInfo->nonceSize );
writeShortInteger( &stream, 1, DEFAULT_TAG );
writeOID( &stream, OID_TSP_POLICY );
swrite( &stream, protocolInfo->msgImprint, protocolInfo->msgImprintSize );
writeInteger( &stream, serialNo, 16, DEFAULT_TAG );
status = writeGeneralizedTime( &stream, currentTime, DEFAULT_TAG );
if( protocolInfo->nonceSize > 0 )
status = swrite( &stream, protocolInfo->nonce,
protocolInfo->nonceSize );
length = stell( &stream );
sMemDisconnect( &stream );
if( cryptStatusOK( status ) )
status = signTSToken( sessionInfoPtr->receiveBuffer + headerOfs + 9,
&responseLength, sessionInfoPtr->receiveBufSize,
sessionInfoPtr->receiveBuffer, length,
sessionInfoPtr->privateKey,
protocolInfo->includeSigCerts );
if( cryptStatusError( status ) )
return( sendErrorResponse( sessionInfoPtr, respBadGeneric, status ) );
DEBUG_DUMP( "tsa_token",
sessionInfoPtr->receiveBuffer + headerOfs + 9,
responseLength );
assert( responseLength >= 256 );
/* If we're using the socket protocol, add the TSP header:
uint32 length of type + data
byte type
byte[] data */
if( !( sessionInfoPtr->flags & SESSION_ISHTTPTRANSPORT ) )
{
bufPtr = sessionInfoPtr->receiveBuffer;
mputLong( bufPtr, 1 + 9 + responseLength );
*bufPtr++ = TSP_MESSAGE_RESPONSE;
}
/* Add the TSA response wrapper and send it to the client. This assumes
that the TSA response will be >= 256 bytes (for a 4-byte SEQUENCE
header encoding), which is always the case since it uses PKCS #7
signed data */
sMemOpen( &stream, bufPtr, 4 + 5 ); /* SEQ + resp.header */
writeSequence( &stream, 5 + responseLength );
swrite( &stream, "\x30\x03\x02\x01\x00", 5 );
sMemDisconnect( &stream );
sessionInfoPtr->receiveBufEnd = headerOfs + 9 + responseLength;
return( writePkiDatagram( sessionInfoPtr ) );
}
/****************************************************************************
* *
* Init/Shutdown Functions *
* *
****************************************************************************/
/* Exchange data with a TSP client/server */
static int clientTransact( SESSION_INFO *sessionInfoPtr )
{
TSP_PROTOCOL_INFO protocolInfo;
int status;
/* Make sure that we have all of the needed information */
if( sessionInfoPtr->tspImprintSize == 0 )
{
setErrorInfo( sessionInfoPtr, CRYPT_SESSINFO_TSP_MSGIMPRINT,
CRYPT_ERRTYPE_ATTR_ABSENT );
return( CRYPT_ERROR_NOTINITED );
}
/* Get a timestamp from the server */
memset( &protocolInfo, 0, sizeof( TSP_PROTOCOL_INFO ) );
status = sendClientRequest( sessionInfoPtr, &protocolInfo );
if( cryptStatusOK( status ) )
status = readServerResponse( sessionInfoPtr, &protocolInfo );
#if 0
sioctl( &sessionInfoPtr->stream, STREAM_IOCTL_GETCONNSTATE, &status, 0 );
#endif /* 0 */
return( status );
}
static int serverTransact( SESSION_INFO *sessionInfoPtr )
{
TSP_PROTOCOL_INFO protocolInfo;
int status;
/* Send a timestamp to the client */
memset( &protocolInfo, 0, sizeof( TSP_PROTOCOL_INFO ) );
status = readClientRequest( sessionInfoPtr, &protocolInfo );
if( cryptStatusOK( status ) )
status = sendServerResponse( sessionInfoPtr, &protocolInfo );
#if 0
sioctl( &sessionInfoPtr->stream, STREAM_IOCTL_GETCONNSTATE, &status, 0 );
#endif /* 0 */
return( status );
}
/****************************************************************************
* *
* Control Information Management Functions *
* *
****************************************************************************/
static int getAttributeFunction( SESSION_INFO *sessionInfoPtr,
void *data, const CRYPT_ATTRIBUTE_TYPE type )
{
CRYPT_CERTIFICATE *cryptEnvelopePtr = ( CRYPT_CERTIFICATE * ) data;
MESSAGE_CREATEOBJECT_INFO createInfo;
RESOURCE_DATA msgData;
const int dataSize = sessionInfoPtr->receiveBufEnd - \
sessionInfoPtr->receiveBufPos;
const int bufSize = max( dataSize + 128, MIN_BUFFER_SIZE );
int status;
assert( type == CRYPT_SESSINFO_RESPONSE || \
type == CRYPT_IATTRIBUTE_ENC_TIMESTAMP );
/* Make sure there's actually a timestamp present (this can happen if
we're using a persistent session and a subsequent transaction
fails) */
if( sessionInfoPtr->receiveBufPos <= 0 )
return( CRYPT_ERROR_NOTFOUND );
/* If we're being asked for raw encoded timestamp data, return it
directly to the caller */
if( type == CRYPT_IATTRIBUTE_ENC_TIMESTAMP )
return( attributeCopy( ( RESOURCE_DATA * ) data,
sessionInfoPtr->receiveBuffer + sessionInfoPtr->receiveBufPos,
dataSize ) );
/* We're being asked for interpreted data, create a cryptlib envelope to
contain it */
setMessageCreateObjectInfo( &createInfo, CRYPT_FORMAT_AUTO );
status = krnlSendMessage( SYSTEM_OBJECT_HANDLE,
IMESSAGE_DEV_CREATEOBJECT, &createInfo,
OBJECT_TYPE_ENVELOPE );
if( cryptStatusError( status ) )
return( status );
krnlSendMessage( createInfo.cryptHandle, IMESSAGE_SETATTRIBUTE,
( void * ) &bufSize, CRYPT_ATTRIBUTE_BUFFERSIZE );
/* Push in the timestamp data */
setMessageData( &msgData, sessionInfoPtr->receiveBuffer + \
sessionInfoPtr->receiveBufPos, dataSize );
status = krnlSendMessage( createInfo.cryptHandle, IMESSAGE_ENV_PUSHDATA,
&msgData, 0 );
if( cryptStatusOK( status ) )
{
setMessageData( &msgData, NULL, 0 );
status = krnlSendMessage( createInfo.cryptHandle,
IMESSAGE_ENV_PUSHDATA, &msgData, 0 );
}
if( cryptStatusError( status ) )
return( status );
if( sessionInfoPtr->iCertResponse != CRYPT_ERROR )
krnlSendNotifier( sessionInfoPtr->iCertResponse,
IMESSAGE_DECREFCOUNT );
sessionInfoPtr->iCertResponse = createInfo.cryptHandle;
/* Return the information to the caller */
krnlSendNotifier( sessionInfoPtr->iCertResponse, IMESSAGE_INCREFCOUNT );
*cryptEnvelopePtr = sessionInfoPtr->iCertResponse;
return( status );
}
static int setAttributeFunction( SESSION_INFO *sessionInfoPtr,
const void *data,
const CRYPT_ATTRIBUTE_TYPE type )
{
CRYPT_CONTEXT hashContext = *( ( CRYPT_CONTEXT * ) data );
int status;
assert( type == CRYPT_SESSINFO_TSP_MSGIMPRINT );
if( sessionInfoPtr->tspImprintSize != 0 )
return( CRYPT_ERROR_INITED );
/* Get the message imprint from the hash context */
status = krnlSendMessage( hashContext, IMESSAGE_GETATTRIBUTE,
&sessionInfoPtr->tspImprintAlgo,
CRYPT_CTXINFO_ALGO );
if( cryptStatusOK( status ) )
{
RESOURCE_DATA msgData;
setMessageData( &msgData, sessionInfoPtr->tspImprint,
CRYPT_MAX_HASHSIZE );
status = krnlSendMessage( hashContext, IMESSAGE_GETATTRIBUTE_S,
&msgData, CRYPT_CTXINFO_HASHVALUE );
if( cryptStatusError( status ) )
return( status );
sessionInfoPtr->tspImprintSize = msgData.length;
}
return( cryptStatusError( status ) ? CRYPT_ARGERROR_NUM1 : CRYPT_OK );
}
static int checkAttributeFunction( SESSION_INFO *sessionInfoPtr,
const CRYPT_HANDLE cryptHandle,
const CRYPT_ATTRIBUTE_TYPE type )
{
int value, status;
if( type != CRYPT_SESSINFO_PRIVATEKEY )
return( CRYPT_OK );
/* Make sure that the key is valid for timestamping */
status = krnlSendMessage( cryptHandle, IMESSAGE_CHECK, NULL,
MESSAGE_CHECK_PKC_SIGN );
if( cryptStatusError( status ) )
{
setErrorInfo( sessionInfoPtr, CRYPT_CERTINFO_KEYUSAGE,
CRYPT_ERRTYPE_ATTR_VALUE );
return( CRYPT_ARGERROR_NUM1 );
}
status = krnlSendMessage( cryptHandle, IMESSAGE_GETATTRIBUTE, &value,
CRYPT_CERTINFO_EXTKEY_TIMESTAMPING );
if( cryptStatusError( status ) || !value )
{
setErrorInfo( sessionInfoPtr, CRYPT_CERTINFO_EXTKEY_TIMESTAMPING,
CRYPT_ERRTYPE_ATTR_ABSENT );
return( CRYPT_ARGERROR_NUM1 );
}
return( CRYPT_OK );
}
/****************************************************************************
* *
* Session Access Routines *
* *
****************************************************************************/
int setAccessMethodTSP( SESSION_INFO *sessionInfoPtr )
{
static const ALTPROTOCOL_INFO altProtocolInfo = {
STREAM_PROTOCOL_TCPIP, /* Alt.xport protocol type */
"tcp://", /* Alt.xport protocol URI type */
TSP_PORT /* Alt.xport protocol port */
};
static const PROTOCOL_INFO protocolInfo = {
/* General session information */
TRUE, /* Request-response protocol */
SESSION_ISHTTPTRANSPORT, /* Flags */
80, /* HTTP port */
0, /* Client flags */
SESSION_NEEDS_PRIVATEKEY | /* Server flags */
SESSION_NEEDS_PRIVKEYSIGN | \
SESSION_NEEDS_PRIVKEYCERT,
1, 1, 1, /* Version 1 */
"application/timestamp-query",/* Client content-type */
"application/timestamp-reply",/* Server content-type */
/* Protocol-specific information */
BUFFER_SIZE_DEFAULT, /* Send/receive buffers */
&altProtocolInfo /* Alt.transport protocol */
};
/* Set the access method pointers */
sessionInfoPtr->protocolInfo = &protocolInfo;
sessionInfoPtr->transactFunction = \
( sessionInfoPtr->flags & SESSION_ISSERVER ) ? \
serverTransact : clientTransact;
sessionInfoPtr->getAttributeFunction = getAttributeFunction;
sessionInfoPtr->setAttributeFunction = setAttributeFunction;
sessionInfoPtr->checkAttributeFunction = checkAttributeFunction;
return( CRYPT_OK );
}
#endif /* USE_TSP */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -