SIGNFILE.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:5k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /******************************************************************************
  2. *       This is a part of the Microsoft Source Code Samples. 
  3. *       Copyright 1996-1997 Microsoft Corporation.
  4. *       All rights reserved. 
  5. *       This source code is only intended as a supplement to 
  6. *       Microsoft Development Tools and/or WinHelp documentation.
  7. *       See these sources for detailed information regarding the 
  8. *       Microsoft samples programs.
  9. ******************************************************************************/
  10. #include <windows.h>
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <wincrypt.h>
  14. static BOOL SignFile(PCHAR szSourceFile, PCHAR szSignatureFile, PCHAR szDescription);
  15. /*****************************************************************************/
  16. void _cdecl main(int argc, char *argv[])
  17. {
  18.     PCHAR szSourceFile   = NULL;
  19.     PCHAR szSignatureFile = NULL;
  20.     PCHAR szDescription   = NULL;
  21.     // Validate argument count.
  22.     if(argc != 4) {
  23. printf("USAGE: signfile <source file> <signature file> <description>n");
  24. exit(1);
  25.     }
  26.     // Parse arguments.
  27.     szSourceFile    = argv[1];
  28.     szSignatureFile = argv[2];
  29.     szDescription   = argv[3];
  30.     if(!SignFile(szSourceFile, szSignatureFile, szDescription)) {
  31. printf("Error signing file!n");
  32. exit(1);
  33.     }
  34.     exit(0);
  35. }
  36. /*****************************************************************************/
  37. static BOOL SignFile(PCHAR szSourceFile, PCHAR szSignatureFile, PCHAR szDescription)
  38. {
  39.     FILE *hSourceFile  = NULL;
  40.     FILE *hSignatureFile = NULL;
  41.     INT eof = 0;
  42.     HCRYPTPROV hProv = 0;
  43.     HCRYPTHASH hHash = 0;
  44.     PBYTE pbSignature = NULL;
  45.     DWORD dwSignatureLen;
  46.     PBYTE pbBuffer    = NULL;
  47.     DWORD dwBufferLen;
  48.     DWORD dwCount;
  49.     // Get handle to the default provider.
  50.     if(!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0)) {
  51.         printf("Error %x during CryptAcquireContext!n", GetLastError());
  52. goto error;
  53.     }
  54.     //
  55.     // Hash source file.
  56.     //
  57.     // Determine number of bytes to hash at once.
  58.     dwBufferLen = 1000;
  59.     // Allocate memory for 'pbBuffer'.
  60.     if((pbBuffer = malloc(dwBufferLen)) == NULL) {
  61. printf("Out of memory 1!n");
  62. goto error;
  63.     }
  64.     // Open source file.
  65.     if((hSourceFile = fopen(szSourceFile,"rb")) == NULL) {
  66. printf("Error opening source file!n");
  67. goto error;
  68.     }
  69.     // Create a hash object.
  70.     if(!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) {
  71. printf("Error %x during CryptCreateHash!n", GetLastError());
  72. goto error;
  73.     }
  74.     // Hash source file.
  75.     do {
  76. // Read up to 'dwBufferLen' bytes from source file.
  77. dwCount = fread(pbBuffer, 1, dwBufferLen, hSourceFile);
  78. if(ferror(hSourceFile)) {
  79.     printf("Error reading Plaintext!n");
  80.     goto error;
  81.         }
  82. eof = feof(hSourceFile);
  83. // Add data to hash object.
  84. if(!CryptHashData(hHash, pbBuffer, dwCount, 0)) {
  85.     printf("Error %x during CryptHashData!n", GetLastError());
  86.     goto error;
  87. }
  88.     } while(!feof(hSourceFile));
  89.     // Close source file.
  90.     fclose(hSourceFile);
  91.     hSourceFile = 0;
  92.     // Free 'pbBuffer' memory.
  93.     free(pbBuffer);
  94.     pbBuffer = NULL;
  95.     //
  96.     // Sign hash object.
  97.     //
  98.     // Determine size of signature.
  99.     dwCount = 0;
  100.     if(!CryptSignHash(hHash, AT_SIGNATURE, NULL, 0, NULL, &dwSignatureLen)) {
  101. printf("Error %x during CryptSignHash 1!n", GetLastError());
  102. goto error;
  103.     }
  104.     // Allocate memory for 'pbSignature'.
  105.     if((pbSignature = malloc(dwSignatureLen)) == NULL) {
  106. printf("Out of memory 2!n");
  107. goto error;
  108.     }
  109.     // Sign hash object (with signature key).
  110.     if(!CryptSignHash(hHash, AT_SIGNATURE, szDescription, 0, pbSignature, &dwSignatureLen)) {
  111. printf("Error %x during CryptSignHash 2!n", GetLastError());
  112. goto error;
  113.     }
  114.     //
  115.     // Write signature to signature file.
  116.     //
  117.     // Open signature file.
  118.     if((hSignatureFile = fopen(szSignatureFile,"wb")) == NULL) {
  119. printf("Error opening signature file!n");
  120. goto error;
  121.     }
  122.     // Write signature to signature file.
  123.     fwrite(pbSignature, 1, dwSignatureLen, hSignatureFile);
  124.     if(ferror(hSignatureFile)) {
  125. printf("Error writing signature!n");
  126. goto error;
  127.     }
  128.     // Close signature file.
  129.     fclose(hSignatureFile);
  130.     hSignatureFile = 0;
  131.     // Free 'pbSignature' memory.
  132.     free(pbSignature);
  133.     pbSignature = NULL;
  134.     // Destroy hash object.
  135.     CryptDestroyHash(hHash);
  136.     hHash = 0;
  137.     // Release provider handle.
  138.     CryptReleaseContext(hProv, 0);
  139.     hProv = 0;
  140.     printf("OKn");
  141.     return TRUE;
  142.     error:
  143.     //
  144.     // Do cleanup
  145.     //
  146.     // Close files.
  147.     if(hSourceFile) fclose(hSourceFile);
  148.     if(hSignatureFile) fclose(hSignatureFile);
  149.     // Free memory.
  150.     if(pbSignature) free(pbSignature);
  151.     if(pbBuffer) free(pbBuffer);
  152.     // Release crypto handles.
  153.     if(hHash) CryptDestroyHash(hHash);
  154.     if(hProv) CryptReleaseContext(hProv, 0);
  155.     return FALSE;
  156. }