📄 net.c
字号:
netStreamInfo->storageSize = netStreamDataSize;
if( useTransportBuffering )
{
stream->buffer = netStreamDataPtr;
stream->bufSize = NETWORK_BUFFER_SIZE;
netStreamInfo->writeBuffer = netStreamDataPtr + \
NETWORK_BUFFER_SIZE;
netStreamInfo->writeBufSize = NETWORK_BUFFER_SIZE;
netStreamDataPtr += NETWORK_BUFFER_SIZE + NETWORK_BUFFER_SIZE;
}
if( urlInfo != NULL )
{
netStreamInfo->host = ( char * ) netStreamDataPtr;
memcpy( netStreamInfo->host, urlInfo->host, urlInfo->hostLen );
netStreamInfo->hostLen = urlInfo->hostLen;
if( urlInfo->location != NULL )
{
netStreamInfo->path = ( char * ) netStreamDataPtr + \
urlInfo->hostLen;
memcpy( netStreamInfo->path, urlInfo->location,
urlInfo->locationLen );
netStreamInfo->pathLen = urlInfo->locationLen;
}
netStreamInfo->port = urlInfo->port;
}
}
stream->netStreamInfo = netStreamData;
/* Open the connection to the remote system */
status = openNetworkConnection( stream->netStreamInfo, options,
proxyUrl, proxyUrlLen );
if( cryptStatusError( status ) )
{
NET_STREAM_INFO *netStream = \
( NET_STREAM_INFO * ) stream->netStreamInfo;
/* Copy back the error information to the caller */
copyErrorInfo( errorInfo, NETSTREAM_ERRINFO );
/* Clean up */
cleanupStream( stream, FALSE );
return( status );
}
/* If we're not going through a proxy, we're done */
if( proxyUrl == NULL )
return( CRYPT_OK );
/* Complete the connect via the appropriate proxy type */
status = connectViaHttpProxy( stream, errorInfo );
if( cryptStatusError( status ) )
{
NET_STREAM_INFO *netStream = \
( NET_STREAM_INFO * ) stream->netStreamInfo;
/* Copy back the error information to the caller */
copyErrorInfo( errorInfo, NETSTREAM_ERRINFO );
/* Clean up */
cleanupStream( stream, FALSE );
return( status );
}
return( CRYPT_OK );
}
/* Open and close a network connection. This parses a location string
(usually a URL) into <scheme>://<host>[:<port>]/<path>[?<query>]
components and opens a connection to the host for non-stateless
protocols */
CHECK_RETVAL STDC_NONNULL_ARG( ( 1, 3, 4 ) ) \
int sNetConnect( INOUT STREAM *stream,
IN_ENUM( STREAM_PROTOCOL ) const STREAM_PROTOCOL_TYPE protocol,
const NET_CONNECT_INFO *connectInfo,
INOUT ERROR_INFO *errorInfo )
{
NET_STREAM_INFO netStream;
URL_INFO urlInfo, *urlInfoPtr = NULL;
char proxyUrlBuffer[ MAX_DNS_SIZE + 8 ], *proxyURL = NULL;
int proxyUrlLen = 0, status;
assert( isWritePtr( stream, sizeof( STREAM ) ) );
assert( isReadPtr( connectInfo, sizeof( NET_CONNECT_INFO ) ) );
assert( isWritePtr( errorInfo, sizeof( ERROR_INFO ) ) );
assert( ( connectInfo->options != NET_OPTION_HOSTNAME && \
connectInfo->options != NET_OPTION_HOSTNAME_TUNNEL ) ||
( ( connectInfo->options == NET_OPTION_HOSTNAME || \
connectInfo->options == NET_OPTION_HOSTNAME_TUNNEL ) && \
isReadPtr( connectInfo->name, connectInfo->nameLength ) && \
( connectInfo->nameLength > 0 && \
connectInfo->nameLength < MAX_INTLENGTH_SHORT ) && \
connectInfo->iCryptSession == CRYPT_ERROR && \
connectInfo->networkSocket == CRYPT_ERROR ) );
REQUIRES( protocol == STREAM_PROTOCOL_TCPIP || \
protocol == STREAM_PROTOCOL_HTTP || \
protocol == STREAM_PROTOCOL_CMP );
REQUIRES( connectInfo->options > NET_OPTION_NONE && \
connectInfo->options < NET_OPTION_LAST );
REQUIRES( ( connectInfo->options != NET_OPTION_HOSTNAME && \
connectInfo->options != NET_OPTION_HOSTNAME_TUNNEL ) ||
( ( connectInfo->options == NET_OPTION_HOSTNAME || \
connectInfo->options == NET_OPTION_HOSTNAME_TUNNEL ) && \
connectInfo->name != NULL && \
( connectInfo->nameLength > 0 && \
connectInfo->nameLength < MAX_INTLENGTH_SHORT ) && \
connectInfo->iCryptSession == CRYPT_ERROR && \
connectInfo->networkSocket == CRYPT_ERROR ) );
REQUIRES( connectInfo->options != NET_OPTION_TRANSPORTSESSION || \
( connectInfo->options == NET_OPTION_TRANSPORTSESSION && \
connectInfo->name == NULL && connectInfo->nameLength == 0 && \
connectInfo->iCryptSession != CRYPT_ERROR && \
connectInfo->networkSocket == CRYPT_ERROR ) );
REQUIRES( ( connectInfo->options != NET_OPTION_NETWORKSOCKET && \
connectInfo->options != NET_OPTION_NETWORKSOCKET_DUMMY ) ||
( ( connectInfo->options == NET_OPTION_NETWORKSOCKET || \
connectInfo->options == NET_OPTION_NETWORKSOCKET_DUMMY ) && \
connectInfo->name == NULL && connectInfo->nameLength == 0 && \
connectInfo->iCryptSession == CRYPT_ERROR && \
connectInfo->networkSocket != CRYPT_ERROR ) );
REQUIRES( connectInfo->iUserObject == DEFAULTUSER_OBJECT_HANDLE || \
isHandleRangeValid( connectInfo->iUserObject ) );
/* Clear return values */
memset( errorInfo, 0, sizeof( ERROR_INFO ) );
/* Initialise the network stream info */
status = initStream( stream, &netStream, protocol, connectInfo, FALSE );
if( cryptStatusError( status ) )
return( status );
if( connectInfo->options == NET_OPTION_HOSTNAME || \
connectInfo->options == NET_OPTION_HOSTNAME_TUNNEL )
urlInfoPtr = &urlInfo;
status = processConnectOptions( stream, &netStream, urlInfoPtr,
connectInfo );
if( cryptStatusError( status ) )
return( status );
if( connectInfo->options == NET_OPTION_HOSTNAME || \
connectInfo->options == NET_OPTION_HOSTNAME_TUNNEL )
{
int proxyUrlLength;
/* Check for the use of a proxy to establish the connection. This
function will return OK_SPECIAL if there's a proxy present */
status = checkForProxy( &netStream, protocol, connectInfo,
urlInfoPtr->host, urlInfoPtr->hostLen,
proxyUrlBuffer, MAX_DNS_SIZE,
&proxyUrlLength );
if( cryptStatusError( status ) )
{
if( status != OK_SPECIAL )
return( status );
/* There's a proxy present, go via the proxy rather than
directly to the user-supplied URL */
proxyURL = proxyUrlBuffer;
proxyUrlLen = proxyUrlLength;
}
}
/* Set up access mechanisms and complete the connection */
return( completeConnect( stream, &netStream, urlInfoPtr, protocol,
connectInfo->options, proxyURL, proxyUrlLen,
connectInfo->iUserObject, errorInfo ) );
}
CHECK_RETVAL STDC_NONNULL_ARG( ( 1, 3, 4 ) ) \
int sNetListen( INOUT STREAM *stream,
IN_ENUM( STREAM_PROTOCOL ) const STREAM_PROTOCOL_TYPE protocol,
const NET_CONNECT_INFO *connectInfo,
INOUT ERROR_INFO *errorInfo )
{
NET_STREAM_INFO netStream;
URL_INFO urlInfo, *urlInfoPtr = NULL;
int status;
assert( isWritePtr( stream, sizeof( STREAM ) ) );
assert( isReadPtr( connectInfo, sizeof( NET_CONNECT_INFO ) ) );
assert( isWritePtr( errorInfo, sizeof( ERROR_INFO ) ) );
REQUIRES( protocol == STREAM_PROTOCOL_TCPIP || \
protocol == STREAM_PROTOCOL_HTTP || \
protocol == STREAM_PROTOCOL_CMP );
REQUIRES( connectInfo->options == NET_OPTION_HOSTNAME || \
connectInfo->options == NET_OPTION_TRANSPORTSESSION || \
connectInfo->options == NET_OPTION_NETWORKSOCKET );
REQUIRES( connectInfo->options != NET_OPTION_HOSTNAME ||
( connectInfo->options == NET_OPTION_HOSTNAME && \
connectInfo->iCryptSession == CRYPT_ERROR && \
connectInfo->networkSocket == CRYPT_ERROR ) );
REQUIRES( connectInfo->options != NET_OPTION_TRANSPORTSESSION || \
( connectInfo->options == NET_OPTION_TRANSPORTSESSION && \
connectInfo->name == NULL && connectInfo->nameLength == 0 && \
connectInfo->iCryptSession != CRYPT_ERROR && \
connectInfo->networkSocket == CRYPT_ERROR ) );
REQUIRES( ( connectInfo->options != NET_OPTION_NETWORKSOCKET && \
connectInfo->options != NET_OPTION_NETWORKSOCKET_DUMMY ) ||
( ( connectInfo->options == NET_OPTION_NETWORKSOCKET || \
connectInfo->options == NET_OPTION_NETWORKSOCKET_DUMMY ) && \
connectInfo->name == NULL && connectInfo->nameLength == 0 && \
connectInfo->iCryptSession == CRYPT_ERROR && \
connectInfo->networkSocket != CRYPT_ERROR ) );
REQUIRES( connectInfo->iUserObject == DEFAULTUSER_OBJECT_HANDLE || \
isHandleRangeValid( connectInfo->iUserObject ) );
/* Clear the return values */
memset( errorInfo, 0, sizeof( ERROR_INFO ) );
/* Initialise the network stream info */
status = initStream( stream, &netStream, protocol, connectInfo, TRUE );
if( cryptStatusError( status ) )
return( status );
if( connectInfo->options == NET_OPTION_HOSTNAME && \
connectInfo->name != NULL )
urlInfoPtr = &urlInfo;
status = processConnectOptions( stream, &netStream, urlInfoPtr,
connectInfo );
if( cryptStatusError( status ) )
return( status );
/* Set up access mechanisms and complete the connection */
return( completeConnect( stream, &netStream, urlInfoPtr, protocol,
connectInfo->options, NULL, 0,
connectInfo->iUserObject, errorInfo ) );
}
RETVAL STDC_NONNULL_ARG( ( 1 ) ) \
int sNetDisconnect( INOUT STREAM *stream )
{
NET_STREAM_INFO *netStream = ( NET_STREAM_INFO * ) stream->netStreamInfo;
assert( isWritePtr( stream, sizeof( STREAM ) ) );
assert( isWritePtr( netStream, sizeof( NET_STREAM_INFO ) ) );
REQUIRES_S( netStream->sanityCheckFunction( stream ) );
cleanupStream( stream, TRUE );
return( CRYPT_OK );
}
/* Parse a URL into its various components */
CHECK_RETVAL STDC_NONNULL_ARG( ( 1, 2 ) ) \
int sNetParseURL( INOUT URL_INFO *urlInfo,
IN_BUFFER( urlLen ) const char *url,
IN_LENGTH_SHORT const int urlLen,
IN_ENUM_OPT( URL_TYPE ) const URL_TYPE urlTypeHint )
{
assert( isWritePtr( urlInfo, sizeof( URL_INFO ) ) );
assert( isReadPtr( url, urlLen ) );
REQUIRES( urlLen > 0 && urlLen < MAX_INTLENGTH_SHORT );
REQUIRES( urlTypeHint >= URL_TYPE_NONE && urlTypeHint < URL_TYPE_LAST );
return( parseURL( urlInfo, url, urlLen, CRYPT_UNUSED, urlTypeHint ) );
}
/* Get extended information about an error status on a network connection */
STDC_NONNULL_ARG( ( 1, 2 ) ) \
void sNetGetErrorInfo( INOUT STREAM *stream, INOUT ERROR_INFO *errorInfo )
{
NET_STREAM_INFO *netStream = ( NET_STREAM_INFO * ) stream->netStreamInfo;
assert( isReadPtr( stream, sizeof( STREAM ) ) );
assert( isWritePtr( errorInfo, sizeof( ERROR_INFO ) ) );
REQUIRES_V( netStream->sanityCheckFunction( stream ) );
/* Remember the error code and message. If we're running over a
cryptlib transport session we have to first pull the information up
from the session, since getSessionErrorInfo() passes through the
error status from the caller (which in this case is CRYPT_OK since
we're just using it as a data-fetch function) we don't check the
return code */
if( netStream->iTransportSession != CRYPT_ERROR )
( void ) getSessionErrorInfo( netStream, CRYPT_OK );
copyErrorInfo( errorInfo, NETSTREAM_ERRINFO );
}
#else
/****************************************************************************
* *
* Network Stream Stubs *
* *
****************************************************************************/
/* If there's no networking support present we replace the network access
routines with dummy ones that always return an error */
CHECK_RETVAL STDC_NONNULL_ARG( ( 1, 3, 4 ) ) \
int sNetConnect( INOUT STREAM *stream,
IN_ENUM( STREAM_PROTOCOL ) const STREAM_PROTOCOL_TYPE protocol,
const NET_CONNECT_INFO *connectInfo,
INOUT ERROR_INFO *errorInfo )
{
memset( stream, 0, sizeof( STREAM ) );
memset( errorInfo, 0, sizeof( ERROR_INFO ) );
return( CRYPT_ERROR_OPEN );
}
CHECK_RETVAL STDC_NONNULL_ARG( ( 1, 3, 4 ) ) \
int sNetListen( INOUT STREAM *stream,
IN_ENUM( STREAM_PROTOCOL ) const STREAM_PROTOCOL_TYPE protocol,
const NET_CONNECT_INFO *connectInfo,
INOUT ERROR_INFO *errorInfo )
{
memset( stream, 0, sizeof( STREAM ) );
memset( errorInfo, 0, sizeof( ERROR_INFO ) );
return( CRYPT_ERROR_OPEN );
}
RETVAL STDC_NONNULL_ARG( ( 1 ) ) \
int sNetDisconnect( INOUT STREAM *stream )
{
UNUSED_ARG( stream );
return( CRYPT_OK );
}
CHECK_RETVAL STDC_NONNULL_ARG( ( 1, 2 ) ) \
int sNetParseURL( INOUT URL_INFO *urlInfo,
IN_BUFFER( urlLen ) const char *url,
IN_LENGTH_SHORT const int urlLen,
IN_ENUM_OPT( URL_TYPE ) const URL_TYPE urlTypeHint )
{
memset( urlInfo, 0, sizeof( URL_INFO ) );
return( CRYPT_ERROR_BADDATA );
}
STDC_NONNULL_ARG( ( 1, 2 ) ) \
void sNetGetErrorInfo( INOUT STREAM *stream, INOUT ERROR_INFO *errorInfo )
{
UNUSED_ARG( stream );
memset( errorInfo, 0, sizeof( ERROR_INFO ) );
}
#endif /* USE_TCP */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -