Note

Access to this page requires authorization. You can try signing in or .

Access to this page requires authorization. You can try .

Example C Program: Creating and Hashing a Session Key

The following example creates and hashes a session key that can be used to encrypt a message, text, or file.

This example also shows using the following CryptoAPI functions:

This example uses the function MyHandleError. The code for this function is included with the sample. Code for this and other auxiliary functions is also listed under General Purpose Functions.

// Copyright (C) Microsoft. All rights reserved.
// 
// CreateAndHashSessionKey.cpp : Defines the entry point for the 
// application.
//

#include <stdafx.h>

#include <stdio.h>
#include <windows.h>
#include <Wincrypt.h>

// Link with the Crypt32.lib file.
#pragma comment (lib, "Crypt32")

#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)

void MyHandleError(LPTSTR psz);

void main()
{
 HCRYPTPROV hCryptProv;
 HCRYPTHASH hHash;
 HCRYPTKEY hKey;

 //---------------------------------------------------------------
 // Acquire a cryptographic provider context handle.
 if(CryptAcquireContext(
 &hCryptProv, 
 NULL, 
 NULL, 
 PROV_RSA_FULL, 
 0)) 
 {
 printf("CryptAcquireContext complete. \n");
 }
 else
 {
 MyHandleError("Acquisition of context failed.");
 }

 //---------------------------------------------------------------
 // Create a hash object.
 if(CryptCreateHash(
 hCryptProv, 
 CALG_MD5, 
 0, 
 0, 
 &hHash)) 
 {
 printf("An empty hash object has been created. \n");
 }
 else
 {
 MyHandleError("Error during CryptBeginHash!\n");
 }

 //---------------------------------------------------------------
 // Create a random session key.
 if(CryptGenKey(
 hCryptProv, 
 CALG_RC2, 
 CRYPT_EXPORTABLE, 
 &hKey)) 
 {
 printf("A random session key has been created. \n");
 }
 else
 {
 MyHandleError("Error during CryptGenKey!\n");
 }

 //---------------------------------------------------------------
 // Compute the cryptographic hash on the key object.
 if(CryptHashSessionKey(
 hHash, 
 hKey, 
 0))
 {
 printf("The session key has been hashed. \n");
 }
 else
 {
 MyHandleError("Error during CryptHashSessionKey!\n");
 }

 /*
 Use the hash of the key object. For instance, additional data 
 could be hashed and sent in a message to several recipients. The 
 recipients will be able to verify who the message originator is 
 if the key used is also exported to them.
 */

 //---------------------------------------------------------------
 // Clean up.

 // Destroy the hash object.

 if(hHash)
 {
 if(!(CryptDestroyHash(hHash)))
 {
 MyHandleError("Error during CryptDestroyHash");
 }
 }

 // Destroy the session key.
 if(hKey)
 {
 if(!(CryptDestroyKey(hKey)))
 {
 MyHandleError("Error during CryptDestroyKey");
 }
 }

 // Release the provider.
 if(hCryptProv)
 {
 if(!(CryptReleaseContext(hCryptProv,0)))
 {
 MyHandleError("Error during CryptReleaseContext");
 }
 }
} // End main.

// Define function MyHandleError.
void MyHandleError(LPTSTR psz)
{
 _ftprintf(stderr, TEXT("An error occurred in the program. \n"));
 _ftprintf(stderr, TEXT("%s\n"), psz);
 _ftprintf(stderr, TEXT("Error number %x.\n"), GetLastError());
 _ftprintf(stderr, TEXT("Program terminating. \n"));
 exit(1);
} // End of MyHandleError.


Feedback

Was this page helpful?

Additional resources