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

📄 inituser.c

📁 C++编程实践与技巧一书各章节的源码
💻 C
字号:
// Example code for encoding and decoding a message.

//--------------------------------------------------------------------
//   In this and all other sample and example code, 
//   use the #define and #include statements listed 
//   under #includes and #defines.

#include <stdio.h>
#include <windows.h>
#include <wincrypt.h>
#define MY_ENCODING_TYPE  (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
void HandleError(char *s);

void main(void)
{
//-------------------------------------------------------------
// Declare and initialize variables. This includes getting a pointer 
// to the message content. This sample program creates the message 
// content and gets a pointer to it. In most situations, 
// the content will exist somewhere and a pointer to it
// will get passed to the application. 

HCRYPTMSG hMsg;
BYTE* pbContent;     // A byte pointer to the message
DWORD cbContent;     // The size of message
DWORD cbEncodedBlob;
BYTE *pbEncodedBlob;


//--------------------------------------------------------------------
//  The following variables are used only in the decoding phase.

DWORD cbData = sizeof(DWORD);
DWORD cbDecoded;
BYTE *pbDecoded;

//--------------------------------------------------------------------
//  Begin processing. Display the original message.

pbContent = (BYTE*) "Security is our only business";
cbContent = strlen((char *) pbContent)+1;

printf("The original message => %s\n",pbContent);  

//--------------------------------------------------------------------
// Get the size of the encoded message blob.

if(cbEncodedBlob = CryptMsgCalculateEncodedLength(
             MY_ENCODING_TYPE,       // Message encoding type
             0,                      // Flags
             CMSG_DATA,              // Message type
             NULL,                   // Pointer to structure
             NULL,                   // Inner content object ID
             cbContent))             // Size of content
{
    printf("The length of the data has been calculated. \n");
}
else
{
    HandleError("Getting cbEncodedBlob length failed");
}
//--------------------------------------------------------------------
// Allocate memory for the encoded blob.

if(pbEncodedBlob = (BYTE *) malloc(cbEncodedBlob))
{
   printf("Memory has been allocated for the signed message. \n");
}
else
{
   HandleError("Memory allocation failed");
}
//--------------------------------------------------------------------
// Open a message to encode.

if(hMsg = CryptMsgOpenToEncode(
          MY_ENCODING_TYPE,        // Encoding type
          0,                       // Flags
          CMSG_DATA,               // Message type
          NULL,                    // Pointer to structure
          NULL,                    // Inner content object ID
          NULL))                   // Stream information (not used)
{
    printf("The message to be encoded has been opened. \n");
}
else
{
     HandleError("OpenToEncode failed");
}
//--------------------------------------------------------------------
// Update the message with the data.

if(CryptMsgUpdate(
        hMsg,         // Handle to the message
        pbContent,    // Pointer to the content
        cbContent,    // Size of the content
        TRUE))        // Last call
{
     printf("Content has been added to the encoded message. \n");
}
else
{
      HandleError("MsgUpdate failed");
}
//--------------------------------------------------------------------
// Get the resulting message.

if(CryptMsgGetParam(
               hMsg,                      // Handle to the message
               CMSG_BARE_CONTENT_PARAM,   // Parameter type
               0,                         // Index
               pbEncodedBlob,             // Pointer to the blob
               &cbEncodedBlob))           // Size of the blob
{
    printf("Message encoded successfully. \n");
}
else
{
      HandleError("MsgGetParam failed");
}
//--------------------------------------------------------------------
// pbEncodedBlob now points to the encoded, signed content.

//--------------------------------------------------------------------
// Close the message.

if(hMsg)
    CryptMsgClose(hMsg);

//--------------------------------------------------------------------
// The following code decodes a message. 
// This code may be included here or could be used
// in a stand-alone program if the message 
// to be decoded and its size were input. 
// The encoded message blob and its length could be read 
// from a disk file or could be extracted from an e-mail message 
// or other input source.

//--------------------------------------------------------------------
// Open a message for decoding.

if(hMsg = CryptMsgOpenToDecode(
               MY_ENCODING_TYPE,      // Encoding type.
               0,                     // Flags.
               CMSG_DATA,             // Look for a data message.
               NULL,                  // Cryptographic provider.
               NULL,                  // Recipient information.
               NULL))                 // Stream information.
{
     printf("The message to decode is open. \n");
}
else
{
    HandleError("OpenToDecode failed");
}
//--------------------------------------------------------------------
// Update the message with an encoded blob.
// Both pbEncodedBlob, the encoded data, 
// and cbEncodeBlob, the length of the encoded data,
// must be available. 

printf("\nThe length of the encoded message is %d.\n\n",cbEncodedBlob);

if(CryptMsgUpdate(
    hMsg,                 // Handle to the message
    pbEncodedBlob,        // Pointer to the encoded blob
    cbEncodedBlob,        // Size of the encoded blob
    TRUE))                // Last call
{
      printf("The encoded blob has been added to the message. \n");
}
else
{
    HandleError("Decode MsgUpdate failed");
}
//--------------------------------------------------------------------
// Get the size of the content.

if(CryptMsgGetParam(
                  hMsg,                  // Handle to the message
                  CMSG_CONTENT_PARAM,    // Parameter type
                  0,                     // Index
                  NULL,                  // Address for returned 
                                         // information
                  &cbDecoded))           // Size of the returned
                                         // information
{
    printf("The decoded message size is %d. \n", cbDecoded);
}
else
{
    HandleError("Decode CMSG_CONTENT_PARAM failed");
}
//--------------------------------------------------------------------
// Allocate memory.

if(pbDecoded = (BYTE *) malloc(cbDecoded))
{
     printf("Memory has been allocated for the decoded message.\n");
}
else
{
    HandleError("Decoding memory allocation failed.");
}
//--------------------------------------------------------------------
// Get a pointer to the content.

if(CryptMsgGetParam(
                  hMsg,                  // Handle to the message
                  CMSG_CONTENT_PARAM,    // Parameter type
                  0,                     // Index
                  pbDecoded,             // Address for returned 
                                         // information
                  &cbDecoded))           // Size of the returned 
                                         // information
{
     printf("The message is %s.\n",(LPSTR)pbDecoded);
}
else
{
     HandleError("Decode CMSG_CONTENT_PARAM #2 failed");
}
//--------------------------------------------------------------------
// Clean up.

if(pbEncodedBlob)
   free(pbEncodedBlob);
if(pbDecoded)
   free(pbDecoded);
if(hMsg)
    CryptMsgClose(hMsg);

printf("This program ran to completion without error. \n");

} //  End of main
//--------------------------------------------------------------------
//  This example uses the function HandleError, a simple error
//  handling function, to print an error message and exit 
//  the program. 
//  For most applications, replace this function with one 
//  that does more extensive error reporting.

void HandleError(char *s)
{
    printf("An error occurred in running the program.\n");
    printf("%s\n",s);
    printf("Error number %x\n.",GetLastError());
    printf("Program terminating.\n");
    exit(1);
}

⌨️ 快捷键说明

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