⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cryptses.c

📁 老外写的加密库cryptlib(版本3.1)
💻 C
📖 第 1 页 / 共 5 页
字号:
	}

static int processSetAttributeS( SESSION_INFO *sessionInfoPtr,
								 void *messageDataPtr, const int messageValue )
	{
	RESOURCE_DATA *msgData = ( RESOURCE_DATA * ) messageDataPtr;

	/* Handle the various information types */
	switch( messageValue )
		{
		case CRYPT_OPTION_NET_SOCKS_SERVER:
		case CRYPT_OPTION_NET_SOCKS_USERNAME:
		case CRYPT_OPTION_NET_HTTP_PROXY:
			/* These aren't implemented on a per-session level yet since 
			   they're almost never user */
			return( CRYPT_ARGERROR_VALUE );

		case CRYPT_SESSINFO_USERNAME:
			assert( msgData->length <= CRYPT_MAX_TEXTSIZE );
			if( sessionInfoPtr->userNameLength > 0 && \
				!( sessionInfoPtr->type == CRYPT_SESSION_SSL && \
				   sessionInfoPtr->flags & SESSION_ISSERVER ) )
				return( exitErrorInited( sessionInfoPtr,
										 CRYPT_SESSINFO_USERNAME ) );
			if( isPKIUserValue( msgData->data, msgData->length ) )
				{
				/* It's an encoded user value, make sure that it's in order.  
				   We store the encoded form at this stage in case the user
				   tries to read it back */
				const int status = decodePKIUserValue( NULL, msgData->data,
													   msgData->length );
				if( cryptStatusError( status ) )
					return( status );
				sessionInfoPtr->flags |= SESSION_ISENCODEDUSERID;
				}
			memcpy( sessionInfoPtr->userName, msgData->data,
					msgData->length );
			sessionInfoPtr->userNameLength = msgData->length;
			if( sessionInfoPtr->flags & SESSION_CHANGENOTIFY_USERID )
				{
				assert( sessionInfoPtr->setAttributeFunction != NULL );

				/* Reflect the change down to the protocol-specific code */
				return( sessionInfoPtr->setAttributeFunction( sessionInfoPtr,
									messageDataPtr, CRYPT_SESSINFO_USERNAME ) );
				}
			return( CRYPT_OK );

		case CRYPT_SESSINFO_PASSWORD:
			assert( msgData->length <= CRYPT_MAX_TEXTSIZE );
			if( sessionInfoPtr->passwordLength > 0 && \
				!( sessionInfoPtr->type == CRYPT_SESSION_SSL && \
				   sessionInfoPtr->flags & SESSION_ISSERVER ) )
				return( exitErrorInited( sessionInfoPtr,
										 CRYPT_SESSINFO_PASSWORD ) );
			if( isPKIUserValue( msgData->data, msgData->length ) )
				{
				BYTE decodedPassword[ CRYPT_MAX_TEXTSIZE ];
				int status;

				/* It's an encoded user value, make sure that it's in order */
				status = decodePKIUserValue( decodedPassword, msgData->data, 
											 msgData->length );
				zeroise( decodedPassword, CRYPT_MAX_TEXTSIZE );
				if( cryptStatusError( status ) )
					return( status );
				sessionInfoPtr->flags |= SESSION_ISENCODEDPW;
				}
			memcpy( sessionInfoPtr->password, msgData->data,
					msgData->length );
			sessionInfoPtr->passwordLength = msgData->length;
			if( sessionInfoPtr->flags & SESSION_CHANGENOTIFY_PASSWD )
				{
				assert( sessionInfoPtr->setAttributeFunction != NULL );

				/* Reflect the change down to the protocol-specific code */
				return( sessionInfoPtr->setAttributeFunction( sessionInfoPtr,
									messageDataPtr, CRYPT_SESSINFO_PASSWORD ) );
				}
			return( CRYPT_OK );

		case CRYPT_SESSINFO_SERVER_NAME:
			{
			const PROTOCOL_INFO *protocolInfoPtr = \
										sessionInfoPtr->protocolInfo;
			URL_INFO urlInfo;
			int status;

			assert( msgData->length < MAX_URL_SIZE );
			if( sessionInfoPtr->serverName[ 0 ] )
				return( exitErrorInited( sessionInfoPtr,
										 CRYPT_SESSINFO_SERVER_NAME ) );

			/* If there's already a transport session or network socket 
			   specified, we can't set a server name as well */
			if( sessionInfoPtr->transportSession != CRYPT_ERROR )
				return( exitErrorInited( sessionInfoPtr,
										 CRYPT_SESSINFO_SESSION ) );
			if( sessionInfoPtr->networkSocket != CRYPT_ERROR )
				return( exitErrorInited( sessionInfoPtr,
										 CRYPT_SESSINFO_NETWORKSOCKET ) );

			/* Parse the server name */
			status = sNetParseURL( &urlInfo, msgData->data, 
								   msgData->length );
			if( cryptStatusError( status ) )
				return( exitError( sessionInfoPtr, CRYPT_SESSINFO_SERVER_NAME, 
								   CRYPT_ERRTYPE_ATTR_VALUE, 
								   CRYPT_ARGERROR_STR1 ) );

			/* We can only use autodetection with PKI services */
			if( !strCompare( msgData->data, "[Autodetect]", 
							 msgData->length ) && \
				!protocolInfoPtr->isReqResp )
				return( exitError( sessionInfoPtr, CRYPT_SESSINFO_SERVER_NAME, 
								   CRYPT_ERRTYPE_ATTR_VALUE, 
								   CRYPT_ARGERROR_STR1 ) );

			/* If there's a port or user name specified in the URL, set the 
			   appropriate attributes */
			if( urlInfo.userInfoLen > 0 )
				{
				RESOURCE_DATA userInfoMsgData;

				krnlSendMessage( sessionInfoPtr->objectHandle, 
								 IMESSAGE_DELETEATTRIBUTE, NULL,
								 CRYPT_SESSINFO_USERNAME );
				setMessageData( &userInfoMsgData, ( void * ) urlInfo.userInfo, 
								urlInfo.userInfoLen );
				status = krnlSendMessage( sessionInfoPtr->objectHandle, 
										  IMESSAGE_SETATTRIBUTE_S, 
										  &userInfoMsgData,
										  CRYPT_SESSINFO_USERNAME );
				}
			if( cryptStatusOK( status ) && urlInfo.port > 0 )
				{
				krnlSendMessage( sessionInfoPtr->objectHandle, 
								 IMESSAGE_DELETEATTRIBUTE, NULL,
								 CRYPT_SESSINFO_SERVER_PORT );
				status = krnlSendMessage( sessionInfoPtr->objectHandle, 
										  IMESSAGE_SETATTRIBUTE, &urlInfo.port,
										  CRYPT_SESSINFO_SERVER_PORT );
				}
			if( cryptStatusError( status ) )
				return( exitError( sessionInfoPtr, CRYPT_SESSINFO_SERVER_NAME, 
								   CRYPT_ERRTYPE_ATTR_VALUE, 
								   CRYPT_ARGERROR_STR1 ) );

			/* Remember the server name and transport type */
			memcpy( sessionInfoPtr->serverName, urlInfo.host, urlInfo.hostLen );
			sessionInfoPtr->serverName[ urlInfo.hostLen ] = 0;
			if( urlInfo.locationLen > 0 )
				{
				memcpy( sessionInfoPtr->serverName + urlInfo.hostLen, 
						urlInfo.location, urlInfo.locationLen );
				sessionInfoPtr->serverName[ urlInfo.hostLen + \
											urlInfo.locationLen ] = 0;
				}
			if( protocolInfoPtr->altProtocolInfo != NULL && \
				urlInfo.schemaLen == \
						strlen( protocolInfoPtr->altProtocolInfo->uriType ) && \
				!strCompare( sessionInfoPtr->serverName, 
							 protocolInfoPtr->altProtocolInfo->uriType,
							 strlen( protocolInfoPtr->altProtocolInfo->uriType ) ) )
				{
				/* The caller has specified the use of the altnernate 
				   transport protocol type, switch to that instead of HTTP */
				sessionInfoPtr->flags &= ~SESSION_ISHTTPTRANSPORT;
				sessionInfoPtr->flags |= SESSION_USEALTTRANSPORT;
				}
			else
				if( sessionInfoPtr->protocolInfo->flags & SESSION_ISHTTPTRANSPORT )
					{
					sessionInfoPtr->flags &= ~SESSION_USEALTTRANSPORT;
					sessionInfoPtr->flags |= SESSION_ISHTTPTRANSPORT;
					}
			return( CRYPT_OK );
			}

		case CRYPT_SESSINFO_SERVER_FINGERPRINT:
			/* If there's already a fingerprint set, we can't set another 
			   one */
			if( sessionInfoPtr->keyFingerprintSize > 0 )
				return( exitErrorInited( sessionInfoPtr,
										 CRYPT_SESSINFO_SERVER_FINGERPRINT ) );

			/* Remember the server key fingerprint */
			memcpy( sessionInfoPtr->keyFingerprint, msgData->data,
					msgData->length );
			sessionInfoPtr->keyFingerprintSize = msgData->length;
			return( CRYPT_OK );
		}

	assert( NOTREACHED );
	return( CRYPT_ERROR );	/* Get rid of compiler warning */
	}

static int processDeleteAttribute( SESSION_INFO *sessionInfoPtr,
								   const int messageValue )
	{
	/* Handle the various information types */
	switch( messageValue )
		{
		case CRYPT_OPTION_NET_TIMEOUT:
			if( sessionInfoPtr->timeout == CRYPT_ERROR )
				return( exitErrorNotFound( sessionInfoPtr,
										   CRYPT_ERROR_NOTINITED ) );
			sessionInfoPtr->timeout = CRYPT_ERROR;
			return( CRYPT_OK );

		case CRYPT_OPTION_NET_CONNECTTIMEOUT:
			if( sessionInfoPtr->connectTimeout == CRYPT_ERROR )
				return( exitErrorNotFound( sessionInfoPtr,
										   CRYPT_ERROR_NOTINITED ) );
			sessionInfoPtr->connectTimeout = CRYPT_ERROR;
			return( CRYPT_OK );

		case CRYPT_SESSINFO_USERNAME:
			{
			int status = CRYPT_OK;

			if( sessionInfoPtr->userNameLength <= 0 )
				return( exitErrorNotFound( sessionInfoPtr,
										   CRYPT_SESSINFO_USERNAME ) );
			if( sessionInfoPtr->flags & SESSION_CHANGENOTIFY_USERID )
				/* Reflect the deletion down to the protocol-specific code, 
				   handled by setting a null attribute value */
				status = sessionInfoPtr->setAttributeFunction( sessionInfoPtr,
										NULL, CRYPT_SESSINFO_USERNAME );
			memset( sessionInfoPtr->userName, 0, CRYPT_MAX_TEXTSIZE );
			sessionInfoPtr->userNameLength = 0;
			sessionInfoPtr->flags &= ~SESSION_ISENCODEDUSERID;
			return( status );
			}

		case CRYPT_SESSINFO_PASSWORD:
			{
			int status = CRYPT_OK;

			if( sessionInfoPtr->passwordLength <= 0 )
				return( exitErrorNotFound( sessionInfoPtr,
										   CRYPT_SESSINFO_PASSWORD ) );
			if( sessionInfoPtr->flags & SESSION_CHANGENOTIFY_PASSWD )
				/* Reflect the deletion down to the protocol-specific code, 
				   handled by setting a null attribute value */
				status = sessionInfoPtr->setAttributeFunction( sessionInfoPtr,
										NULL, CRYPT_SESSINFO_PASSWORD );
			zeroise( sessionInfoPtr->password, CRYPT_MAX_TEXTSIZE );
			sessionInfoPtr->passwordLength = 0;
			sessionInfoPtr->flags &= ~SESSION_ISENCODEDPW;
			return( status );
			}

		case CRYPT_SESSINFO_SERVER_NAME:
			if( !strlen( sessionInfoPtr->serverName ) )
				return( exitErrorNotFound( sessionInfoPtr,
										   CRYPT_SESSINFO_SERVER_NAME ) );
			memset( sessionInfoPtr->serverName, 0, MAX_URL_SIZE + 1 );
			return( CRYPT_OK );

		case CRYPT_SESSINFO_REQUEST:
			if( sessionInfoPtr->iCertRequest == CRYPT_ERROR )
				return( exitErrorNotFound( sessionInfoPtr,
										   CRYPT_SESSINFO_REQUEST ) );
			krnlSendNotifier( sessionInfoPtr->iCertRequest,
							  IMESSAGE_DECREFCOUNT );
			sessionInfoPtr->iCertRequest = CRYPT_ERROR;
			return( CRYPT_OK );

		case CRYPT_SESSINFO_TSP_MSGIMPRINT:
			if( sessionInfoPtr->tspImprintAlgo == CRYPT_ALGO_NONE || \
				sessionInfoPtr->tspImprintSize <= 0 )
				return( exitErrorNotFound( sessionInfoPtr,
										   CRYPT_SESSINFO_TSP_MSGIMPRINT ) );
			sessionInfoPtr->tspImprintAlgo = CRYPT_ALGO_NONE;
			sessionInfoPtr->tspImprintSize = 0;
			return( CRYPT_OK );
		}

	assert( NOTREACHED );
	return( CRYPT_ERROR );	/* Get rid of compiler warning */
	}

