📄 session.h
字号:
typedef struct {
int type; /* Response type */
BUFFER( SSH_MAX_RESPONSESIZE, dataLen ) \
BYTE data[ SSH_MAX_RESPONSESIZE + 8 ]; /* Encoded response data */
int dataLen;
} SSH_RESPONSE_INFO;
/* The internal fields in a session that hold data for the various session
types */
typedef struct {
/* Session state information */
int sessionCacheID; /* Session cache ID for this session */
int ivSize; /* Explicit IV size for TLS 1.1 */
/* The incoming and outgoing packet sequence number, for detecting
insertion/deletion attacks */
long readSeqNo, writeSeqNo;
/* The SSL MAC read/write secrets are required because SSL 3.0 uses a
proto-HMAC that isn't handled by cryptlib. We leave the data in
normal memory because it's only usable for an active attack, which
means that recovering it from swap afterwards isn't a problem */
BUFFER_FIXED( CRYPT_MAX_HASHSIZE ) \
BYTE macReadSecret[ CRYPT_MAX_HASHSIZE + 8 ];
BUFFER_FIXED( CRYPT_MAX_HASHSIZE ) \
BYTE macWriteSecret[ CRYPT_MAX_HASHSIZE + 8 ];
/* The session scoreboard, used for the SSL session cache */
SCOREBOARD_INFO *scoreboardInfoPtr; /* Session scoreboard */
/* A buffer for the SSL packet header, which is read out-of-band */
BUFFER_FIXED( 8 + CRYPT_MAX_IVSIZE ) \
BYTE headerBuffer[ 8 + CRYPT_MAX_IVSIZE + 8 ];
} SSL_INFO;
typedef struct {
/* The packet type and padding length, which are extracted from the
packet header during header processing */
int packetType, padLength;
/* The incoming and outgoing packet sequence number, for detecting
insertion/deletion attacks */
long readSeqNo, writeSeqNo;
/* Per-channel state information */
int currReadChannel, currWriteChannel; /* Current active R/W channels */
int nextChannelNo; /* Next SSH channel no.to use */
int channelIndex; /* Current cryptlib unique channel ID */
/* Deferred response data, used to enqueue responses when unwritten data
remains in the send buffer */
SSH_RESPONSE_INFO response;
/* Whether an SSH user authentication packet has been read ready for the
server to act on */
BOOLEAN authRead;
/* A buffer for the SSH packet header, which is sent in encrypted form
and needs to be decrypted, parts discarded, and the remainder copied
into the main buffer as payload data (ugh) */
BUFFER_FIXED( CRYPT_MAX_IVSIZE ) \
BYTE headerBuffer[ CRYPT_MAX_IVSIZE + 8 ];
} SSH_INFO;
typedef struct {
/* The message imprint (hash) algorithm and hash value */
CRYPT_ALGO_TYPE imprintAlgo;
BUFFER( CRYPT_MAX_HASHSIZE, imprintSize ) \
BYTE imprint[ CRYPT_MAX_HASHSIZE ];
int imprintSize;
} TSP_INFO;
typedef struct {
/* CMP request subtype, user info and protocol flags */
int requestType; /* CMP request subtype */
CRYPT_CERTIFICATE userInfo; /* PKI user info */
int flags; /* Protocol flags */
/* The saved MAC context from a previous transaction (if any) */
CRYPT_CONTEXT savedMacContext; /* MAC context from prev.trans */
} CMP_INFO;
typedef struct {
/* SCEP protocol flags */
int flags; /* Protocol flags */
} SCEP_INFO;
/* Defines to make access to the union fields less messy */
#define sessionSSH sessionInfo.sshInfo
#define sessionSSL sessionInfo.sslInfo
#define sessionTSP sessionInfo.tspInfo
#define sessionCMP sessionInfo.cmpInfo
#define sessionSCEP sessionInfo.scepInfo
/* The structure that stores the information on a session */
typedef struct SI {
/* Control and status information */
CRYPT_SESSION_TYPE type; /* Session type */
const PROTOCOL_INFO *protocolInfo; /* Session subtype information */
int version; /* Protocol version/subtype */
CRYPT_ALGO_TYPE cryptAlgo; /* Negotiated encryption algo */
CRYPT_ALGO_TYPE integrityAlgo; /* Negotiated integrity prot.algo */
int flags, protocolFlags; /* Session info, protocol-specific flags */
int authResponse; /* Response to user-auth request */
/* Session type-specific information */
union {
SSL_INFO *sslInfo;
SSH_INFO *sshInfo;
TSP_INFO *tspInfo;
CMP_INFO *cmpInfo;
SCEP_INFO *scepInfo;
} sessionInfo;
/* When we add generic attributes to the session, we occasionally need to
perform protocol-specific checking of the attributes being added. The
following values are used to tell the generic cryptses.c code which
checks need to be performed */
int clientReqAttrFlags, serverReqAttrFlags; /* Required attributes */
/* The overall session status. If we run into a nonrecoverable error
(which for the encrypted session types means just about anything,
once we lose sync we're toast) we remember the status here so that
any further attempts to work with the session will return this
status. Since an error on one side of the channel (e.g. bad data on
read) doesn't necessarily affect the operation of the other side, we
keep track of the two sides independantly, and only set the error
state for both sides for network-related errors.
In many cases there'll still be data in the internal buffer that the
user can read/write without triggering an error response so before we
set the error state we set the pending error state and only move the
pending state into the current state once all data still present in
the buffer has been read */
int readErrorState, writeErrorState;/* Current error state */
int pendingReadErrorState, pendingWriteErrorState;
/* Error state when buffer emptied */
/* Data buffer information. In protocols that consist of single
messages sent back and forth only the receive buffer is used for
sending and receiving data, this buffer is somewhat more flexible
since it's associated with extra variables for handling the current
position in the buffer (bufPos) vs.the total amount of data present
(bufEnd) */
BUFFER( sendBufSize, sendBufPos ) \
BYTE *sendBuffer;
BUFFER_OPT( receiveBufSize, receiveBufEnd ) \
BYTE *receiveBuffer; /* Data buffer */
int sendBufSize, receiveBufSize; /* Total buffer size */
int sendBufPos, receiveBufPos; /* Current position in buffer */
int sendBufStartOfs, receiveBufStartOfs; /* Space for header in buffer */
int receiveBufEnd; /* Total data in buffer */
int maxPacketSize; /* Maximum packet (payload data) size */
/* When reading encrypted data packets we typically end up with a partial
packet in the read buffer that we can't process until the remainder
arrives, the following variables holds the eventual length of the
pending data packet, the amount of data at the start of the packet
that has already been MACd and decrypted (for protocols that require
processing of the packet header which is normally discarded as out-of-
band data), and the amount of data remaining to be read */
int pendingPacketLength; /* Lending of pending data packet */
int pendingPacketPartialLength; /* Length of data already processed */
int pendingPacketRemaining; /* Bytes remaining to be read */
/* Unlike payload data, the packet header can't be read in sections but
must be read completely since all of the header information needs to
be processed at once. The following value is usually zero, if it's
nonzero it records how much of the header remains to be read */
int partialHeaderRemaining; /* Header bytes still to read */
/* When sending data we can also end up with partially-processed packets
in the send buffer, but for sending we prevent further packets from
being added until the current one is flushed. To handle this all we
need is a simple high-water-mark indicator that indicates the start
position of any yet-to-be-written data */
BOOLEAN partialWrite; /* Unwritten data remains in buffer */
int sendBufPartialBufPos; /* Progress point of partial write */
/* The session generally has various ephemeral contexts associated with
it, some short-term (e.g.public-key contexts used to establish the
session) and some long-term (e.g.encryption contexts used to perform
bulk data encryption). These contexts are ephemeral ones that are
created as part of the session, long-term ones (e.g.signature keys
used for authentication) are held elsewhere */
CRYPT_CONTEXT iKeyexCryptContext; /* Key exchange encryption */
CRYPT_CONTEXT iKeyexAuthContext; /* Key exchange authentication */
CRYPT_CONTEXT iCryptInContext, iCryptOutContext;
/* In/outgoing data encryption */
CRYPT_CONTEXT iAuthInContext, iAuthOutContext;
/* In/outgoing auth/integrity */
CRYPT_CERTIFICATE iCertRequest, iCertResponse;
/* Cert request/response */
int cryptBlocksize, authBlocksize; /* Block size of crypt, auth.algos */
/* The private key, which is required to authenticate the client or
server in some protocols */
CRYPT_CONTEXT privateKey; /* Authentication private key */
/* Certificate store for cert management protocols like OCSP and CMP
and private-key keyset for PnP PKI protocols */
CRYPT_KEYSET cryptKeyset; /* Certificate store */
CRYPT_HANDLE privKeyset; /* Private-key keyset/device */
/* Session-related attributes, a current-position cursor in the
attribute list, and the ID of the last attribute added, used to
handle the addition of elements of attribute groups such as
username+password */
ATTRIBUTE_LIST *attributeList, *attributeListCurrent;
CRYPT_ATTRIBUTE_TYPE lastAddedAttributeID;
/* Network connection information. The reason why the client and server
info require separate storage is that (on the server) we may be
binding to a specific interface (requiring a server name) and we need
to record where the remote system's connection is coming from
(requiring a client name) */
CRYPT_SESSION transportSession; /* Transport mechanism */
int networkSocket; /* User-supplied network socket */
int readTimeout, writeTimeout, connectTimeout;
/* Connect and data xfer.timeouts */
STREAM stream; /* Network I/O stream */
/* Low-level error information */
ERROR_INFO errorInfo;
/* Pointers to session access methods. Stateful sessions use the read/
write functions, stateless ones use the transact function */
void ( *shutdownFunction )( INOUT struct SI *sessionInfoPtr ) \
STDC_NONNULL_ARG( ( 1 ) );
CHECK_RETVAL \
int ( *connectFunction )( INOUT struct SI *sessionInfoPtr ) \
STDC_NONNULL_ARG( ( 1 ) );
CHECK_RETVAL \
int ( *getAttributeFunction )( INOUT struct SI *sessionInfoPtr,
void *data,
const CRYPT_ATTRIBUTE_TYPE type ) \
STDC_NONNULL_ARG( ( 1, 2 ) );
CHECK_RETVAL \
int ( *setAttributeFunction )( INOUT struct SI *sessionInfoPtr,
const void *data,
const CRYPT_ATTRIBUTE_TYPE type ) \
STDC_NONNULL_ARG( ( 1, 2 ) );
CHECK_RETVAL \
int ( *checkAttributeFunction )( INOUT struct SI *sessionInfoPtr,
const CRYPT_HANDLE cryptHandle,
const CRYPT_ATTRIBUTE_TYPE type ) \
STDC_NONNULL_ARG( ( 1 ) );
CHECK_RETVAL \
int ( *transactFunction )( INOUT struct SI *sessionInfoPtr ) \
STDC_NONNULL_ARG( ( 1 ) );
CHECK_RETVAL \
int ( *readHeaderFunction )( INOUT struct SI *sessionInfoPtr,
INOUT READSTATE_INFO *readInfo ) \
STDC_NONNULL_ARG( ( 1, 2 ) );
CHECK_RETVAL \
int ( *processBodyFunction )( INOUT struct SI *sessionInfoPtr,
INOUT READSTATE_INFO *readInfo ) \
STDC_NONNULL_ARG( ( 1, 2 ) );
CHECK_RETVAL \
int ( *preparePacketFunction )( INOUT struct SI *sessionInfoPtr ) \
STDC_NONNULL_ARG( ( 1 ) );
/* Error information */
CRYPT_ATTRIBUTE_TYPE errorLocus;/* Error locus */
CRYPT_ERRTYPE_TYPE errorType; /* Error type */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -