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

📄 app_general_che.c

📁 最新MTK手机软件源码
💻 C
📖 第 1 页 / 共 2 页
字号:
 *  isLastBlock         [IN]        
 *  iv_size:(?)
 *  key_size:(?)
 * RETURNS
 *  pending_size:
 *  dest:
 *****************************************************************************/
kal_bool app_drv_cipher
    (kal_uint8 handle,
     CHE_TYPE type,
     kal_uint8 *init_vector,
     kal_uint8 iv_len,
     kal_uint8 *ciphered_key,
     kal_uint8 key_len,
     kal_uint8 *source, kal_uint8 *dest, kal_uint32 *data_size, kal_uint8 round, kal_bool isLastBlock)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    if ((((kal_uint32) ciphered_key & 0x03) == 1)   /* The key must be 4-byte alignment */
        || ((CHE_HANDLE[handle] != ciphered_key) && (CHE_HANDLE[handle] != (kal_uint8*) 1))    /* CHE handle misused */
        || !(type > CHE_SHA1 && type < MAX_CHE_TYPE))
    {
        return KAL_FALSE;
    }
    /* check the key and iv length */
    switch (type)
    {
        case CHE_MD5:
        case CHE_SHA1:
            /* unknow length */
            break;
        case CHE_DES_ECB_DEC:
        case CHE_DES_CBC_DEC:
        case CHE_DES_ECB_ENC:
        case CHE_DES_CBC_ENC:
            if ((key_len != 8) || (iv_len != 8))
            {
                return KAL_FALSE;
            }
            break;
        case CHE_3DES_ECB_DEC:
        case CHE_3DES_CBC_DEC:
        case CHE_3DES_ECB_ENC:
        case CHE_3DES_CBC_ENC:
            if ((key_len != 24) || (iv_len != 8))
            {
                return KAL_FALSE;
            }
            break;
        case CHE_AES_CBC_DEC_128:
        case CHE_AES_ECB_DEC_128:
        case CHE_AES_CBC_ENC_128:
        case CHE_AES_ECB_ENC_128:
            if ((key_len != 16) || (iv_len != 16))
            {
                return KAL_FALSE;
            }
            break;
        case CHE_AES_CBC_DEC_192:
        case CHE_AES_ECB_DEC_192:
        case CHE_AES_CBC_ENC_192:
        case CHE_AES_ECB_ENC_192:
            if ((key_len != 24) || (iv_len != 16))
            {
                return KAL_FALSE;
            }
            break;
        case CHE_AES_CBC_DEC_256:
        case CHE_AES_ECB_DEC_256:
        case CHE_AES_CBC_ENC_256:
        case CHE_AES_ECB_ENC_256:
            if ((key_len != 32) || (iv_len != 16))
            {
                return KAL_FALSE;
            }
            break;
        default:
            return KAL_FALSE;
    }

    kal_take_mutex(app_che_mutex);
    if (round == 0)
    {
        *data_size = drv_cipher(handle, type, init_vector, ciphered_key, source, dest, *data_size, isLastBlock);
    }
    else
    {
        *data_size = drv_cipher_next(handle, type, source, dest, *data_size, isLastBlock);
    }
    kal_give_mutex(app_che_mutex);
    
    if (isLastBlock)
    {
        CHE_HANDLE[handle] = (kal_uint8*) 1;
    }

    return KAL_TRUE;

}   /* end of app_free_che_handle */


/*****************************************************************************
 * FUNCTION
 *  app_drv_decipher
 * DESCRIPTION
 *  decipher interface between the application level and CHE driver
 * PARAMETERS
 *  handle              [IN]        
 *  type                [IN]        
 *  init_vector         [?]         
 *  iv_len              [IN]        
 *  ciphered_key        [?]         
 *  key_len             [IN]        
 *  source              [?]         
 *  dest                [?]         
 *  data_size           [?]         
 *  round               [IN]        
 *  isLastBlock         [IN]        
 *  iv_size:(?)
 *  key_size:(?)
 * RETURNS
 *  pending_size:
 *  dest:
 *****************************************************************************/
kal_bool app_drv_decipher
    (kal_uint8 handle,
     CHE_TYPE type,
     kal_uint8 *init_vector,
     kal_uint8 iv_len,
     kal_uint8 *ciphered_key,
     kal_uint8 key_len,
     kal_uint8 *source, kal_uint8 *dest, kal_uint32 *data_size, kal_uint8 round, kal_bool isLastBlock)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    kal_uint32 padding_size;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    if ((((kal_uint32) ciphered_key & 0x03) == 1)   /* The key must be 4-byte alignment */
        || ((CHE_HANDLE[handle] != ciphered_key) && (CHE_HANDLE[handle] != (kal_uint8*) 1))    /* CHE handle misused */
        || !(type > CHE_SHA1 && type < MAX_CHE_TYPE))
    {
        return KAL_FALSE;
    }

    /* check the key and iv length */
    switch (type)
    {
        case CHE_MD5:
        case CHE_SHA1:
            /* unknow length */
            break;
        case CHE_DES_ECB_DEC:
        case CHE_DES_CBC_DEC:
        case CHE_DES_ECB_ENC:
        case CHE_DES_CBC_ENC:
            if ((key_len != 8) || (iv_len != 8))
            {
                return KAL_FALSE;
            }
            break;
        case CHE_3DES_ECB_DEC:
        case CHE_3DES_CBC_DEC:
        case CHE_3DES_ECB_ENC:
        case CHE_3DES_CBC_ENC:
            if ((key_len != 24) || (iv_len != 8))
            {
                return KAL_FALSE;
            }
            break;
        case CHE_AES_CBC_DEC_128:
        case CHE_AES_ECB_DEC_128:
        case CHE_AES_CBC_ENC_128:
        case CHE_AES_ECB_ENC_128:
            if ((key_len != 16) || (iv_len != 16))
            {
                return KAL_FALSE;
            }
            break;
        case CHE_AES_CBC_DEC_192:
        case CHE_AES_ECB_DEC_192:
        case CHE_AES_CBC_ENC_192:
        case CHE_AES_ECB_ENC_192:
            if ((key_len != 24) || (iv_len != 16))
            {
                return KAL_FALSE;
            }
            break;
        case CHE_AES_CBC_DEC_256:
        case CHE_AES_ECB_DEC_256:
        case CHE_AES_CBC_ENC_256:
        case CHE_AES_ECB_ENC_256:
            if ((key_len != 32) || (iv_len != 16))
            {
                return KAL_FALSE;
            }
            break;
        default:
            return KAL_FALSE;
    }

    kal_take_mutex(app_che_mutex);
    if (round == 0)
    {
        drv_decipher(handle, type, init_vector, ciphered_key, source, dest, *data_size, &padding_size, isLastBlock);
    }
    else
    {
        drv_decipher_next(handle, type, source, dest, *data_size, &padding_size, isLastBlock);
    }
    kal_give_mutex(app_che_mutex);

    if (isLastBlock)
    {
        CHE_HANDLE[handle] = (kal_uint8*) 1;
        *data_size -= padding_size;
    }
    return KAL_TRUE;

}


/*****************************************************************************
 * FUNCTION
 *  app_drv_hash
 * DESCRIPTION
 *  hash interface between the application level and CHE driver
 * PARAMETERS
 *  handle          [IN]        
 *  type            [IN]        
 *  source          [?]         
 *  dest            [?]         
 *  data_size       [IN]        
 *  round           [IN]        
 *  isLastBlock     [IN]        
 *  init_vector:(?)
 *  iv_size:(?)
 *  ciphered_key:(?)
 *  key_size:(?)
 * RETURNS
 *  pending_size:
 *  dest:
 *****************************************************************************/
kal_bool app_drv_hash
    (kal_uint8 handle,
     CHE_TYPE type, kal_uint8 *source, kal_uint8 *dest, kal_uint32 data_size, kal_uint8 round, kal_bool isLastBlock)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    kal_uint32 return_size;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    if (((CHE_HANDLE[handle] != (kal_uint8*) 1) && (CHE_HANDLE[handle] != source))     /* CHE handle misused */
        || (type != CHE_MD5 && type != CHE_SHA1))
    {
        return KAL_FALSE;
    }
    
    kal_take_mutex(app_che_mutex);
    if (round == 0)
    {
        return_size = drv_hash(handle, type, source, dest, data_size, isLastBlock);
    }
    else
    {
        return_size = drv_hash_next(handle, type, source, dest, data_size, isLastBlock);
    }
    kal_give_mutex(app_che_mutex);

    if (isLastBlock)
    {
        CHE_HANDLE[handle] = (kal_uint8*) 1;
    }
    else
    {
        CHE_HANDLE[handle] = source + return_size;
    }

    return return_size;

}
#endif /* _APP_GENERAL_CHE_C */ 

⌨️ 快捷键说明

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