Index: yc_sm2.h
===================================================================
--- /YC3121_SDK/fw/crypt/yc_sm2.h	(revision 630)
+++ /YC3121_SDK/fw/crypt/yc_sm2.h	(working copy)
@@ -9,7 +9,6 @@
 #include "yc_trng.h"
 
 #define SM2_FLOW_CONTROL
-//#define BCTC
 
 
 #define SM2_KEY_BITS 		257

Index: yc_sm2.c
===================================================================
--- /YC3121_SDK/fw/crypt/yc_sm2.c	(revision 630)
+++ /YC3121_SDK/fw/crypt/yc_sm2.c	(working copy)
@@ -130,14 +130,91 @@
 	}
 }
 
-// static void memcpy_r(uint8_t *a,uint8_t *b,uint32_t len)
+static void memcpy_r(uint8_t *a,uint8_t *b,uint32_t len)
+{
+	uint32_t i;
+	uint8_t temp[MAX_RSA_MODULUS_BITS]={0};
+	for(i=0;i<len;i++)
+		temp[i] = b[len-1-i];
+	for(i=0;i<len;i++)
+		a[i] = temp[i];
+}
+
+// uint32_t SM2_Hash_Za(uint8_t *Za, uint8_t *IDa, uint16_t IDalen, SM2_EllipseParaTypeDef *para, SM2_PublicKeyTypeDef *key, uint16_t block_size)
 // {
-// 	uint32_t i;
-// 	uint8_t temp[MAX_RSA_MODULUS_BITS]={0};
-// 	for(i=0;i<len;i++)
-// 		temp[i] = b[len-1-i];
-// 	for(i=0;i<len;i++)
-// 		a[i] = temp[i];
+// 	uint8_t data_temp[256]={0};
+// 	uint16_t index = 0;
+// 	uint16_t i=0;
+// 	uint8_t *pdata;
+// 	uint8_t data_1[64];
+
+// 	data_temp[0] = (IDalen>>8);
+// 	data_temp[1] = IDalen;
+
+// 	mem_rollcpy_char(&data_temp[2], IDa, IDalen/8,GetTRNGData());
+// 	index = 2+IDalen/8;
+
+// 	pdata = (uint8_t *)(para->a);
+// 	pdata += block_size;
+// 	for (i=0;i<block_size;i++)
+// 	{
+// 		data_1[i] = *(pdata-i-1);
+// 	}
+// 	mem_rollcpy_char((data_temp+index), data_1, block_size,GetTRNGData());
+// 	index += block_size;
+
+// 	pdata = (uint8_t *)(para->b);
+// 	pdata += block_size;
+// 	for (i=0;i<block_size;i++)
+// 	{
+// 		data_1[i] = *(pdata-i-1);
+// 	}
+// 	mem_rollcpy_char((data_temp+index), data_1, block_size,GetTRNGData());
+// 	index += block_size;
+
+// 	pdata = (uint8_t *)(para->g.x);
+// 	pdata += block_size;
+// 	for (i=0;i<block_size;i++)
+// 	{
+// 		data_1[i] = *(pdata-i-1);
+// 	}
+// 	mem_rollcpy_char((data_temp+index), data_1, block_size,GetTRNGData());
+// 	index += block_size;
+
+// 	pdata = (uint8_t *)(para->g.y);
+// 	pdata += block_size;
+// 	for (i=0;i<block_size;i++)
+// 	{
+// 		data_1[i] = *(pdata-i-1);
+// 	}
+// 	mem_rollcpy_char((data_temp+index), data_1, block_size,GetTRNGData());
+// 	index += block_size;
+
+// 	pdata = (uint8_t *)(key->x);
+// 	pdata += block_size;
+// 	for (i=0;i<block_size;i++)
+// 	{
+// 		data_1[i] = *(pdata-i-1);
+// 	}
+// 	mem_rollcpy_char((data_temp+index), data_1, block_size,GetTRNGData());
+// 	index += block_size;
+
+// 	pdata = (uint8_t *)(key->y);
+// 	pdata += block_size;
+// 	for (i=0;i<block_size;i++)
+// 	{
+// 		data_1[i] = *(pdata-i-1);
+// 	}
+// 	mem_rollcpy_char((data_temp+index), data_1, block_size,GetTRNGData());
+// 	index += block_size;
+
+// #ifdef SM2_DEBUG	
+// 	MyPrintf("data_temp:\n");
+// 	for(i=0;i<index;i++)
+// 		MyPrintf("%02x ",data_temp[i]);	MyPrintf("\n");
+// #endif
+// 	return SM3(Za,(uint8_t *)data_temp,index);  
+	
 // }
 
 uint32_t SM2_Hash_Za(uint8_t *Za, uint8_t *IDa, uint16_t IDalen, SM2_EllipseParaTypeDef *para, SM2_PublicKeyTypeDef *key, uint16_t block_size)
@@ -146,75 +223,185 @@
 	uint16_t index = 0;
 	uint16_t i=0;
 	uint8_t *pdata;
-	uint8_t data_1[64];
+//	uint8_t data_1[64];
+#ifdef SM2_DEBUG
+	MyPrintf("SM2_Hash_Za :block_size=%d\n",block_size);
+#endif
 
 	data_temp[0] = (IDalen>>8);
 	data_temp[1] = IDalen;
 
-	mem_rollcpy_char(&data_temp[2], IDa, IDalen/8,GetTRNGData());
-	index = 2+IDalen/8;
+	SM3_BYTE(NULL, data_temp[0],0,0);
+	SM3_BYTE(NULL, data_temp[1],1,0);
+	index += 2;
+
+#ifdef SM2_DEBUG
+	MyPrintf("%02x ",data_temp[0]);
+	MyPrintf("%02x ",data_temp[1]);
+#endif
+	#ifdef SM2_DEBUG
+			MyPrintf("\n");
+	#endif
+	// mem_rollcpy_char(&data_temp[2], IDa, IDalen/8,GetTRNGData());
+	// index = 2+IDalen/8;
+	//Ida
+	if(IDalen % 8)
+	{
+		goto SM2_Hash_Za_ERR;
+	}
+	for(i = 0;i < IDalen/8; i++)
+	{
+		SM3_BYTE(NULL, IDa[IDalen/8 - 1 - i],index++,0);
+		#ifdef SM2_DEBUG
+			MyPrintf("%02x ",IDa[IDalen/8 - 1 - i]);
+		#endif
+	}
+	#ifdef SM2_DEBUG
+			MyPrintf("\n");
+	#endif
 
+	// pdata = (uint8_t *)(para->a);
+	// pdata += block_size;
+	// for (i=0;i<block_size;i++)
+	// {
+	// 	data_1[i] = *(pdata-i-1);
+	// }
+	// mem_rollcpy_char((data_temp+index), data_1, block_size,GetTRNGData());
+	// index += block_size;
 	pdata = (uint8_t *)(para->a);
 	pdata += block_size;
 	for (i=0;i<block_size;i++)
 	{
-		data_1[i] = *(pdata-i-1);
+		SM3_BYTE(NULL, *(pdata-i-1),index++,0);
+		#ifdef SM2_DEBUG
+			MyPrintf("%02x ",*(pdata-i-1));
+		#endif
 	}
-	mem_rollcpy_char((data_temp+index), data_1, block_size,GetTRNGData());
-	index += block_size;
+	#ifdef SM2_DEBUG
+			MyPrintf("\n");
+	#endif
 
+
+	// pdata = (uint8_t *)(para->b);
+	// pdata += block_size;
+	// for (i=0;i<block_size;i++)
+	// {
+	// 	data_1[i] = *(pdata-i-1);
+	// }
+	// mem_rollcpy_char((data_temp+index), data_1, block_size,GetTRNGData());
+	// index += block_size;
 	pdata = (uint8_t *)(para->b);
 	pdata += block_size;
 	for (i=0;i<block_size;i++)
 	{
-		data_1[i] = *(pdata-i-1);
+		SM3_BYTE(NULL, *(pdata-i-1),index++,0);
+		#ifdef SM2_DEBUG
+			MyPrintf("%02x ",*(pdata-i-1));
+		#endif
 	}
-	mem_rollcpy_char((data_temp+index), data_1, block_size,GetTRNGData());
-	index += block_size;
+	#ifdef SM2_DEBUG
+			MyPrintf("\n");
+	#endif
 
