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

📄 chedrv.c

📁 8032底层驱动部分。因为可以移植 所以单独来拿出来
💻 C
📖 第 1 页 / 共 4 页
字号:
         else if (che_type == CHE_DES_ECB_ENC)
         {
            CHE_REGSET_CON( (CHE_CON_ATYPE_DES|CHE_CON_CIPHER|CHE_CON_SMODE_ECB) );
         }
         if ((((kal_uint32)key)&0x03)==0)
         {
            che_update_key0_1(*(kal_uint32 *)(key+0x0),
                              *(kal_uint32 *)(key+0x4) );
         }
         else
         {
            che_update_key0_1(( (*(key+0x0)) | (*(key+0x1)<<8) | (*(key+0x2)<<16) | (*(key+0x3)<<24) ),
                              ( (*(key+0x4)) | (*(key+0x5)<<8) | (*(key+0x6)<<16) | (*(key+0x7)<<24) ) );
                              
         }
         break;
      
      case CHE_3DES_ECB_ENC:
      case CHE_3DES_CBC_ENC:
      case CHE_3DES_ECB_DEC:
      case CHE_3DES_CBC_DEC:
         if (che_type == CHE_3DES_CBC_DEC)
         {
            CHE_REGSET_CON( (CHE_CON_ATYPE_3DES|CHE_CON_DECIPHER|CHE_CON_SMODE_CBC) );
         }
         else if (che_type == CHE_3DES_ECB_DEC)
         {
            CHE_REGSET_CON( (CHE_CON_ATYPE_3DES|CHE_CON_DECIPHER|CHE_CON_SMODE_ECB) );
         }
         else if (che_type == CHE_3DES_CBC_ENC)
         {
            CHE_REGSET_CON( (CHE_CON_ATYPE_3DES|CHE_CON_CIPHER|CHE_CON_SMODE_CBC) );
         }
         else if (che_type == CHE_3DES_ECB_ENC)
         {
            CHE_REGSET_CON( (CHE_CON_ATYPE_3DES|CHE_CON_CIPHER|CHE_CON_SMODE_ECB) );
         }

         if ((((kal_uint32)key)&0x03)==0)
         {
            che_update_key0_3(*(kal_uint32 *)(key+0x0),
                              *(kal_uint32 *)(key+0x4),
                              *(kal_uint32 *)(key+0x8),
                              *(kal_uint32 *)(key+0xc) );
            che_update_key4_5(*(kal_uint32 *)(key+0x10),
                              *(kal_uint32 *)(key+0x14) );
         }
         else
         {
            che_update_key0_3(( (*(key+0x0)) | (*(key+0x1)<<8) | (*(key+0x2)<<16) | (*(key+0x3)<<24) ),
                              ( (*(key+0x4)) | (*(key+0x5)<<8) | (*(key+0x6)<<16) | (*(key+0x7)<<24) ),
                              ( (*(key+0x8)) | (*(key+0x9)<<8) | (*(key+0xa)<<16) | (*(key+0xb)<<24) ),
                              ( (*(key+0xc)) | (*(key+0xd)<<8) | (*(key+0xe)<<16) | (*(key+0xf)<<24) ) );
            che_update_key4_5(( (*(key+0x10)) | (*(key+0x11)<<8) | (*(key+0x12)<<16) | (*(key+0x13)<<24) ),
                              ( (*(key+0x14)) | (*(key+0x15)<<8) | (*(key+0x16)<<16) | (*(key+0x17)<<24) ) );
         }
         break;
         
      case CHE_AES_ECB_ENC_128:
      case CHE_AES_CBC_ENC_128:
      case CHE_AES_ECB_DEC_128:
      case CHE_AES_CBC_DEC_128:
         if (che_type == CHE_AES_CBC_DEC_128)
         {
            CHE_REGSET_CON( (CHE_CON_ATYPE_AES_128|CHE_CON_DECIPHER|CHE_CON_SMODE_CBC) );
         }
         else if (che_type == CHE_AES_ECB_DEC_128)
         {
            CHE_REGSET_CON( (CHE_CON_ATYPE_AES_128|CHE_CON_DECIPHER|CHE_CON_SMODE_ECB) );
         }
         else if (che_type == CHE_AES_CBC_ENC_128)
         {
            CHE_REGSET_CON( (CHE_CON_ATYPE_AES_128|CHE_CON_CIPHER|CHE_CON_SMODE_CBC) );
         }
         else if (che_type == CHE_AES_ECB_ENC_128)
         {
            CHE_REGSET_CON( (CHE_CON_ATYPE_AES_128|CHE_CON_CIPHER|CHE_CON_SMODE_ECB) );
         }
         
         if ((((kal_uint32)key)&0x03)==0)
         {
            che_update_key0_3(*(kal_uint32 *)(key+0x0),
                              *(kal_uint32 *)(key+0x4),
                              *(kal_uint32 *)(key+0x8),
                              *(kal_uint32 *)(key+0xc) );
         }
         else
         {
            che_update_key0_3(( (*(key+0x0)) | (*(key+0x1)<<8) | (*(key+0x2)<<16) | (*(key+0x3)<<24) ),
                              ( (*(key+0x4)) | (*(key+0x5)<<8) | (*(key+0x6)<<16) | (*(key+0x7)<<24) ),
                              ( (*(key+0x8)) | (*(key+0x9)<<8) | (*(key+0xa)<<16) | (*(key+0xb)<<24) ),
                              ( (*(key+0xc)) | (*(key+0xd)<<8) | (*(key+0xe)<<16) | (*(key+0xf)<<24) ) );
         }
         break;
      
      case CHE_AES_ECB_ENC_192:
      case CHE_AES_CBC_ENC_192:
      case CHE_AES_ECB_DEC_192:
      case CHE_AES_CBC_DEC_192:
         if (che_type == CHE_AES_CBC_DEC_192)
         {
            CHE_REGSET_CON( (CHE_CON_ATYPE_AES_192|CHE_CON_DECIPHER|CHE_CON_SMODE_CBC) );
         }
         else if (che_type == CHE_AES_ECB_DEC_192)
         {
            CHE_REGSET_CON( (CHE_CON_ATYPE_AES_192|CHE_CON_DECIPHER|CHE_CON_SMODE_ECB) );
         }
         else if (che_type == CHE_AES_CBC_ENC_192)
         {
            CHE_REGSET_CON( (CHE_CON_ATYPE_AES_192|CHE_CON_CIPHER|CHE_CON_SMODE_CBC) );
         }
         else if (che_type == CHE_AES_ECB_ENC_192)
         {
            CHE_REGSET_CON( (CHE_CON_ATYPE_AES_192|CHE_CON_CIPHER|CHE_CON_SMODE_ECB) );
         }
         
         if ((((kal_uint32)key)&0x03)==0)
         {
            che_update_key0_3(*(kal_uint32 *)(key+0x0),
                              *(kal_uint32 *)(key+0x4),
                              *(kal_uint32 *)(key+0x8),
                              *(kal_uint32 *)(key+0xc) );
            che_update_key4_5(*(kal_uint32 *)(key+0x10),
                              *(kal_uint32 *)(key+0x14) );
         }
         else
         {
            che_update_key0_3(( (*(key+0x0)) | (*(key+0x1)<<8) | (*(key+0x2)<<16) | (*(key+0x3)<<24) ),
                              ( (*(key+0x4)) | (*(key+0x5)<<8) | (*(key+0x6)<<16) | (*(key+0x7)<<24) ),
                              ( (*(key+0x8)) | (*(key+0x9)<<8) | (*(key+0xa)<<16) | (*(key+0xb)<<24) ),
                              ( (*(key+0xc)) | (*(key+0xd)<<8) | (*(key+0xe)<<16) | (*(key+0xf)<<24) ) );
            che_update_key4_5(( (*(key+0x10)) | (*(key+0x11)<<8) | (*(key+0x12)<<16) | (*(key+0x13)<<24) ),
                              ( (*(key+0x14)) | (*(key+0x15)<<8) | (*(key+0x16)<<16) | (*(key+0x17)<<24) ) );
         }
         break;
      
      case CHE_AES_ECB_ENC_256:
      case CHE_AES_CBC_ENC_256:
      case CHE_AES_ECB_DEC_256:
      case CHE_AES_CBC_DEC_256:
         if (che_type == CHE_AES_CBC_DEC_256)
         {
            CHE_REGSET_CON( (CHE_CON_ATYPE_AES_256|CHE_CON_DECIPHER|CHE_CON_SMODE_CBC) );
         }
         else if (che_type == CHE_AES_ECB_DEC_256)
         {
            CHE_REGSET_CON( (CHE_CON_ATYPE_AES_256|CHE_CON_DECIPHER|CHE_CON_SMODE_ECB) );
         }
         else if (che_type == CHE_AES_CBC_ENC_256)
         {
            CHE_REGSET_CON( (CHE_CON_ATYPE_AES_256|CHE_CON_CIPHER|CHE_CON_SMODE_CBC) );
         }
         else if (che_type == CHE_AES_ECB_ENC_256)
         {
            CHE_REGSET_CON( (CHE_CON_ATYPE_AES_256|CHE_CON_CIPHER|CHE_CON_SMODE_ECB) );
         }
         
         if ((((kal_uint32)key)&0x03)==0)
         {
            che_update_key0_3(*(kal_uint32 *)(key+0x0),
                              *(kal_uint32 *)(key+0x4),
                              *(kal_uint32 *)(key+0x8),
                              *(kal_uint32 *)(key+0xc) );
            che_update_key4_7(*(kal_uint32 *)(key+0x10),
                              *(kal_uint32 *)(key+0x14),
                              *(kal_uint32 *)(key+0x18),
                              *(kal_uint32 *)(key+0x1c));
         }
         else
         {
            che_update_key0_3(( (*(key+0x0)) | (*(key+0x1)<<8) | (*(key+0x2)<<16) | (*(key+0x3)<<24) ),
                              ( (*(key+0x4)) | (*(key+0x5)<<8) | (*(key+0x6)<<16) | (*(key+0x7)<<24) ),
                              ( (*(key+0x8)) | (*(key+0x9)<<8) | (*(key+0xa)<<16) | (*(key+0xb)<<24) ),
                              ( (*(key+0xc)) | (*(key+0xd)<<8) | (*(key+0xe)<<16) | (*(key+0xf)<<24) ) );
            che_update_key4_7(( (*(key+0x10)) | (*(key+0x11)<<8) | (*(key+0x12)<<16) | (*(key+0x13)<<24) ),
                              ( (*(key+0x14)) | (*(key+0x15)<<8) | (*(key+0x16)<<16) | (*(key+0x17)<<24) ),
                              ( (*(key+0x18)) | (*(key+0x19)<<8) | (*(key+0x1a)<<16) | (*(key+0x1b)<<24) ),
                              ( (*(key+0x1c)) | (*(key+0x1d)<<8) | (*(key+0x1e)<<16) | (*(key+0x1f)<<24) ));
         }
         break;
         
      default:
         ASSERT(0);
   }
   
   /*Output cipher key*/
   che_output_ckey((kal_uint32)ckey);  /*ckey*/
   CHE_PDN_ENABLE(handle);
}

void aes_set_iv(kal_uint8 *che_iv)
{
   if ( (((kal_uint32)che_iv)&0x03) == 0)
   {
      CHE_REGSET_IV0(*(kal_uint32 *)(che_iv+0x0));
      CHE_REGSET_IV1(*(kal_uint32 *)(che_iv+0x4));
      CHE_REGSET_IV2(*(kal_uint32 *)(che_iv+0x8));
      CHE_REGSET_IV3(*(kal_uint32 *)(che_iv+0xc));
   }
   else
   {
      CHE_REGSET_IV0(( (*(che_iv+0x0)) | (*(che_iv+0x1)<<8) | (*(che_iv+0x2)<<16) | (*(che_iv+0x3)<<24) ));
      CHE_REGSET_IV1(( (*(che_iv+0x4)) | (*(che_iv+0x5)<<8) | (*(che_iv+0x6)<<16) | (*(che_iv+0x7)<<24) ));
      CHE_REGSET_IV2(( (*(che_iv+0x8)) | (*(che_iv+0x9)<<8) | (*(che_iv+0xa)<<16) | (*(che_iv+0xb)<<24) ));
      CHE_REGSET_IV3(( (*(che_iv+0xc)) | (*(che_iv+0xd)<<8) | (*(che_iv+0xe)<<16) | (*(che_iv+0xf)<<24) ));
   }
   
   CHE_REGSET_START((CHE_START_UPIV01|CHE_START_UPIV23));
   CHE_REGSET_START(CHE_START_DONE);
}

void des_set_iv(kal_uint8 *che_iv)
{
   if ( (((kal_uint32)che_iv)&0x03) == 0)
   {
      CHE_REGSET_IV0(*(kal_uint32 *)(che_iv+0x0));
      CHE_REGSET_IV1(*(kal_uint32 *)(che_iv+0x4));
   }
   else
   {
      CHE_REGSET_IV0(( (*(che_iv+0x0)) | (*(che_iv+0x1)<<8) | (*(che_iv+0x2)<<16) | (*(che_iv+0x3)<<24) ));
      CHE_REGSET_IV1(( (*(che_iv+0x4)) | (*(che_iv+0x5)<<8) | (*(che_iv+0x6)<<16) | (*(che_iv+0x7)<<24) ));
   }
   
   CHE_REGSET_START(CHE_START_UPIV01);
   CHE_REGSET_START(CHE_START_DONE);
}

void aes_decipher(kal_uint8 handle, CHE_TYPE che_type, kal_uint8 *che_iv, kal_uint8 *ckey, kal_uint8 *srcData, kal_uint8 *decryptedData, kal_uint32 data_length, kal_bool last_block)
{
   switch(che_type)
   {
      case CHE_AES_CBC_DEC_128:
         CHE_REGSET_CON( (CHE_CON_ATYPE_AES_128|CHE_CON_DECIPHER|CHE_CON_SMODE_CBC) );
         aes_set_iv(che_iv);
         break;
      case CHE_AES_CBC_DEC_192:
         CHE_REGSET_CON( (CHE_CON_ATYPE_AES_192|CHE_CON_DECIPHER|CHE_CON_SMODE_CBC) );
         aes_set_iv(che_iv);
         break;
      case CHE_AES_CBC_DEC_256:
         CHE_REGSET_CON( (CHE_CON_ATYPE_AES_256|CHE_CON_DECIPHER|CHE_CON_SMODE_CBC) );
         aes_set_iv(che_iv);
         break;
      case CHE_AES_ECB_DEC_128:
         CHE_REGSET_CON( (CHE_CON_ATYPE_AES_128|CHE_CON_DECIPHER|CHE_CON_SMODE_ECB) );
         break;
      case CHE_AES_ECB_DEC_192:
         CHE_REGSET_CON( (CHE_CON_ATYPE_AES_192|CHE_CON_DECIPHER|CHE_CON_SMODE_ECB) );
         break;
      case CHE_AES_ECB_DEC_256:
         CHE_REGSET_CON( (CHE_CON_ATYPE_AES_256|CHE_CON_DECIPHER|CHE_CON_SMODE_ECB) );
         break;
      default:
         ASSERT(0);
   }
   
   /*Read the ckey to aes engine*/
   che_input_ckey((kal_uint32)ckey);
   
   /*Detail src/dst/length*/
   CHE_REGSET_SRC((kal_uint32)srcData);
   CHE_REGSET_DST((kal_uint32)decryptedData);
   CHE_REGSET_LEN((kal_uint32)data_length);
   CHE_REGSET_SADDR((kal_uint32)che_glb_data[handle].che_hw_status);
   
   if (last_block)
   {
      CHE_REGSET_START((CHE_START_STUD|CHE_START_LAST));
      che_wait_status_complete(data_length, KAL_TRUE, __LINE__);
   }
   else
   {
      CHE_REGSET_START((CHE_START_WSTAT|CHE_START_STUD));
      che_wait_status_complete(data_length, KAL_FALSE, __LINE__);
   }
   CHE_REGSET_START(CHE_START_DONE);
}

