📄 tdes_fips81.c
字号:
// ----------------------------------------------------------------------------
// ATMEL Microcontroller Software Support - ROUSSET -
// ----------------------------------------------------------------------------
// DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
// DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// ----------------------------------------------------------------------------
// File Name : tdes_fips81.c
// Object :
// Creation : FBr 31-Aug-2005
// ----------------------------------------------------------------------------
#include "main.h"
#include "tdes_fips81.h"
unsigned int TestBuf[2];
//*----------------------------------------------------------------------------
//* \fn AT91F_TDES_SetKeys1
//* \brief
//*----------------------------------------------------------------------------
void AT91F_TDES_SetKeys1(const unsigned int array[][12],unsigned int index)
{
unsigned char i;
for (i=0;i<2;i++)
AT91F_TDES_SetCryptoKey1(AT91C_BASE_TDES,i,array[index][i+KEY1_OFFSET]);
}
//*----------------------------------------------------------------------------
//* \fn AT91F_TDES_SetKeys2
//* \brief
//*----------------------------------------------------------------------------
void AT91F_TDES_SetKeys2(const unsigned int array[][12],unsigned int index)
{
unsigned char i;
for (i=0;i<2;i++)
AT91F_TDES_SetCryptoKey2(AT91C_BASE_TDES,i,array[index][i+KEY2_OFFSET]);
}
//*----------------------------------------------------------------------------
//* \fn AT91F_TDES_SetKeys3
//* \brief
//*----------------------------------------------------------------------------
void AT91F_TDES_SetKeys3(const unsigned int array[][12],unsigned int index)
{
unsigned char i;
for (i=0;i<2;i++)
AT91F_TDES_SetCryptoKey3(AT91C_BASE_TDES,i,array[index][i+KEY3_OFFSET]);
}
//*----------------------------------------------------------------------------
//* \fn AT91F_TDES_SetInitializationVectors
//* \brief
//*----------------------------------------------------------------------------
void AT91F_TDES_SetInitializationVectors(const unsigned int array[][12],unsigned int index)
{
unsigned char i;
for (i=0;i<2;i++)
AT91F_TDES_SetInitializationVector(AT91C_BASE_TDES,i,array[index][i+INIT_OFFSET]);
}
//*----------------------------------------------------------------------------
//* \fn AT91F_AES_SetPlainText
//* \brief
//*----------------------------------------------------------------------------
void AT91F_AES_SetPlainText(const unsigned int array[][12],unsigned int index)
{
unsigned char i;
for (i=0;i<2;i++)
AT91F_TDES_InputData(AT91C_BASE_TDES,i,array[index][i+IN_OFFSET]);
}
//*----------------------------------------------------------------------------
//* \fn AT91F_TDES_Manual_Auto_Mode
//* \brief
//*----------------------------------------------------------------------------
unsigned int AT91F_TDES_Manual_Auto_Mode(unsigned int mode,unsigned int startmode,unsigned int cipher,unsigned int index)
{
unsigned int out1,out2;
unsigned char i;
AT91F_TDES_SoftReset(AT91C_BASE_TDES);
AT91F_TDES_CfgModeReg(AT91C_BASE_TDES,cipher|startmode|mode);
// Set Keys (same for En/Dec)
AT91F_TDES_SetKeys1(tdes_fips81,index);
AT91F_TDES_SetKeys2(tdes_fips81,index);
AT91F_TDES_SetKeys3(tdes_fips81,index);
// Set Init Vector for Chained Modes
if(mode != AT91C_AES_OPMOD_ECB)
AT91F_TDES_SetInitializationVectors(tdes_fips81,index);
for(i=0;i<3;i++,index++) {
// DATRDY flag already cleared (output data reg read before)
test = AT91C_TEST_NOK;
AT91F_TDES_EnableIt(AT91C_BASE_TDES,AT91C_TDES_DATRDY);
// Start Processing (for AUTO Mode)
// 2 accesses required for 64-bit modes to Start Processing (for AUTO Mode)
AT91F_AES_SetPlainText(tdes_fips81,index);
// Start Processing (for MANUAL Mode)
if( !(startmode & AT91C_TDES_SMOD_AUTO) )
AT91F_TDES_StartProcessing(AT91C_BASE_TDES);
// Wait 4 end of processing
while(test != AT91C_TEST_OK);
// Retrieve Output DATA => Reset DATRDY Status Flag
out1 = AT91F_TDES_GetOutputData(AT91C_BASE_TDES,0);
out2 = AT91F_TDES_GetOutputData(AT91C_BASE_TDES,1);
// Comparison Test
if( (out1 != tdes_fips81[index][0+OUT_OFFSET]) || (out2 != tdes_fips81[index][1+OUT_OFFSET]) ) {
TRACE_ERROR("........ => FAILED\n\r");
return FALSE;
}
}
TRACE_INFO("........ => OK\n\r");
return TRUE;
}
//*----------------------------------------------------------------------------
//* \fn AT91C_TDES_Manual_Auto_Mode_CFB8
//* \brief
//*----------------------------------------------------------------------------
unsigned int AT91C_TDES_Manual_Auto_Mode_CFB8(unsigned int startmode,unsigned int cipher,unsigned int index)
{
unsigned int out1;
unsigned char i;
AT91F_TDES_SoftReset(AT91C_BASE_TDES);
AT91F_TDES_CfgModeReg(AT91C_BASE_TDES,cipher|startmode|AT91C_TDES_OPMOD_CFB|AT91C_TDES_CFBS_8_BIT);
// Set Key
AT91F_TDES_SetKeys1(tdes_fips81,index);
AT91F_TDES_SetKeys2(tdes_fips81,index);
AT91F_TDES_SetKeys3(tdes_fips81,index);
// Set Initialization Vector
AT91F_TDES_SetInitializationVectors(tdes_fips81,index);
for(i=0;i<10;i++,index++) {
// DATRDY flag already cleared (output data reg read before)
test = AT91C_TEST_NOK;
AT91F_TDES_EnableIt(AT91C_BASE_TDES,AT91C_TDES_DATRDY);
// 1 access required for CFB 8-,16-,32-bit to Start Processing (for AUTO Mode)
AT91F_TDES_InputData(AT91C_BASE_TDES,0,tdes_fips81[index][0+IN_OFFSET]);
// Start Processing (for MANUAL Mode)
if( !(startmode & AT91C_TDES_SMOD_AUTO) )
AT91F_TDES_StartProcessing(AT91C_BASE_TDES);
// Wait 4 end of processing
while(test != AT91C_TEST_OK);
// Retrieve Output DATA => Reset DATRDY Status Flag
out1 = AT91F_TDES_GetOutputData(AT91C_BASE_TDES,0);
// Comparison Test
if( (out1 != tdes_fips81[index][0+OUT_OFFSET]) ) {
TRACE_ERROR("........ => FAILED\n\r");
return FALSE;
}
}
TRACE_INFO("........ => OK\n\r");
return TRUE;
}
//*----------------------------------------------------------------------------
//* \fn AT91F_TDES_PDC_Mode
//* \brief
//*----------------------------------------------------------------------------
unsigned int AT91F_TDES_PDC_Mode(unsigned int mode,unsigned int submode,unsigned int cipher,unsigned char index)
{
unsigned char i;
AT91F_TDES_SoftReset(AT91C_BASE_TDES);
AT91F_TDES_CfgModeReg(AT91C_BASE_TDES,AT91C_TDES_SMOD_PDC|cipher|mode|submode);
// Set Key
AT91F_TDES_SetKeys1(tdes_fips81,index);
AT91F_TDES_SetKeys2(tdes_fips81,index);
AT91F_TDES_SetKeys3(tdes_fips81,index);
// Set Init Vector for Chained Modes
if(mode != AT91C_TDES_OPMOD_ECB)
AT91F_TDES_SetInitializationVectors(tdes_fips81,index);
for(i=0;i<0x2;i++)
TestBuf[i] = tdes_fips81[index][i+IN_OFFSET];
// Set xCR & xPR
if(submode == AT91C_TDES_CFBS_8_BIT) {
AT91F_PDC_SetTx(AT91C_BASE_PDC_TDES, (char *)TestBuf, 1);
AT91F_PDC_SetRx(AT91C_BASE_PDC_TDES, (char *)TestBuf, 1);
} else {
AT91F_PDC_SetTx(AT91C_BASE_PDC_TDES, (char *)TestBuf, 2);
AT91F_PDC_SetRx(AT91C_BASE_PDC_TDES, (char *)TestBuf, 2);
}
// Enable ITs
test = AT91C_TEST_NOK;
AT91F_TDES_EnableIt(AT91C_BASE_TDES,AT91C_TDES_ENDRX);
// Enable PDC => Start Tx/Rx
AT91C_BASE_PDC_TDES->PDC_PTCR = AT91C_PDC_TXTEN | AT91C_PDC_RXTEN;
// Wait end of Transfer
while(test != AT91C_TEST_OK);
// Disable PDC
AT91C_BASE_PDC_TDES->PDC_PTCR = AT91C_PDC_TXTDIS | AT91C_PDC_RXTDIS;
// Check Output Text
if(submode == AT91C_TDES_CFBS_8_BIT) {
if( ((char) *TestBuf) != (char)(tdes_fips81[index][0+OUT_OFFSET]) )
return FALSE;
}
else {
for(i=0;i<0x2;i++) {
if( TestBuf[i] != (tdes_fips81[index][i+OUT_OFFSET]) ) {
TRACE_ERROR("........ => FAILED\n\r");
return FALSE;
}
}
}
TRACE_INFO("........ => OK\n\r");
return TRUE;
}
//*----------------------------------------------------------------------------
//* \fn AT91F_BasicTestSuite
//* \brief
//*----------------------------------------------------------------------------
void AT91F_BasicTestSuite(void)
{
// ECB
TRACE_INFO("\n\r1a. ECB PDC Encryption ");
AT91F_TDES_PDC_Mode(AT91C_TDES_OPMOD_ECB,0,AT91C_TDES_CIPHER,ECB_ENCRYPT_OFFSET);
TRACE_INFO("1b. ECB PDC Decryption ");
AT91F_TDES_PDC_Mode(AT91C_TDES_OPMOD_ECB,0,0,ECB_DECRYPT_OFFSET);
TRACE_INFO("1c. ECB Manual Encryption ");
AT91F_TDES_Manual_Auto_Mode(AT91C_TDES_OPMOD_ECB,AT91C_TDES_SMOD_MANUAL,AT91C_TDES_CIPHER,ECB_ENCRYPT_OFFSET);
TRACE_INFO("1d. ECB Manual Decryption ");
AT91F_TDES_Manual_Auto_Mode(AT91C_TDES_OPMOD_ECB,AT91C_TDES_SMOD_MANUAL,0,ECB_DECRYPT_OFFSET);
TRACE_INFO("1e. ECB Auto Encryption ");
AT91F_TDES_Manual_Auto_Mode(AT91C_TDES_OPMOD_ECB,AT91C_TDES_SMOD_AUTO,AT91C_TDES_CIPHER,ECB_ENCRYPT_OFFSET);
TRACE_INFO("1f. ECB Auto Decryption ");
AT91F_TDES_Manual_Auto_Mode(AT91C_TDES_OPMOD_ECB,AT91C_TDES_SMOD_AUTO,0,ECB_DECRYPT_OFFSET);
// CBC
TRACE_INFO("\n\r2a. CBC PDC Encryption ");
AT91F_TDES_PDC_Mode(AT91C_TDES_OPMOD_CBC,0,AT91C_TDES_CIPHER,CBC_ENCRYPT_OFFSET);
TRACE_INFO("2b. CBC PDC Decryption ");
AT91F_TDES_PDC_Mode(AT91C_TDES_OPMOD_CBC,0,0,CBC_DECRYPT_OFFSET);
TRACE_INFO("2c. CBC Manual Encryption ");
AT91F_TDES_Manual_Auto_Mode(AT91C_TDES_OPMOD_CBC,AT91C_TDES_SMOD_MANUAL,AT91C_TDES_CIPHER,CBC_ENCRYPT_OFFSET);
TRACE_INFO("2d. CBC Manual Decryption ");
AT91F_TDES_Manual_Auto_Mode(AT91C_TDES_OPMOD_CBC,AT91C_TDES_SMOD_MANUAL,0,CBC_DECRYPT_OFFSET);
TRACE_INFO("2e. CBC Auto Encryption ");
AT91F_TDES_Manual_Auto_Mode(AT91C_TDES_OPMOD_CBC,AT91C_TDES_SMOD_AUTO,AT91C_TDES_CIPHER,CBC_ENCRYPT_OFFSET);
TRACE_INFO("2f. CBC Auto Decryption ");
AT91F_TDES_Manual_Auto_Mode(AT91C_TDES_OPMOD_CBC,AT91C_TDES_SMOD_AUTO,0,CBC_DECRYPT_OFFSET);
// CFB64
TRACE_INFO("\n\r3a. CFB64 PDC Encryption ");
AT91F_TDES_PDC_Mode(AT91C_TDES_OPMOD_CFB,AT91C_TDES_CFBS_64_BIT,AT91C_TDES_CIPHER,CFB64_ENCRYPT_OFFSET);
TRACE_INFO("3b. CFB64 PDC Decryption ");
AT91F_TDES_PDC_Mode(AT91C_TDES_OPMOD_CFB,AT91C_TDES_CFBS_64_BIT,0,CFB64_DECRYPT_OFFSET);
TRACE_INFO("3c. CFB64 Manual Encryption ");
AT91F_TDES_Manual_Auto_Mode(AT91C_TDES_OPMOD_CFB,AT91C_TDES_SMOD_MANUAL,AT91C_TDES_CIPHER,CFB64_ENCRYPT_OFFSET);
TRACE_INFO("3d. CFB64 Manual Decryption ");
AT91F_TDES_Manual_Auto_Mode(AT91C_TDES_OPMOD_CFB,AT91C_TDES_SMOD_MANUAL,0,CFB64_DECRYPT_OFFSET);
TRACE_INFO("3e. CFB64 Auto Encryption ");
AT91F_TDES_Manual_Auto_Mode(AT91C_TDES_OPMOD_CFB,AT91C_TDES_SMOD_AUTO,AT91C_TDES_CIPHER,CFB64_ENCRYPT_OFFSET);
TRACE_INFO("3f. CFB64 Auto Decryption ");
AT91F_TDES_Manual_Auto_Mode(AT91C_TDES_OPMOD_CFB,AT91C_TDES_SMOD_AUTO,0,CFB64_DECRYPT_OFFSET);
// CFB8
TRACE_INFO("\n\r4a. CFB8 PDC Encryption ");
AT91F_TDES_PDC_Mode(AT91C_TDES_OPMOD_CFB,AT91C_TDES_CFBS_8_BIT,AT91C_TDES_CIPHER,CFB8_ENCRYPT_OFFSET);
TRACE_INFO("4b. CFB8 PDC Decryption ");
AT91F_TDES_PDC_Mode(AT91C_TDES_OPMOD_CFB,AT91C_TDES_CFBS_8_BIT,0,CFB8_DECRYPT_OFFSET);
TRACE_INFO("4c. CFB8 Manual Encryption ");
AT91C_TDES_Manual_Auto_Mode_CFB8(AT91C_TDES_SMOD_MANUAL,AT91C_TDES_CIPHER,CFB8_ENCRYPT_OFFSET);
TRACE_INFO("4d. CFB8 Manual Decryption ");
AT91C_TDES_Manual_Auto_Mode_CFB8(AT91C_TDES_SMOD_MANUAL,0,CFB8_DECRYPT_OFFSET);
TRACE_INFO("4e. CFB8 Auto Encryption ");
AT91C_TDES_Manual_Auto_Mode_CFB8(AT91C_TDES_SMOD_AUTO,AT91C_TDES_CIPHER,CFB8_ENCRYPT_OFFSET);
TRACE_INFO("4f. CFB8 Auto Decryption ");
AT91C_TDES_Manual_Auto_Mode_CFB8(AT91C_TDES_SMOD_AUTO,0,CFB8_DECRYPT_OFFSET);
TRACE_INFO("\n\rEnd of Tests\n\r");
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -