📄 envelope.h
字号:
there's no more data to be hashed it's cleared to prevent out-of-band
data from being hashed as well */
CRYPT_CONTEXT iCryptContext;
/* Some types of key management/signature require additional certs.
For encryption, there may be originator certs present for use with
key agreement algorithms; for signing, there may be a signing-cert
meta-object present to contain the union of multiple sets of signing
certs if multiple signatures are present. These are held in the
following certificate object */
CRYPT_CERTIFICATE iExtraCertChain;
/* The encryption/hashing/signature defaults for this envelope. These
are recorded here for two reasons. Firstly, we need to freeze the
defaults when the envelope is created so that a later change of the
default value won't affect the enveloping process. Secondly,
different envelope types have different defaults, and setting them
once at envelope creation is easier than checking the envelope type
and choosing the appropriate algorithm every time we need to use a
default parameter */
CRYPT_ALGO_TYPE defaultHash; /* Default hash algorithm */
CRYPT_ALGO_TYPE defaultAlgo; /* Default encryption algorithm */
CRYPT_ALGO_TYPE defaultMAC; /* Default MAC algorithm */
#ifdef USE_COMPRESSION
/* zlib stream compression data structure used to hold the compression/
decompression state */
z_stream zStream; /* zlib state variable */
#endif /* USE_COMPRESSION */
/* Buffer information */
BYTE *buffer; /* Data buffer */
int bufSize; /* Total buffer size */
int bufPos; /* Last data position in buffer */
/* Auxiliary buffer used as a staging area for holding signature data
that may not currently fit into the main buffer. These are generated
into the auxiliary buffer and then copied into the main buffer as
required */
BYTE *auxBuffer; /* Buffer for sig.data */
int auxBufPos, auxBufSize; /* Current pos and total aux.buf.size */
/* When the caller knows in advance how large the payload will be, they
can advise the enveloping code of this, which allows a more efficient
encoding of the data. The following variable records the payload
size */
long payloadSize;
/* The current state of header processing. The cryptlib/CMS and PGP
processing states are kept separate (although they could actually be
merged into the same variable) because they are conceptually separate
and shouldn't really be treated as the same thing */
ENVELOPE_STATE state; /* Current state of processing */
ENV_STATE envState; /* Current state of env.non-data proc.*/
DEENV_STATE deenvState; /* Current state of de-env.non-data proc.*/
#ifdef USE_PGP
PGP_DEENV_STATE pgpDeenvState; /* Current state of PGP de-env.n-d proc.*/
#endif /* USE_PGP */
int hdrSetLength; /* Remaining bytes in SET OF EKeyInfo */
/* Some data formats place out-of-band data at the start of the payload
rather than putting it in the header, the data-left variable keeps
track of how many bytes of data still need to be removed before we
can return actual payload data to the caller. In some cases the
amount of data can't be specified as a simple byte count but involves
format-specific events (e.g. the presence of a flag or data count in
the OOB data that indicates that there's more data present), the
event-count variable records how many of these events still need to
be handled before we can return data to the caller. Finally, some
content types (e.g. compressed data) don't allow lookahead reads,
which are necessary in some cases to determine how the payload needs
to be handled. To handle this we have to remember the returned OOB
data (if it's read via a lookahead read) so that we can reinsert it
into the output stream on the next read call */
int oobDataLeft; /* Remaining out-of-band data in payload */
int oobEventCount; /* No.events left to process */
BYTE oobBuffer[ OOB_BUFFER_SIZE ]; /* Buffered OOB data */
int oobBufPos;
/* Information on the current OCTET STRING segment in the buffer during
the de-enveloping process. We keep track of the segment start point
(the byte after the OCTET STRING tag), the segment data start point
(which may move when the segment is terminated if the length encoding
shrinks due to a short segment), and whether we've just completed a
segment (which we need to do before we can pop any data from the
envelope, this is tracked via the ENVDATA_SEGMENTCOMPLETE flag). In
addition we track where the last completed segment ends, as the buffer
may contain one or more completed segments followed by an incomplete
segment, and any attempt to read into the incomplete segment will
require it to be completed first */
int segmentStart; /* Segment len+data start point */
int segmentDataStart; /* Segment data start point */
int segmentDataEnd; /* End of completed data */
/* The remaining data in the current OCTET STRING segment, explicitly
declared as a long since we may be processing data that came from a
32-bit machine on a 16-bit machine. During enveloping this is used
to track the amount of data left from the user-declared payloadSize
that can still be added to the envelope. During de-enveloping, it's
used to record how much data is left in the current segment */
long segmentSize; /* Remaining data in segment */
/* If the amount of data pushed in results in only part of a segment
header being available during the decoding process, we need to record
the state information so we can continue parsing the header when more
data is pushed. The following variables record the state information
so that processing can be interrupted and resumed at any point */
SEGHDR_STATE segHdrState; /* State of segment header processing */
long segHdrSegLength; /* Current len.of seg.being processed */
int segHdrCount; /* Current length-of-length for seg.*/
/* Once the low-level segment-processing code sees the end-of-contents
octets for the payload, we need to notify the higher-level code that
anything that follows is out-of-band data that needs to be processed
at a higher level. We do this by setting the ENVDATA_ENDOFCONTENTS
flag to record the fact that we've seen the payload EOC and have
moved to trailing out-of-band data. Since the post-payload data
isn't directly retrievable by the user, we use the dataLeft variable
to keep track of how much of what's left in the envelope is payload
that can be copied out */
int dataLeft;
/* Block cipher buffer for leftover bytes. This contains any bytes
remaining to be en/decrypted when the input data size isn't a
multiple of the cipher block size */
BYTE blockBuffer[ CRYPT_MAX_IVSIZE ]; /* Buffer of bytes */
int blockBufferPos; /* Position in buffer */
int blockSize; /* Cipher block size */
int blockSizeMask; /* Mask for blockSize-sized blocks */
/* The overall envelope status. Some error states (underflow/overflow
enveloping information errors, randomness errors, and a few others)
are recoverable whereas other states (bad data) aren't recoverable.
If we run into a nonrecoverable error, we remember the status here so
that any further attempts to work with the envelope will return this
status */
int errorState;
/* Error information */
CRYPT_ATTRIBUTE_TYPE errorLocus;/* Error locus */
CRYPT_ERRTYPE_TYPE errorType; /* Error type */
/* Pointers to the enveloping/de-enveloping functions */
int ( *addInfo )( struct EI *envelopeInfoPtr,
const CRYPT_ATTRIBUTE_TYPE envInfo,
const void *value, const int valueLength );
CRYPT_ATTRIBUTE_TYPE ( *checkMissingInfo )( struct EI *envelopeInfoPtr );
int ( *checkCryptAlgo )( const CRYPT_ALGO_TYPE cryptAlgo,
const CRYPT_ALGO_TYPE cryptMode );
int ( *checkHashAlgo )( const CRYPT_ALGO_TYPE hashAlgo );
int ( *processPreambleFunction )( struct EI *envelopeInfoPtr );
int ( *processPostambleFunction )( struct EI *envelopeInfoPtr );
int ( *copyToEnvelopeFunction )( struct EI *envelopeInfoPtr,
const BYTE *buffer, const int length );
int ( *copyFromEnvelopeFunction )( struct EI *envelopeInfoPtr,
BYTE *buffer, int length );
int ( *processExtraData )( struct EI *envelopeInfoPtr, const void *buffer,
const int length );
int ( *syncDeenvelopeData )( struct EI *envelopeInfoPtr,
STREAM *stream );
/* The object's handle and the handle of the user who owns this object.
The former is used when sending messages to the object when only the
xxx_INFO is available, the latter is used to avoid having to fetch the
same information from the system object table */
CRYPT_HANDLE objectHandle;
CRYPT_USER ownerHandle;
/* The local memory pool used to allocate small data objects attached to
the envelope */
MEMPOOL_STATE memPoolState;
/* Variable-length storage for the type-specific data */
DECLARE_VARSTRUCT_VARS;
} ENVELOPE_INFO;
/****************************************************************************
* *
* Enveloping Functions *
* *
****************************************************************************/
/* Prototypes for envelope action management functions */
ACTION_LIST *addAction( ACTION_LIST **actionListHeadPtrPtr,
MEMPOOL_STATE memPoolState,
const ACTION_TYPE actionType,
const CRYPT_HANDLE cryptHandle );
ACTION_RESULT checkAction( const ACTION_LIST *actionListStart,
const ACTION_TYPE actionType,
const CRYPT_HANDLE cryptHandle );
ACTION_LIST *findAction( ACTION_LIST *actionListPtr,
const ACTION_TYPE actionType );
void deleteAction( ACTION_LIST **actionListHead,
MEMPOOL_STATE memPoolState,
ACTION_LIST *actionListItem );
void deleteActionList( MEMPOOL_STATE memPoolState,
ACTION_LIST *actionListPtr );
void deleteUnusedActions( ENVELOPE_INFO *envelopeInfoPtr );
#ifndef NDEBUG
BOOLEAN actionsOK( ENVELOPE_INFO *envelopeInfoPtr );
#endif /* !NDEBUG */
/* Prototypes for content list management functions */
CONTENT_LIST *createContentListItem( MEMPOOL_STATE memPoolState,
const CRYPT_FORMAT_TYPE formatType,
const void *object, const int objectSize,
const BOOLEAN isSigObject );
void appendContentListItem( ENVELOPE_INFO *envelopeInfoPtr,
CONTENT_LIST *contentListItem );
void deleteContentList( MEMPOOL_STATE memPoolState,
CONTENT_LIST **contentListHeadPtr );
/* Prototypes for misc.management functions */
int addKeyset( ENVELOPE_INFO *envelopeInfoPtr,
const CRYPT_ATTRIBUTE_TYPE keysetFunction,
const CRYPT_KEYSET keyset );
/* Prepare the envelope for data en/decryption */
int initEnvelopeEncryption( ENVELOPE_INFO *envelopeInfoPtr,
const CRYPT_CONTEXT cryptContext,
const CRYPT_ALGO_TYPE algorithm,
const CRYPT_MODE_TYPE mode,
const BYTE *iv, const int ivLength,
const BOOLEAN copyContext );
/* Prototypes for envelope mapping functions */
#ifdef USE_CMS
void initCMSEnveloping( ENVELOPE_INFO *envelopeInfoPtr );
void initCMSDeenveloping( ENVELOPE_INFO *envelopeInfoPtr );
#else
#define initCMSEnveloping( envelopeInfoPtr )
#define initCMSDeenveloping( envelopeInfoPtr )
#endif /* USE_CMS */
#ifdef USE_PGP
void initPGPEnveloping( ENVELOPE_INFO *envelopeInfoPtr );
void initPGPDeenveloping( ENVELOPE_INFO *envelopeInfoPtr );
#else
#define initPGPEnveloping( envelopeInfoPtr )
#define initPGPDeenveloping( envelopeInfoPtr )
#endif /* USE_PGP */
void initEnvelopeStreaming( ENVELOPE_INFO *envelopeInfoPtr );
void initEnvResourceHandling( ENVELOPE_INFO *envelopeInfoPtr );
void initDeenvelopeStreaming( ENVELOPE_INFO *envelopeInfoPtr );
void initDenvResourceHandling( ENVELOPE_INFO *envelopeInfoPtr );
#endif /* _ENV_DEFINED */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -