瀏覽代碼

Z991239-1096 #comment 修改CardIssuer,首次提交 other:修改CardIssuer,首次提交

杨诗友80174847 5 年之前
父節點
當前提交
e2d8fc4810

+ 29 - 0
Module/mod_cardissuer/CMakeLists.txt

@@ -0,0 +1,29 @@
+define_module("CardIssuer")
+
+set(${MODULE_PREFIX}_SRCS
+	mod_cardissuer.cpp
+	mod_cardissuer.h
+	CardIssuerFSM.cpp
+	CardIssuerFSM.h
+	${DevHeadPath}/CardAssist.cpp)
+list(APPEND ${MODULE_PREFIX}_SRCS)
+set(MOD_VERSION_STRING "1.0.0-dev1")
+add_module_libraries(${MODULE_PREFIX} ${MODULE_NAME} ${MOD_VERSION_STRING})
+
+target_include_directories(${MODULE_NAME} PRIVATE
+	${DevHeadPath}
+	${RVC_TOOLKIT_INCLUDE_DIR}
+	${ModuleCommonHeadPath}
+	${MODULE_BASE_DIR}/mod_heartbeat
+	${MODULE_BASE_DIR}/mod_guiconsole
+	${MODULE_BASE_DIR}/mod_accessauth
+	${CONAN_INCLUDE_DIRS_OPENSSL}
+)
+get_target_property(EXISTED_PROPERTIES ${MODULE_NAME} COMPILE_DEFINITIONS)
+set_target_properties(${MODULE_NAME} PROPERTIES COMPILE_DEFINITIONS "${EXISTED_PROPERTIES};_CRT_RAND_S")
+
+# 添加实体需要依赖的其他共享库(包括系统库)
+set(${MODULE_PREFIX}_LIBS)
+target_link_libraries(${MODULE_NAME} ${MODULE_BASE_LIBS} ${${MODULE_PREFIX}_LIBS} CONAN_PKG::OpenSSL)
+
+deploy_module(${MODULE_PREFIX} ${MODULE_NAME})

+ 186 - 241
Module/mod_cardissuer/CardIssuerFSM.cpp

@@ -4,6 +4,7 @@
 #include "CardIssuerFSM.h"
 #include "GetDevInfoHelper.h"
 #include "EventCode.h"
+#include "RVCComm.h"
 //oilyang@20200522 go on using
 // deprecated!! [4/17/2020 16:15 @Gifur]
 #include "CardIssuer_UserErrorCode.h"	//后续替代EventCode.h,暂时混合使用,时间太紧
@@ -14,27 +15,42 @@
 
 #include <algorithm>
 //CSimpleStringA<T> ambigulous
-#define _ATL_NO_AUTOMATIC_NAMESPACE
-#include <atltime.h>
+
+//#include <atltime.h>
 
 char tmpxx[1024];
 char testIC[1024];
 
 #include "CardIssuerClass.h"
 
-#include "mod_CardIssuer.h"
+#include "mod_cardissuer.h"
 
 #include "stdafx.h"
-#include <winsock2.h>
-#include <Ws2bth.h>
-
-// Link to Bthprops.lib
-
-#include <BluetoothAPIs.h>
-
-#pragma comment (lib, "Ws2_32.lib")
-#pragma comment (lib, "Bthprops.lib")
-
+//oiltest@20200915 temp for GetTickCount
+#ifdef RVC_OS_WIN
+	#define _ATL_NO_AUTOMATIC_NAMESPACE
+	#include <winsock2.h>
+	#include <Ws2bth.h>
+	// Link to Bthprops.lib
+	#include <BluetoothAPIs.h>
+	#pragma comment (lib, "Ws2_32.lib")
+	#pragma comment (lib, "Bthprops.lib")
+#else
+	#include<sys/time.h>
+#include <dlfcn.h>
+#endif //RVC_OS_WIN
+		unsigned long long GetTickCountRVC() {
+#ifdef RVC_OS_WIN
+		return GetTickCount64();
+#else
+		struct timespec ts;
+
+		clock_gettime(CLOCK_MONOTONIC, &ts);
+
+		return (ts.tv_sec * 1000 + ts.tv_nsec / 1000000);
+#endif //RVC_OS_WIN
+	}
+		
 #define CARDREADER_INIT_COUNT 3
 #define GET_DEV_STATUS_COUNT 1//oilyang@20180104 change from 3 to 1,no need to test 3 times
 
@@ -56,7 +72,37 @@ const int ACCEPT_TRY_INTERVAL = 500;
 const int ACCEPT_TRY_NUM = 110;
 //const int MAX_TEST_SHOW = 1024;
 CRITICAL_SECTION g_sciRecord;
+const unsigned char hextable[] = { "0123456789ABCDEF" };
+void ConvAscii(unsigned char* Hex, char* Ascii, unsigned int len)
+{
+	unsigned int i;
+	for (i = 0; i < len; i++)
+	{
+		Ascii[2 * i] = hextable[Hex[i] >> 4];
+		Ascii[2 * i + 1] = hextable[Hex[i] & 0xf];
+	}
+	Ascii[2 * len] = 0;
+}
+//*******************************************************************************
+void AsciiToHex(char* Ascii, unsigned char* Hex, int len)
+{
+	int i;
+	unsigned char ch;
+	for (i = 0; i < len; i = i + 2)
+	{
+		ch = (Ascii[i] & 0xf);
+		if (Ascii[i] > '9')
+			ch += 9;
 
+		Hex[i / 2] = ch << 4;
+
+		ch = Ascii[i + 1] & 0xf;
+		if (Ascii[i + 1] > '9')
+			ch += 9;
+
+		Hex[i / 2] += ch;
+	}
+}
 class CCardIssuerEntity;
 void CCardIssuerFSM::s0_on_entry()
 {
@@ -471,7 +517,7 @@ unsigned int CCardIssuerFSM::s2_on_event(FSMEvent* pEvt)
 	{
 		pEvt->SetHandled();
 		PreOnlineEvent* poe = dynamic_cast<PreOnlineEvent*>(pEvt);
-		if (poe->ctx->Req.reserved1 != NULL && _strnicmp("kaku#", (const char*)poe->ctx->Req.reserved1, 5) == 0)
+		if (poe->ctx->Req.reserved1.GetLength() > 0 && _strnicmp("kaku#", (const char*)poe->ctx->Req.reserved1, 5) == 0)
 		{
 			PreOnlineTask* task = new PreOnlineTask(this);
 			task->ctx = poe->ctx;
@@ -1807,6 +1853,60 @@ bool isnostr(const char *str)
 	}
 	return true;
 }
+bool CCardIssuerFSM::LoadCMBPrint(CSimpleStringA csBinPath)
+{
+	if (cmdDecodeEx == NULL) {
+		CSimpleStringA csCMBPrint("");
+#ifdef linux
+		csCMBPrint = "CMBPrint.so";
+		csCMBPrint = csBinPath + "/" + csCMBPrint;
+		Dbg("cmbpath %s", (const char*)csCMBPrint);
+		void* hr = NULL;
+		hr = dlopen(csCMBPrint, RTLD_LAZY);
+		if (hr == NULL)
+		{
+			Dbg("Load CMBPrint failed(%d)(%s).", errno,strerror(errno));
+			return false;
+		}
+		//pfunc_unpack = (PF_unpack)dlsym(hLib, "_Z6unpackPcS_i");
+		if ((cmdDecodeMag2 = (lpCMBdecodeMag2)dlsym(hr, "CMBdecodeMag2")) == NULL)
+		{
+			Dbg("Get Mag2 address failed.");
+			return false;
+		}
+		if ((cmdDecodeEx = (lpCMBdecodeEx)dlsym(hr, "CMBdecodeEx")) == NULL)
+		{
+			Dbg("Get Mag23Ex address failed.");
+			cmdDecodeMag2 = NULL;
+			return false;
+		}
+#else
+		csCMBPrint = "CMBPrint.dll";
+		csCMBPrint = csBinPath + csBackslash + csCMBPrint;
+		Dbg("cmbpath %s", (const char*)csCMBPrint);
+		HMODULE hr = LoadLibraryA(csCMBPrint);
+		if (hr == NULL)
+		{
+			Dbg("Load CMBPrint failed(%d).", hr);
+			return false;
+		}
+		if ((cmdDecodeMag2 = (lpCMBdecodeMag2)GetProcAddress(hr, "CMBdecodeMag2")) == NULL)
+		{
+			Dbg("Get Mag2 address failed.");
+			return false;
+		}
+		if ((cmdDecodeEx = (lpCMBdecodeEx)GetProcAddress(hr, "CMBdecodeEx")) == NULL)
+		{
+			Dbg("Get Mag23Ex address failed.");
+			cmdDecodeMag2 = NULL;
+			return false;
+		}
+#endif
+		Dbg("Load %s suc.", (const char*)csCMBPrint);
+	}
+	
+	return true;
+}
 ErrorCodeEnum CCardIssuerFSM::OpenDevice(BYTE btOpenType, const char *pDevSN)
 {
 	//MessageBoxA(0,0,0,0);
@@ -1961,27 +2061,11 @@ ErrorCodeEnum CCardIssuerFSM::OpenDevice(BYTE btOpenType, const char *pDevSN)
 			//	m_pCardIssuer->GetLastErr(devErrInfo);
 			//	Dbg("reset err[%s]",devErrInfo.szErrMsg);
 			//}
-			if(cmdDecodeEx == NULL) {
-				CSimpleStringA csCMBPrint("CMBPrint.dll");
-				csCMBPrint = csBinPath + csBackslash + csCMBPrint;
-				Dbg("cmbpath %s", (const char*)csCMBPrint);
-				HMODULE hr = LoadLibraryA(csCMBPrint);
-				if (hr == NULL)
-				{
-					Dbg("Load CMBPrint failed(%d).",hr);
-					return Error_DevLoadFileFailed;
-				}
-				if ((cmdDecodeMag2=(lpCMBdecodeMag2)GetProcAddress(hr, "CMBdecodeMag2")) == NULL)
-				{
-					Dbg("Get Mag2 address failed.");
-					return Error_DevLoadFileFailed;
-				}
-				if ((cmdDecodeEx=(lpCMBdecodeEx)GetProcAddress(hr, "CMBdecodeEx")) == NULL)
-				{
-					Dbg("Get Mag23Ex address failed.");
-					cmdDecodeMag2 = NULL;
-					return Error_DevLoadFileFailed;
-				}
+			if (!LoadCMBPrint(csBinPath))
+			{
+				Dbg("load CMBPrint failed.");
+				LogErrMsg("OpenDevice::DevOpenEx", Error_DevLoadFileFailed, CardIssuer_UserErrorCode_Load_CMBPrint_Failed, TRUE);
+				return Error_DevLoadFileFailed;
 			}
 			initTries = 0;
 			break;
@@ -2084,13 +2168,11 @@ ErrorCodeEnum CCardIssuerFSM::OpenDevice(BYTE btOpenType, const char *pDevSN)
 		{
 			if (btOpenType != DEV_OPEN_TYPE_COM)
 			{
-				int rt = 0;
+				int rt = -1;
 				if (m_csCM.GetLength() > 3 && _strnicmp(m_csCM, "V2.0", strlen("V2.0")) == 0)
 				{
 					rt = DataTransferInitEx();
 				}
-				else
-					rt = DataTransferInit();
 				Dbg("DataTransferInit(Ex) rt:%d", rt);
 				if (rt == 0)
 				{
@@ -2338,7 +2420,8 @@ int CCardIssuerFSM::IssueCard(SpReqAnsContext<CardIssuerService_Issue_Req, CardI
 		}
 	}
 #endif
-	if ((_strnicmp("RVC.PAD", m_csMachineType, strlen("RVC.PAD")) == 0 || _strnicmp("RVC.Desk2S", m_csMachineType, strlen("RVC.Desk2S")) == 0 )
+	if ((_strnicmp("RVC.PAD", m_csMachineType, strlen("RVC.PAD")) == 0 
+		|| (_strnicmp("RVC.Desk2S", m_csMachineType, strlen("RVC.Desk2S")) == 0 && m_majorVerion == 1 && m_minorVerion == 0))
 		&& !m_bChannelOK)
 	{
 		Dbg("未建立安全通道。");
@@ -2382,7 +2465,7 @@ int CCardIssuerFSM::IssueCard(SpReqAnsContext<CardIssuerService_Issue_Req, CardI
 				m_bForHangzhouSongruiMenjinka = false;
 				return 2;
 			}
-			INT64 start = GetTickCount64();
+			INT64 start = GetTickCountRVC();
 			while (1)
 			{
 				if (m_bForHangzhouSongruiMenjinka)
@@ -2405,7 +2488,7 @@ int CCardIssuerFSM::IssueCard(SpReqAnsContext<CardIssuerService_Issue_Req, CardI
 					return 0;
 				}
 				Sleep(1000);
-				INT64 end = GetTickCount64();
+				INT64 end = GetTickCountRVC();
 				if ((end - start) > 60 * 1000)
 				{
 					Dbg("time elapsed,but can't find card.");
@@ -2711,11 +2794,11 @@ int CCardIssuerFSM::WaitFetchingCard()
 	LOG_FUNCTION();
 	//int waitTries = 0;
 	DWORD dwStart, dwEnd;
-	dwStart = GetTickCount();
+	dwStart = GetTickCountRVC();
 	LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_GREEN_ON,"CardReader(fetch) warning on");
 	do {
 		if (GetDevStatus()){
-			dwEnd = GetTickCount();
+			dwEnd = GetTickCountRVC();
 			if (m_devStatus.eMedia == CI_MEDIA_ENTERING){
 				Sleep(WAIT_INTERVAL);
 				//waitTries++;
@@ -2739,7 +2822,7 @@ int CCardIssuerFSM::InternalAcceptCard()
 	LOG_FUNCTION();
 	ErrorCodeEnum eErr = Error_Unexpect;
 	int acceptTries = 0, err = 0;
-	DWORD64 dwStart = GetTickCount64();
+	DWORD64 dwStart = GetTickCountRVC();
 	DWORD64 dwEnd = dwStart;
 	m_bWaitingAccept = true;
 	//if (Error_Succeed == hr){
@@ -2757,7 +2840,7 @@ int CCardIssuerFSM::InternalAcceptCard()
 		if (m_bWaitAccepteMore)
 		{
 			acceptTries = 0;
-			dwEnd = dwStart = GetTickCount64();
+			dwEnd = dwStart = GetTickCountRVC();
 			m_bWaitAccepteMore = false;
 		}
 		if (GetDevStatus())
@@ -2786,7 +2869,7 @@ int CCardIssuerFSM::InternalAcceptCard()
 			err = 1;
 			goto Err;
 		}
-		dwEnd = GetTickCount64();
+		dwEnd = GetTickCountRVC();
 	}while ((dwEnd - dwStart) < 58*1000);
 	err = 2;
 
@@ -3021,7 +3104,7 @@ int CCardIssuerFSM::ReadCard(SpReqAnsContext<CardIssuerService_Read_Req,CardIssu
 			m_pCardIssuer->ReleaseIC();
 		}
 	}
-	DWORD dwStart = GetTickCount();
+	DWORD dwStart = GetTickCountRVC();
 	MagTracks magTracks;
 	int readTries = 0;
 
@@ -3216,7 +3299,7 @@ int CCardIssuerFSM::ReadCard(SpReqAnsContext<CardIssuerService_Read_Req,CardIssu
 	}
 	Dbg("ic type %d",ctx->Ans.ICType);
 	m_currCardNo = ctx->Ans.t2Account;
-	DWORD dwEnd = GetTickCount();
+	DWORD dwEnd = GetTickCountRVC();
 	DWORD dwCollapse = dwEnd-dwStart;
 	if ((dwCollapse < 8000) && (!bReadCardInfo))
 	{
@@ -3355,7 +3438,7 @@ int CCardIssuerFSM::PreOnline(SpReqAnsContext<CardIssuerService_PreOnline_Req,Ca
 	Dbg("bus data[%s]",(LPCTSTR)ctx->Req.businessData);
 	CSimpleStringA csMagT2Track(""), csMagT3Track(""), csMagAccout(""), csMagRegion(""), csMagCardSerial(""), csMagCVC(""), csMagExpireDate("");
 	int slot = 0;
-	if (ctx->Req.reserved1 != NULL && _strnicmp("kaku#",(const char*)ctx->Req.reserved1,5) == 0)
+	if (ctx->Req.reserved1.GetLength() > 0 && _strnicmp("kaku#",(const char*)ctx->Req.reserved1,5) == 0)
 	{
 		GetEntityBase()->GetFunction()->SetSysVar("CardStoreInUse", "Y");
 		CSimpleStringA csSlot("");
@@ -3388,7 +3471,7 @@ int CCardIssuerFSM::PreOnline(SpReqAnsContext<CardIssuerService_PreOnline_Req,Ca
 		{
 			Dbg("move card from slot to cardreader and ReadAccount suc.magT2.size:%d(%d),magT3.size:%d(%d)"
 				,card.dwTrack2Size,strlen(card.track2),card.dwTrack3Size, strlen(card.track3));
-			if (ctx->Req.reserved2 != NULL && ctx->Req.reserved2.Compare(card.account) != 0)
+			if (ctx->Req.reserved2.GetLength() > 0 && ctx->Req.reserved2.Compare(card.account) != 0)
 			{
 				m_findCard = 3;
 				AfterPreOnlineOnStore(Error_Unexpect, slot);
@@ -3448,12 +3531,22 @@ int CCardIssuerFSM::PreOnline(SpReqAnsContext<CardIssuerService_PreOnline_Req,Ca
 		m_pCardProcess->SplitBusinessData("DF690101",strlen("DF690101"));
 	}
 	int activeCardType;
-	if (!m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER, m_pCardIssuer, "A000000333", activeCardType))//oiltmp 20140915
+	//oilyang@20201014 add emv card support
+	int retDetectAndRead = -1;
+	retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER, m_pCardIssuer, "A000000333", activeCardType);
+	if (retDetectAndRead < -1)//-1:DetectIfICCard failed; -2:select app failed
+	{
+		Dbg("Can't read pboc record,to try emv...");
+		retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER, m_pCardIssuer, "A0000000108888", activeCardType);
+	}
+	if (retDetectAndRead < 0)
 	{
-		LogErrMsg("PreOnline:DetectAndReadICData ", Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand, TRUE);
 		if (m_csMachineType.Compare("RVC.CardStore") == 0)
 			AfterPreOnlineOnStore(Error_Unexpect, slot);
-		ctx->Answer(Error_Unexpect, AlarmDECToBusiness(MEC_DEVAPI_CARDISSUER_ICCommand));
+		if (retDetectAndRead == -1)
+			ctx->Answer(Error_Unexpect, AlarmDECToBusiness(MEC_DEVAPI_CARDISSUER_ActiveICCard));
+		else if (retDetectAndRead == -2)
+			ctx->Answer(Error_Unexpect, AlarmDECToBusiness(MEC_DEVAPI_CARDISSUER_ICCommand));
 		return 0;
 	}
 	//if (m_cardType == CI_CARDTYPE_IC)
@@ -4046,159 +4139,6 @@ int CCardIssuerFSM::SetDevStateAndSendMsg(const DevStateEnum eState, bool bForce
 	}
 	return 0;
 }
-int CCardIssuerFSM::DataTransferInit()
-{
-	LOG_FUNCTION();
-	//MessageBoxA(0, 0, 0, 0);
-	ZeroMemory(m_priKey, ONE_K / 2);
-	//AsciiToHex("16E532957F1F107F794C1F8157CC768A72BD425B6F425B3C67153DB9082B7F45", m_priKey, strlen("16E532957F1F107F794C1F8157CC768A72BD425B6F425B3C67153DB9082B7F45"));
-	memcpy(m_priKey, "16E532957F1F107F794C1F8157CC768A72BD425B6F425B3C67153DB9082B7F45", strlen("16E532957F1F107F794C1F8157CC768A72BD425B6F425B3C67153DB9082B7F45"));
-	int iStatus;
-	BYTE *Cr1, *Cr3, *dKey;
-	Cr1 = new BYTE[ONE_K / 4];
-	Cr3 = new BYTE[ONE_K / 4];
-	dKey = new BYTE[ONE_K / 4];
-	ZeroMemory(Cr1, ONE_K / 4);
-	ZeroMemory(Cr3, ONE_K / 4);
-	ZeroMemory(dKey, ONE_K / 4);
-	int lenCr1, lenCr3, lenDKey;
-	bool bFirstFailed = false;
-	Dbg("to TransferEnInit");
-	ErrorCodeEnum eErr = m_pCardIssuer->TransferEnInit(iStatus, Cr1, lenCr1, Cr3, lenCr3, dKey, lenDKey);
-	if (eErr != Error_Succeed)
-	{
-		LogErrMsg("MEC_DEVAPI_CARDISSUER_TransferEnInit:", eErr, MEC_DEVAPI_CARDISSUER_TransferEnInit, TRUE);
-		Dbg("TransferEnInit failed: EC=%d, iStatus=%d", eErr, iStatus);
-		return 1;
-	}
-	Dbg("iStatus:%d,lenCr1:%d,lenCr3:%d,lenDKey:%d",iStatus,lenCr1,lenCr3,lenDKey);
-	ZeroMemory(m_r1, ONE_K / 8);
-	char tmp[2048];
-	ZeroMemory(tmp, ONE_K * 2);
-	ConvAscii(Cr1, tmp, lenCr1);
-	int rt = sm2_decrypt_new((const char*)tmp, (const char*)m_priKey, (char*)m_r1);
-	if (rt == 0)
-	{
-		Dbg("decrypte Cr1 failed,%s,%d.", tmp, lenCr1);
-		bFirstFailed = true;
-	}
-	Dbg("Cr1 %s,%d.", tmp, lenCr1);
-	ZeroMemory(m_r3, ONE_K / 8);
-	ZeroMemory(tmp, ONE_K * 2);
-	ConvAscii(Cr3, tmp, lenCr3);
-	rt = sm2_decrypt_new((const char*)tmp, (const char*)m_priKey, (char*)m_r3);
-	if (rt == 0)
-	{
-		Dbg("decrypte Cr3 failed,%s,%d.", tmp, lenCr3);
-		bFirstFailed = true;
-	}
-	Dbg("Cr3 %s,%d.", tmp, lenCr3);
-	ZeroMemory(m_devPubKey, ONE_K / 2);
-	ZeroMemory(tmp, ONE_K * 2);
-	ConvAscii(dKey, tmp, lenDKey);
-
-	rt = sm2_decrypt_new((const char*)tmp, (const char*)m_priKey, (char*)m_devPubKey);
-	Dbg("dKey %s,%d.", tmp, lenDKey);
-	if (rt == 0)
-	{
-		Dbg("decrypte dKey failed,%s,%d.", tmp, lenDKey);
-		bFirstFailed = true;
-	}
-	if (bFirstFailed)
-	{
-		Dbg("decrypte data failed.");
-		return 2;
-	}
-	char pubkey_x[128];
-	char pubkey_y[128];
-	char random_key[128];
-	unsigned char tbuf[4096];
-	char encrnd[1024];
-	int encdatalen;
-	int iloop;
-	memset(pubkey_x, 0, sizeof(pubkey_x));
-	memset(pubkey_y, 0, sizeof(pubkey_y));
-	//取随机因子
-	srand((int)time(NULL));
-	for (iloop = 0; iloop < 32; iloop++)
-		tbuf[iloop] = rand() % 256;
-	ConvAscii(tbuf, random_key, 32);
-
-	//公钥X分量
-	ConvAscii(m_devPubKey, pubkey_x, 32);
-	ConvAscii(m_devPubKey + 32, pubkey_y, 32);
-
-	//随机数2
-
-	BYTE r2[16];
-	ZeroMemory(r2, 16);
-	for (int i = 0; i < 15; ++i)
-	{
-		unsigned int ram;
-		int ret = rand_s(&ram);
-		r2[i] = ram % 256;
-		r2[15] ^= r2[i];
-		m_r2[i] = r2[i];
-	}
-	m_r2[15] = r2[15];
-	char *xxxR2 = new char[256];
-	ZeroMemory(xxxR2, 256);
-	ConvAscii(r2, xxxR2, 16);
-	Dbg("randomkey:%s,public_x[%s],public_y[%s],r2:[%s]", (char*)random_key, (char*)pubkey_x, (char*)pubkey_y, xxxR2);
-
-	encdatalen = sm2_encrypt_new(random_key, pubkey_x, pubkey_y, (char *)r2, 16, encrnd);
-	Dbg("Cr2:%s", encrnd);
-
-	unsigned char *xxxCR2 = new unsigned char[512];
-	ZeroMemory(xxxCR2, 512);
-	AsciiToHex(encrnd, xxxCR2, strlen(encrnd));
-	eErr = m_pCardIssuer->SetR2(iStatus, xxxCR2, strlen(encrnd) / 2);
-	if (eErr != Error_Succeed)
-	{
-		LogErrMsg("DataTransferInit:SetR2 ", Error_Unexpect, MEC_DEVAPI_CARDISSUER_SetR2, TRUE);
-		Dbg("SetR2 failed:%d,%d", eErr, iStatus);
-		return 3;
-	}
-
-	int lenrandom1, lenrandom2, lenrandom3;
-	lenrandom1 = lenrandom2 = lenrandom3 = 16;
-
-	int ilen = 0;
-	char databuf[2048];
-	char key[128];
-
-	memset(databuf, 0, sizeof(databuf));
-	memset(tbuf, 0, sizeof(tbuf));
-
-	memcpy(databuf, m_r2, lenrandom2);
-	for (iloop = 0; iloop < 64; iloop++)
-		databuf[iloop] ^= 0x5C;
-	memcpy(tbuf, m_r2, lenrandom2);
-	for (iloop = 0; iloop < 64; iloop++)
-		tbuf[iloop] ^= 0x36;
-	ilen = 64;
-	memcpy(tbuf + ilen, "KEY", strlen("KEY"));
-	ilen += strlen("KEY");
-	memcpy(tbuf + ilen, m_r1, lenrandom1);
-	ilen += lenrandom1;
-	memcpy(tbuf + ilen, m_r3, lenrandom3);
-	ilen += lenrandom3;
-	sm3((unsigned char *)tbuf, ilen, (unsigned char *)(databuf + 64));
-	sm3((unsigned char *)databuf, 96, (unsigned char *)key);
-	char *sessionKey = new char[1024];
-	ZeroMemory(sessionKey, 1024);
-	HexBuf2StrBuf((unsigned char *)key, &sessionKey, 16);
-
-	eErr = m_pCardIssuer->SendWorkingKey(sessionKey);
-	if (eErr != Error_Succeed)
-	{
-		LogErrMsg("DataTransferInit:SendWorkingKey ", Error_Unexpect, MEC_DEVAPI_CARDISSUER_SendWorkingKey, TRUE);
-		Dbg("SendWorkingKey failed:%d,iStatus", eErr, iStatus);
-		return 4;
-	}
-
-	return 0;
-}
 int CCardIssuerFSM::DataTransferInitEx()
 {
 	LOG_FUNCTION();
@@ -4261,8 +4201,8 @@ int CCardIssuerFSM::DataTransferInitEx()
 	ZeroMemory(r2, 16);
 	for (int i = 0; i < 15; ++i)
 	{
-		unsigned int ram;
-		int ret = rand_s(&ram);
+		srand((int)time(NULL));
+		unsigned int ram = rand();
 		r2[i] = ram % 256;
 		r2[15] ^= r2[i];
 		m_r2[i] = r2[i];
@@ -4336,8 +4276,8 @@ int CCardIssuerFSM::DataTransferInitEx()
 	ilen += lenrandom1;
 	memcpy(tbuf + ilen, m_r3, lenrandom3);
 	ilen += lenrandom3;
-	sm3((unsigned char *)tbuf, ilen, (unsigned char *)(databuf + 64));
-	sm3((unsigned char *)databuf, 96, (unsigned char *)key);
+	SM3Hash((unsigned char *)tbuf, ilen, (unsigned char *)(databuf + 64));
+	SM3Hash((unsigned char *)databuf, 96, (unsigned char *)key);
 	char *sessionKey = new char[1024];
 	ZeroMemory(sessionKey, 1024);
 	HexBuf2StrBuf((unsigned char *)key, &sessionKey, 16);
@@ -4801,7 +4741,13 @@ bool CCardIssuerFSM::JustReadCardNo()
 	bool bIC = m_pCardProcess->DetectIfICCard(CARD_MACHINE_ISSUER, m_pCardIssuer, activeCardType);
 	if (bIC)
 	{
-		m_pCardProcess->GetICDataFromCard(CARD_MACHINE_ISSUER, m_pCardIssuer, "A000000333");
+		//oilyang@20201014 add emv support
+		bool bGetICData = false;
+		bGetICData = m_pCardProcess->GetICDataFromCard(CARD_MACHINE_ISSUER, m_pCardIssuer, "A000000333");
+		if (!bGetICData)
+		{
+			bGetICData = m_pCardProcess->GetICDataFromCard(CARD_MACHINE_ISSUER, m_pCardIssuer, "A0000000108888");
+		}
 		ICData track2(false, 0x57, 0x00);
 		string t2ICAccount(""), t2ICCardSerial(""), t2ICCVC(""), t2ICTrack2(""), cardType;
 		if (m_pCardProcess->FindTagValue(TAG_VECTOR_IC, track2, false, 0) == -1)
@@ -5251,34 +5197,17 @@ int CCardIssuerFSM::Print(SpReqAnsContext<CardIssuerService_Print_Req, CardIssue
 		}
 		ctx->Answer(Error_Succeed);
 	}
-	DeleteFileA(csABmp);
-	DeleteFileA(csBBmp);
+	remove((const char*)csABmp);
+	remove((const char*)csBBmp);
 	return 0;
 }
-// callback for BluetoothSdpEnumAttributes()
-BOOL __stdcall callback(ULONG uAttribId, LPBYTE pValueStream, ULONG cbStreamSize, LPVOID pvParam)
-
+int CCardIssuerFSM::DetectBluetoothSCIOnLinux()
 {
-	SDP_ELEMENT_DATA element;
-	// Just a verification, uncomment to see the output!!!
-	//Dbg("Callback() uAttribId: %ul\n", uAttribId);
-	//Dbg("Callback() pValueStream: %d\n ", pValueStream);
-	//Dbg("Callback() cbStreamSize: %ul\n ", cbStreamSize);
-	if (BluetoothSdpGetElementData(pValueStream, cbStreamSize, &element) != ERROR_SUCCESS)
-	{
-		// Just a verification
-		// Dbg("BluetoothSdpGetElementData() failed with error code %ld\n", WSAGetLastError());
-		return FALSE;
-	}
-	else
-	{
-		// Just a verification
-		// Dbg("BluetoothSdpGetElementData() is OK!\n");
-		return TRUE;
-	}
+
 }
 int CCardIssuerFSM::DetectBluetoothSCI()
 {
+#ifdef RVC_OS_WIN
 	ClearSCIRecords();
 	WSADATA m_data;
 	SOCKET s;
@@ -5519,6 +5448,9 @@ int CCardIssuerFSM::DetectBluetoothSCI()
 		}
 	} // end WSAStartup()
 	return 0;
+#else 
+return DetectBluetoothSCIOnLinux();
+#endif //RVC_OS_WIN
 }
 int CCardIssuerFSM::QuerySCIList(
 	SpReqAnsContext<CardIssuerService_QuerySCIList_Req, CardIssuerService_QuerySCIList_Ans>::Pointer ctx,
@@ -5868,7 +5800,9 @@ ErrorCodeEnum CCardIssuerFSM::AfterBindUpdateSCINameToRunCfg(const char *name, b
 }
 void CCardIssuerFSM::GetVendorDllName(CSimpleStringA &strDevAdaptorPath)
 {
-	if (m_csMachineType.Compare("RVC.Stand2S") == 0 || m_csMachineType.Compare("RVC.CardStore") == 0)
+	if (m_csMachineType.Compare("RVC.Stand2S") == 0 || m_csMachineType.Compare("RVC.CardStore") == 0
+		|| m_csMachineType.Compare("RVC.Desk1S") == 0 
+		|| (m_csMachineType.Compare("RVC.Desk2S") == 0 && m_majorVerion == 2 && (m_minorVerion == 0 || m_minorVerion == 1)))
 	{
 		SpGetDevAdaptorPath(m_pEntity, GetEntityBase()->GetEntityName(), strDevAdaptorPath);
 		return;
@@ -5936,10 +5870,15 @@ void CCardIssuerFSM::GetVendorDllName(CSimpleStringA &strDevAdaptorPath)
 		}
 		CSimpleStringA strDepPath;
 		GetEntityBase()->GetFunction()->GetPath("Dep", strDepPath);
-
+#ifdef RVC_OS_WIN
 		strDevAdaptorPath = CSimpleStringA::Format("%s\\%s.dll",
 			(const char*)strDepPath,
 			(const char*)strDevAdaptorPath);
+#else
+		strDevAdaptorPath = CSimpleStringA::Format("%s/%s.so",
+			(const char*)strDepPath,
+			(const char*)strDevAdaptorPath);
+#endif
 	}
 	return;
 }
@@ -6127,7 +6066,7 @@ int CCardIssuerFSM::PreOnlineOnStore(SpReqAnsContext<CardIssuerService_PreOnline
 		ctx->Answer(Error_Unexpect);
 		return 0;
 	}
-	m_crossStart = GetTickCount64();
+	m_crossStart = GetTickCountRVC();
 	if (eErr == Error_Succeed)
 	{
 		if (pHeartBeatClient != NULL)
@@ -6151,7 +6090,7 @@ int CCardIssuerFSM::PreOnlineOnStore(SpReqAnsContext<CardIssuerService_PreOnline
 }
 void CCardIssuerFSM::NotifyPreOnline(unsigned long errCode, unsigned long findCard, unsigned long cardPos, CSimpleStringA data)
 {
-	UINT64 crossEnd = GetTickCount64();
+	UINT64 crossEnd = GetTickCountRVC();
 	//in 110 second
 	if (m_crossCtx != NULL)
 	{
@@ -7211,7 +7150,7 @@ void CCardIssuerFSM::oiltestSCI()
 				m_pCardIssuer->ReleaseIC();
 			}
 		}
-		DWORD dwStart = GetTickCount();
+		DWORD dwStart = GetTickCountRVC();
 		MagTracks magTracks;
 		int readTries = 0;
 
@@ -7229,7 +7168,13 @@ void CCardIssuerFSM::oiltestSCI()
 			//read card no 20140625
 			int activeCardType;
 			m_pCardProcess->DetectIfICCard(CARD_MACHINE_ISSUER, m_pCardIssuer, activeCardType);
-			m_pCardProcess->GetICDataFromCard(CARD_MACHINE_ISSUER, m_pCardIssuer, "A000000333");
+			//oilyang@20201014 add emv support
+			int retGetICData = -1;
+			retGetICData = m_pCardProcess->GetICDataFromCard(CARD_MACHINE_ISSUER, m_pCardIssuer, "A000000333");
+			if (retGetICData < -1)//-1:DetectIfICCard failed; -2:select app failed
+			{
+				retGetICData = m_pCardProcess->GetICDataFromCard(CARD_MACHINE_ISSUER, m_pCardIssuer, "A0000000108888");
+			}
 			ICData track2(false, 0x57, 0x00);
 			string t2ICAccount(""), t2ICCardSerial(""), t2ICCVC(""), t2ICTrack2(""), cardType;
 			if (m_pCardProcess->FindTagValue(TAG_VECTOR_IC, track2, false, 0) == -1)
@@ -7334,10 +7279,10 @@ void CCardIssuerFSM::oiltestSCI()
 			EjectCard(NULL);
 			//等待取卡
 			DWORD dwStart, dwEnd;
-			dwStart = GetTickCount();
+			dwStart = GetTickCountRVC();
 			do {
 				if (GetDevStatus()) {
-					dwEnd = GetTickCount();
+					dwEnd = GetTickCountRVC();
 					if (m_devStatus.eMedia == CI_MEDIA_ENTERING) {
 						Sleep(WAIT_INTERVAL);
 						//waitTries++;

+ 7 - 9
Module/mod_cardissuer/CardIssuerFSM.h

@@ -4,12 +4,9 @@
 #pragma once
 
 #include "SpFSM.h"
-#include "public.h"
-#include "sm2.h"
-#include "sm3.h"
-#include "sm4.h"
-#include "..\..\DeviceAdapter\DeviceBaseHelper.h"
 #include "DevErrorCode.h"
+#include "DevEntityCommBase.hpp"
+#include "DevFSMCommBase.hpp"
 #include "DeviceBaseHelper.h"
 enum EvtType
 {
@@ -94,11 +91,11 @@ enum SAMICCommandType
 #include "CardAssist.h"
 #include "ICDataElement.h"
 using namespace CardIssuer;
-#include "..\mod_guiconsole\GUIConsole_client_g.h"
+#include "GUIConsole_client_g.h"
 using namespace GUIConsole;
-#include "..\mod_heartbeat\HeartBeat_client_g.h"
+#include "HeartBeat_client_g.h"
 using namespace HeartBeat;
-#include "..\\mod_accessauth\\AccessAuthorization_client_g.h"
+#include "AccessAuthorization_client_g.h"
 using namespace AccessAuthorization;
 
 typedef int(*lpCMBdecodeMag2)(char* Mag2Data, char * data);
@@ -858,7 +855,6 @@ public:
 	int ConnectSCI();
 	int QueryIfCfgSCI();
 	int SetDevStateAndSendMsg(const DevStateEnum eState, bool bForceSend = true);
-	int DataTransferInit();
 	int DataTransferInitEx();
 	int LoadSafeLockDll();
 	int EncryptData(SCITempData ramData, SCITempData bdk, SCITempData curksn, SCITempData &encryptedData);
@@ -872,6 +868,7 @@ public:
 	int SAMICCommand(SpReqAnsContext<CardIssuerService_SAMICCommand_Req, CardIssuerService_SAMICCommand_Ans>::Pointer ctx);
 	void PeriodConnect(BOOL anotherThread = TRUE);
 	int DetectBluetoothSCI();
+	int DetectBluetoothSCIOnLinux();
 	int QuerySCIList(SpReqAnsContext<CardIssuerService_QuerySCIList_Req, CardIssuerService_QuerySCIList_Ans>::Pointer ctx,const int);
 	int BindSCI(SpReqAnsContext<CardIssuerService_BindSCI_Req, CardIssuerService_BindSCI_Ans>::Pointer ctx,const int);
 	void GetSCINo(CSimpleStringA&);
@@ -1010,6 +1007,7 @@ private:
 	bool AccountExchange(const char *origAcc, CSimpleStringA &acc,int dir=1);
 	bool SetSlotFlag(int slot,bool bReset=false,bool bClear=false);
 	void ClearAllLocalSlotInfo();
+	bool LoadCMBPrint(CSimpleStringA csBinPath);
 	DevCategoryInfo m_devCat;
 
 	HardwareEntityCode m_entCode;

+ 1 - 0
Module/mod_cardissuer/CardIssuer_UserErrorCode.h

@@ -25,4 +25,5 @@
 #define CardIssuer_UserErrorCode_KakuPanKu_Failed					(CardIssuer_UserErrorCode_Start + 19)	//卡库盘库失败
 
 #define CardIssuer_UserErrorCode_Customer_Forget_Fectch_Card	(CardIssuer_UserErrorCode_Start + 20)	//客户超时未取卡
+#define CardIssuer_UserErrorCode_Load_CMBPrint_Failed		(CardIssuer_UserErrorCode_Start + 21)	//加载CMBPrint失败
 #endif //_CARDISSUER_USER_ERRORCODE_H

+ 0 - 108
Module/mod_cardissuer/kdf.h

@@ -1,108 +0,0 @@
-
-#include <memory.h>
-#include <openssl/evp.h>
-#include "sm3.h"
-// ----- KDF FUNCTIONS START -----
-//typedef void *(*KDF)(const void *in, size_t inlen, void *out, size_t *outlen);
-
-int x9_63_kdf(const EVP_MD *md, const unsigned char *share, size_t sharelen, size_t keylen, unsigned char *outkey)
-{
-	int ret = 0;
-
-	EVP_MD_CTX ctx;
-	unsigned char counter[4] = {0, 0, 0, 1};
-	unsigned char dgst[EVP_MAX_MD_SIZE];
-	unsigned int dgstlen;
-	int rlen = (int)keylen;
-	unsigned char * pp;
-
-	pp = outkey;
-
-	if (keylen > (size_t)EVP_MD_size(md)*255)
-	{
-		fprintf(stderr, "%s(%d):", __FILE__, __LINE__);
-		goto end;
-	}
-
-	while (rlen > 0)
-	{
-		EVP_MD_CTX_init(&ctx);
-
-		if (!EVP_DigestInit(&ctx, md))
-		{
-			fprintf(stderr, "%s(%d):", __FILE__, __LINE__);
-			goto end;
-		}
-
-		if (!EVP_DigestUpdate(&ctx, share, sharelen))
-		{
-			fprintf(stderr, "%s(%d):", __FILE__, __LINE__);
-			goto end;
-		}
-		if (!EVP_DigestUpdate(&ctx, counter, 4))
-		{
-			fprintf(stderr, "%s(%d):", __FILE__, __LINE__);
-			goto end;
-		}
-		if (!EVP_DigestFinal(&ctx, dgst, &dgstlen))
-		{
-			fprintf(stderr, "%s(%d):", __FILE__, __LINE__);
-			goto end;
-		}
-
-		EVP_MD_CTX_cleanup(&ctx);
-
-		memcpy(pp, dgst, keylen>=dgstlen ? dgstlen:keylen);
-
-		rlen -= dgstlen;
-		pp += dgstlen;
-		counter[3]++;
-	}
-
-	ret = 1;
-
-end:
-	return ret;
-}
-
-int sm3_kdf(unsigned char *share, size_t sharelen, size_t keylen, unsigned char *outkey)
-{
-	int ret = 0;
-	
-	unsigned char counter[4] = {0, 0, 0, 1};
-	unsigned char dgst[EVP_MAX_MD_SIZE];
-//	unsigned char ZA[33] = "\x3B\x85\xA5\x71\x79\xE1\x1E\x7E\x51\x3A\xA6\x22\x99\x1F\x2C\xA7\x4D\x18\x07\xA0\xBD\x4D\x4B\x38\xF9\x09\x87\xA1\x7A\xC2\x45\xB1";
-//	unsigned char ZB[33] = "\x79\xC9\x88\xD6\x32\x29\xD9\x7E\xF1\x9F\xE0\x2C\xA1\x05\x6E\x01\xE6\xA7\x41\x1E\xD2\x46\x94\xAA\x8F\x83\x4F\x4A\x4A\xB0\x22\xF7"; 
-	unsigned int dgstlen;
-	int rlen = (int)keylen;
-	unsigned char * pp;
-	sm3_context sm3_ctx;
-	pp = outkey;
-	
-	if (keylen > 16*255)
-	{
-		fprintf(stderr, "%s(%d):", __FILE__, __LINE__);
-		goto end;
-	}
-	
-	while (rlen > 0)
-	{
-		sm3_starts(&sm3_ctx);
-		sm3_update(&sm3_ctx,share,sharelen);
-		sm3_update(&sm3_ctx,counter,4);
-		sm3_finish(&sm3_ctx,dgst);
-		dgstlen = 32;
-
-		memcpy(pp, dgst, keylen>=dgstlen ? dgstlen:keylen);
-		
-		rlen -= dgstlen;
-		pp += dgstlen;
-		counter[3]++;
-	}
-	
-	ret = 1;
-	
-end:
-	return ret;
-}
-// ----- KDF FUNCTIONS END -----

+ 1 - 1
Module/mod_cardissuer/mod_cardissuer.h

@@ -209,7 +209,7 @@ public:
 	void PreOnline(SpReqAnsContext<CardIssuerService_PreOnline_Req, CardIssuerService_PreOnline_Ans>::Pointer ctx)
 	{
 		LOG_FUNCTION();
-		if (ctx->Req.reserved1 != NULL && strnicmp("kaku#", (const char*)ctx->Req.reserved1, 5) == 0)
+		if (ctx->Req.reserved1.GetLength() > 0 && strnicmp("kaku#", (const char*)ctx->Req.reserved1, 5) == 0)
 		{
 			int state = m_fsm.GetFSMState();
 			if (state == 9)

+ 0 - 127
Module/mod_cardissuer/public.cpp

@@ -1,127 +0,0 @@
-#include "StdAfx.h"
-
-#include "public.h"
-#include <time.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
-const unsigned char hextable[]={"0123456789ABCDEF"};
-void ConvAscii(unsigned char *Hex,char *Ascii,unsigned int len)
-{
-	unsigned int i;
-	for(i=0;i<len;i++)
-    {
-        Ascii[2*i]=hextable[Hex[i]>>4];
-		Ascii[2*i+1]=hextable[Hex[i]&0xf];
-	}
-	Ascii[2*len]=0;
-}
-//*******************************************************************************
-void AsciiToHex(char *Ascii,unsigned char *Hex,int len)
-{
-	int i;
-	unsigned char ch;
-	for(i=0;i<len;i=i+2)
-    {
-        ch=(Ascii[i]&0xf);
-		if(Ascii[i]>'9')
-            ch+=9;
-
-		Hex[i/2]=ch<<4;
-
-        ch=Ascii[i+1]&0xf;
-		if(Ascii[i+1]>'9')
-            ch+=9;
-
-		Hex[i/2]+=ch;
-	}
-}
-
-int convTo3x(unsigned char*from,int flen,char*to)
-{
-	int i = 0;
-	unsigned char ch;
-	for(i=0;i<flen;++i) {
-		ch=from[i];
-		ch>>=4;
-		ch&=0x0f;
-		ch|=0x30; 
-		to[i*2] = ch;
-		ch=from[i];
-		ch&=0x0f;
-		ch|=0x30; 
-		to[i*2+1]=ch;
-	}
-
-	return flen*2;
-}
-
-int _3xToHex(char *Ascii,unsigned char *Hex,int len)
-{
-	int i = 0,j=0;
-	unsigned char tmp[512] = {0};
-	unsigned char ch;
-	for(i = 0;i<len;i++)
-	{
-		j = 2*i;
-		ch = Ascii[j]&0x0F;
-		ch<<=4;
-		ch |= (Ascii[j+1]&0x0F);
-
-		tmp[j/2] = ch;
-	}
-
-	memcpy(Hex,tmp,len/2);
-	return (len/2);
-}
-
-int get_random(int len,unsigned char*random)
-{
-	int iloop;
-	unsigned char ch;
-
-	srand((int)time(NULL));
-	
-	for(iloop=0;iloop<len;iloop++)
-	{
-		ch = rand()%256;
-		if(ch==0)
-		{
-			iloop--;
-			continue;
-		}
-		random[iloop]=ch;
-	}
-
-	return iloop;
-}
-
-int RSA_GetBitLen(unsigned char *a, int alen) 
-{
-	int i;
-	int temp;
-	int bitlen;
-	if (0 == alen)
-		return 0;	
-	
-	for(i = alen-1;i >= 0; i--)
-	{
-		if(a[i] > 0)
-			break;
-	}
-	if(i == -1)
-	{
-		return 0;
-	}
-	temp = i;	
-	bitlen = temp << 3;	
-	
-	for (i = 7; i >= 0; i--)
-	{
-		if (a[temp] & (1 << i))
-			break;
-	}
-	bitlen += (int)(i + 1);
-	return bitlen;
-}

+ 0 - 15
Module/mod_cardissuer/public.h

@@ -1,15 +0,0 @@
-#ifndef _PUBLIC_H
-#define _PUBLIC_H
-
-void ConvAscii(unsigned char *Hex,char *Ascii,unsigned int len);
-
-void AsciiToHex(char *Ascii,unsigned char *Hex,int len);
-
-int convTo3x(unsigned char*from,int flen,char*to);
-
-int _3xToHex(char *Ascii,unsigned char *Hex,int len);
-
-int get_random(int len,unsigned char*random);
-
-int RSA_GetBitLen(unsigned char *a, int alen);
-#endif

+ 0 - 986
Module/mod_cardissuer/sm2.cpp

@@ -1,986 +0,0 @@
-#include "StdAfx.h"
-
-#include "sm2.h"
-#include "kdf.h"
-#include "public.h"
-
-
-static const char rnd_seed[] = "string to make the random number generator think it has entropy";
-#pragma comment(lib,"libeay32.lib")
-
-BN_CTX *ctx = NULL;
-EC_GROUP *group;
-
-void BNPrintf(BIGNUM* bn)
-{
-	char *p=NULL;
-	p=BN_bn2hex(bn);
-	printf("%s",p);
-	OPENSSL_free(p);
-}
-
-
-int sm2_init()
-{
-	BIGNUM *p, *a, *b;
-	BIGNUM *x, *y, *z;
-	EC_POINT *P, *Q;
-    
- 	CRYPTO_set_mem_debug_functions(0, 0, 0, 0, 0);
-	CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
-	ERR_load_crypto_strings();
-	RAND_seed(rnd_seed, sizeof rnd_seed); /* or BN_generate_prime may fail */
-
-	/*
-	素数p:FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFF
-	系数a:FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFC
-	系数b:28E9FA9E 9D9F5E34 4D5A9E4B CF6509A7 F39789F5 15AB8F92 DDBCBD41 4D940E93
-
-	 基点G:
-	 xG:32C4AE2C 1F198119 5F990446 6A39C994 8FE30BBF F2660BE1 715A4589 334C74C7
-	 yG:BC3736A2 F4F6779C 59BDCEE3 6B692153 D0A9877C C62A4740 02DF32E5 2139F0A0
-  
-	阶n:FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF 7203DF6B 21C6052B 53BBF409 39D54123
-*/
-	
-	ctx = BN_CTX_new();
-	if (!ctx) ABORT;
-
-	/* Curve SM2 (Chinese National Algorithm) */
-	//http://www.oscca.gov.cn/News/201012/News_1197.htm
-	p = BN_new();
-	a = BN_new();
-	b = BN_new();
-	if (!p || !a || !b) ABORT;
-	group = EC_GROUP_new(EC_GFp_mont_method()); /* applications should use EC_GROUP_new_curve_GFp
- 	                                             * so that the library gets to choose the EC_METHOD */
-	if (!group) ABORT;
-	
-	if (!BN_hex2bn(&p, "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF"))ABORT;//8542D69E4C044F18E8B92435BF6FF7DE457283915C45517D722EDB8B08F1DFC3")) ABORT;
-	if (1 != BN_is_prime_ex(p, BN_prime_checks, ctx, NULL)) ABORT;
-	if (!BN_hex2bn(&a, "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC"))ABORT;//787968B4FA32C3FD2417842E73BBFEFF2F3C848B6831D7E0EC65228B3937E498")) ABORT;
-	if (!BN_hex2bn(&b, "28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93"))ABORT;//63E4C6D3B23B0C849CF84241484BFE48F61D59A5B16BA06E6E12D1DA27C5249A")) ABORT;
-	if (!EC_GROUP_set_curve_GFp(group, p, a, b, ctx)) ABORT;
-
-	P = EC_POINT_new(group);
-	Q = EC_POINT_new(group);
-	if (!P || !Q) ABORT;
-
-	x = BN_new();
-	y = BN_new();
-	z = BN_new();
-	if (!x || !y || !z) ABORT;
-
-	if (!BN_hex2bn(&x, "32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7"))ABORT;//421DEBD61B62EAB6746434EBC3CC315E32220B3BADD50BDC4C4E6C147FEDD43D")) ABORT;
-	if (!EC_POINT_set_compressed_coordinates_GFp(group, P, x, 0, ctx)) ABORT;
-	if (!EC_POINT_is_on_curve(group, P, ctx)) ABORT;
-	if (!BN_hex2bn(&z, "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123"))ABORT;//8542D69E4C044F18E8B92435BF6FF7DD297720630485628D5AE74EE7C32E79B7")) ABORT;
-	if (!EC_GROUP_set_generator(group, P, z, BN_value_one())) ABORT;
-	
-	if (!EC_POINT_get_affine_coordinates_GFp(group, P, x, y, ctx)) ABORT;
-
-	/* G_y value taken from the standard: */
-	if (!BN_hex2bn(&z, "BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0"))ABORT;//0680512BCBB42C07D47349D2153B70C4E5D7FDFCBFA36EA1A85841B9E46E09A2")) ABORT;
-	if (0 != BN_cmp(y, z)) ABORT;
-	
-	if (EC_GROUP_get_degree(group) != 256) ABORT;
-
-	if (!EC_GROUP_get_order(group, z, ctx)) ABORT;
-	if (!EC_GROUP_precompute_mult(group, ctx)) ABORT;
-	if (!EC_POINT_mul(group, Q, z, NULL, NULL, ctx)) ABORT;
-	if (!EC_POINT_is_at_infinity(group, Q)) ABORT;
-	
-	EC_POINT_free(P);
-	EC_POINT_free(Q);
-	
-	return 0;
-}
-
-EC_KEY* sm2_generate_key()
-{
-	EC_KEY *tmpKey = NULL;
-
-	if ((tmpKey = EC_KEY_new()) == NULL)
-		return NULL;
-	if (EC_KEY_set_group(tmpKey, group) == 0)
-	{
-		fprintf(stdout," failed\n");
-		return NULL;
-	}
-
-	if(EC_KEY_generate_key(tmpKey)!=1)
-	{
-		printf("EC_KEY_generate_key err.\n");
-		return NULL;
-	}
-	/* 检查密钥 */
-
-	if(EC_KEY_check_key(tmpKey)!=1)
-	{
-		printf("check key err.\n");
-		return NULL;
-    }
-
-	return tmpKey;
-}
-
-
-EC_POINT *sm2_compute_key(const EC_POINT *b_pub_key_r, const EC_POINT *b_pub_key, const BIGNUM *a_r,EC_KEY *a_eckey)
-{
-	BN_CTX *ctx;
-	EC_POINT *tmp=NULL;
-	BIGNUM *x=NULL, *y=NULL, *order=NULL,*z=NULL;
-	const BIGNUM *priv_key;
-	const EC_GROUP* group;
-	EC_POINT *ret= NULL;
-/*	size_t buflen, len;*/
-	unsigned char *buf=NULL;
-	int i, j;
-	//char *p=NULL;
-	BIGNUM *x1,*x2,*t,*h;
-
-	if ((ctx = BN_CTX_new()) == NULL) goto err;
-	BN_CTX_start(ctx);
-	x = BN_CTX_get(ctx);
-	y = BN_CTX_get(ctx);
-	order = BN_CTX_get(ctx);
-	z = BN_CTX_get(ctx);
-	x1 = BN_CTX_get(ctx);
-	x2 = BN_CTX_get(ctx);
-	t = BN_CTX_get(ctx);
-	h = BN_CTX_get(ctx);
-
-	
-	priv_key = EC_KEY_get0_private_key(a_eckey);
-	if (priv_key == NULL)
-	{
-		ECDHerr(ECDH_F_ECDH_COMPUTE_KEY,ECDH_R_NO_PRIVATE_VALUE);
-		goto err;
-	}
-
-	group = EC_KEY_get0_group(a_eckey);
-	if ((tmp=EC_POINT_new(group)) == NULL)
-	{
-		ECDHerr(ECDH_F_ECDH_COMPUTE_KEY,ERR_R_MALLOC_FAILURE);
-		goto err;
-	}
-
-	if (!EC_POINT_mul(group, tmp, a_r, NULL, NULL, ctx)) 
-	{
-		ECDHerr(ECDH_F_ECDH_COMPUTE_KEY,ECDH_R_POINT_ARITHMETIC_FAILURE);
-		goto err;
-	}
-	
-	if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) == NID_X9_62_prime_field) 
-	{
-		if (!EC_POINT_get_affine_coordinates_GFp(group, tmp, x, NULL, ctx)) 
-		{
-			ECDHerr(ECDH_F_ECDH_COMPUTE_KEY,ECDH_R_POINT_ARITHMETIC_FAILURE);
-			goto err;
-		}
-	}
-	else
-	{
-		if (!EC_POINT_get_affine_coordinates_GF2m(group, tmp, x, NULL, ctx)) 
-		{
-			ECDHerr(ECDH_F_ECDH_COMPUTE_KEY,ECDH_R_POINT_ARITHMETIC_FAILURE);
-			goto err;
-		}
-	}
-	
-	if (!EC_GROUP_get_order(group, order, ctx))
-	{
-		ECDSAerr(ECDSA_F_ECDSA_DO_SIGN, ERR_R_EC_LIB);
-		goto err;
-	}
-		
-	i = BN_num_bits(order);
-	j = i/2 -1;
-	BN_mask_bits(x,j);
-	BN_set_word(y,2);
-	BN_set_word(z,j);
-	BN_exp(y,y,z,ctx);
-	BN_add(x1,x,y);
-
-	BN_mod_mul(t,x1,a_r,order,ctx);
-	BN_mod_add_quick(t,t,priv_key,order);
-// 
-	
-	if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) == NID_X9_62_prime_field) 
-	{
-		if (!EC_POINT_get_affine_coordinates_GFp(group, b_pub_key_r, x, NULL, ctx)) 
-		{
-			ECDHerr(ECDH_F_ECDH_COMPUTE_KEY,ECDH_R_POINT_ARITHMETIC_FAILURE);
-			goto err;
-		}
-	}
-	else
-	{
-		if (!EC_POINT_get_affine_coordinates_GF2m(group, b_pub_key_r, x, NULL, ctx)) 
-		{
-			ECDHerr(ECDH_F_ECDH_COMPUTE_KEY,ECDH_R_POINT_ARITHMETIC_FAILURE);
-			goto err;
-		}
-	}
-
-	i = BN_num_bits(order);
-	j = i/2 -1;
-	BN_mask_bits(x,j);
-	BN_set_word(y,2);
-	BN_set_word(z,j);
-	BN_exp(y,y,z,ctx);
-	BN_add(x2,x,y);
-	
-	//x2*Rb+Pb;
-	if (!EC_POINT_mul(group, tmp, NULL,b_pub_key_r,x2,ctx) )
-	{
-		ECDHerr(ECDH_F_ECDH_COMPUTE_KEY,ECDH_R_POINT_ARITHMETIC_FAILURE);
-		goto err;
-	}
-	if ((ret=EC_POINT_new(group)) == NULL)
-	{
-		ECDHerr(ECDH_F_ECDH_COMPUTE_KEY,ERR_R_MALLOC_FAILURE);
-		goto err;
-	}
-	if (!EC_POINT_add(group, ret, b_pub_key, tmp, ctx))
-	{
-		ECDHerr(ECDH_F_ECDH_COMPUTE_KEY,ECDH_R_POINT_ARITHMETIC_FAILURE);
-		goto err;
-	}
-	if (!EC_POINT_get_affine_coordinates_GFp(group,ret, x, y, ctx)) 
-	{
-		goto err;
-	}
-
-	if(!EC_GROUP_get_cofactor(group, h, ctx))
-	{
-		goto err;
-	}
-    BN_mul(t,t,h,ctx);
-
-	//h*t*(x2*Rb+Pb)
-	if (!EC_POINT_mul(group, ret, NULL,ret,t,ctx) ) 
-	{
-		goto err;
-	}
-	if (!EC_POINT_get_affine_coordinates_GFp(group,ret, x, y, ctx)) 
-	{
-		goto err;
-	}
-	
-err:
-	if (tmp) EC_POINT_free(tmp);
-	if (ctx) BN_CTX_end(ctx);
-	if (ctx) BN_CTX_free(ctx);
-	if (buf) OPENSSL_free(buf);
-	return(ret);
-}
-
-int sm2_exchange_key(EC_KEY*B,EC_KEY*RB,EC_POINT*PA,EC_POINT*RA,unsigned char*ZA,unsigned char *ZB,unsigned char *outkey,size_t keylen)
-{
-	EC_POINT *dhpoint = NULL;
-	BN_CTX * ctx;
-	BIGNUM *x, *y,*z;
-	int ret = 0;
-	unsigned char in[256],SB[33],tmp[33]={0};
-	int inlen;
-	int len;
-
-	ctx = BN_CTX_new();
-	x = BN_new();
-	y = BN_new();
-	z = BN_new();
-
-	if (!x || !y ||!z) goto err;
-	
-
-	z = (BIGNUM*)EC_KEY_get0_private_key(RB);
-
-	dhpoint = sm2_compute_key(RA,PA,z,B);
-	
-	if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) == NID_X9_62_prime_field) 
-	{
-		if (!EC_POINT_get_affine_coordinates_GFp(group,dhpoint, x, y, ctx))
-		{
-			fprintf(stdout, " failed\n");
-			goto err;
-		}
-	}
-	else
-	{
-		if (!EC_POINT_get_affine_coordinates_GF2m(group,dhpoint, x, y, ctx)) 
-		{
-			ECDHerr(ECDH_F_ECDH_COMPUTE_KEY,ECDH_R_POINT_ARITHMETIC_FAILURE);
-			goto err;
-		}
-	}
-	
-
-	fprintf(stdout, "\nTesting DH Point\n     Xv = 0x");
-	BNPrintf(x);
-	fprintf(stdout, "\n     Yv = 0x");
-	BNPrintf( y);
-	fprintf(stdout, "\n");
-	
-	len = BN_bn2bin(x,in);
-	inlen =BN_bn2bin(y,in+len);
-	inlen = inlen + len;
-	memcpy(in+inlen,ZA,32);
-	inlen +=32;
-	memcpy(in+inlen,ZB,32);
-	inlen +=32;
-	
-	ret = sm3_kdf(in,inlen,keylen,outkey);
-
-//计算可选项 Hash(0x02||yv||Hash(xv||ZA||ZB||x1||y1||x2||y2));
-	BN_bn2bin(y,tmp);
-
-	memset(in,0,sizeof(in));
-	len = BN_bn2bin(x,in);
-	memcpy(in+len,ZA,32);
-	len +=32;
-	memcpy(in+len,ZB,32);
-	len +=32;
-	inlen = len;
-
-	if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) == NID_X9_62_prime_field) 
-	{
-		if (!EC_POINT_get_affine_coordinates_GFp(group,RA, x, y, ctx))
-		{
-			fprintf(stdout, " failed\n");
-			goto err;
-		}
-	}
-	else
-	{
-		if (!EC_POINT_get_affine_coordinates_GF2m(group,RA, x, y, ctx)) 
-		{
-			ECDHerr(ECDH_F_ECDH_COMPUTE_KEY,ECDH_R_POINT_ARITHMETIC_FAILURE);
-			goto err;
-		}
-	}
-
-	len = BN_bn2bin(x,in+inlen);
-	inlen +=len;
-	len =BN_bn2bin(y,in+inlen);
-	inlen += len;
-
-	len = ecKey2str(RB,in+inlen);
-	inlen += len;
-
-	sm3(in,inlen,SB);
-
-	memset(in,0,sizeof(in));
-	in[0] = 0x02;
-	memcpy(in+1,tmp,32);
-	memcpy(in+33,SB,32);
-
-	sm3(in,65,SB);
-
-	memcpy(outkey+keylen,SB,32);
-	//ret  = 1;
-err:
-	EC_POINT_free(dhpoint);
-	BN_CTX_free(ctx);
-	
-	return ret;
-	return 0;
-}
-
-int sm2_end()
-{
-	EC_GROUP_free(group);
-	BN_CTX_free(ctx);
-
-	CRYPTO_cleanup_all_ex_data();
-	ERR_free_strings();
-	ERR_remove_state(0);
-	CRYPTO_mem_leaks_fp(stderr);
-
-	return 0;
-}
-
-int ecKey2str(EC_KEY*k,unsigned char*pubkey)
-{
-	EC_POINT *point;
-	BIGNUM *x,*y;
-	int ilen = 0,tolen=0;
-	unsigned char to[512] = {0};
-
-	x = BN_new();
-	y = BN_new();
-
-	point = (EC_POINT *)EC_KEY_get0_public_key(k);
-	if (!EC_POINT_get_affine_coordinates_GFp(group,point, x, y, ctx)) ABORT; 
-
-	tolen = BN_bn2bin(x,to);
-	memcpy(pubkey,to,tolen);
-
-	ilen +=  tolen;
-	tolen = BN_bn2bin(y,to);
-	memcpy(pubkey+ilen,to,tolen);
-	ilen +=tolen;
-
-	return ilen;
-}
-
-int pubkey2ecPoint(char*pubkey,EC_POINT**k)
-{
-	char tmp[65] = {0};
-	BIGNUM *x,*y;
-
-	x = BN_new();
-	y = BN_new();
-
-	memcpy(tmp,pubkey,64);
-
-	if(!BN_hex2bn(&x,(const char*)tmp))ABORT;
-
-	memcpy(tmp,pubkey+64,64);
-	if(!BN_hex2bn(&y,(const char*)tmp))ABORT;
-	if(!EC_POINT_set_affine_coordinates_GFp(group,*k,x,y,ctx))ABORT;
-	return 0;
-}
-
-/*
-random_k :随机数k,Ascii码表示的16进制字符串如:4C62EEFD6ECFC2B95B92FD6C3D9575148AFA17425546D49018E5388D49DD7B4F
-ecpoint_PBx:公钥的x值:435B39CCA8F3B508C1488AFC67BE491A0F7BA07E581A0E4849A5CF70628A7E0A
-ecpont_PBy:公钥的y值:75DDBA78F15FEECB4C7895E2C1CDF5FE01DEBB2CDBADF45399CCF77BBA076A42
-M:要加密的信息,原文,不处理
-encdata:加密后的返回值,已转为Ascii码形式
-
-返回值:加密返回的字符串长度
-*/
-int sm2_encrypt(char*random_k,char*ecpoint_PBx,char*ecpoint_PBy,const char *M,unsigned char mdatalen,char*encdata)
-/*
-新国密密文格式加密
-*/
-{
-	int len,inlen,encLen = 0,mLen = 0;
-	unsigned char in[512],outkey[256]={0},C2[256]={0};
-	BIGNUM *x,*y,*k;
-	EC_POINT *C1,*P,*PB;
-	unsigned char C3[256] = {0};
-	unsigned char tsm2data[256];
-	mLen = mdatalen;
-	sm2_init();
-	
-	x = BN_new();
-	y = BN_new();
-	k = BN_new();
-	
-	C1 = EC_POINT_new(group);
-	
-	PB = EC_POINT_new(group);
-	
-	P = EC_POINT_new(group);
-	
-	if(!BN_hex2bn(&k,random_k))ABORT;//随机数k
-	
-	if(!EC_POINT_mul(group,C1,k,NULL,NULL,ctx))ABORT;
-	
-	if(!EC_POINT_get_affine_coordinates_GFp(group,C1,x,y,ctx))ABORT;
-/*	
-	printf("C1=[k]G:\r\n");
-	BNPrintf(x);
-	BNPrintf(y);
-*/	
-	encdata[0] = 0x04;
-	encLen = 1;
-    
-	 memset(encdata+1,0,64);
-	 len = BN_bn2bin(x,tsm2data);
-	 memcpy(encdata+33-len,tsm2data,len);
-	 len=32;
-	 inlen = BN_bn2bin(y,tsm2data);
-	 memcpy(encdata+65-inlen,tsm2data,inlen);
-	 inlen=32;
-	 encLen += len + inlen;
-	
-
-	if(!BN_hex2bn(&x,ecpoint_PBx))ABORT;//xB
-	if(!BN_hex2bn(&y,ecpoint_PBy))ABORT;//yB
-	
-	if(!EC_POINT_set_affine_coordinates_GFp(group,PB,x,y,ctx))ABORT;
-	
-	if(!EC_POINT_mul(group,P,NULL,PB,k,ctx))ABORT;
-	
-	if(!EC_POINT_get_affine_coordinates_GFp(group,P,x,y,ctx))ABORT;
-/*	
-	printf("P=[k]PB:\r\n");
-	BNPrintf(x);
-	BNPrintf(y);
-*/	
-	memset(in,0,64);
-	len = BN_bn2bin(x,tsm2data);
-    memcpy(in+32-len,tsm2data,len);
-	len=32;
-	inlen =BN_bn2bin(y,tsm2data);
-    memcpy(in+64-inlen,tsm2data,inlen);
-	inlen = 64;
-	
-	
-	sm3_kdf(in,inlen,mLen,outkey);
-	
-	for(len=0;len<mLen;len++)
-	{
-//		printf("%02X ",outkey[len]);
-		C2[len] = M[len]^outkey[len];
-	}
-	
-	memcpy(encdata+encLen,C2,mLen);
-	encLen +=mLen;
-    
-	memset(in,0,32);
-	len = BN_bn2bin(x,tsm2data);
-	memcpy(in+32-len,tsm2data,len);
-	len=32;
-	memcpy(in+len,M,mdatalen);
-	len +=mdatalen;
-	memset(in+len,0,32);
-	inlen =BN_bn2bin(y,tsm2data);
-	memcpy(in+len+32-inlen,tsm2data,inlen);
-	inlen=32;
-	inlen +=len;
-	
-	sm3(in,inlen,C3);
-	memcpy(encdata+encLen,C3,32);
-	encLen +=32;
-
-	ConvAscii((unsigned char*)encdata,(char*)in,encLen);
-	memcpy(encdata,in,encLen*2);
-    encdata[encLen*2]=0x00;
-	sm2_end();
-	return encLen*2;
-}
-
-/*
-random_k :随机数k,Ascii码表示的16进制字符串如:4C62EEFD6ECFC2B95B92FD6C3D9575148AFA17425546D49018E5388D49DD7B4F
-ecpoint_PBx:公钥的x值:435B39CCA8F3B508C1488AFC67BE491A0F7BA07E581A0E4849A5CF70628A7E0A
-ecpont_PBy:公钥的y值:75DDBA78F15FEECB4C7895E2C1CDF5FE01DEBB2CDBADF45399CCF77BBA076A42
-M:要加密的信息,原文,不处理
-encdata:加密后的返回值,已转为Ascii码形式
-
-返回值:加密返回的字符串长度
-*/
-int sm2_encrypt_new(char*random_k,char*ecpoint_PBx,char*ecpoint_PBy,const char *M,unsigned char mdatalen,char*encdata)
-/*
-新国密密文格式加密
-*/
-{
-	int len,inlen,encLen = 0,mLen = 0;
-	unsigned char in[512],outkey[256]={0},C2[256]={0};
-	unsigned char tsm2data[256];
-	BIGNUM *x,*y,*k;
-	EC_POINT *C1,*P,*PB;
-	unsigned char C3[256] = {0};
-	
-	mLen = mdatalen;
-	sm2_init();
-	
-	x = BN_new();
-	y = BN_new();
-	k = BN_new();
-	
-	C1 = EC_POINT_new(group);
-	
-	PB = EC_POINT_new(group);
-	
-	P = EC_POINT_new(group);
-	
-	if(!BN_hex2bn(&k,random_k))ABORT;//???k
-	
-	if(!EC_POINT_mul(group,C1,k,NULL,NULL,ctx))ABORT;
-	
-	if(!EC_POINT_get_affine_coordinates_GFp(group,C1,x,y,ctx))ABORT;
-	
-
-	encLen = 0;
-    memset(encdata,0,64);
-	len = BN_bn2bin(x,tsm2data);
-	memcpy(encdata+32-len,tsm2data,len);
-	len=32;
-	inlen = BN_bn2bin(y,tsm2data);
-	memcpy(encdata+64-inlen,tsm2data,inlen);
-	inlen=32;
-	encLen += len + inlen;
-	
-
-	if(!BN_hex2bn(&x,ecpoint_PBx))ABORT;//xB
-	if(!BN_hex2bn(&y,ecpoint_PBy))ABORT;//yB
-	
-	if(!EC_POINT_set_affine_coordinates_GFp(group,PB,x,y,ctx))ABORT;
-	
-	if(!EC_POINT_mul(group,P,NULL,PB,k,ctx))ABORT;
-	
-	if(!EC_POINT_get_affine_coordinates_GFp(group,P,x,y,ctx))ABORT;
-/*	
-	printf("P=[k]PB:\r\n");
-	BNPrintf(x);
-	BNPrintf(y);
-*/	
-	memset(in,0,64);
-	len = BN_bn2bin(x,tsm2data);
-    memcpy(in+32-len,tsm2data,len);
-	len=32;
-	inlen =BN_bn2bin(y,tsm2data);
-    memcpy(in+64-inlen,tsm2data,inlen);
-	inlen = 64;
-	
-	
-	sm3_kdf(in,inlen,mLen,outkey);
-	
-	for(len=0;len<mLen;len++)
-	{
-//		printf("%02X ",outkey[len]);
-		C2[len] = M[len]^outkey[len];
-	}
-	
-	memcpy(encdata+encLen+32,C2,mLen);
-	
-    memset(in,0,32);
-	len = BN_bn2bin(x,tsm2data);
-	memcpy(in+32-len,tsm2data,len);
-	len=32;
-	memcpy(in+len,M,mdatalen);
-	len +=mdatalen;
-	memset(in+len,0,32);
-	inlen =BN_bn2bin(y,tsm2data);
-	memcpy(in+len+32-inlen,tsm2data,inlen);
-	inlen=32;
-	inlen +=len;
-	
-	sm3(in,inlen,C3);
-	memcpy(encdata+encLen,C3,32);
-	encLen +=mLen;
-	encLen +=32;
-
-	ConvAscii((unsigned char*)encdata,(char*)in,encLen);
-	memcpy(encdata,in,encLen*2);
-    encdata[encLen*2]=0x00;
-	sm2_end();
-	return encLen*2;
-}
-/*
-decdata:Ascii码表示的16进制字符串,sm2_encrypt的返回值字符串,Ascii码的16进制形式
-dB:B的私钥,如1649AB77A00637BD5E2EFE283FBF353534AA7F7CB89463F208DDBC2920BB0DA0
-M:解密后的值,没有编码
-
-  返回值:>0 M的长度
-		  =0 解密失败
-*/
-int sm2_decrypt(const char*decdata,const char*dB,char*M)
-/*
-旧国密密文格式解密
-*/
-{
-	int len,inlen,mLen = 0;
-	unsigned char in[256],outkey[256]={0};
-	unsigned char C2[256]={0},C3[256]={0};
-	char xstr[65]={0},ystr[65]={0};
-	unsigned char tsm2data[256];
-	EC_POINT *C1,*S,*P;
-	BIGNUM *x,*y,*h;
-
-	x = BN_new();
-	y = BN_new();
-	h = BN_new();
-
-	sm2_init();
-	
-	C1 = EC_POINT_new(group);
-	S = EC_POINT_new(group);
-	P = EC_POINT_new(group);
-
-	memcpy(xstr,decdata+2,64);
-	memcpy(ystr,decdata+66,64);
-	len = strlen(decdata);
-
-	mLen = len - 130 - 64;
-
-	AsciiToHex((char*)decdata+130,C2,64);
-	AsciiToHex((char*)decdata+len-64,C3,64);
-
-	mLen /=2;
-/*
-	memcpy(C2,decdata+130,mLen);
-	memcpy(C3,decdata+len-64,64);
-*/
-	if(!BN_hex2bn(&x,xstr))ABORT;
-	if(!BN_hex2bn(&y,ystr))ABORT;
-
-	if(!EC_POINT_set_affine_coordinates_GFp(group,C1,x,y,ctx))ABORT;
-/*
-	printf("C1:\r\n");
-	BNPrintf(x);
-	printf("\r\n");
-	BNPrintf(y);
-	printf("\r\n");
-*/
-
-	if(!EC_POINT_is_on_curve(group,C1,ctx))ABORT;
-	
-	if(!EC_GROUP_get_cofactor(group,h,ctx))ABORT;
-
-	if(!EC_POINT_mul(group,S,NULL,C1,h,ctx))ABORT;
-
-	if(EC_POINT_is_at_infinity(group,S))ABORT;	//S是无穷远点
-
-	if(!BN_hex2bn(&x,dB))ABORT;
-	if(!EC_POINT_mul(group,P,NULL,C1,x,ctx))ABORT;
-
-	if(!EC_POINT_get_affine_coordinates_GFp(group,P,x,y,ctx))ABORT;
-/*
-	printf("P=[dB]C1:\r\n");
-	BNPrintf(x);
-	printf("\r\n");
-	BNPrintf(y);
-	printf("\r\n");
-*/
-	memset(in,0,64);
-	len = BN_bn2bin(x,tsm2data);
-    memcpy(in+32-len,tsm2data,len);
-	len=32;
-	inlen =BN_bn2bin(y,tsm2data);
-    memcpy(in+64-inlen,tsm2data,inlen);
-	inlen = 64;
-	
-	
-	sm3_kdf(in,inlen,mLen,outkey);
-	
-	
-	for(len=0;len<mLen;len++)
-	{
-		M[len] = C2[len]^outkey[len];
-	}
-	M[mLen] = 0x00;
-	
-	memset(in,0,32);
-	len = BN_bn2bin(x,tsm2data);
-    memcpy(in+32-len,tsm2data,len);
-	len=32;
-	   
-	memcpy(in+len,M,mLen);
-	len +=mLen;
-	memset(in+len,0,32);
-	inlen =BN_bn2bin(y,tsm2data);
-	memcpy(in+len+32-inlen,tsm2data,inlen);
-    inlen=32;
-
-	inlen +=len;
-	sm3(in,inlen,C2);
-    sm2_end();
-	if(memcmp(C2,C3,32)==0)
-	{
-		return mLen;
-	}
-	else
-	{
-		return 0;
-	}
-}
-/*
-decdata:Ascii码表示的16进制字符串,sm2_encrypt的返回值字符串,Ascii码的16进制形式
-dB:B的私钥,如1649AB77A00637BD5E2EFE283FBF353534AA7F7CB89463F208DDBC2920BB0DA0
-M:解密后的值,没有编码
-
-  返回值:>0 M的长度
-		  =0 解密失败
-*/
-int sm2_decrypt_new(const char*decdata,const char*dB,char*M)
-/*
-新国密密文格式解密
-*/
-{
-	int len,inlen,mLen = 0;
-	unsigned char in[256],outkey[256]={0};
-	unsigned char C2[256]={0},C3[256]={0};
-	unsigned char tsm2data[256];
-	char xstr[65]={0},ystr[65]={0};
-	EC_POINT *C1,*S,*P;
-	BIGNUM *x,*y,*h;
-	x = BN_new();
-	y = BN_new();
-	h = BN_new();
-
-	sm2_init();
-	
-	C1 = EC_POINT_new(group);
-	S = EC_POINT_new(group);
-	P = EC_POINT_new(group);
-
-	memcpy(xstr,decdata,64);
-	memcpy(ystr,decdata+64,64);
-	len = strlen(decdata);
-
-	mLen = len - 128 - 64;
-
-	AsciiToHex((char*)decdata+128,C3,64);
-	AsciiToHex((char*)decdata+128+64,C2,mLen);
-
-	mLen /=2;
-/*
-	memcpy(C2,decdata+130,mLen);
-	memcpy(C3,decdata+len-64,64);
-*/
-	if(!BN_hex2bn(&x,xstr))ABORT;
-	if(!BN_hex2bn(&y,ystr))ABORT;
-
-	if(!EC_POINT_set_affine_coordinates_GFp(group,C1,x,y,ctx))ABORT;
-/*
-	printf("C1:\r\n");
-	BNPrintf(x);
-	printf("\r\n");
-	BNPrintf(y);
-	printf("\r\n");
-*/
-
-	if(!EC_POINT_is_on_curve(group,C1,ctx))ABORT;
-	
-	if(!EC_GROUP_get_cofactor(group,h,ctx))ABORT;
-
-	if(!EC_POINT_mul(group,S,NULL,C1,h,ctx))ABORT;
-
-	if(EC_POINT_is_at_infinity(group,S))ABORT;	//S是无穷远点
-
-	if(!BN_hex2bn(&x,dB))ABORT;
-	if(!EC_POINT_mul(group,P,NULL,C1,x,ctx))ABORT;
-
-	if(!EC_POINT_get_affine_coordinates_GFp(group,P,x,y,ctx))ABORT;
-/*
-	printf("P=[dB]C1:\r\n");
-	BNPrintf(x);
-	printf("\r\n");
-	BNPrintf(y);
-	printf("\r\n");
-*/
-	memset(in,0,64);
-	len = BN_bn2bin(x,tsm2data);
-    memcpy(in+32-len,tsm2data,len);
-	len=32;
-	inlen =BN_bn2bin(y,tsm2data);
-    memcpy(in+64-inlen,tsm2data,inlen);
-	inlen = 64;
-	
-	
-	sm3_kdf(in,inlen,mLen,outkey);
-	
-	
-	for(len=0;len<mLen;len++)
-	{
-		M[len] = C2[len]^outkey[len];
-	}
-	M[mLen] = 0x00;
-	
-	memset(in,0,32);
-	len = BN_bn2bin(x,tsm2data);
-    memcpy(in+32-len,tsm2data,len);
-	len=32;
-	   
-	memcpy(in+len,M,mLen);
-	len +=mLen;
-	memset(in+len,0,32);
-	inlen =BN_bn2bin(y,tsm2data);
-	memcpy(in+len+32-inlen,tsm2data,inlen);
-    inlen=32;
-
-	inlen +=len;
-	
-	sm3(in,inlen,C2);
-    sm2_end();
-	if(memcmp(C2,C3,32)==0)
-	{
-		return mLen;
-	}
-	else
-	{
-		return 0;
-	}
-}
-int main11()
-{
-	EC_KEY *B = NULL,*RB = NULL;
-	EC_POINT *PA,*RA,*PB,*PRB;
-	BIGNUM *x,*y;
-	unsigned char outkey[32] = {0};
-	unsigned char ZA[33]={0},ZB[33]={0};
-	unsigned char pubkey[130]={0};
-	int i;
-
-	
-	x = BN_new();
-	y = BN_new();
-
-	sm2_init();
-
-	
-	PA = EC_POINT_new(group);
-	
-	RA = EC_POINT_new(group);
-/*	指定私钥dB和rB */
-	PB = EC_POINT_new(group);
-	
-	PRB = EC_POINT_new(group);
-
-	if ((B = EC_KEY_new()) == NULL)
-		return 1;
-	if (EC_KEY_set_group(B, group) == 0)
-	{
-		fprintf(stdout," failed\n");
-		return 1;
-	}
-	
-	if ((RB = EC_KEY_new()) == NULL)
-		return 1;
-	if (EC_KEY_set_group(RB, group) == 0)
-	{
-		fprintf(stdout," failed\n");
-		return 1;
-	}
-
-	if (!BN_hex2bn(&x, "785129917D45A9EA5437A59356B82338EAADDA6CEB199088F14AE10DEFA229B5"))ABORT;//6FCBA2EF9AE0AB902BC3BDE3FF915D44BA4CC78F88E2F8E7F8996D3B8CCEEDEE")) ABORT;
-	if (!EC_POINT_mul(group,PB, x, NULL, NULL, ctx)) ABORT;
-	
-	EC_KEY_set_private_key(B,x);
-	EC_KEY_set_public_key(B, PB);
-	
-	if (!BN_hex2bn(&x, "7E07124814B309489125EAED101113164EBF0F3458C5BD88335C1F9D596243D6"))ABORT;//6FCBA2EF9AE0AB902BC3BDE3FF915D44BA4CC78F88E2F8E7F8996D3B8CCEEDEE")) ABORT;
-	if (!EC_POINT_mul(group,PRB, x, NULL, NULL, ctx)) ABORT;
-	EC_KEY_set_private_key(RB,x);
-	EC_KEY_set_public_key(RB, PRB);
-
-//*/
-//随机产生dB和rB		
-//	B = sm2_generate_key();
-	
-//	RB = sm2_generate_key();
-
-	ecKey2str(B,pubkey);
-
-	if(!PA || !RA)
-		return 1;
-
-
-	if(!BN_hex2bn(&x,"160E12897DF4EDB61DD812FEB96748FBD3CCF4FFE26AA6F6DB9540AF49C94232"))ABORT;
-	if(!BN_hex2bn(&y,"4A7DAD08BB9A459531694BEB20AA489D6649975E1BFCF8C4741B78B4B223007F"))ABORT;
-	if(!EC_POINT_set_affine_coordinates_GFp(group,PA,x,y,ctx))ABORT;
-
-//	pubkey2ecPoint("160E12897DF4EDB61DD812FEB96748FBD3CCF4FFE26AA6F6DB9540AF49C942324A7DAD08BB9A459531694BEB20AA489D6649975E1BFCF8C4741B78B4B223007F",&PA);
-
-	if(!BN_hex2bn(&x,"64ced1bdBC99D590049B434D0FD73428CF608A5DB8FE5CE07F15026940BAE40E"))ABORT;
-	if(!BN_hex2bn(&y,"376629C7AB21E7DB260922499DDB118F07CE8EAAE3E7720AFEF6A5CC062070C0"))ABORT;
-	if(!EC_POINT_set_affine_coordinates_GFp(group,RA,x,y,ctx))ABORT;
-
-	memcpy(ZA,"\x3B\x85\xA5\x71\x79\xE1\x1E\x7E\x51\x3A\xA6\x22\x99\x1F\x2C\xA7\x4D\x18\x07\xA0\xBD\x4D\x4B\x38\xF9\x09\x87\xA1\x7A\xC2\x45\xB1",32);
-	memcpy(ZB,"\x79\xC9\x88\xD6\x32\x29\xD9\x7E\xF1\x9F\xE0\x2C\xA1\x05\x6E\x01\xE6\xA7\x41\x1E\xD2\x46\x94\xAA\x8F\x83\x4F\x4A\x4A\xB0\x22\xF7",32);
-	sm2_exchange_key(B,RB,PA,RA,ZA,ZB,outkey,16);
-
-	fprintf(stdout,"\nExchange key --KDF(Xv||Yv)--  :");
-	for(i=0; i<16; i++)
-		printf("%02X",outkey[i]);
-	printf("\n");
-
-	sm2_end();
-
-	return 0;
-}

+ 0 - 48
Module/mod_cardissuer/sm2.h

@@ -1,48 +0,0 @@
-#include <limits.h>
-#include <openssl/ec.h>
-#include <openssl/bn.h>
-#include <openssl/rand.h>
-#include <openssl/err.h>
-#include <openssl/ecdsa.h>
-#include <openssl/ecdh.h>
-#include <openssl/ssl.h>
-
-
-
-#define  NID_X9_62_prime_field 406
-
-#define ABORT do { \
-	fflush(stdout); \
-	fprintf(stderr, "%s:%d: ABORT\n", __FILE__, __LINE__); \
-	ERR_print_errors_fp(stderr); \
-	exit(1); \
-} while (0)
-
-int sm2_init();
-
-EC_KEY* sm2_generate_key();
-
-int sm2_exchange_key(EC_KEY*B,EC_KEY*RB,EC_POINT*PA,EC_POINT*RA,unsigned char*ZA,unsigned char *ZB,unsigned char *outkey,size_t keylen);
-
-int sm2_end();
-
-int ecKey2str(EC_KEY*k,unsigned char*pubkey);
-
-int pubkey2ecPoint(char*pubkey,EC_POINT**k);
-
-int sm2_decrypt(const char*decdata,const char*dB,char*M);
-/*
-旧国密密文格式解密
-*/
-int sm2_decrypt_new(const char*decdata,const char*dB,char*M);
-/*
-新国密密文格式解密
-*/
-int sm2_encrypt(char*random_k,char*ecpoint_PBx,char*ecpoint_PBy,const char *M,unsigned char mdatalen,char*encdata);
-/*
-旧国密密文格式加密
-*/
-int sm2_encrypt_new(char*random_k,char*ecpoint_PBx,char*ecpoint_PBy,const char *M,unsigned char mdatalen,char*encdata);
-/*
-新国密密文格式加密
-*/

+ 0 - 539
Module/mod_cardissuer/sm3.cpp

@@ -1,539 +0,0 @@
-/*
- * SM3 Hash alogrith 
- * thanks to Xyssl
- * author:goldboar
- * email:goldboar@163.com
- * 2011-10-26
- */
-
-//Testing data from SM3 Standards
-//http://www.oscca.gov.cn/News/201012/News_1199.htm 
-// Sample 1
-// Input:"abc"  
-// Output:66c7f0f4 62eeedd9 d1f2d46b dc10e4e2 4167c487 5cf2f7a2 297da02b 8f4ba8e0
-
-// Sample 2 
-// Input:"abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd"
-// Outpuf:debe9ff9 2275b8a1 38604889 c18e5a4d 6fdb70e5 387e5765 293dcba3 9c0c5732
-#include "StdAfx.h"
-#include "sm3.h"
-#include <string.h>
-#include <stdio.h>
-
-/*
- * 32-bit integer manipulation macros (big endian)
- */
-#ifndef GET_ULONG_BE
-#define GET_ULONG_BE(n,b,i)                             \
-{                                                       \
-    (n) = ( (unsigned long) (b)[(i)    ] << 24 )        \
-        | ( (unsigned long) (b)[(i) + 1] << 16 )        \
-        | ( (unsigned long) (b)[(i) + 2] <<  8 )        \
-        | ( (unsigned long) (b)[(i) + 3]       );       \
-}
-#endif
-
-#ifndef PUT_ULONG_BE
-#define PUT_ULONG_BE(n,b,i)                             \
-{                                                       \
-    (b)[(i)    ] = (unsigned char) ( (n) >> 24 );       \
-    (b)[(i) + 1] = (unsigned char) ( (n) >> 16 );       \
-    (b)[(i) + 2] = (unsigned char) ( (n) >>  8 );       \
-    (b)[(i) + 3] = (unsigned char) ( (n)       );       \
-}
-#endif
-/*
-#define FF0(x,y,z) ( (x) ^ (y) ^ (z)) 
-#define FF1(x,y,z) (((x) & (y)) | ( (x) & (z)) | ( (y) & (z)))
-
-#define GG0(x,y,z) ( (x) ^ (y) ^ (z)) 
-#define GG1(x,y,z) (((x) & (y)) | ( (~(x)) & (z)) )
-
-#define  SHL(x,n) (((x) & 0xFFFFFFFF) << n)
-#define ROTL(x,n) (SHL((x),n) | ((x) >> (32 - n)))
-
-
-#define P0(x) ((x) ^  ROTL((x),9) ^ ROTL((x),17)) 
-#define P1(x) ((x) ^  ROTL((x),15) ^ ROTL((x),23)) 
-*/
-unsigned long GG0(unsigned long x,unsigned long y,unsigned long z)
-{
-	unsigned long u = 0;
-	x = x & 0xFFFFFFFF;
-	y = y & 0xFFFFFFFF;
-	z = z & 0xFFFFFFFF;
-	
-	u = x ^ y ^ z;
-	
-	u = u & 0xFFFFFFFF;
-	return u;
-}
-
-unsigned long GG1(unsigned long x,unsigned long y,unsigned long z)
-{
-	unsigned long u = 0,v = 0;
-	x = x & 0xFFFFFFFF;
-	y = y & 0xFFFFFFFF;
-	z = z & 0xFFFFFFFF;
-	
-	u = x & y;
-	v = (~x) & z;
-	u = u | v;
-	
-	u = u & 0xFFFFFFFF;
-	
-	return u;
-}
-
-unsigned long FF0(unsigned long x,unsigned long y,unsigned long z)
-{
-	unsigned long u = 0;
-	x = x & 0xFFFFFFFF;
-	y = y & 0xFFFFFFFF;
-	z = z & 0xFFFFFFFF;
-
-	u = x ^ y ^ z;
-
-	u = u & 0xFFFFFFFF;
-	return u;
-}
-
-unsigned long FF1(unsigned long x,unsigned long y,unsigned long z)
-{
-	unsigned long u = 0,v = 0;
-	x = x & 0xFFFFFFFF;
-	y = y & 0xFFFFFFFF;
-	z = z & 0xFFFFFFFF;
-
-	u = x & y;
-	v = x & z;
-	u = u | v;
-	v = y & z;
-	u = u | v;
-
-	u = u & 0xFFFFFFFF;
-
-	return u;
-}
-
-unsigned long ROTL(unsigned long x,int n)
-{
-	unsigned long y = 0;
-	x = x & 0xFFFFFFFF;
-	n = n%32;
-	y = (x &0xFFFFFFFF) << n;
-	y = y | (x >> (32-n));
-
-	y = y & 0xFFFFFFFF;
-
-	return y;
-}
-
-
-unsigned long P0(unsigned long x)
-{
-	unsigned long y = 0;
-	x = x & 0xFFFFFFFF;
-	y = ROTL(x,9);
-	y = x ^ y;
-	y = y ^ ROTL(x,17);
-
-	y = y & 0xFFFFFFFF;
-
-	return y;
-}
-
-unsigned long P1(unsigned long x)
-{
-	unsigned long y = 0;
-	x = x & 0xFFFFFFFF;
-	y = ROTL(x,15);
-	y = x ^ y;
-	y = y ^ ROTL(x,23);
-	
-	y = y & 0xFFFFFFFF;
-	
-	return y;
-}
-
-/*
- * SM3 context setup
- */
-void sm3_starts( sm3_context *ctx )
-{
-    ctx->total[0] = 0;
-    ctx->total[1] = 0;
-
-    ctx->state[0] = 0x7380166F;
-    ctx->state[1] = 0x4914B2B9;
-    ctx->state[2] = 0x172442D7;
-    ctx->state[3] = 0xDA8A0600;
-    ctx->state[4] = 0xA96F30BC;
-    ctx->state[5] = 0x163138AA;
-    ctx->state[6] = 0xE38DEE4D;
-    ctx->state[7] = 0xB0FB0E4E;
-}
-
-static void sm3_process( sm3_context *ctx, unsigned char data[64] )
-{
-    unsigned long SS1=0, SS2=0, TT1=0, TT2=0, W[68],W1[64];
-    unsigned long A=0, B=0, C=0, D=0, E=0, F=0, G=0, H=0;
-	unsigned long T[64];
-	unsigned long Temp1,Temp2,Temp3,Temp4,Temp5;
-	int j;
-#ifdef _DEBUG
-	int i;
-#endif
-
-// 	for(j=0; j < 68; j++)
-// 		W[j] = 0;
-// 	for(j=0; j < 64; j++)
-// 		W1[j] = 0;
-	
-	for(j = 0; j < 16; j++)
-		T[j] = 0x79CC4519;
-	for(j =16; j < 64; j++)
-		T[j] = 0x7A879D8A;
-
-    GET_ULONG_BE( W[ 0], data,  0 );
-    GET_ULONG_BE( W[ 1], data,  4 );
-    GET_ULONG_BE( W[ 2], data,  8 );
-    GET_ULONG_BE( W[ 3], data, 12 );
-    GET_ULONG_BE( W[ 4], data, 16 );
-    GET_ULONG_BE( W[ 5], data, 20 );
-    GET_ULONG_BE( W[ 6], data, 24 );
-    GET_ULONG_BE( W[ 7], data, 28 );
-    GET_ULONG_BE( W[ 8], data, 32 );
-    GET_ULONG_BE( W[ 9], data, 36 );
-    GET_ULONG_BE( W[10], data, 40 );
-    GET_ULONG_BE( W[11], data, 44 );
-    GET_ULONG_BE( W[12], data, 48 );
-    GET_ULONG_BE( W[13], data, 52 );
-    GET_ULONG_BE( W[14], data, 56 );
-    GET_ULONG_BE( W[15], data, 60 );
-
-#ifdef _DEBUG 
-	printf("Message with padding:\n");
-	for(i=0; i< 8; i++)
-		printf("%08x ",W[i]);
-	printf("\n");
-	for(i=8; i< 16; i++)
-		printf("%08x ",W[i]);
-	printf("\n");
-#endif
-	for(j = 16; j < 68; j++ )
-	{
-		//W[j] = P1( W[j-16] ^ W[j-9] ^ ROTL(W[j-3],15)) ^ ROTL(W[j - 13],7 ) ^ W[j-6];
-		//Why thd release's result is different with the debug's ?
-		//Below is okay. Interesting, Perhaps VC6 has a bug of Optimizaiton.
-		Temp1 = W[j-16] ^ W[j-9];
-		Temp2 = ROTL(W[j-3],15);
-		Temp3 = Temp1 ^ Temp2;
-		Temp4 = P1(Temp3);
-		Temp5 =  ROTL(W[j - 13],7 ) ^ W[j-6];
-		W[j] = Temp4 ^ Temp5;
-//		printf("%08X %08X %08X %08X %08X %08X j=%d\n",W[j-16],W[j-9],W[j-3],W[j-13],W[j-6],W[j],j);
-	}
-
-#ifdef _DEBUG 
-	printf("Expanding message W0-67:\n");
-	for(i=0; i<68; i++)
-	{
-		printf("%08x ",W[i]);
-		if(((i+1) % 8) == 0) printf("\n");
-	}
-	printf("\n");
-#endif
-
-	for(j =  0; j < 64; j++)
-	{
-        W1[j] = W[j] ^ W[j+4];
-	}
-
-#ifdef _DEBUG 
-	printf("Expanding message W'0-63:\n");
-	for(i=0; i<64; i++)
-	{
-		printf("%08x ",W1[i]);
-		if(((i+1) % 8) == 0) printf("\n");
-	}
-	printf("\n");
-#endif
-
-    A = ctx->state[0];
-    B = ctx->state[1];
-    C = ctx->state[2];
-    D = ctx->state[3];
-    E = ctx->state[4];
-    F = ctx->state[5];
-    G = ctx->state[6];
-    H = ctx->state[7];
-#ifdef _DEBUG       
-	printf("j     A       B        C         D         E        F        G       H\n");
-	printf("   %08x %08x %08x %08x %08x %08x %08x %08x\n",A,B,C,D,E,F,G,H);
-#endif
-
-	for(j =0; j < 16; j++)
-	{
-		SS1 = ROTL((ROTL(A,12) + E + ROTL(T[j],j)), 7); 
-		SS2 = SS1 ^ ROTL(A,12);
-		TT1 = FF0(A,B,C) + D + SS2 + W1[j];
-		TT2 = GG0(E,F,G) + H + SS1 + W[j];
-		D = C;
-		C = ROTL(B,9);
-		B = A;
-		A = TT1;
-		H = G;
-		G = ROTL(F,19);
-		F = E;
-		E = P0(TT2);
-#ifdef _DEBUG 
-		printf("%02d %08x %08x %08x %08x %08x %08x %08x %08x\n",j,A,B,C,D,E,F,G,H);
-#endif
-	}
-	
-	for(j =16; j < 64; j++)
-	{
-		SS1 = ROTL((ROTL(A,12) + E + ROTL(T[j],j)), 7); 
-		SS2 = SS1 ^ ROTL(A,12);
-		TT1 = FF1(A,B,C) + D + SS2 + W1[j];
-		TT2 = GG1(E,F,G) + H + SS1 + W[j];
-		D = C;
-		C = ROTL(B,9);
-		B = A;
-		A = TT1;
-		H = G;
-		G = ROTL(F,19);
-		F = E;
-		E = P0(TT2);
-#ifdef _DEBUG 
-		printf("%02d %08x %08x %08x %08x %08x %08x %08x %08x\n",j,A,B,C,D,E,F,G,H);
-#endif	
-	}
-
-    ctx->state[0] ^= A;
-    ctx->state[1] ^= B;
-    ctx->state[2] ^= C;
-    ctx->state[3] ^= D;
-    ctx->state[4] ^= E;
-    ctx->state[5] ^= F;
-    ctx->state[6] ^= G;
-    ctx->state[7] ^= H;
-#ifdef _DEBUG 
-	   printf("   %08x %08x %08x %08x %08x %08x %08x %08x\n",ctx->state[0],ctx->state[1],ctx->state[2],
-		                          ctx->state[3],ctx->state[4],ctx->state[5],ctx->state[6],ctx->state[7]);
-#endif
-}
-
-/*
- * SM3 process buffer
- */
-void sm3_update( sm3_context *ctx, unsigned char *input, int ilen )
-{
-    int fill;
-    unsigned long left;
-
-    if( ilen <= 0 )
-        return;
-
-    left = ctx->total[0] & 0x3F;
-    fill = 64 - left;
-
-    ctx->total[0] += ilen;
-    ctx->total[0] &= 0xFFFFFFFF;
-
-    if( ctx->total[0] < (unsigned long) ilen )
-        ctx->total[1]++;
-
-    if( left && ilen >= fill )
-    {
-        memcpy( (void *) (ctx->buffer + left),
-                (void *) input, fill );
-        sm3_process( ctx, ctx->buffer );
-        input += fill;
-        ilen  -= fill;
-        left = 0;
-    }
-
-    while( ilen >= 64 )
-    {
-        sm3_process( ctx, input );
-        input += 64;
-        ilen  -= 64;
-    }
-
-    if( ilen > 0 )
-    {
-        memcpy( (void *) (ctx->buffer + left),
-                (void *) input, ilen );
-    }
-}
-
-static const unsigned char sm3_padding[64] =
-{
- 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
-};
-
-/*
- * SM3 final digest
- */
-void sm3_finish( sm3_context *ctx, unsigned char output[32] )
-{
-    unsigned long last, padn;
-    unsigned long high, low;
-    unsigned char msglen[8];
-
-    high = ( ctx->total[0] >> 29 )
-         | ( ctx->total[1] <<  3 );
-    low  = ( ctx->total[0] <<  3 );
-
-    PUT_ULONG_BE( high, msglen, 0 );
-    PUT_ULONG_BE( low,  msglen, 4 );
-
-    last = ctx->total[0] & 0x3F;
-    padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
-
-    sm3_update( ctx, (unsigned char *) sm3_padding, padn );
-    sm3_update( ctx, msglen, 8 );
-
-    PUT_ULONG_BE( ctx->state[0], output,  0 );
-    PUT_ULONG_BE( ctx->state[1], output,  4 );
-    PUT_ULONG_BE( ctx->state[2], output,  8 );
-    PUT_ULONG_BE( ctx->state[3], output, 12 );
-    PUT_ULONG_BE( ctx->state[4], output, 16 );
-    PUT_ULONG_BE( ctx->state[5], output, 20 );
-    PUT_ULONG_BE( ctx->state[6], output, 24 );
-    PUT_ULONG_BE( ctx->state[7], output, 28 );
-}
-
-/*
- * output = SM3( input buffer )
- */
-void sm3( unsigned char *input, int ilen,
-           unsigned char output[32] )
-{
-    sm3_context ctx;
-
-    sm3_starts( &ctx );
-    sm3_update( &ctx, input, ilen );
-    sm3_finish( &ctx, output );
-
-    memset( &ctx, 0, sizeof( sm3_context ) );
-}
-
-/*
- * output = SM3( file contents )
- */
-int sm3_file( char *path, unsigned char output[32] )
-{
-    FILE *f;
-    size_t n;
-    sm3_context ctx;
-    unsigned char buf[1024];
-
-    if( ( f = fopen( path, "rb" ) ) == NULL )
-        return( 1 );
-
-    sm3_starts( &ctx );
-
-    while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 )
-        sm3_update( &ctx, buf, (int) n );
-
-    sm3_finish( &ctx, output );
-
-    memset( &ctx, 0, sizeof( sm3_context ) );
-
-    if( ferror( f ) != 0 )
-    {
-        fclose( f );
-        return( 2 );
-    }
-
-    fclose( f );
-    return( 0 );
-}
-
-/*
- * SM3 HMAC context setup
- */
-void sm3_hmac_starts( sm3_context *ctx, unsigned char *key, int keylen )
-{
-    int i;
-    unsigned char sum[32];
-
-    if( keylen > 64 )
-    {
-        sm3( key, keylen, sum );
-        keylen = 32;
-		//keylen = ( is224 ) ? 28 : 32;
-        key = sum;
-    }
-
-    memset( ctx->ipad, 0x36, 64 );
-    memset( ctx->opad, 0x5C, 64 );
-
-    for( i = 0; i < keylen; i++ )
-    {
-        ctx->ipad[i] = (unsigned char)( ctx->ipad[i] ^ key[i] );
-        ctx->opad[i] = (unsigned char)( ctx->opad[i] ^ key[i] );
-    }
-
-    sm3_starts( ctx);
-    sm3_update( ctx, ctx->ipad, 64 );
-
-    memset( sum, 0, sizeof( sum ) );
-}
-
-/*
- * SM3 HMAC process buffer
- */
-void sm3_hmac_update( sm3_context *ctx, unsigned char *input, int ilen )
-{
-    sm3_update( ctx, input, ilen );
-}
-
-/*
- * SM3 HMAC final digest
- */
-void sm3_hmac_finish( sm3_context *ctx, unsigned char output[32] )
-{
-    int hlen;
-    unsigned char tmpbuf[32];
-
-    //is224 = ctx->is224;
-    hlen =  32;
-
-    sm3_finish( ctx, tmpbuf );
-    sm3_starts( ctx );
-    sm3_update( ctx, ctx->opad, 64 );
-    sm3_update( ctx, tmpbuf, hlen );
-    sm3_finish( ctx, output );
-
-    memset( tmpbuf, 0, sizeof( tmpbuf ) );
-}
-
-/*
- * output = HMAC-SM#( hmac key, input buffer )
- */
-void sm3_hmac( unsigned char *key, int keylen,
-                unsigned char *input, int ilen,
-                unsigned char output[32] )
-{
-    sm3_context ctx;
-
-    sm3_hmac_starts( &ctx, key, keylen);
-    sm3_hmac_update( &ctx, input, ilen );
-    sm3_hmac_finish( &ctx, output );
-
-    memset( &ctx, 0, sizeof( sm3_context ) );
-}
-
-
-
-
-
-
-

+ 0 - 121
Module/mod_cardissuer/sm3.h

@@ -1,121 +0,0 @@
-/**
- * \file sm3.h
- * thanks to Xyssl
- * SM3 standards:http://www.oscca.gov.cn/News/201012/News_1199.htm
- * author:goldboar
- * email:goldboar@163.com
- * 2011-10-26
- */
-#ifndef XYSSL_SM3_H
-#define XYSSL_SM3_H
-
-//#define _DEBUG
-
-/**
- * \brief          SM3 context structure
- */
-typedef struct
-{
-    unsigned long total[2];     /*!< number of bytes processed  */
-    unsigned long state[8];     /*!< intermediate digest state  */
-    unsigned char buffer[64];   /*!< data block being processed */
-
-    unsigned char ipad[64];     /*!< HMAC: inner padding        */
-    unsigned char opad[64];     /*!< HMAC: outer padding        */
-
-}
-sm3_context;
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * \brief          SM3 context setup
- *
- * \param ctx      context to be initialized
- */
-void sm3_starts( sm3_context *ctx );
-
-/**
- * \brief          SM3 process buffer
- *
- * \param ctx      SM3 context
- * \param input    buffer holding the  data
- * \param ilen     length of the input data
- */
-void sm3_update( sm3_context *ctx, unsigned char *input, int ilen );
-
-/**
- * \brief          SM3 final digest
- *
- * \param ctx      SM3 context
- */
-void sm3_finish( sm3_context *ctx, unsigned char output[32] );
-
-/**
- * \brief          Output = SM3( input buffer )
- *
- * \param input    buffer holding the  data
- * \param ilen     length of the input data
- * \param output   SM3 checksum result
- */
-void sm3( unsigned char *input, int ilen,
-           unsigned char output[32]);
-
-/**
- * \brief          Output = SM3( file contents )
- *
- * \param path     input file name
- * \param output   SM3 checksum result
- *
- * \return         0 if successful, 1 if fopen failed,
- *                 or 2 if fread failed
- */
-int sm3_file( char *path, unsigned char output[32] );
-
-/**
- * \brief          SM3 HMAC context setup
- *
- * \param ctx      HMAC context to be initialized
- * \param key      HMAC secret key
- * \param keylen   length of the HMAC key
- */
-void sm3_hmac_starts( sm3_context *ctx, unsigned char *key, int keylen);
-
-/**
- * \brief          SM3 HMAC process buffer
- *
- * \param ctx      HMAC context
- * \param input    buffer holding the  data
- * \param ilen     length of the input data
- */
-void sm3_hmac_update( sm3_context *ctx, unsigned char *input, int ilen );
-
-/**
- * \brief          SM3 HMAC final digest
- *
- * \param ctx      HMAC context
- * \param output   SM3 HMAC checksum result
- */
-void sm3_hmac_finish( sm3_context *ctx, unsigned char output[32] );
-
-/**
- * \brief          Output = HMAC-SM3( hmac key, input buffer )
- *
- * \param key      HMAC secret key
- * \param keylen   length of the HMAC key
- * \param input    buffer holding the  data
- * \param ilen     length of the input data
- * \param output   HMAC-SM3 result
- */
-void sm3_hmac( unsigned char *key, int keylen,
-                unsigned char *input, int ilen,
-                unsigned char output[32] );
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* sm3.h */

+ 0 - 344
Module/mod_cardissuer/sm4.cpp

@@ -1,344 +0,0 @@
-/*
- * SM4 Encryption alogrithm (SMS4 algorithm)
- * GM/T 0002-2012 Chinese National Standard ref:http://www.oscca.gov.cn/ 
- * thanks to Xyssl
- * thnaks and refers to http://hi.baidu.com/numax/blog/item/80addfefddfb93e4cf1b3e61.html
- * author:goldboar
- * email:goldboar@163.com
- * 2012-4-20
- */
-
-// Test vector 1
-// plain: 01 23 45 67 89 ab cd ef fe dc ba 98 76 54 32 10
-// key:   01 23 45 67 89 ab cd ef fe dc ba 98 76 54 32 10
-// 	   round key and temp computing result:
-// 	   rk[ 0] = f12186f9 X[ 0] = 27fad345
-// 		   rk[ 1] = 41662b61 X[ 1] = a18b4cb2
-// 		   rk[ 2] = 5a6ab19a X[ 2] = 11c1e22a
-// 		   rk[ 3] = 7ba92077 X[ 3] = cc13e2ee
-// 		   rk[ 4] = 367360f4 X[ 4] = f87c5bd5
-// 		   rk[ 5] = 776a0c61 X[ 5] = 33220757
-// 		   rk[ 6] = b6bb89b3 X[ 6] = 77f4c297
-// 		   rk[ 7] = 24763151 X[ 7] = 7a96f2eb
-// 		   rk[ 8] = a520307c X[ 8] = 27dac07f
-// 		   rk[ 9] = b7584dbd X[ 9] = 42dd0f19
-// 		   rk[10] = c30753ed X[10] = b8a5da02
-// 		   rk[11] = 7ee55b57 X[11] = 907127fa
-// 		   rk[12] = 6988608c X[12] = 8b952b83
-// 		   rk[13] = 30d895b7 X[13] = d42b7c59
-// 		   rk[14] = 44ba14af X[14] = 2ffc5831
-// 		   rk[15] = 104495a1 X[15] = f69e6888
-// 		   rk[16] = d120b428 X[16] = af2432c4
-// 		   rk[17] = 73b55fa3 X[17] = ed1ec85e
-// 		   rk[18] = cc874966 X[18] = 55a3ba22
-// 		   rk[19] = 92244439 X[19] = 124b18aa
-// 		   rk[20] = e89e641f X[20] = 6ae7725f
-// 		   rk[21] = 98ca015a X[21] = f4cba1f9
-// 		   rk[22] = c7159060 X[22] = 1dcdfa10
-// 		   rk[23] = 99e1fd2e X[23] = 2ff60603
-// 		   rk[24] = b79bd80c X[24] = eff24fdc
-// 		   rk[25] = 1d2115b0 X[25] = 6fe46b75
-// 		   rk[26] = 0e228aeb X[26] = 893450ad
-// 		   rk[27] = f1780c81 X[27] = 7b938f4c
-// 		   rk[28] = 428d3654 X[28] = 536e4246
-// 		   rk[29] = 62293496 X[29] = 86b3e94f
-// 		   rk[30] = 01cf72e5 X[30] = d206965e
-// 		   rk[31] = 9124a012 X[31] = 681edf34
-// cypher: 68 1e df 34 d2 06 96 5e 86 b3 e9 4f 53 6e 42 46
-// 		
-// test vector 2
-// the same key and plain 1000000 times coumpting 
-// plain:  01 23 45 67 89 ab cd ef fe dc ba 98 76 54 32 10
-// key:    01 23 45 67 89 ab cd ef fe dc ba 98 76 54 32 10
-// cypher: 59 52 98 c7 c6 fd 27 1f 04 02 f8 04 c3 3d 3f 66
-#include "StdAfx.h"
-#include "sm4.h"
-#include <string.h>
-#include <stdio.h>
-
-/*
- * 32-bit integer manipulation macros (big endian)
- */
-#ifndef GET_ULONG_BE
-#define GET_ULONG_BE(n,b,i)                             \
-{                                                       \
-    (n) = ( (unsigned long) (b)[(i)    ] << 24 )        \
-        | ( (unsigned long) (b)[(i) + 1] << 16 )        \
-        | ( (unsigned long) (b)[(i) + 2] <<  8 )        \
-        | ( (unsigned long) (b)[(i) + 3]       );       \
-}
-#endif
-
-#ifndef PUT_ULONG_BE
-#define PUT_ULONG_BE(n,b,i)                             \
-{                                                       \
-    (b)[(i)    ] = (unsigned char) ( (n) >> 24 );       \
-    (b)[(i) + 1] = (unsigned char) ( (n) >> 16 );       \
-    (b)[(i) + 2] = (unsigned char) ( (n) >>  8 );       \
-    (b)[(i) + 3] = (unsigned char) ( (n)       );       \
-}
-#endif
-
-/*
- *rotate shift left marco definition
- *
- */
-#define  SHL(x,n) (((x) & 0xFFFFFFFF) << n)
-#define ROTL(x,n) (SHL((x),n) | ((x) >> (32 - n)))
-
-#define SWAP(a,b) { unsigned long t = a; a = b; b = t; t = 0; }
-
-/*
- * Expanded SM4 S-boxes
- /* Sbox table: 8bits input convert to 8 bits output*/
- 
-static const unsigned char SboxTable[16][16] = 
-{
-{0xd6,0x90,0xe9,0xfe,0xcc,0xe1,0x3d,0xb7,0x16,0xb6,0x14,0xc2,0x28,0xfb,0x2c,0x05},
-{0x2b,0x67,0x9a,0x76,0x2a,0xbe,0x04,0xc3,0xaa,0x44,0x13,0x26,0x49,0x86,0x06,0x99},
-{0x9c,0x42,0x50,0xf4,0x91,0xef,0x98,0x7a,0x33,0x54,0x0b,0x43,0xed,0xcf,0xac,0x62},
-{0xe4,0xb3,0x1c,0xa9,0xc9,0x08,0xe8,0x95,0x80,0xdf,0x94,0xfa,0x75,0x8f,0x3f,0xa6},
-{0x47,0x07,0xa7,0xfc,0xf3,0x73,0x17,0xba,0x83,0x59,0x3c,0x19,0xe6,0x85,0x4f,0xa8},
-{0x68,0x6b,0x81,0xb2,0x71,0x64,0xda,0x8b,0xf8,0xeb,0x0f,0x4b,0x70,0x56,0x9d,0x35},
-{0x1e,0x24,0x0e,0x5e,0x63,0x58,0xd1,0xa2,0x25,0x22,0x7c,0x3b,0x01,0x21,0x78,0x87},
-{0xd4,0x00,0x46,0x57,0x9f,0xd3,0x27,0x52,0x4c,0x36,0x02,0xe7,0xa0,0xc4,0xc8,0x9e},
-{0xea,0xbf,0x8a,0xd2,0x40,0xc7,0x38,0xb5,0xa3,0xf7,0xf2,0xce,0xf9,0x61,0x15,0xa1},
-{0xe0,0xae,0x5d,0xa4,0x9b,0x34,0x1a,0x55,0xad,0x93,0x32,0x30,0xf5,0x8c,0xb1,0xe3},
-{0x1d,0xf6,0xe2,0x2e,0x82,0x66,0xca,0x60,0xc0,0x29,0x23,0xab,0x0d,0x53,0x4e,0x6f},
-{0xd5,0xdb,0x37,0x45,0xde,0xfd,0x8e,0x2f,0x03,0xff,0x6a,0x72,0x6d,0x6c,0x5b,0x51},
-{0x8d,0x1b,0xaf,0x92,0xbb,0xdd,0xbc,0x7f,0x11,0xd9,0x5c,0x41,0x1f,0x10,0x5a,0xd8},
-{0x0a,0xc1,0x31,0x88,0xa5,0xcd,0x7b,0xbd,0x2d,0x74,0xd0,0x12,0xb8,0xe5,0xb4,0xb0},
-{0x89,0x69,0x97,0x4a,0x0c,0x96,0x77,0x7e,0x65,0xb9,0xf1,0x09,0xc5,0x6e,0xc6,0x84},
-{0x18,0xf0,0x7d,0xec,0x3a,0xdc,0x4d,0x20,0x79,0xee,0x5f,0x3e,0xd7,0xcb,0x39,0x48}
-};
-
-/* System parameter */
-static const unsigned long FK[4] = {0xa3b1bac6,0x56aa3350,0x677d9197,0xb27022dc};
-
-/* fixed parameter */
-static const unsigned long CK[32] =
-{
-0x00070e15,0x1c232a31,0x383f464d,0x545b6269,
-0x70777e85,0x8c939aa1,0xa8afb6bd,0xc4cbd2d9,
-0xe0e7eef5,0xfc030a11,0x181f262d,0x343b4249,
-0x50575e65,0x6c737a81,0x888f969d,0xa4abb2b9,
-0xc0c7ced5,0xdce3eaf1,0xf8ff060d,0x141b2229,
-0x30373e45,0x4c535a61,0x686f767d,0x848b9299,
-0xa0a7aeb5,0xbcc3cad1,0xd8dfe6ed,0xf4fb0209,
-0x10171e25,0x2c333a41,0x484f565d,0x646b7279
-};
-
-
-/*
- * private function:
- * look up in SboxTable and get the related value.
- * args:    [in] inch: 0x00~0xFF (8 bits unsigned value).
- */
-static unsigned char sm4Sbox(unsigned char inch)
-{
-    unsigned char *pTable = (unsigned char *)SboxTable;
-    unsigned char retVal = (unsigned char)(pTable[inch]);
-    return retVal;
-}
-
-/*
- * private F(Lt) function:
- * "T algorithm" == "L algorithm" + "t algorithm".
- * args:    [in] a: a is a 32 bits unsigned value;
- * return: c: c is calculated with line algorithm "L" and nonline algorithm "t"
- */
-static unsigned long sm4Lt(unsigned long ka)
-{
-    unsigned long bb = 0;
-    unsigned long c = 0;
-    unsigned char a[4];
-	unsigned char b[4];
-    PUT_ULONG_BE(ka,a,0)
-    b[0] = sm4Sbox(a[0]);
-    b[1] = sm4Sbox(a[1]);
-    b[2] = sm4Sbox(a[2]);
-    b[3] = sm4Sbox(a[3]);
-	GET_ULONG_BE(bb,b,0)
-    c =bb^(ROTL(bb, 2))^(ROTL(bb, 10))^(ROTL(bb, 18))^(ROTL(bb, 24));
-    return c;
-}
-
-/*
- * private F function:
- * Calculating and getting encryption/decryption contents.
- * args:    [in] x0: original contents;
- * args:    [in] x1: original contents;
- * args:    [in] x2: original contents;
- * args:    [in] x3: original contents;
- * args:    [in] rk: encryption/decryption key;
- * return the contents of encryption/decryption contents.
- */
-static unsigned long sm4F(unsigned long x0, unsigned long x1, unsigned long x2, unsigned long x3, unsigned long rk)
-{
-    return (x0^sm4Lt(x1^x2^x3^rk));
-}
-
-
-/* private function:
- * Calculating round encryption key.
- * args:    [in] a: a is a 32 bits unsigned value;
- * return: sk[i]: i{0,1,2,3,...31}.
- */
-static unsigned long sm4CalciRK(unsigned long ka)
-{
-    unsigned long bb = 0;
-    unsigned long rk = 0;
-    unsigned char a[4];
-    unsigned char b[4];
-    PUT_ULONG_BE(ka,a,0)
-    b[0] = sm4Sbox(a[0]);
-    b[1] = sm4Sbox(a[1]);
-    b[2] = sm4Sbox(a[2]);
-    b[3] = sm4Sbox(a[3]);
-	GET_ULONG_BE(bb,b,0)
-    rk = bb^(ROTL(bb, 13))^(ROTL(bb, 23));
-    return rk;
-}
-
-static void sm4_setkey( unsigned long SK[32], unsigned char key[16] )
-{
-    unsigned long MK[4];
-    unsigned long k[36];
-    unsigned long i = 0;
-
-    GET_ULONG_BE( MK[0], key, 0 );
-    GET_ULONG_BE( MK[1], key, 4 );
-    GET_ULONG_BE( MK[2], key, 8 );
-    GET_ULONG_BE( MK[3], key, 12 );
-    k[0] = MK[0]^FK[0];
-    k[1] = MK[1]^FK[1];
-    k[2] = MK[2]^FK[2];
-    k[3] = MK[3]^FK[3];
-    for(; i<32; i++)
-    {
-        k[i+4] = k[i] ^ (sm4CalciRK(k[i+1]^k[i+2]^k[i+3]^CK[i]));
-        SK[i] = k[i+4];
-	}
-
-}
-
-/*
- * SM4 standard one round processing
- *
- */
-static void sm4_one_round( unsigned long sk[32],
-                    unsigned char input[16],
-                    unsigned char output[16] )
-{
-    unsigned long i = 0;
-    unsigned long ulbuf[36];
-
-    memset(ulbuf, 0, sizeof(ulbuf));
-    GET_ULONG_BE( ulbuf[0], input, 0 )
-    GET_ULONG_BE( ulbuf[1], input, 4 )
-    GET_ULONG_BE( ulbuf[2], input, 8 )
-    GET_ULONG_BE( ulbuf[3], input, 12 )
-    while(i<32)
-    {
-        ulbuf[i+4] = sm4F(ulbuf[i], ulbuf[i+1], ulbuf[i+2], ulbuf[i+3], sk[i]);
-// #ifdef _DEBUG
-//        	printf("rk(%02d) = 0x%08x,  X(%02d) = 0x%08x \n",i,sk[i], i, ulbuf[i+4] );
-// #endif
-	    i++;
-    }
-	PUT_ULONG_BE(ulbuf[35],output,0);
-	PUT_ULONG_BE(ulbuf[34],output,4);
-	PUT_ULONG_BE(ulbuf[33],output,8);
-	PUT_ULONG_BE(ulbuf[32],output,12);
-}
-
-/*
- * SM4 key schedule (128-bit, encryption)
- */
-void sm4_setkey_enc( sm4_context *ctx, unsigned char key[16] )
-{
-    ctx->mode = SM4_ENCRYPT;
-	sm4_setkey( ctx->sk, key );
-}
-
-/*
- * SM4 key schedule (128-bit, decryption)
- */
-void sm4_setkey_dec( sm4_context *ctx, unsigned char key[16] )
-{
-    int i;
-	ctx->mode = SM4_ENCRYPT;
-    sm4_setkey( ctx->sk, key );
-    for( i = 0; i < 16; i ++ )
-    {
-        SWAP( ctx->sk[ i ], ctx->sk[ 31-i] );
-    }
-}
-
-
-/*
- * SM4-ECB block encryption/decryption
- */
-
-void sm4_crypt_ecb( sm4_context *ctx,
-				   int mode,
-				   int length,
-				   unsigned char *input,
-                   unsigned char *output)
-{
-    while( length > 0 )
-    {
-        sm4_one_round( ctx->sk, input, output );
-        input  += 16;
-        output += 16;
-        length -= 16;
-    }
-
-}
-
-/*
- * SM4-CBC buffer encryption/decryption
- */
-void sm4_crypt_cbc( sm4_context *ctx,
-                    int mode,
-                    int length,
-                    unsigned char iv[16],
-                    unsigned char *input,
-                    unsigned char *output )
-{
-    int i;
-    unsigned char temp[16];
-
-    if( mode == SM4_ENCRYPT )
-    {
-        while( length > 0 )
-        {
-            for( i = 0; i < 16; i++ )
-                output[i] = (unsigned char)( input[i] ^ iv[i] );
-
-            sm4_one_round( ctx->sk, output, output );
-            memcpy( iv, output, 16 );
-
-            input  += 16;
-            output += 16;
-            length -= 16;
-        }
-    }
-    else /* SM4_DECRYPT */
-    {
-        while( length > 0 )
-        {
-            memcpy( temp, input, 16 );
-            sm4_one_round( ctx->sk, input, output );
-
-            for( i = 0; i < 16; i++ )
-                output[i] = (unsigned char)( output[i] ^ iv[i] );
-
-            memcpy( iv, temp, 16 );
-
-            input  += 16;
-            output += 16;
-            length -= 16;
-        }
-    }
-}

+ 0 - 75
Module/mod_cardissuer/sm4.h

@@ -1,75 +0,0 @@
-/**
- * \file sm4.h
- */
-#ifndef XYSSL_SM4_H
-#define XYSSL_SM4_H
-
-#define SM4_ENCRYPT     1
-#define SM4_DECRYPT     0
-
-/**
- * \brief          SM4 context structure
- */
-typedef struct
-{
-    int mode;                   /*!<  encrypt/decrypt   */
-    unsigned long sk[32];       /*!<  SM4 subkeys       */
-}
-sm4_context;
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * \brief          SM4 key schedule (128-bit, encryption)
- *
- * \param ctx      SM4 context to be initialized
- * \param key      16-byte secret key
- */
-void sm4_setkey_enc( sm4_context *ctx, unsigned char key[16] );
-
-/**
- * \brief          SM4 key schedule (128-bit, decryption)
- *
- * \param ctx      SM4 context to be initialized
- * \param key      16-byte secret key
- */
-void sm4_setkey_dec( sm4_context *ctx, unsigned char key[16] );
-
-/**
- * \brief          SM4-ECB block encryption/decryption
- * \param ctx      SM4 context
- * \param mode     SM4_ENCRYPT or SM4_DECRYPT
- * \param length   length of the input data
- * \param input    input block
- * \param output   output block
- */
-void sm4_crypt_ecb( sm4_context *ctx,
-				     int mode,
-					 int length,
-                     unsigned char *input,
-                     unsigned char *output);
-
-/**
- * \brief          SM4-CBC buffer encryption/decryption
- * \param ctx      SM4 context
- * \param mode     SM4_ENCRYPT or SM4_DECRYPT
- * \param length   length of the input data
- * \param iv       initialization vector (updated after use)
- * \param input    buffer holding the input data
- * \param output   buffer holding the output data
- */
-void sm4_crypt_cbc( sm4_context *ctx,
-                     int mode,
-                     int length,
-                     unsigned char iv[16],
-                     unsigned char *input,
-                     unsigned char *output );
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* sm4.h */