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

📄 key.h

📁 windows的加密api源码
💻 H
字号:
/* 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          */
/*********************************/

void UnpickleKey(
                 ALG_ID Algid,
                 BYTE *pbData,
                 DWORD cbData,
                 BOOL *pfExportable,
	             Key_t *pKey
                 );

Key_t *allocKey ();

// Delete a key
void freeKey (
              IN OUT Key_t *key
              );

// Copy a public key
void CopyPubKey (
                 IN Key_t *pKeyIn,
                 OUT Key_t *pKeyOut
                 );

// Initialize a key
DWORD initKey (
               IN OUT Key_t *key,
               IN Context_t *pContext,
               IN ALG_ID algId,
               IN DWORD dwFlags
               );

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
DWORD deriveKey (
                 Key_t *pKey,
                 Context_t *pContext,
                 BYTE *pbData,
                 DWORD cbData,
                 DWORD dwFlags,
                 Hash_t *pHash,
                 BOOL fGenKey,
                 BOOL fAnySizeRC2
                 );

// generate a key
DWORD generateKey (
                   IN OUT Key_t *pKey,
                   IN DWORD dwFlags,
                   IN OUT uchar *pbRandom,
                   IN DWORD cbRandom,
                   IN Context_t *pContext
                   );

// duplicate a key
DWORD DuplicateKey(
                   Context_t *pContext,
                   Key_t *pKey,
                   Key_t *pNewKey,
                   BOOL fCopyContext
                   );

// set the parameters on a key
DWORD setKeyParams (
                    IN OUT Key_t *pKey,
                    IN DWORD dwParam,
                    IN BYTE *pbData,
                    IN OUT Context_t *pContext,
                    IN DWORD dwFlags
                    );

DWORD getKeyParams (
                    IN Context_t *pContext,
                    IN Key_t *key,
                    IN DWORD param,
                    IN DWORD dwFlags,
                    OUT BYTE *data,
                    OUT DWORD *len
                    );

DWORD ImportOpaqueBlob(
	                  Context_t	*pContext,
                      DWORD dwFlags,
                      CONST BYTE *pbData,
                      DWORD cbData,
                      HCRYPTKEY *phKey
                      );

// Export the requested key into blob format
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
                );

DWORD feedPlainText (Key_t *pKey, BYTE *pbData, DWORD dwBufLen, DWORD *pdwDataLen,int final);
DWORD feedCypherText (Key_t *pKey, BYTE *pbData, DWORD *pdwDataLen, int final);

DWORD generateSignature (
                         IN Context_t *pContext,
                         IN Key_t *key,
                         IN uchar *hashVal,
                         IN DWORD hashLen,
                         OUT uchar *pbSignature,
                         OUT DWORD *pdwSigLen,
                         IN OUT uchar *random
                         );

// Verify signature
DWORD verifySignature(
                      IN Context_t *pContext,
                      IN Key_t *pKey,
                      IN uchar *pbHash,
                      IN DWORD cbHash,
                      IN uchar *pbSignature,
                      IN DWORD cbSignature
                      );

BOOL BlockEncrypt(void EncFun(BYTE *In, BYTE *Out, void *key, int op),
                  Key_t *pKey,
                  int BlockLen,
                  BOOL Final,
                  BYTE  *pbData,
                  DWORD *pdwDataLen,
                  DWORD dwBufLen);

BOOL 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.
//
BOOL TestSymmetricAlgorithm(
                            IN ALG_ID Algid,
                            IN BYTE *pbKey,
                            IN DWORD cbKey,
                            IN BYTE *pbPlaintext,
                            IN DWORD cbPlaintext,
                            IN BYTE *pbCiphertext,
                            IN 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
 */
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
 */
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

⌨️ 快捷键说明

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