+	// pdata = (uint8_t *)(para->g.x);
+	// pdata += block_size;
+	// for (i=0;i<block_size;i++)
+	// {
+	// 	data_1[i] = *(pdata-i-1);
+	// }
+	// mem_rollcpy_char((data_temp+index), data_1, block_size,GetTRNGData());
+	// index += block_size;
 	pdata = (uint8_t *)(para->g.x);
 	pdata += block_size;
 	for (i=0;i<block_size;i++)
 	{
-		data_1[i] = *(pdata-i-1);
+		SM3_BYTE(NULL, *(pdata-i-1),index++,0);
+		#ifdef SM2_DEBUG
+			MyPrintf("%02x ",*(pdata-i-1));
+		#endif
 	}
-	mem_rollcpy_char((data_temp+index), data_1, block_size,GetTRNGData());
-	index += block_size;
+	#ifdef SM2_DEBUG
+			MyPrintf("\n");
+	#endif
 
+	// pdata = (uint8_t *)(para->g.y);
+	// pdata += block_size;
+	// for (i=0;i<block_size;i++)
+	// {
+	// 	data_1[i] = *(pdata-i-1);
+	// }
+	// mem_rollcpy_char((data_temp+index), data_1, block_size,GetTRNGData());
+	// index += block_size;
 	pdata = (uint8_t *)(para->g.y);
 	pdata += block_size;
 	for (i=0;i<block_size;i++)
 	{
-		data_1[i] = *(pdata-i-1);
+		SM3_BYTE(NULL, *(pdata-i-1),index++,0);
+		#ifdef SM2_DEBUG
+			MyPrintf("%02x ",*(pdata-i-1));
+		#endif
 	}
-	mem_rollcpy_char((data_temp+index), data_1, block_size,GetTRNGData());
-	index += block_size;
-
+	#ifdef SM2_DEBUG
+			MyPrintf("\n");
+	#endif
+	// pdata = (uint8_t *)(key->x);
+	// pdata += block_size;
+	// for (i=0;i<block_size;i++)
+	// {
+	// 	data_1[i] = *(pdata-i-1);
+	// }
+	// mem_rollcpy_char((data_temp+index), data_1, block_size,GetTRNGData());
+	// index += block_size;
 	pdata = (uint8_t *)(key->x);
 	pdata += block_size;
 	for (i=0;i<block_size;i++)
 	{
-		data_1[i] = *(pdata-i-1);
+		SM3_BYTE(NULL, *(pdata-i-1),index++,0);
+		#ifdef SM2_DEBUG
+			MyPrintf("%02x ",*(pdata-i-1));
+		#endif
 	}
-	mem_rollcpy_char((data_temp+index), data_1, block_size,GetTRNGData());
-	index += block_size;
+	#ifdef SM2_DEBUG
+			MyPrintf("\n");
+	#endif
 
+	// pdata = (uint8_t *)(key->y);
+	// pdata += block_size;
+	// for (i=0;i<block_size;i++)
+	// {
+	// 	data_1[i] = *(pdata-i-1);
+	// }
+	// mem_rollcpy_char((data_temp+index), data_1, block_size,GetTRNGData());
+	// index += block_size;
 	pdata = (uint8_t *)(key->y);
 	pdata += block_size;
-	for (i=0;i<block_size;i++)
+	for (i=0;i<block_size - 1;i++)
 	{
-		data_1[i] = *(pdata-i-1);
+		SM3_BYTE(NULL, *(pdata-i-1),index++,0);
+		#ifdef SM2_DEBUG
+			MyPrintf("%02x ",*(pdata-i-1));
+		#endif
+	}
+	SM3_BYTE(Za, *(pdata-i-1),index++,1);
+	#ifdef SM2_DEBUG
+			MyPrintf("%02x ",*(pdata-i-1));
+	#endif
+	#ifdef SM2_DEBUG
+			MyPrintf("\n");
+	#endif
+	if(index != (block_size * 6 + 2 + IDalen/8))
+	{
+		#ifdef SM2_DEBUG
+			MyPrintf("index=%d - (block_size * 6 + 2 + IDalen/8)=%d\n",index,(block_size * 6 + 2 + IDalen/8));
+		#endif
+		goto SM2_Hash_Za_ERR;
 	}
-	mem_rollcpy_char((data_temp+index), data_1, block_size,GetTRNGData());
-	index += block_size;
+	return RET_SM3_SUCCESS;
+//	return SM3(Za,(uint8_t *)data_temp,index);
 
