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

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 <stdlib.h>
  11. #include <stdio.h>
  12. #include <ctype.h>
  13. #include <windows.h>
  14. #include <wincrypt.h>
  15. /*****************************************************************************/
  16. void _cdecl main(int argc, char *argv[])
  17. {
  18.     HCRYPTPROV hProv = 0;
  19.     BYTE *ptr = NULL;
  20.     DWORD i;
  21.     ALG_ID aiAlgid;
  22.     DWORD dwBits;
  23.     DWORD dwNameLen;
  24.     CHAR szName[100];       // Often allocated dynamically.
  25.     BYTE pbData[1000];       // Often allocated dynamically.
  26.     DWORD dwDataLen;
  27.     DWORD dwFlags;
  28.     CHAR *pszAlgType = NULL;
  29.     // Get handle to the default provider.
  30.     if(!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0)) {
  31.         printf("Error %x during CryptAcquireContext!n", GetLastError());
  32.         goto done;
  33.     }
  34.     // Enumerate the supported algorithms.
  35.     for(i=0 ; ; i++) {
  36. // Set the CRYPT_FIRST flag the first time through the loop.
  37. if(i == 0) {
  38.     dwFlags = CRYPT_FIRST;
  39. } else {
  40.     dwFlags = 0;
  41. }
  42. // Retrieve information about an algorithm.
  43. dwDataLen = 1000;
  44. if(!CryptGetProvParam(hProv, PP_ENUMALGS, pbData, &dwDataLen, 0)) {
  45.     if(GetLastError() == ERROR_NO_MORE_ITEMS) {
  46. // Exit the loop.
  47. break;
  48.     } else {
  49. printf("Error %x reading algorithm!n", GetLastError());
  50. return;
  51.     }
  52. }
  53. // Extract algorithm information from 'pbData' buffer.
  54. ptr = pbData;
  55. aiAlgid = *(ALG_ID *)ptr;
  56. ptr += sizeof(ALG_ID);
  57. dwBits = *(DWORD *)ptr;
  58. ptr += sizeof(DWORD);
  59. dwNameLen = *(DWORD *)ptr;
  60. ptr += sizeof(DWORD);
  61. strncpy(szName, ptr,dwNameLen);
  62. // Determine algorithm type.
  63. switch(GET_ALG_CLASS(aiAlgid)) {
  64.     case ALG_CLASS_DATA_ENCRYPT: pszAlgType = "Encrypt  ";
  65.  break;
  66.     case ALG_CLASS_HASH:  pszAlgType = "Hash     ";
  67.  break;
  68.     case ALG_CLASS_KEY_EXCHANGE: pszAlgType = "Exchange ";
  69.  break;
  70.     case ALG_CLASS_SIGNATURE:  pszAlgType = "Signature";
  71.  break;
  72.     default:  pszAlgType = "Unknown  ";
  73. }
  74. // Print information about algorithm.
  75. printf("Name:%-14s Type:%s  Bits:%-4d Algid:%8.8xhn",
  76.     szName, pszAlgType, dwBits, aiAlgid
  77. );
  78.     }
  79.     done:
  80.     // Release CSP handle.
  81.     if(hProv) CryptReleaseContext(hProv,0);
  82. }