⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tdes_fips81.c

📁 atmel官方的at91sam7x256芯片在iar编译环境下的全部演示代码
💻 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 + -