/****************************************************************************
*																			*
*								Session Message Handler						*
*																			*
****************************************************************************/

/* Handle a message sent to a session object */

static int sessionMessageFunction( const void *objectInfoPtr,
								   const MESSAGE_TYPE message,
								   void *messageDataPtr,
								   const int messageValue )
	{
	SESSION_INFO *sessionInfoPtr = ( SESSION_INFO * ) objectInfoPtr;

	/* Process destroy object messages */
	if( message == MESSAGE_DESTROY )
		{
		/* Shut down the session if required.  Nemo nisi mors */
		if( sessionInfoPtr->flags & SESSION_ISOPEN )
			sessionInfoPtr->shutdownFunction( sessionInfoPtr );

		/* Clear and free session state information if necessary */
		if( sessionInfoPtr->sendBuffer != NULL )
			{
			zeroise( sessionInfoPtr->sendBuffer,
					 sessionInfoPtr->sendBufSize );
			clFree( "sessionMessageFunction", sessionInfoPtr->sendBuffer );
			}
		if( sessionInfoPtr->receiveBuffer != NULL )
			{
			zeroise( sessionInfoPtr->receiveBuffer,
					 sessionInfoPtr->receiveBufSize );
			clFree( "sessionMessageFunction", sessionInfoPtr->receiveBuffer );
			}

		/* Clean up any session-related objects if necessary */
		if( sessionInfoPtr->iKeyexCryptContext != CRYPT_ERROR )
			krnlSendNotifier( sessionInfoPtr->iKeyexCryptContext,
							  IMESSAGE_DECREFCOUNT );
		if( sessionInfoPtr->iKeyexAuthContext != CRYPT_ERROR )
			krnlSendNotifier( sessionInfoPtr->iKeyexAuthContext,
							  IMESSAGE_DECREFCOUNT );
		if( sessionInfoPtr->iCryptInContext != CRYPT_ERROR )
			krnlSendNotifier( sessionInfoPtr->iCryptInContext,
							  IMESSAGE_DECREFCOUNT );
		if( sessionInfoPtr->iCryptOutContext != CRYPT_ERROR )
			krnlSendNotifier( sessionInfoPtr->iCryptOutContext,
							  IMESSAGE_DECREFCOUNT );
		if( sessionInfoPtr->iAuthInContext != CRYPT_ERROR )
			krnlSendNotifier( sessionInfoPtr->iAuthInContext,
							  IMESSAGE_DECREFCOUNT );
		if( sessionInfoPtr->iAuthOutContext != CRYPT_ERROR )
			krnlSendNotifier( sessionInfoPtr->iAuthOutContext,
							  IMESSAGE_DECREFCOUNT );
		if( sessionInfoPtr->iCertRequest != CRYPT_ERROR )
			krnlSendNotifier( sessionInfoPtr->iCertRequest,
							  IMESSAGE_DECREFCOUNT );
		if( sessionInfoPtr->iCertResponse != CRYPT_ERROR )
			krnlSendNotifier( sessionInfoPtr->iCertResponse,
							  IMESSAGE_DECREFCOUNT );
		if( sessionInfoPtr->privateKey != CRYPT_ERROR )
			krnlSendNotifier( sessionInfoPtr->privateKey,
							  IMESSAGE_DECREFCOUNT );
		i

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -