test.c

来自「C语言环境下的AES加密算法」· C语言 代码 · 共 549 行 · 第 1/2 页

C
549
字号
/***************************************************************************
* Copyright (c) 2000-2004, Future Systems, Inc. / Seoul, Republic of Korea *
* All Rights Reserved.                                                     *
*                                                                          *
* This document contains proprietary and confidential information.  No     *
* parts of this document or the computer program it embodies may be in     *
* any way copied, duplicated, reproduced, translated into a different      *
* programming language, or distributed to any person, company, or          *
* corporation without the prior written consent of Future Systems, Inc.    *
*                              Hyo Sun Hwang                               *
*                372-2 YangJae B/D 6th Floor, Seoul, Korea                 *
*                           +82-2-578-0581 (552)                           *
***************************************************************************/

/*--------------------- [ Version/Command in detais] ---------------------*\
Description : filename.? (CrypLib version 1.00)
			(head file)	(C-source file)

C0000 : Created by Hyo Sun Hwang (hyosun@future.co.kr) 2000/12/31

C0001 : Modified by Hyo Sun Hwang (hyosun@future.co.kr) 2001/01/01

\*------------------------------------------------------------------------*/

/*************** Header files *********************************************/
#include <stdio.h>
#include <time.h>
#include "aes.h"

/*************** Assertions ***********************************************/

/*************** Definitions / Macros  ************************************/
#define KILO	1024
#define MEGA	(KILO*KILO)

////	Prine out BYTE data in ascending order and with no '0x'(hexa type)
#undef PrintBYTE
#define PrintBYTE(pfile, msg, Data, DataLen) {			\
	int idx;											\
	fprintf(pfile, "%5s =", msg);						\
	for( idx=0; idx<(int)DataLen; idx++) {				\
		if( (idx==0) || ((idx%16)!=0) )					\
			fprintf(pfile, " %.2x", Data[idx]);			\
		else											\
			fprintf(pfile, "\n\t%.2x", Data[idx]);		\
	}													\
	fprintf(pfile, "\n");								\
}

////	茄锅俊 'ByteLen'-bytes狼 单捞鸥甫 贸府窍绰 楷魂 'Oper'阑
////	'Iter'锅 荐青窍绊, 弊 搬苞甫 KByte/sec窜困肺 免仿窃.
#define SPEED_TEST(str1, str2, Iter, ByteLen, Oper) {	\
	unsigned idx;										\
	clock_t start, finish;								\
	double Sec, Mbps=0.0;								\
	start = clock();									\
	for( idx=0; idx<Iter; idx++)						\
		{	Oper;	}									\
	finish = clock();									\
	Sec = (double)(finish-start) / CLOCKS_PER_SEC;		\
	if( Sec!=0 )	Mbps = 8.0*ByteLen*idx/Sec/MEGA;	\
	printf("%s%7.3fMbps(=%d*", str1, Mbps, Iter);		\
	printf("%d", ByteLen);								\
	printf("/%3.0f)%s", 1000.0*Sec, str2);				\
}

/*************** New Data Types *******************************************/

/*************** Constant (Error Code) ************************************/
#define CTR_USAGE_ERROR		0x2001
#define CTR_KEYFILE_ERROR	0x2002

/*************** Global Variables *****************************************/
char	Help[] = "\
Usage1 : -[T/S]   (Test Value/Test Speed)\n\
Usage2 : -[E/D] -[ECB/CBC/OFB/CFB/ECBPAD/CBCPAD/OFBPAD/CFBPAD] infile outfile\n\
            (file 'key.dat' contains UserKey and IV)\n";

/*************** Prototypes ***********************************************/

//########################################################//
//######		Error Code 包府 窃荐				######//
//########################################################//

/*************************************************************************/
typedef struct{
	DWORD		ErrorCode;
	BYTE		Message[32];
} ERROR_MESSAGE;

ERROR_MESSAGE	ErrorMessage[] = {
	{CTR_FATAL_ERROR,		"CTR_FATAL_ERROR"},
	{CTR_INVALID_USERKEYLEN,"CTR_INVALID_USERKEYLEN"},
	{CTR_PAD_CHECK_ERROR,	"CTR_PAD_CHECK_ERROR"},
	{CTR_DATA_LEN_ERROR,	"CTR_DATA_LEN_ERROR"},
	{CTR_CIPHER_LEN_ERROR,	"CTR_CIPHER_LEN_ERROR"},
	{CTR_USAGE_ERROR,		"CTR_USAGE_ERROR"},
	{CTR_KEYFILE_ERROR,		"CTR_KEYFILE_ERROR"},
	{0, ""},
};

/**************************************************************************
*
*/
void	Error(
		DWORD	ErrorCode,
		char	*Message)
{
	DWORD	i;

	for( i=0; ErrorMessage[i].ErrorCode!=0; i++)
		if( ErrorMessage[i].ErrorCode==ErrorCode )	break;

	printf("ERROR(%s) :::: %s\n", ErrorMessage[i].Message, Message);
	if( ErrorCode==CTR_USAGE_ERROR )	printf("\n%s", Help);
	exit(1);
}

//########################################################//
//######		Validity Test 包访 窃荐				######//
//########################################################//

/*************************************************************************/
typedef struct{
	DWORD		ModeType;
	DWORD		PadType;
	char		Description[32];
	DWORD		UkLen;
	BYTE		UK[56];
	DWORD		IVLen;
	BYTE		IV[16];
	DWORD		PtLen;
	BYTE		PT[48];
	DWORD		EtLen;
	BYTE		ET[48];
} TEST_STRUCT;

TEST_STRUCT		TestData[] = {
	{	AI_ECB, AI_NO_PADDING, "ECB-NO_PADDING : ",
		16,		{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
				 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
		 0,		{0},
		32,		{0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
				 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
				 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
				 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01},
		32,		{0x3A,0xD7,0x8E,0x72,0x6C,0x1E,0xC0,0x2B,
				 0x7E,0xBF,0xE9,0x2B,0x23,0xD9,0xEC,0x34,
				 0x58,0xE2,0xFC,0xCE,0xFA,0x7E,0x30,0x61,
				 0x36,0x7F,0x1D,0x57,0xA4,0xE7,0x45,0x5A}	},
	{	AI_ECB, AI_NO_PADDING, "ECB-NO_PADDING : ",
		24,		{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
				 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
				 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
		 0,		{0},
		32,		{0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
				 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
				 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
				 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01},
		32,		{0x6C,0xD0,0x25,0x13,0xE8,0xD4,0xDC,0x98,
				 0x6B,0x4A,0xFE,0x08,0x7A,0x60,0xBD,0x0C,
				 0xCD,0x33,0xB2,0x8A,0xC7,0x73,0xF7,0x4B,
				 0xA0,0x0E,0xD1,0xF3,0x12,0x57,0x24,0x35}	},
	{	AI_ECB, AI_NO_PADDING, "ECB-NO_PADDING : ",
		32,		{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
				 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
				 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
				 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
		 0,		{0},
		32,		{0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
				 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
				 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
				 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01},
		32,		{0xDD,0xC6,0xBF,0x79,0x0C,0x15,0x76,0x0D,
				 0x8D,0x9A,0xEB,0x6F,0x9A,0x75,0xFD,0x4E,
				 0x53,0x0F,0x8A,0xFB,0xC7,0x45,0x36,0xB9,
				 0xA9,0x63,0xB4,0xF1,0xC4,0xCB,0x73,0x8B}	},
	{	AI_CBC, AI_NO_PADDING, "CBC-NO_PADDING",
		16,		{0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF,
				 0x12,0x34,0x56,0x78,0x9A,0xBC,0xDE,0xF0},
		16,		{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
		32,		{0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x20,
				 0x4E,0x6F,0x77,0x20,0x69,0x73,0x20,0x74,
				 0x68,0x65,0x20,0x74,0x69,0x6D,0x65,0x20,
				 0x66,0x6F,0x72,0x20,0x00,0x00,0x00,0x00},
		32,		{0x3E,0xBD,0x62,0x2A,0x06,0x58,0xE6,0x05,
				 0x32,0x3E,0xC4,0x82,0xD6,0xD7,0x77,0xFF,
				 0x5C,0x93,0x92,0x9A,0xD6,0xB1,0xF4,0x10,
				 0x46,0x32,0xAA,0xE0,0x1C,0xA9,0x8B,0x3F}	},
	{	AI_CBC, AI_PKCS_PADDING, "CBC-PKCS_PADDING",
		16,		{0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF,
				 0x12,0x34,0x56,0x78,0x9A,0xBC,0xDE,0xF0},
		16,		{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
		28,		"7654321 Now is the time for ",
		32,		{0x3e,0xbd,0x62,0x2a,0x06,0x58,0xe6,0x05,
				 0x32,0x3e,0xc4,0x82,0xd6,0xd7,0x77,0xff,
				 0xbd,0x38,0x68,0xe4,0xa9,0xa2,0x81,0xb8,
				 0x61,0x95,0x2e,0xe1,0xb7,0x05,0xf9,0x5f}	},
	{	AI_OFB, 0, "OFB",
		16,		{0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
				 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F},
		16,		{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
		28,		"7654321 Now is the time for ",
		28,		{0xf1,0x97,0x0e,0x03,0xb4,0xbd,0x6a,0xa2,
				 0x21,0x20,0xf6,0x42,0xc8,0xbb,0xf8,0x0d,
				 0xc7,0xf8,0xb9,0x52,0x9e,0xb7,0xad,0x51,
				 0xf4,0xde,0xb6,0x34}	},
	{	AI_CFB, 0, "CFB",
		16,		{0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF,
				 0x12,0x34,0x56,0x78,0x9A,0xBC,0xDE,0xF0},
		16,		{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
		28,		"7654321 Now is the time for ",
		28,		{0x75,0xf1,0x5a,0xb2,0x2f,0xa1,0xe2,0x0d,
				 0x79,0x59,0xcd,0x19,0x35,0xbb,0x93,0xf4,
				 0x7f,0x42,0x32,0xf3,0xb7,0x1a,0x0f,0xfd,
				 0xb3,0x26,0xc6,0x46}	},
	{	0, 0, ""},
};

/**************************************************************************
*
*/
void	ValidityTest()
{
	BYTE	EncText[2*AES_BLOCK_LEN], DecText[2*AES_BLOCK_LEN];
	DWORD	i, tt, EncLen, DecLen;
	RET_VAL	ret;
	AES_ALG_INFO	EncAlgInfo, DecAlgInfo;

	//
	for( i=0; TestData[i].ModeType!=0; i++) {
		AES_SetAlgInfo(TestData[i].ModeType, TestData[i].PadType,
						TestData[i].IV, &EncAlgInfo);
		AES_SetAlgInfo(TestData[i].ModeType, TestData[i].PadType,
						TestData[i].IV, &DecAlgInfo);

		//
		ret = AES_EncKeySchedule(TestData[i].UK, TestData[i].UkLen, &EncAlgInfo);
		if( ret!=CTR_SUCCESS )	Error(ret, "AES_EncKeySchedule() returns.");
		if( (TestData[i].ModeType==AI_OFB) || (TestData[i].ModeType==AI_CFB) )
			ret = AES_EncKeySchedule(TestData[i].UK, TestData[i].UkLen,
							&DecAlgInfo);
		else
			ret = AES_DecKeySchedule(TestData[i].UK, TestData[i].UkLen,
							&DecAlgInfo);
		if( ret!=CTR_SUCCESS )	Error(ret, "AES_DecKeySchedule() returns.");

		//
		EncLen = tt = 0;
		ret = AES_EncInit(&EncAlgInfo);
		if( ret!=CTR_SUCCESS )	Error(ret, "AES_EncInit() returns.");
		ret = AES_EncUpdate(&EncAlgInfo, TestData[i].PT, TestData[i].PtLen,
							EncText, &EncLen);
		if( ret!=CTR_SUCCESS )	Error(ret, "AES_EncUpdate() returns.");
		ret = AES_EncFinal(&EncAlgInfo, EncText+EncLen, &tt);
		if( ret!=CTR_SUCCESS )	Error(ret, "AES_EncFinal() returns.");
		EncLen += tt;

		//
		DecLen = tt = 0;
		ret = AES_DecInit(&DecAlgInfo);
		if( ret!=CTR_SUCCESS )	Error(ret, "AES_DecInit() returns.");
		ret = AES_DecUpdate(&DecAlgInfo, EncText, EncLen, DecText, &DecLen);
		if( ret!=CTR_SUCCESS )	Error(ret, "AES_DecUpdate() returns.");
		ret = AES_DecFinal(&DecAlgInfo, DecText+DecLen, &tt);
		if( ret!=CTR_SUCCESS )	Error(ret, "AES_DecFinal() returns.");
		DecLen += tt;

		//
		fprintf(stdout, "\n==== test %d : %s\n", i, TestData[i].Description);
		PrintBYTE(stdout, "UK", TestData[i].UK, TestData[i].UkLen);
		PrintBYTE(stdout, "PT", TestData[i].PT, TestData[i].PtLen);
		PrintBYTE(stdout, "ET", EncText, EncLen);
		if( memcmp(TestData[i].PT, DecText, TestData[i].PtLen)==0 )
			printf("   DT = (OK)\n");

⌨️ 快捷键说明

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