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

📄 chedrv.c

📁 8032底层驱动部分。因为可以移植 所以单独来拿出来
💻 C
📖 第 1 页 / 共 4 页
字号:
   /*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 des_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_DES_CBC_DEC:
         CHE_REGSET_CON( (CHE_CON_ATYPE_DES|CHE_CON_DECIPHER|CHE_CON_SMODE_CBC) );
         break;
      case CHE_DES_ECB_DEC:
         CHE_REGSET_CON( (CHE_CON_ATYPE_DES|CHE_CON_DECIPHER|CHE_CON_SMODE_ECB) );
         break;
      case CHE_3DES_CBC_DEC:
         CHE_REGSET_CON( (CHE_CON_ATYPE_3DES|CHE_CON_DECIPHER|CHE_CON_SMODE_CBC) );
         break;
      case CHE_3DES_ECB_DEC:
         CHE_REGSET_CON( (CHE_CON_ATYPE_3DES|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);
      UPDES = CHE_START_UPDES;
   }
   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_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);
}

kal_uint32 drv_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_uint32 *padding_length, 
                        kal_bool last_block)
{
   kal_uint32 decipher_bytes;
   ASSERT(decryptedData != NULL);
   ASSERT(che_cb.che_machie_running == KAL_FALSE);
   che_cb.che_machie_running = KAL_TRUE;
   
   CHE_PDN_DISABLE(handle);
   
   ASSERT((((kal_uint32)ckey)&0x03)==0);
      
   che_glb_data[handle].che_last_block =  last_block; 
   che_glb_data[handle].che_type =  che_type;
   che_glb_data[handle].total_length = data_length;
   
   CHE_REGSET_START(CHE_START_CLEAR);
   CHE_REGSET_START(CHE_START_DONE);
   
   switch(che_type)
   {
      case CHE_DES_CBC_DEC:
      case CHE_DES_ECB_DEC:
      case CHE_3DES_CBC_DEC:
      case CHE_3DES_ECB_DEC:
         des_decipher(handle,che_type,che_iv,ckey,srcData,decryptedData,data_length,last_block);
         if (last_block)
         {
            ASSERT((che_glb_data[handle].total_length&0x7)==0x0);
         }
         break;
      
      case CHE_AES_CBC_DEC_128:
      case CHE_AES_CBC_DEC_192:
      case CHE_AES_CBC_DEC_256:
      case CHE_AES_ECB_DEC_128:
      case CHE_AES_ECB_DEC_192:
      case CHE_AES_ECB_DEC_256:
         aes_decipher(handle,che_type,che_iv,ckey,srcData,decryptedData,data_length,last_block);
         if (last_block)
         {
            ASSERT((che_glb_data[handle].total_length&0xf)==0x0);
         }
         break;
      default:
         ASSERT(0);
   }
   
   che_glb_data[handle].che_last_handle = che_cb.che_lastest_finish_handle;
   che_cb.che_lastest_finish_handle = handle;
   che_cb.che_machie_running = KAL_FALSE;
   
   decipher_bytes = DRV_Reg32(CHE_CDES) - (kal_uint32)decryptedData;
   if (!last_block)
   {
      che_glb_data[handle].keep_dst_addr = KAL_TRUE;
      che_glb_data[handle].keep_dst_addr_value = DRV_Reg32(CHE_CDES);
   }
   
   if (padding_length != NULL)
   {
      if (last_block)
         *padding_length = DRV_Reg32(CHE_PCNT);
      else
         *padding_length = 0;
   }
   
   CHE_PDN_ENABLE(handle);
   
   return decipher_bytes;
}

kal_uint32 drv_decipher_next(kal_uint8 handle, 
                             CHE_TYPE che_type, 
                             kal_uint8 *srcData, 
                             kal_uint8 *decryptedData, 
                             kal_uint32 data_length, 
                             kal_uint32 *padding_length, 
                             kal_bool last_block)
{
   kal_uint32 decipher_bytes;
   ASSERT(che_cb.che_machie_running == KAL_FALSE);
   che_cb.che_machie_running = KAL_TRUE;
   
   CHE_PDN_DISABLE(handle);
   
   che_glb_data[handle].che_type = che_type;
   ASSERT(che_glb_data[handle].che_last_block == KAL_FALSE);
   che_glb_data[handle].che_last_block = last_block;
   che_glb_data[handle].total_length += data_length;
   
   switch(che_type)
   {
      case CHE_DES_CBC_DEC:
      case CHE_DES_ECB_DEC:
      case CHE_3DES_CBC_DEC:
      case CHE_3DES_ECB_DEC:
         des_decipher_next(handle,che_type,srcData,decryptedData,data_length,last_block);
         if (last_block)
         {
            ASSERT((che_glb_data[handle].total_length&0x7)==0x0);
         }
         break;
      
      case CHE_AES_CBC_DEC_128:
      case CHE_AES_CBC_DEC_192:
      case CHE_AES_CBC_DEC_256:
      case CHE_AES_ECB_DEC_128:
      case CHE_AES_ECB_DEC_192:
      case CHE_AES_ECB_DEC_256:
         aes_decipher_next(handle,che_type,srcData,decryptedData,data_length,last_block);
         if (last_block)
         {
            ASSERT((che_glb_data[handle].total_length&0xf)==0x0);
         }
         break;
      default:
         ASSERT(0);
   }
   che_glb_data[handle].che_last_handle = che_cb.che_lastest_finish_handle;
   che_cb.che_lastest_finish_handle = handle;
   che_cb.che_machie_running = KAL_FALSE;
   
   if (decryptedData != NULL)
      decipher_bytes = DRV_Reg32(CHE_CDES) - (kal_uint32)decryptedData;
   else
   {
      ASSERT(che_glb_data[handle].keep_dst_addr == KAL_TRUE);
      decipher_bytes = DRV_Reg32(CHE_CDES) - che_glb_data[handle].keep_dst_addr_value;
   }
   
   if (decryptedData != NULL)
   {
      che_glb_data[handle].keep_dst_addr = KAL_FALSE;
      che_glb_data[handle].keep_dst_addr_value = 0;
   }
   else
   {
      che_glb_data[handle].keep_dst_addr = KAL_TRUE;
      che_glb_data[handle].keep_dst_addr_value = DRV_Reg32(CHE_CDES);
   }
   
   if (padding_length != NULL)
   {
      if (last_block)
         *padding_length = DRV_Reg32(CHE_PCNT);
      else
         *padding_length = 0;
   }
   CHE_PDN_ENABLE(handle);
   
   return decipher_bytes;
}


void aes_cipher(kal_uint8 handle, CHE_TYPE che_type, kal_uint8 *che_iv, kal_uint8 *ckey, kal_uint8 *srcData, kal_uint8 *encryptedData, kal_uint32 data_length, kal_bool last_block)
{
   switch(che_type)
   {
      case CHE_AES_CBC_ENC_128:
         CHE_REGSET_CON( (CHE_CON_ATYPE_AES_128|CHE_CON_CIPHER|CHE_CON_SMODE_CBC) );
         aes_set_iv(che_iv);
         break;
      case CHE_AES_CBC_ENC_192:
         CHE_REGSET_CON( (CHE_CON_ATYPE_AES_192|CHE_CON_CIPHER|CHE_CON_SMODE_CBC) );
         aes_set_iv(che_iv);
         break;
      case CHE_AES_CBC_ENC_256:
         CHE_REGSET_CON( (CHE_CON_ATYPE_AES_256|CHE_CON_CIPHER|CHE_CON_SMODE_CBC) );
         aes_set_iv(che_iv);
         break;
      case CHE_AES_ECB_ENC_128:
         CHE_REGSET_CON( (CHE_CON_ATYPE_AES_128|CHE_CON_CIPHER|CHE_CON_SMODE_ECB) );
         break;
      case CHE_AES_ECB_ENC_192:
         CHE_REGSET_CON( (CHE_CON_ATYPE_AES_192|CHE_CON_CIPHER|CHE_CON_SMODE_ECB) );
         break;
      case CHE_AES_ECB_ENC_256:
         CHE_REGSET_CON( (CHE_CON_ATYPE_AES_256|CHE_CON_CIPHER|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);      /*src*/
   CHE_REGSET_DST((kal_uint32)encryptedData);
   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_cipher_next(kal_uint8 handle, CHE_TYPE che_type, kal_uint8 *srcData, kal_uint8 *encryptedData, 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_ENC_128:
         CHE_REGSET_CON( (CHE_CON_ATYPE_AES_128|CHE_CON_CIPHER|CHE_CON_SMODE_CBC) );
         break;
      case CHE_AES_CBC_ENC_192:
         CHE_REGSET_CON( (CHE_CON_ATYPE_AES_192|CHE_CON_CIPHER|CHE_CON_SMODE_CBC) );
         break;
      case CHE_AES_CBC_ENC_256:
         CHE_REGSET_CON( (CHE_CON_ATYPE_AES_256|CHE_CON_CIPHER|CHE_CON_SMODE_CBC) );
         break;
      case CHE_AES_ECB_ENC_128:
         CHE_REGSET_CON( (CHE_CON_ATYPE_AES_128|CHE_CON_CIPHER|CHE_CON_SMODE_ECB) );
         break;
      case CHE_AES_ECB_ENC_192:
         CHE_REGSET_CON( (CHE_CON_ATYPE_AES_192|CHE_CON_CIPHER|CHE_CON_SMODE_ECB) );
         break;
      case CHE_AES_ECB_ENC_256:
         CHE_REGSET_CON( (CHE_CON_ATYPE_AES_256|CHE_CON_CIPHER|CHE_CON_SMODE_ECB) );
         break;
      default:
         ASSERT(0);
   }
   
   /*Detail src/dst/length*/
   CHE_REGSET_SRC((kal_uint32)srcData);      /*src*/
   if (encryptedData != NULL)
   {
      CHE_REGSET_DST((kal_uint32)encryptedData);
      UPDES = CHE_START_UPDES;
   }
   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_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_cipher(kal_uint8 handle, CHE_TYPE che_type, kal_uint8 *che_iv, kal_uint8 *ckey, kal_uint8 *srcData, kal_uint8 *encryptedData, kal_uint32 data_length, kal_bool last_block)
{
   switch(che_type)
   {
      case CHE_DES_CBC_ENC:
         CHE_REGSET_CON( (CHE_CON_ATYPE_DES|CHE_CON_CIPHER|CHE_CON_SMODE_CBC) );
         des_set_iv(che_iv);
         break;
      case CHE_3DES_CBC_ENC:
         CHE_REGSET_CON( (CHE_CON_ATYPE_3DES|CHE_CON_CIPHER|CHE_CON_SMODE_CBC) );
         des_set_iv(che_iv);
         break;
      case CHE_DES_ECB_ENC:
         CHE_REGSET_CON( (CHE_CON_ATYPE_DES|CHE_CON_CIPHER|CHE_CON_SMODE_ECB) );
         break;
      case CHE_3DES_ECB_ENC:
         CHE_REGSET_CON( (CHE_CON_ATYPE_3DES|CHE_CON_CIPHER|CHE_CON_SMODE_ECB) );
         break;
      default:
         ASSERT(0);
   }
   

⌨️ 快捷键说明

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