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

📄 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);      /*src*/
   CHE_REGSET_DST((kal_uint32)encryptedData);   /*dst*/
   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_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_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_DES_CBC_ENC:
         CHE_REGSET_CON((CHE_CON_ATYPE_DES|CHE_CON_CIPHER|CHE_CON_SMODE_CBC));
         break;
      case CHE_DES_ECB_ENC:
         CHE_REGSET_CON((CHE_CON_ATYPE_DES|CHE_CON_CIPHER|CHE_CON_SMODE_ECB));
         break;
      case CHE_3DES_CBC_ENC:
         CHE_REGSET_CON((CHE_CON_ATYPE_3DES|CHE_CON_CIPHER|CHE_CON_SMODE_CBC));
         break;
      case CHE_3DES_ECB_ENC:
         CHE_REGSET_CON((CHE_CON_ATYPE_3DES|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);  /*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);
}

kal_uint32 drv_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)
{
   kal_uint32 decipher_bytes;
   ASSERT(encryptedData != 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_ENC:
      case CHE_DES_ECB_ENC:
      case CHE_3DES_CBC_ENC:
      case CHE_3DES_ECB_ENC:
         des_cipher(handle,che_type,che_iv,ckey,srcData,encryptedData,data_length,last_block);
         break;
      
      case CHE_AES_CBC_ENC_128:
      case CHE_AES_CBC_ENC_192:
      case CHE_AES_CBC_ENC_256:
      case CHE_AES_ECB_ENC_128:
      case CHE_AES_ECB_ENC_192:
      case CHE_AES_ECB_ENC_256:
         aes_cipher(handle,che_type,che_iv,ckey,srcData,encryptedData,data_length,last_block);
         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)encryptedData;
   if (last_block != 1)
   {
      che_glb_data[handle].keep_dst_addr = KAL_TRUE;
      che_glb_data[handle].keep_dst_addr_value = DRV_Reg32(CHE_CDES);
   }
   
   CHE_PDN_ENABLE(handle);

   return decipher_bytes;
}

kal_uint32 drv_cipher_next(kal_uint8 handle, 
                           CHE_TYPE che_type, 
                           kal_uint8 *srcData, 
                           kal_uint8 *encryptedData, 
                           kal_uint32 data_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_ENC:
      case CHE_DES_ECB_ENC:
      case CHE_3DES_CBC_ENC:
      case CHE_3DES_ECB_ENC:
         des_cipher_next(handle,che_type,srcData,encryptedData,data_length,last_block);
         break;
         
      case CHE_AES_CBC_ENC_128:
      case CHE_AES_CBC_ENC_192:
      case CHE_AES_CBC_ENC_256:
      case CHE_AES_ECB_ENC_128:
      case CHE_AES_ECB_ENC_192:
      case CHE_AES_ECB_ENC_256:
         aes_cipher_next(handle,che_type,srcData,encryptedData,data_length,last_block);
         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 (encryptedData != NULL)
      decipher_bytes = DRV_Reg32(CHE_CDES) - (kal_uint32)encryptedData;
   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 (encryptedData != 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);
   }
   
   CHE_PDN_ENABLE(handle);
   
   return decipher_bytes;
}

kal_uint32 drv_hash(kal_uint8 handle, 
                    CHE_TYPE che_type, 
                    kal_uint8 *srcData, 
                    kal_uint8 *output_data, 
                    kal_uint32 data_length, 
                    kal_bool last_block)
{
   kal_uint32 hash_bytes;
   ASSERT(output_data != NULL);
   ASSERT(che_cb.che_machie_running == KAL_FALSE);
   che_cb.che_machie_running = KAL_TRUE;
   
   CHE_PDN_DISABLE(handle);
   
   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_MD5:
         CHE_REGSET_CON((CHE_CON_ATYPE_MD5));
         break;
         
      case CHE_SHA1:
         CHE_REGSET_CON((CHE_CON_ATYPE_SHA1));
         break;
      default:
         ASSERT(0);
   }

   /*Detail src/dst/length*/
   CHE_REGSET_SRC((kal_uint32)srcData);      /*src*/
   CHE_REGSET_DST((kal_uint32)output_data);   /*dst*/
   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_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_glb_data[handle].keep_dst_addr = KAL_TRUE;
      che_glb_data[handle].keep_dst_addr_value = DRV_Reg32(CHE_CDES);
   }
   CHE_REGSET_START(CHE_START_DONE);
   
   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;
   
   hash_bytes = DRV_Reg32(CHE_CDES) - (kal_uint32)output_data;
   
   CHE_PDN_ENABLE(handle);
   
   return hash_bytes;
}

kal_uint32 drv_hash_next(kal_uint8 handle, 
                         CHE_TYPE che_type, 
                         kal_uint8 *srcData, 
                         kal_uint8 *output_data, 
                         kal_uint32 data_length, 
                         kal_bool last_block)
{
   kal_uint32 hash_bytes;
   kal_uint32 UPDES;
   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_MD5:
         CHE_REGSET_CON(CHE_CON_ATYPE_MD5);
         break;
         
      case CHE_SHA1:
         CHE_REGSET_CON(CHE_CON_ATYPE_SHA1);
         break;
      default:
         ASSERT(0);
   }
   
   /*Detail src/dst/length*/
   CHE_REGSET_SRC((kal_uint32)srcData);   /*src*/
   if (output_data != NULL)
   {
      CHE_REGSET_DST((kal_uint32)output_data);  /*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);
   
   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 (output_data != NULL)
      hash_bytes = DRV_Reg32(CHE_CDES) - (kal_uint32)output_data;
   else
   {
      ASSERT(che_glb_data[handle].keep_dst_addr == KAL_TRUE);
      hash_bytes = DRV_Reg32(CHE_CDES) - che_glb_data[handle].keep_dst_addr_value;
   }
   
   if (output_data != 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);
   }
   
   CHE_PDN_ENABLE(handle);
   return hash_bytes;
}
#else /*__HW_CHE__*/
void che_init(void)
{
}
void che_slowdown(void)
{
}
void che_recover(void)
{
}
#endif

⌨️ 快捷键说明

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