Пример #1
0
TEST(SKF_DEV_MANAGE,SKF_DisConnectDev_Test)
{
    ULONG result;
    SKF_DisConnectDev skf_disConnetDev = SKF_DisConnectDev(GetProcAddress(hmodule,"SKF_DisConnectDev"));
    result = skf_disConnetDev(*devHandle);
    EXPECT_EQ(0,(int)result);
}
Пример #2
0
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;
}
Пример #3
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;
}
Пример #4
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;
}