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

📄 inituser.c

📁 C++编程实践与技巧一书各章节的源码
💻 C
字号:
/*
运行该函数之前,必须保证系统中有一个MY证书库,证书库
中必须包含主题为"Microsoft"和"Test Certificate"的证书。
*/


#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)
{
//--------------------------------------------------------------------

HCERTSTORE  hSystemStore;              //系统库句柄
HCERTSTORE  hMemoryStore;              //内存库句柄
HCERTSTORE  hDuplicateStore;           //打开库的副本的句柄
PCCERT_CONTEXT  pDesiredCert = NULL;   //第一个调用CertFindCertificateInStore设置为空
PCCERT_CONTEXT  pCertContext;
HANDLE  hStoreFileHandle ;             // 输出文件句柄
LPCSTR  pszFileName = "TestStor.sto";  // 输出文件名句柄

//-------------------------------------------------------------------
//在内存中打开一个新的证书库

if(hMemoryStore = CertOpenStore(
      CERT_STORE_PROV_MEMORY,    //内存库
      0,                         //编码类型,没有使用
      NULL,                      // 使用默认CSP
      0,                         // 没有标志
      NULL))                     // 不需要
{
   printf("已打开内存库");
}
else
{
   HandleError( "内存库打开错误");
}
//-------------------------------------------------------------------
//打开MY系统库

if(hSystemStore = CertOpenStore(
     CERT_STORE_PROV_SYSTEM, // 系统库为虚拟库
     0,                      //编码类型,没有使用
     NULL,                   //使用默认HCRYPTPROV. 
     CERT_SYSTEM_STORE_CURRENT_USER,
                             //设置注册表中的系统库
     L"MY"))                 //使用以前定义的系统库MY
{
   printf("打开了MY系统库\n");
}
else
{
   HandleError( "不能打开MY系统库");
}
//--------------------------------------------------------------------
//创建MY库的副本

if(hDuplicateStore = CertDuplicateStore(hSystemStore))
{
  printf("MY库已经被复制\n");
}
else
{
  printf("复制MY库失败\n");
}
//-------------------------------------------------------------------
//获取主题为"Microsoft"的证书

if(pDesiredCert=CertFindCertificateInStore(
      hSystemStore,
      MY_ENCODING_TYPE,            // 使用X509_ASN_ENCODING
      0,                           //不需要标志
      CERT_FIND_SUBJECT_STR,       // 查找主题为指定字符串的证书
      L"Microsoft",                // 指定的字符串,为要查找的证书主题
      NULL))                       //该参数第一给调用为NULL
                                   //下一次调用中为函数返回的最后一个指针
{
  printf("已经找到符合条件的证书\n");
}
else
{
   HandleError("不能找到符合条件的证书");
}
//-------------------------------------------------------------------
// pDesiredCert是主题为"Microsoft"的证书指针。

//从一个存在的证书编码部分创建一个新的证书

if(pCertContext = CertCreateCertificateContext(
    MY_ENCODING_TYPE  ,            // 编码类型
    pDesiredCert->pbCertEncoded,   //从证书中接收的编码数据
    pDesiredCert->cbCertEncoded))  //编码数据长度
{
  printf("新的证书已经被创建\n");
}
else
{
  HandleError("新的证书不能被创建");
}

//--------------------------------------------------------------------
// 从MY库中往内存库中增加证书

if(CertAddCertificateContextToStore(
      hMemoryStore,                // 证书库句柄
      pDesiredCert,                // 指向证书的指针
      CERT_STORE_ADD_USE_EXISTING,
      NULL))
{
   printf("证书已增加到内存库中\n");
}
else
{
   HandleError("不能往内存库中增加证书");
}
//-------------------------------------------------------------------
//  在MY库中查找另外一个不同的证书,并往内存库中增加它的一个连接。

//获取主题为"TEST CERTIFICATE"的证书

if(pDesiredCert=CertFindCertificateInStore(
      hSystemStore,
      MY_ENCODING_TYPE,            // 使用X509_ASN_ENCODING
      0,                           //不需要标志
      CERT_FIND_SUBJECT_STR,       // 查找主题为指定字符串的证书
      L"TEST CERTIFICATE",                // 指定的字符串,为要查找的证书主题
      NULL))                       //该参数第一给调用为NULL
                                   //下一次调用中为函数返回的最后一个指针
{
  printf("已经找到主题为'TEST CERTIFICATE'的证书\n");
}
else
{
   HandleError("不能找到主题为'TEST CERTIFICATE'的证书");
}
//--------------------------------------------------------------------
// 从MY库到新的内存库增加一个TEST CERTIFICATE证书的连接

if(CertAddCertificateLinkToStore(
      hMemoryStore,           //库句柄
      pDesiredCert,           // 指向证书的指针
      CERT_STORE_ADD_USE_EXISTING,
      NULL))
{
   printf("证书连接已增加到内存中库\n");
}
else
{
   HandleError("不能往内存库中增加证书连接");
}

//创建一个文件存储新的证书库和证书

if(hStoreFileHandle = CreateFile(
      pszFileName,        // 文件路径
      GENERIC_WRITE,      // 存取权限
      0,                  // 共享模式
      NULL,               // 安全性 
      CREATE_ALWAYS,      // 创建文件方法
      FILE_ATTRIBUTE_NORMAL,// 文件属性
      NULL))              // 模板
{
   printf("在磁盘中创建一个新的文件\n");
}
else
{
   HandleError("磁盘中创建新文件失败");
}
//-------------------------------------------------------------------
// hStoreFileHandle为输出文件句柄
//把内存库及其证书存储到输出文件中

if( CertSaveStore(
      hMemoryStore,        // 库句柄
      0,                   // 编码类型,不需要
      CERT_STORE_SAVE_AS_STORE,
      CERT_STORE_SAVE_TO_FILE,
      hStoreFileHandle,    //打开文件句柄
      0))                  // dwFlags,不需要
{
   printf("把内存库保存到文件中\n");
}
else
{
   HandleError("不能把内存库保存到文件中");
}
//-------------------------------------------------------------------
// 关闭库和文件。重新打开文件库,并检查其内容

if(hMemoryStore)
    CertCloseStore(
        hMemoryStore, 
        CERT_CLOSE_STORE_CHECK_FLAG);

if(hSystemStore)
    CertCloseStore(
        hSystemStore, 
        CERT_CLOSE_STORE_CHECK_FLAG);

if(hStoreFileHandle)
     CloseHandle(hStoreFileHandle);

printf("所有的库和文件都已经关闭\n");

//-------------------------------------------------------------------
// 重新打开文件库

if(hMemoryStore = CertOpenStore(
       CERT_STORE_PROV_FILENAME,    //库类型
       MY_ENCODING_TYPE,            // 编码类型
       NULL,                        //使用默认HCRYPTPROV.
       0,
       L"TestStor.sto" ))           //库名字
                                    
{
     printf("文件库已经被重新打开\n");
}
else
{
    printf("文件库不能被重新打开\n");
}
//--------------------------------------------------------------------
//在打开的文件库中查找证书连接

//获取主题为"TEST CERTIFICATE"的证书

if(pDesiredCert=CertFindCertificateInStore(
      hSystemStore,
      MY_ENCODING_TYPE,            // 使用X509_ASN_ENCODING
      0,                           //不需要标志
      CERT_FIND_SUBJECT_STR,       // 查找主题为指定字符串的证书
      L"TEST CERTIFICATE",                // 指定的字符串,为要查找的证书主题
      NULL))                       //该参数第一给调用为NULL
                                   //下一次调用中为函数返回的最后一个指针
{
  printf("在文件库中找到了证书连接\n");
}
else
{
   HandleError("在文件库中没有找到证书连接");
}
//-------------------------------------------------------------------
// 资源释放

if(pDesiredCert)
    CertFreeCertificateContext(pDesiredCert);
if(hMemoryStore)
    CertCloseStore(
        hMemoryStore, 
        CERT_CLOSE_STORE_CHECK_FLAG);
if(hSystemStore)
    CertCloseStore(
        hSystemStore, 
        CERT_CLOSE_STORE_CHECK_FLAG);
if(hStoreFileHandle)
     CloseHandle(hStoreFileHandle);
printf("所有的库和文件都已经关闭\n");
return;
} 

//错误处理函数
void HandleError(char *s)
{
    printf("在运行程序时出现错误\n");
    printf("%s\n",s);
    printf("错误代号 %x\n.",GetLastError());
    printf("程序终止运行\n");
    exit(1);
}

⌨️ 快捷键说明

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