void aes_decipher_next(kal_uint8 handle, CHE_TYPE che_type, kal_uint8 *srcData, kal_uint8 *decryptedData, kal_uint32 data_length, kal_bool last_block)
{
   /*if decryptedData == NULL, the dstination address will follow previous destination address.*/
   kal_uint32 UPDES = 0;
   /*1s: 1M bytes*/
   switch(che_type)
   {
      case CHE_AES_CBC_DEC_128:
         CHE_REGSET_CON( (CHE_CON_ATYPE_AES_128|CHE_CON_DECIPHER|CHE_CON_SMODE_CBC) );
         break;
      case CHE_AES_CBC_DEC_192:
         CHE_REGSET_CON( (CHE_CON_ATYPE_AES_192|CHE_CON_DECIPHER|CHE_CON_SMODE_CBC) );
         break;
      case CHE_AES_CBC_DEC_256:
         CHE_REGSET_CON( (CHE_CON_ATYPE_AES_256|CHE_CON_DECIPHER|CHE_CON_SMODE_CBC) );
         break;
      case CHE_AES_ECB_DEC_128:
         CHE_REGSET_CON( (CHE_CON_ATYPE_AES_128|CHE_CON_DECIPHER|CHE_CON_SMODE_ECB) );
         break;
      case CHE_AES_ECB_DEC_192:
         CHE_REGSET_CON( (CHE_CON_ATYPE_AES_192|CHE_CON_DECIPHER|CHE_CON_SMODE_ECB) );
         break;
      case CHE_AES_ECB_DEC_256:
         CHE_REGSET_CON( (CHE_CON_ATYPE_AES_256|CHE_CON_DECIPHER|CHE_CON_SMODE_ECB) );
         break;
      default:
         ASSERT(0);
   }
   
   /*Detail src/dst/length*/
   CHE_REGSET_SRC((kal_uint32)srcData);   /*src*/
   if (decryptedData != NULL)
   {
      CHE_REGSET_DST((kal_uint32)decryptedData);   /*dst*/
      UPDES = CHE_START_UPDES;
   }
   
   CHE_REGSET_LEN((kal_uint32)data_length);   /*length*/
   CHE_REGSET_SADDR((kal_uint32)che_glb_data[handle].che_hw_status);
   
   if (last_block)
   {
      CHE_REGSET_START((CHE_START_RSTAT|CHE_START_STUD|CHE_START_LAST|UPDES));
      che_wait_status_complete(data_length,KAL_TRUE, __LINE__);
   }
   else
   {
      CHE_REGSET_START((CHE_START_RSTAT|CHE_START_WSTAT|CHE_START_STUD|UPDES));
      che_wait_status_complete(data_length,KAL_FALSE, __LINE__);
   }
   CHE_REGSET_START(CHE_START_DONE);
}

void des_decipher(kal_uint8 handle, CHE_TYPE che_type, kal_uint8 *che_iv, kal_uint8 *ckey, kal_uint8 *srcData, kal_uint8 *decryptedData, kal_uint32 data_length, kal_bool last_block)
{
   switch(che_type)
   {
      case CHE_DES_CBC_DEC:
         CHE_REGSET_CON( (CHE_CON_ATYPE_DES|CHE_CON_DECIPHER|CHE_CON_SMODE_CBC) );
         des_set_iv(che_iv);
         break;
      case CHE_3DES_CBC_DEC:
         CHE_REGSET_CON( (CHE_CON_ATYPE_3DES|CHE_CON_DECIPHER|CHE_CON_SMODE_CBC) );
         des_set_iv(che_iv);
         break;
      case CHE_DES_ECB_DEC:
         CHE_REGSET_CON( (CHE_CON_ATYPE_DES|CHE_CON_DECIPHER|CHE_CON_SMODE_ECB) );
         break;
      case CHE_3DES_ECB_DEC:
         CHE_REGSET_CON( (CHE_CON_ATYPE_3DES|CHE_CON_DECIPHER|CHE_CON_SMODE_ECB) );
         break;
      default:
         ASSERT(0);
   }

⌨️ 快捷键说明

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