-#ifdef SM2_DEBUG	
-	MyPrintf("data_temp:\n");
-	for(i=0;i<index;i++)
-		MyPrintf("%02x ",data_temp[i]);	MyPrintf("\n");
-#endif
-	return SM3(Za,(uint8_t *)data_temp,index);  
-	
+SM2_Hash_Za_ERR:
+	memset(Za,0,32);
+	return RET_SM3_FAILE;
 }
 
 uint32_t SM2_Hash_z(uint8_t *Za, uint8_t *IDa, uint16_t IDalen, SM2_EllipseParaTypeDef *para, SM2_PublicKeyTypeDef *key)
@@ -222,7 +409,7 @@
 	uint32_t i;
 	uint32_t data_temp[5+8+8+8+8+8+8]={0};
 
-	data_temp[0] = ((IDalen<<8)&0xff00)+((IDalen&0xff00)>>8);	
+	data_temp[0] = ((IDalen<<8)&0xff00)+((IDalen&0xff00)>>8);
 	memcpy(((uint8_t *)data_temp)+2,IDa,18);
 	mem_reverse((uint32_t *)(data_temp+5),(para->a),8);
 	mem_reverse((uint32_t *)(data_temp+5+8),(para->b),8);
@@ -230,30 +417,55 @@
 	mem_reverse((uint32_t *)(data_temp+5+8+8+8),(para->g.y),8);
 	mem_reverse((uint32_t *)(data_temp+5+8+8+8+8),(key->x),8);
 	mem_reverse((uint32_t *)(data_temp+5+8+8+8+8+8),(key->y),8);
-#ifdef SM2_DEBUG	
+#ifdef SM2_DEBUG
 	MyPrintf("data_temp:\n");
 	for(i=0;i<((2+18+32+32+32+32+32+32)>>2);i++)
 		MyPrintf("%08x ",data_temp[i]);	MyPrintf("\n");
 #endif
-	return SM3(Za,(uint8_t *)data_temp,2+18+32+32+32+32+32+32);  
-	
+	return SM3(Za,(uint8_t *)data_temp,2+18+32+32+32+32+32+32);
+
 }
 
 uint32_t SM2_Hash_e(uint32_t *e, uint8_t *Za, uint8_t *m, uint32_t mlen)
 {
 	uint32_t i;
+	uint32_t index = 0;
 	uint32_t data_temp[16]={0};
 
-	memcpy(((uint8_t *)data_temp),Za,32);
-//	memcpy_r(((uint8_t *)data_temp)+32,m,mlen);	
-	memcpy(((uint8_t *)data_temp)+32,m,mlen);	
-#ifdef SM2_DEBUG	
-	MyPrintf("data_temp:\n");
-	for(i=0;i<16;i++)
-		MyPrintf("%08x ",data_temp[i]);	MyPrintf("\n");
-#endif
-	 SM3((uint8_t *)e,(uint8_t *)data_temp,32+mlen);  
-	memcpy_r((uint8_t *)e,(uint8_t *)e,32);  
+//	memcpy(((uint8_t *)data_temp),Za,32);
+//	memcpy(((uint8_t *)data_temp)+32,m,mlen);
+	#ifdef SM2_DEBUG
+			MyPrintf("\nSM2_Hash_e:\n");
+	#endif
+
+	#ifdef SM2_DEBUG
+			MyPrintf("za:\n");
+	#endif
+	for(i = 0;i<32;i++)
+	{
+		SM3_BYTE(NULL, Za[i],index++,0);
+		#ifdef SM2_DEBUG
+			MyPrintf("%02x ",Za[i]);
+		#endif
+	}
+
+	#ifdef SM2_DEBUG
+			MyPrintf("\nmessage:\n");
+	#endif
+	for(i = 0;i<mlen-1;i++)
+	{
+		SM3_BYTE(NULL, m[i],index++,0);
+		#ifdef SM2_DEBUG
+			MyPrintf("%02x ",m[i]);
+		#endif
+	}
+	SM3_BYTE((uint8_t*)e, m[mlen-1],index++,1);
+	#ifdef SM2_DEBUG
+			MyPrintf("%02x ",m[mlen-1]);
+	#endif
+
+//	 SM3((uint8_t *)e,(uint8_t *)data_temp,32+mlen);
+	memcpy_r((uint8_t *)e,(uint8_t *)e,32);
 	return 0;
 }
 
