TEST(SKF_CONTAINER_MANAGE,SKF_CloseContainer_Test) { ULONG result; LPSTR containerName; ULONG containerType; SKF_CloseContainer skf_closeContainer = SKF_CloseContainer(GetProcAddress(hmodule,"SKF_CloseContainer")); result = skf_closeContainer(hContainer); EXPECT_EQ(0,(int)result); }
DWORD WINAPI ThreadFuncSKFImportCerts(LPVOID aThisClass) { CClassCommon * thisClass = (CClassCommon*)aThisClass; char szDevNameLists[BUFFER_LEN_1K] = {0}; char szAppNameLists[BUFFER_LEN_1K] = {0}; char szConNameLists[BUFFER_LEN_1K]; ULONG ulDevNameLists = BUFFER_LEN_1K; ULONG ulAppNameLists = BUFFER_LEN_1K; ULONG ulConNameLists = BUFFER_LEN_1K; HANDLE hDevSKF = NULL; HANDLE hConSKF = NULL; HANDLE hAppSKF = NULL; // 枚举设备 thisClass->ulResult = SKF_EnumDev(TRUE,szDevNameLists,&ulDevNameLists); if(thisClass->ulResult) { goto err; } if(ulDevNameLists < 2) { thisClass->ulResult = OPE_ERR_NO_DEV; goto err; } // 打开设备 thisClass->ulResult = SKF_ConnectDev(szDevNameLists,&hDevSKF); if(ulDevNameLists < 2) { goto err; } thisClass->ulResult = SKF_EnumApplication(hDevSKF,szAppNameLists, &ulAppNameLists); // 设备认证或者打开一个应用 if (ulAppNameLists < 2) { thisClass->ulResult = FuncSKF_DevAuth(hDevSKF,&hAppSKF,(thisClass->m_szPIN),8); } else { thisClass->ulResult = SKF_OpenApplication(hDevSKF, szAppNameLists,&hAppSKF); } // 验证密码 thisClass->ulResult = SKF_VerifyPIN(hAppSKF, 1, (thisClass->m_szPIN),&(thisClass->m_ulRetry)); if(thisClass->ulResult) { goto err; } // 枚举容器 thisClass->ulResult = SKF_EnumContainer(hAppSKF,szConNameLists,&ulConNameLists); if(thisClass->ulResult) { goto err; } // 创建或打开容器 if (ulConNameLists < 2) { thisClass->ulResult = SKF_CreateContainer(hAppSKF, DEFAULT_CONTAINER, &hConSKF); } else { thisClass->ulResult = SKF_OpenContainer(hAppSKF, szConNameLists, &hConSKF); } if(thisClass->ulResult) { goto err; } // 导入证书 thisClass->ulResult = SKF_ImportCertificate(hConSKF, 1, thisClass->m_szCertSIGN,thisClass->m_iCertSIGNLen); if(thisClass->ulResult) { goto err; } // 导入证书 thisClass->ulResult = SKF_ImportCertificate(hConSKF, 0, thisClass->m_szCertEX,thisClass->m_iCertEXLen); if(thisClass->ulResult) { goto err; } // 拷贝签名公钥 memcpy(thisClass->m_szPublicKeyEX, thisClass->m_stEnvelopedKeyBlobEX.PubKey.XCoordinate + SM2_BYTES_LEN, SM2_BYTES_LEN); memcpy(thisClass->m_szPublicKeyEX+SM2_BYTES_LEN, thisClass->m_stEnvelopedKeyBlobEX.PubKey.YCoordinate + SM2_BYTES_LEN, SM2_BYTES_LEN); FILE_LOG_FMT(file_log_name, "%s %d %d", __FUNCTION__, __LINE__, 1); FILE_LOG_HEX(file_log_name,thisClass->m_szPublicKeyEX,SM2_BYTES_LEN * 2); err: if (hConSKF) { SKF_CloseContainer(hConSKF); } if (hAppSKF) { SKF_CloseApplication(hAppSKF); } if (hDevSKF) { SKF_DisConnectDev(hDevSKF); } return 0; }
DWORD WINAPI ThreadFuncSKFGenCSR(LPVOID aThisClass) { CClassCommon * thisClass = (CClassCommon*)aThisClass; char szDevNameLists[BUFFER_LEN_1K] = {0}; char szAppNameLists[BUFFER_LEN_1K] = {0}; char szConNameLists[BUFFER_LEN_1K]; ULONG ulDevNameLists = BUFFER_LEN_1K; ULONG ulAppNameLists = BUFFER_LEN_1K; ULONG ulConNameLists = BUFFER_LEN_1K; HANDLE hDevSKF = NULL; HANDLE hConSKF = NULL; HANDLE hAppSKF = NULL; unsigned long ulPublicKeyLen = 2 * SM2_BYTES_LEN + 1; unsigned char pbPublicKey[2 * SM2_BYTES_LEN + 1] = {0}; unsigned char pbDigest[SM2_BYTES_LEN] = {0}; unsigned int ulDigestLen = SM2_BYTES_LEN; unsigned char szX509content[BUFFER_LEN_1K * 4]; unsigned long ulX509ContentLen = BUFFER_LEN_1K * 4; ECCSIGNATUREBLOB stSigBlob = {0}; // 初始化 thisClass->ulResult = OpenSSL_Initialize(); if(thisClass->ulResult) { goto err; } thisClass->m_iCsrLen = BUFFER_LEN_1K * 4; thisClass->ulResult = OpenSSL_SM2GenCSRWithPubkey( &(thisClass->userInfo), thisClass->m_szPublicKeySIGN,SM2_BYTES_LEN, thisClass->m_szPublicKeySIGN+SM2_BYTES_LEN,SM2_BYTES_LEN, thisClass->m_szCsr, &(thisClass->m_iCsrLen) ); FILE_LOG_FMT(file_log_name, "%s %d %d", __FUNCTION__, __LINE__, 2); FILE_LOG_HEX(file_log_name, thisClass->m_szCsr, thisClass->m_iCsrLen); // 签名证书请求 thisClass->m_iSignedCsrLen = BUFFER_LEN_1K * 4; FILE_LOG_STRING(file_log_name, "8"); // 枚举设备 thisClass->ulResult = SKF_EnumDev(TRUE,szDevNameLists,&ulDevNameLists); if(thisClass->ulResult) { goto err; } if(ulDevNameLists < 2) { thisClass->ulResult = OPE_ERR_NO_DEV; goto err; } // 打开设备 thisClass->ulResult = SKF_ConnectDev(szDevNameLists,&hDevSKF); if(ulDevNameLists < 2) { goto err; } thisClass->ulResult = SKF_EnumApplication(hDevSKF,szAppNameLists, &ulAppNameLists); // 设备认证或者打开一个应用 if (ulAppNameLists < 2) { thisClass->ulResult = FuncSKF_DevAuth(hDevSKF,&hAppSKF,(thisClass->m_szPIN),8); } else { thisClass->ulResult = SKF_OpenApplication(hDevSKF, szAppNameLists,&hAppSKF); } // 验证密码 thisClass->ulResult = SKF_VerifyPIN(hAppSKF, 1, (thisClass->m_szPIN),&(thisClass->m_ulRetry)); if(thisClass->ulResult) { goto err; } // 枚举容器 thisClass->ulResult = SKF_EnumContainer(hAppSKF,szConNameLists,&ulConNameLists); if(thisClass->ulResult) { goto err; } // 创建或打开容器 if (ulConNameLists < 2) { thisClass->ulResult = SKF_CreateContainer(hAppSKF, DEFAULT_CONTAINER, &hConSKF); } else { thisClass->ulResult = SKF_OpenContainer(hAppSKF, szConNameLists, &hConSKF); } if(thisClass->ulResult) { goto err; } memcpy(pbPublicKey, "\x04", 1); memcpy(pbPublicKey + 1 , thisClass->m_szPublicKeySIGN, SM2_BYTES_LEN * 2); thisClass->ulResult = OpenSSL_GetX509Content(thisClass->m_szCsr, thisClass->m_iCsrLen, X509_TYPE_CSR, szX509content,&ulX509ContentLen ); if(thisClass->ulResult) { goto err; } thisClass->ulResult = tcm_get_message_hash( szX509content, ulX509ContentLen, (unsigned char *)"1234567812345678", 16, pbPublicKey, ulPublicKeyLen,pbDigest,&ulDigestLen); if(thisClass->ulResult) { goto err; } FILE_LOG_FMT(file_log_name, "%s %d %s", __FUNCTION__, __LINE__,"pbPublicKey"); FILE_LOG_HEX(file_log_name,pbPublicKey, SM2_BYTES_LEN * 2 + 1); FILE_LOG_FMT(file_log_name, "%s %d %s", __FUNCTION__, __LINE__,"pbDigest"); FILE_LOG_HEX(file_log_name,pbDigest, ulDigestLen); FILE_LOG_FMT(file_log_name, "%s %d %s", __FUNCTION__, __LINE__,"m_szCsr"); FILE_LOG_HEX(file_log_name,thisClass->m_szCsr, thisClass->m_iCsrLen); FILE_LOG_FMT(file_log_name, "%s %d %s", __FUNCTION__, __LINE__,"szX509content"); FILE_LOG_HEX(file_log_name,szX509content, ulX509ContentLen); thisClass->ulResult = SKF_ECCSignData(hConSKF,pbDigest,ulDigestLen,&stSigBlob); if(thisClass->ulResult) { goto err; } thisClass->ulResult = OpenSSL_SM2SetX509SignValue( thisClass->m_szCsr, thisClass->m_iCsrLen, X509_TYPE_CSR, stSigBlob.r + SM2_BYTES_LEN,SM2_BYTES_LEN, stSigBlob.s + SM2_BYTES_LEN,SM2_BYTES_LEN, thisClass->m_szSignedCsr, &(thisClass->m_iSignedCsrLen) ); if(thisClass->ulResult) { goto err; } ::FILE_LOG_FMT(file_log_name, "%s %d %s", __FUNCTION__, __LINE__,"RS"); ::FILE_LOG_HEX(file_log_name, stSigBlob.r + SM2_BYTES_LEN , SM2_BYTES_LEN); ::FILE_LOG_HEX(file_log_name, stSigBlob.r + SM2_BYTES_LEN , SM2_BYTES_LEN); err: if (hConSKF) { SKF_CloseContainer(hConSKF); } if (hAppSKF) { SKF_CloseApplication(hAppSKF); } if (hDevSKF) { SKF_DisConnectDev(hDevSKF); } OpenSSL_Finalize(); return 0; }
DWORD WINAPI ThreadFuncSKFGenSM2KeyPair(LPVOID aThisClass) { CClassCommon * thisClass = (CClassCommon*)aThisClass; char szDevNameLists[BUFFER_LEN_1K] = {0}; char szAppNameLists[BUFFER_LEN_1K] = {0}; char szConNameLists[BUFFER_LEN_1K]; ULONG ulDevNameLists = BUFFER_LEN_1K; ULONG ulAppNameLists = BUFFER_LEN_1K; ULONG ulConNameLists = BUFFER_LEN_1K; HANDLE hDevSKF = NULL; HANDLE hConSKF = NULL; HANDLE hAppSKF = NULL; ECCPUBLICKEYBLOB pubkeyBlob = {0}; // 枚举设备 thisClass->ulResult = SKF_EnumDev(TRUE,szDevNameLists,&ulDevNameLists); if(thisClass->ulResult) { goto err; } ::FILE_LOG_STRING(file_log_name, "SKF_EnumDev"); if(ulDevNameLists < 2) { thisClass->ulResult = OPE_ERR_NO_DEV; goto err; } // 打开设备 thisClass->ulResult = SKF_ConnectDev(szDevNameLists,&hDevSKF); if(ulDevNameLists < 2) { goto err; } ::FILE_LOG_STRING(file_log_name, "SKF_ConnectDev"); thisClass->ulResult = SKF_EnumApplication(hDevSKF,szAppNameLists, &ulAppNameLists); if (ulAppNameLists < 2) { thisClass->ulResult = FuncSKF_DevAuth(hDevSKF,&hAppSKF,(thisClass->m_szPIN),8); } else { thisClass->ulResult = SKF_OpenApplication(hDevSKF, szAppNameLists,&hAppSKF); } ::FILE_LOG_STRING(file_log_name, "FuncSKF_DevAuth SKF_OpenApplication"); thisClass->ulResult = SKF_VerifyPIN(hAppSKF, 1, (thisClass->m_szPIN),&(thisClass->m_ulRetry)); if(thisClass->ulResult) { goto err; } ::FILE_LOG_STRING(file_log_name, "SKF_VerifyPIN"); thisClass->ulResult = SKF_EnumContainer(hAppSKF,szConNameLists,&ulConNameLists); if(thisClass->ulResult) { goto err; } ::FILE_LOG_STRING(file_log_name, "SKF_EnumContainer"); if (ulConNameLists < 2) { thisClass->ulResult = SKF_CreateContainer(hAppSKF, DEFAULT_CONTAINER, &hConSKF); } else { thisClass->ulResult = SKF_OpenContainer(hAppSKF, szConNameLists, &hConSKF); } ::FILE_LOG_STRING(file_log_name, "SKF_CreateContainer SKF_OpenContainer"); if(thisClass->ulResult) { goto err; } // 生成签名公钥 thisClass->ulResult = SKF_GenECCKeyPair(hConSKF, SGD_SM2_1,&pubkeyBlob); if(thisClass->ulResult) { goto err; } ::FILE_LOG_STRING(file_log_name, "SKF_GenECCKeyPair"); // 拷贝签名公钥 memcpy(thisClass->m_szPublicKeySIGN, pubkeyBlob.XCoordinate + SM2_BYTES_LEN, SM2_BYTES_LEN); memcpy(thisClass->m_szPublicKeySIGN+SM2_BYTES_LEN, pubkeyBlob.YCoordinate + SM2_BYTES_LEN, SM2_BYTES_LEN); err: if (hConSKF) { SKF_CloseContainer(hConSKF); } if (hAppSKF) { SKF_CloseApplication(hAppSKF); } if (hDevSKF) { SKF_DisConnectDev(hDevSKF); } return 0; }