📄 sblock_test.c
字号:
/**************************************************************************************
*
* Project Name : S3C6400 Validation
*
* Copyright 2006 by Samsung Electronics, Inc.
* All rights reserved.
*
* Project Description :
* This software is only for validating functions of the S3C6400.
* Anybody can use this software without our permission.
*
*--------------------------------------------------------------------------------------
*
* File Name : sblock_test.c
*
* File Description : This file implements the functons for security sub-system test.
*
* Author : Wonjoon Jang
* Dept. : AP Development Team
* Created Date : 2007/01/17
* Version : 0.1
*
* History
* - Created(wonjoon.jang 2007/01/17)
*
**************************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <time.h>
#include "def.h"
#include "option.h"
#include "library.h"
#include "sfr6400.h"
#include "system.h"
#include "intc.h"
#include "gpio.h"
#include "sysc.h"
#include "sblock.h"
#include "sblock_data.h"
void SBLOCK_Test(void);
// must be changed
#define INPUT_BUF (0x51000000)
#define INPUT_BUF1 (0x51100000)
#define OUTPUT_BUF (0x51400000)
#define OUTPUT_BUF1 (0x51500000)
#define GOLDEN_BUF (0x51800000)
#define GOLDEN_BUF1 (0x51810000)
#define MID_BUF (0x51C00000)
#define Sblock_DEBUG (false)
//static SBLK oSblk;
//static INTC oIntc;
static OPER_MODE eAesOperMode;
static OPER_MODE eDesOperMode;
static OPER_MODE eHashOperMode;
static u32 g_SDma1Done;
volatile int g_AES_Key;
volatile int g_sblock_err;
//////////
// Function Name : Isr_SDMA0
// Function Description : Isr routine
// Input : None
// Output : None
// Version : v0.1
void __irq Isr_SDMA1(void)
{
//u32 uRead;
//for Test
//uRead = Inp32(0x7DC00000); //SDMA1 INT STATUS
/*
uRead = (uRead>>6)&0x3;
if(uRead== 1)
{
printf(" SDMA1 Rx ISR Occurred\n");
}
else if(uRead== 2)
{
printf(" SDMA1 Tx ISR Occurred\n");
}
else
{
printf(" SDMA1 Rx/Tx ISR Occurred\n");
}
*/
SBLK_ClearIntPending(0);
//Delay(1);
//printf(" SDMA1 Int 0x%x \n", uRead);
//printf(" SDMA1 ISR Occurred\n");
g_SDma1Done = 1;
INTC_ClearVectAddr();
}
//////////
// Function Name : DispOperMode
// Function Description : Display operating mode
// Input : None
// Output : None
// Version : v0.1
void DispOperMode(OPER_MODE eOperMode)
{
if (eOperMode == ECB) Disp("ECB");
else if (eOperMode == CBC) Disp("CBC");
else if (eOperMode == CTR) Disp("CTR");
else if (eOperMode == HMAC) Disp("HMAC");
else if (eOperMode == SHA1) Disp("SHA1");
else if (eOperMode == PRNG) Disp("PRNG");
}
void SetAesOperMode(void)
{
int sel;
Disp("Select Operation Mode\n");
Disp("1)ECB 2)CBC 3) CTR : \n");
sel=GetIntNum();
if (sel == 1) eAesOperMode = ECB;
else if (sel == 2) eAesOperMode = CBC;
else if (sel == 3) eAesOperMode = CTR;
Disp("Your selection is ");
DispOperMode(eAesOperMode);
//Disp("\n");
}
void SetDesOperMode(void)
{
int sel;
Disp("Select Operation Mode\n");
Disp("1)ECB 2)CBC : \n");
sel=GetIntNum();
if (sel == 1) eDesOperMode = ECB;
else if (sel == 2) eDesOperMode = CBC;
Disp("Your selection is ");
DispOperMode(eDesOperMode);
//Disp("\n");
}
void SetHashOperMode(void)
{
int sel;
Disp("Select Operation Mode\n");
Disp("1)HMAC 2)SHA1 3)PRNG : \n");
sel=GetIntNum();
if (sel == 1) eHashOperMode = HMAC;
else if (sel == 2) eHashOperMode = SHA1;
else if (sel == 3) eHashOperMode = PRNG;
Disp("Your selection is ");
DispOperMode(eHashOperMode);
//Disp("\n");
}
//////////
// Function Name : Test_AES_CPU
// Function Description : AES CPU mode Test
// Input : None
// Output : None
// Version : v0.1
void Test_AES_CPU(eFunction_Test eTest, oFunctionT_AutoVar oAutoVar)
//void Test_AES_CPU(void)
{
u32 uRet, i, usel;
//bool uError;
//g_sblock_err=0;
if(eTest == eTest_Manual)
{
printf("[SBLOCK - AES CPU Mode Test]\n");
printf("Select AES Operating Mode : 1)ECB 2)CBC 3)CTR \n");
usel=GetIntNum();
if (usel == 1) eAesOperMode = ECB;
else if (usel == 2) eAesOperMode = CBC;
else if (usel == 3) eAesOperMode = CTR;
printf("Your selection is ");
DispOperMode(eAesOperMode);
printf("\n");
}
else
{
eAesOperMode = (OPER_MODE)oAutoVar.Test_Parameter[0];
}
//////////////////////////
////// Encryption
SBLK_Init(AES, eAesOperMode, ENC);
for (i=0; i<4; i++)
{
SBLK_PutDataToInReg((u32)uAesPlainText+i*4*4, 4, LASTBYTE_1ST);
SBLK_StartByManual();
while(!SBLK_IsOutputReady());
SBLK_GetDataFromOutReg(OUTPUT_BUF+i*4*4, 4);
}
Copy((u32)uAesCipherText[eAesOperMode], GOLDEN_BUF, 16);
uRet = Compare(OUTPUT_BUF, GOLDEN_BUF, 16);
if(eTest == eTest_Manual)
{
if (uRet)
{
printf("AES_");
DispOperMode(eAesOperMode);
printf("_CPU_ENC Success..\n");
}
else
{
printf("AES");
DispOperMode(eAesOperMode);
printf("_CPU_ENC Failed..\n");
}
}
else
{
if(uRet == false)
{
printf("AES");
DispOperMode(eAesOperMode);
printf("_CPU_ENC Failed..\n");
g_sblock_err =1;
UART_Getc();
}
else if (Sblock_DEBUG)
{
printf("AES_");
DispOperMode(eAesOperMode);
printf("_CPU_ENC Success..\n");
}
}
/////////////////////////
////// Decryption
if (eAesOperMode == CTR)
SBLK_Init(AES, eAesOperMode, ENC);
else
SBLK_Init(AES, eAesOperMode, DEC);
for (i=0; i<4; i++)
{
SBLK_PutDataToInReg(OUTPUT_BUF+i*4*4, 4, LASTBYTE_1ST);
SBLK_StartByManual();
while(!SBLK_IsOutputReady());
SBLK_GetDataFromOutReg(INPUT_BUF+i*4*4, 4);
}
Copy((u32)uAesPlainText, GOLDEN_BUF, 16);
uRet = Compare(INPUT_BUF, GOLDEN_BUF, 16);
if(eTest == eTest_Manual)
{
if (uRet)
{
printf("AES_");
DispOperMode(eAesOperMode);
printf("_CPU_DEC Success..\n\n");
}
else
{
printf("AES");
DispOperMode(eAesOperMode);
printf("_CPU_DEC Failed..\n\n");
}
}
else
{
if(uRet == false)
{
printf("AES");
DispOperMode(eAesOperMode);
printf("_CPU_DEC Failed..\n");
g_sblock_err =1;
UART_Getc();
}
else if (Sblock_DEBUG)
{
printf("AES_");
DispOperMode(eAesOperMode);
printf("_CPU_DEC Success..\n");
}
}
}
//////////
// Function Name : Test_AES_FIFO
// Function Description : AES FIFO mode Test
// Input : None
// Output : None
// Version : v0.1
void Test_AES_FIFO(eFunction_Test eTest, oFunctionT_AutoVar oAutoVar)
{
u32 uRet, usel;
//g_sblock_err=0;
if(eTest == eTest_Manual)
{
printf("[SBLOCK - AES FIFO Mode Test]\n");
printf("Select AES Operating Mode : 1)ECB 2)CBC 3)CTR \n");
usel=GetIntNum();
if (usel == 1) eAesOperMode = ECB;
else if (usel == 2) eAesOperMode = CBC;
else if (usel == 3) eAesOperMode = CTR;
printf("Your selection is ");
DispOperMode(eAesOperMode);
printf("\n");
}
else
{
eAesOperMode = (OPER_MODE)oAutoVar.Test_Parameter[0];
}
//////////////////////////
////// Encryption
SBLK_Init(AES, eAesOperMode, ENC);
SBLK_SetFifo(16, 4, 16, 4, LASTBYTE_1ST);
SBLK_StartFifo();
SBLK_PutDataToRxFifo((u32)uAesPlainText, 16);
while(!SBLK_IsFifoTransDone());
SBLK_GetDataFromTxFifo(OUTPUT_BUF, 16);
Copy((u32)uAesCipherText[eAesOperMode], GOLDEN_BUF, 16);
uRet = Compare(OUTPUT_BUF, GOLDEN_BUF, 16);
if(eTest == eTest_Manual)
{
if (uRet)
{
Disp("AES_");
DispOperMode(eAesOperMode);
Disp("_FIFO_ENC Success..\n");
}
else
{
Disp("AES");
DispOperMode(eAesOperMode);
Disp("_FIFO_ENC Failed..\n");
}
}
else
{
if(uRet == false)
{
printf("AES");
DispOperMode(eAesOperMode);
printf("_FIFO_ENC Failed..\n");
g_sblock_err =1;
UART_Getc();
}
else if (Sblock_DEBUG)
{
Disp("AES_");
DispOperMode(eAesOperMode);
Disp("_FIFO_ENC Success..\n");
}
}
/////////////////////////
////// Decryption
if (eAesOperMode == CTR)
SBLK_Init(AES, eAesOperMode, ENC);
else
SBLK_Init(AES, eAesOperMode, DEC);
SBLK_SetFifo(16, 4, 16, 4, LASTBYTE_1ST);
SBLK_StartFifo();
SBLK_PutDataToRxFifo(OUTPUT_BUF, 16);
while(!SBLK_IsFifoTransDone());
SBLK_GetDataFromTxFifo(INPUT_BUF, 16);
Copy((u32)uAesPlainText, GOLDEN_BUF, 16);
uRet = Compare(INPUT_BUF, GOLDEN_BUF, 16);
if(eTest == eTest_Manual)
{
if (uRet)
{
Disp("AES_");
DispOperMode(eAesOperMode);
Disp("_FIFO_DEC Success..\n");
}
else
{
Disp("AES");
DispOperMode(eAesOperMode);
Disp("_FIFO_DEC Failed..\n");
}
}
else
{
if(uRet == false)
{
printf("AES");
DispOperMode(eAesOperMode);
printf("_FIFO_DEC Failed..\n");
g_sblock_err =1;
UART_Getc();
}
else if (Sblock_DEBUG)
{
Disp("AES_");
DispOperMode(eAesOperMode);
Disp("_FIFO_DEC Success..\n");
}
}
}
//////////
// Function Name : Test_AES_DMA
// Function Description : AES DMA mode Test
// Input : None
// Output : None
// Version : v0.1
void Test_AES_DMA(eFunction_Test eTest, oFunctionT_AutoVar oAutoVar)
{
u32 uRet, usel;
//g_sblock_err=0;
if(eTest == eTest_Manual)
{
printf("[SBLOCK - AES DMA_FIFO Mode Test]\n");
printf("Select AES Operating Mode : 1)ECB 2)CBC 3)CTR \n");
usel=GetIntNum();
if (usel == 1) eAesOperMode = ECB;
else if (usel == 2) eAesOperMode = CBC;
else if (usel == 3) eAesOperMode = CTR;
printf("Your selection is ");
DispOperMode(eAesOperMode);
printf("\n");
}
else
{
eAesOperMode = (OPER_MODE)oAutoVar.Test_Parameter[0];
}
INTC_SetVectAddr(NUM_SDMA1, Isr_SDMA1); //Rx Operation
INTC_Enable(NUM_SDMA1);
//////////////////////////
////// Encryption
SBLK_Init(AES, eAesOperMode, ENC);
SBLK_SetFifo(16, 4, 16, 4, LASTBYTE_1ST);
SBLK_SetSDMA(INPUT_BUF, 16, OUTPUT_BUF, 16);
Copy((u32)uAesPlainText, INPUT_BUF, 16);
g_SDma1Done = 0;
SBLK_StartFifo();
SBLK_StartSDMA();
while(!g_SDma1Done);
Copy((u32)uAesCipherText[eAesOperMode], GOLDEN_BUF, 16);
uRet = Compare(OUTPUT_BUF, GOLDEN_BUF, 16);
if(eTest == eTest_Manual)
{
if (uRet)
{
Disp("AES_");
DispOperMode(eAesOperMode);
Disp("_DMA_FIFO_ENC Success..\n");
}
else
{
Disp("AES_");
DispOperMode(eAesOperMode);
Disp("_DMA_FIFO_ENC Failed..\n");
}
}
else
{
if(uRet == false)
{
printf("AES");
DispOperMode(eAesOperMode);
printf("_DMA_FIFO_ENC Failed..\n");
g_sblock_err =1;
UART_Getc();
}
else if (Sblock_DEBUG)
{
Disp("AES_");
DispOperMode(eAesOperMode);
Disp("_DMA_FIFO_ENC Success..\n");
}
}
/////////////////////////
////// Decryption
if (eAesOperMode == CTR)
SBLK_Init(AES, eAesOperMode, ENC);
else
SBLK_Init(AES, eAesOperMode, DEC);
SBLK_SetFifo(16, 4, 16, 4, LASTBYTE_1ST);
SBLK_SetSDMA(OUTPUT_BUF, 16, INPUT_BUF, 16);
g_SDma1Done = 0;
SBLK_StartFifo();
SBLK_StartSDMA();
while(!g_SDma1Done);
Copy((u32)uAesPlainText, GOLDEN_BUF, 16);
uRet = Compare(INPUT_BUF, GOLDEN_BUF, 16);
if(eTest == eTest_Manual)
{
if (uRet)
{
Disp("AES_");
DispOperMode(eAesOperMode);
Disp("_DMA_FIFO_DEC Success..\n");
}
else
{
Disp("AES");
DispOperMode(eAesOperMode);
Disp("_DMA_FIFO_DEC Failed..\n");
}
}
else
{
if(uRet == false)
{
printf("AES");
DispOperMode(eAesOperMode);
printf("_DMA_FIFO_DEC Failed..\n");
g_sblock_err =1;
UART_Getc();
}
else if (Sblock_DEBUG)
{
Disp("AES_");
DispOperMode(eAesOperMode);
Disp("_DMA_FIFO_DEC Success..\n");
}
}
}
//////////
// Function Name : Test_DES_CPU
// Function Description : DES CPU mode Test
// Input : None
// Output : None
// Version : v0.1
void Test_DES_CPU(eFunction_Test eTest, oFunctionT_AutoVar oAutoVar)
{
u32 uRet, i, usel;
//g_sblock_err=0;
if(eTest == eTest_Manual)
{
printf("[SBLOCK - DES CPU Mode Test]\n");
printf("Select DES Operating Mode : 1)ECB 2)CBC \n");
usel=GetIntNum();
if (usel == 1) eDesOperMode = ECB;
else if (usel == 2) eDesOperMode = CBC;
printf("Your selection is ");
DispOperMode(eDesOperMode);
printf("\n");
}
else
{
eDesOperMode = (OPER_MODE)oAutoVar.Test_Parameter[0];
}
//////////////////////////////////
// Encryption
SBLK_Init(DES, eDesOperMode, ENC);
for (i=0; i<8; i++)
{
SBLK_PutDataToInReg((u32)uDesPlainText+i*4*2, 2, LASTBYTE_1ST);
SBLK_StartByManual();
while(!SBLK_IsOutputReady());
SBLK_GetDataFromOutReg(OUTPUT_BUF+i*4*2, 2);
}
Copy((u32)uDesCipherText[eDesOperMode], GOLDEN_BUF, 16);
uRet = Compare(OUTPUT_BUF, GOLDEN_BUF, 16);
if(eTest == eTest_Manual)
{
if (uRet)
{
Disp("DES_");
DispOperMode(eDesOperMode);
Disp("_CPU_ENC Success..\n");
}
else
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -