|
|
/* key.h */
#ifdef __cplusplus
extern "C" { #endif
// needs to be put into wincrypt.h or left open in wincrypt.h
#define KP_Z 30
#define IPSEC_FLAG_CHECK 0xF42A19B6
static BYTE rgbSymmetricKeyWrapIV[8] = {0x4a, 0xdd, 0xa2, 0x2c, 0x79, 0xe8, 0x21, 0x05};
/*********************************/ /* Function Definitions */ /*********************************/
extern void UnpickleKey( ALG_ID Algid, BYTE *pbData, DWORD cbData, BOOL *pfExportable, Key_t *pKey);
extern Key_t * allocKey( void);
// Delete a key
extern void freeKey( IN OUT Key_t *key);
// Copy a public key
extern void CopyPubKey( IN Key_t *pKeyIn, OUT Key_t *pKeyOut);
// Initialize a key
extern DWORD initKey( IN OUT Key_t *key, IN Context_t *pContext, IN ALG_ID algId, IN DWORD dwFlags);
extern BOOL checkKey( Key_t *key);
// Derive key
// if the pHash parameter is non zero and the key to be derived is a
// 3 Key triple DES key, then the data is expanded to the appropriate key size
extern DWORD deriveKey( Key_t *pKey, Context_t *pContext, BYTE *pbData, DWORD cbData, DWORD dwFlags, Hash_t *pHash, BOOL fGenKey, BOOL fAnySizeRC2);
// generate a key
extern DWORD generateKey( IN OUT Key_t *pKey, IN DWORD dwFlags, IN OUT uchar *pbRandom, IN DWORD cbRandom, IN Context_t *pContext);
// duplicate a key
extern DWORD DuplicateKey( Context_t *pContext, Key_t *pKey, Key_t *pNewKey, BOOL fCopyContext);
// set the parameters on a key
extern DWORD setKeyParams( IN OUT Key_t *pKey, IN DWORD dwParam, IN CONST BYTE *pbData, IN OUT Context_t *pContext, IN DWORD dwFlags);
extern DWORD getKeyParams( IN Context_t *pContext, IN Key_t *key, IN DWORD param, IN DWORD dwFlags, OUT BYTE *data, OUT DWORD *len);
extern DWORD ImportOpaqueBlob( Context_t *pContext, CONST BYTE *pbData, DWORD cbData, HCRYPTKEY *phKey);
// Export the requested key into blob format
extern DWORD exportKey( IN Context_t *pContext, IN Key_t *pKey, IN Key_t *pEncKey, IN DWORD dwBlobType, IN DWORD dwFlags, OUT BYTE *pbBlob, OUT DWORD *pcbBlob, IN BOOL fInternalExport);
extern DWORD feedPlainText( Key_t *pKey, BYTE *pbData, DWORD dwBufLen, DWORD *pdwDataLen, int final);
extern DWORD feedCypherText( Key_t *pKey, BYTE *pbData, DWORD *pdwDataLen, int final);
extern DWORD generateSignature( IN Context_t *pContext, IN Key_t *key, IN uchar *hashVal, OUT uchar *pbSignature, OUT DWORD *pdwSigLen);
// Verify signature
extern DWORD verifySignature( IN Context_t *pContext, IN Key_t *pKey, IN uchar *pbHash, IN DWORD cbHash, IN uchar *pbSignature, IN DWORD cbSignature);
extern DWORD BlockEncrypt( void EncFun(BYTE *In, BYTE *Out, void *key, int op), Key_t *pKey, int BlockLen, BOOL Final, BYTE *pbData, DWORD *pdwDataLen, DWORD dwBufLen);
extern DWORD BlockDecrypt( void DecFun(BYTE *In, BYTE *Out, void *key, int op), Key_t *pKey, int BlockLen, BOOL Final, BYTE *pbData, DWORD *pdwDataLen);
//
// Function : TestSymmetricAlgorithm
//
// Description : This function expands the passed in key buffer for the appropriate algorithm,
// encrypts the plaintext buffer with the same algorithm and key, and the
// compares the passed in expected ciphertext with the calculated ciphertext
// to make sure they are the same. The function only uses ECB mode for
// block ciphers and the plaintext buffer must be the same length as the
// ciphertext buffer. The length of the plaintext must be either the
// the block length of the cipher if it is a block cipher or less
// than MAX_BLOCKLEN if a stream cipher is being used.
//
extern DWORD TestSymmetricAlgorithm( IN ALG_ID Algid, IN CONST BYTE *pbKey, IN DWORD cbKey, IN CONST BYTE *pbPlaintext, IN DWORD cbPlaintext, IN CONST BYTE *pbCiphertext, IN CONST BYTE *pbIV);
/*
- GetRC4KeyForSymWrap - * Purpose: * RC4 or more precisely stream ciphers are not supported by the CMS spec * on symmetric key wrapping so we had to do something proprietary since * we want to support RC4 for applications other than SMIME * * * Parameters: * IN pContext - Pointer to the context * IN pbSalt - Pointer to the 8 byte salt buffer * IN pKey - Pointer to the orignial key * OUT ppNewKey - Pointer to a pointer to the new key */ extern DWORD GetRC4KeyForSymWrap( IN Context_t *pContext, IN BYTE *pbSalt, IN Key_t *pKey, OUT Key_t **ppNewKey);
/*
- GetSymmetricKeyChecksum - * Purpose: * Calculates the checksum for a symmetric key which is to be * wrapped with another symmetric key. This should meet the * CMS specification * * * Parameters: * IN pKey - Pointer to the key * OUT pbChecksum - Pointer to the 8 byte checksum */ extern void GetSymmetricKeyChecksum( IN BYTE *pbKey, IN DWORD cbKey, OUT BYTE *pbChecksum);
// check for symmetric wrapping support
#define UnsupportedSymKey(pKey) ((CALG_RC4 != pKey->algId) && \
(CALG_RC2 != pKey->algId) && \ (CALG_DES != pKey->algId) && \ (CALG_CYLINK_MEK != pKey->algId) && \ (CALG_3DES != pKey->algId) && \ (CALG_3DES_112 != pKey->algId))
#ifdef __cplusplus
} #endif
|