Files
gk-sdk/sample/cipher/sample_cipher_efuse.c

346 lines
11 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* Copyright (c) XMEDIA. All rights reserved.
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <assert.h>
#include "xmedia_type.h"
#include "xmedia_cipher.h"
#include "xmedia_memory.h"
#include "sample_common.h"
#define KEY_IS_ZERO
#define AES_KEY_MAX_LENGTH 32
#define AES128_KEY_LENGTH 16
#define AES_IV_LENGTH 16
static xmedia_u8 aes_128_cbc_key[16] = {0x00,0xe9,0x85,0xde,0x41,0x67,0x6f,0x00,0x96,0x94,0x41,0x54,0x02,0x7d,0xe7,0xc5};
#ifdef KEY_IS_ZERO
// 使用的AES硬件key(OTP中的key)需要为全0(默认为全0)
static xmedia_u8 aes_128_enc_key[16] = {0x00,0x86,0x30,0x1E,0xAF,0x79,0x10,0x06,0x14,0x65,0x6C,0x08,0xE5,0xEE,0x7C,0x19};
#else
/*
* 使用的AES硬件keyOTP中的key)需要为00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff,
* 烧写AES硬件key的方法请参考《OTP API参考.docx》
*/
static xmedia_u8 aes_128_enc_key[16] = {0x53,0x2d,0x81,0x71,0x24,0x3d,0x70,0xcc,0x55,0xad,0x4f,0xb7,0x2a,0x52,0x06,0x8d};
#endif
static xmedia_u8 aes_128_cbc_IV[16] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F};
static xmedia_u8 aes_128_src_buf[16] = {0x6B,0xC1,0xBE,0xE2,0x2E,0x40,0x9F,0x96,0xE9,0x3D,0x7E,0x11,0x73,0x93,0x17,0x2A};
static xmedia_u8 aes_128_dst_buf[16] = {0xF0,0XB7,0X6A,0X0C,0X16,0X06,0XD4,0XDE,0X79,0XCB,0X5C,0X66,0XD3,0X51,0X0C,0XAB};
static xmedia_s32 set_config(xmedia_handle handle, xmedia_cipher_ca_type type, xmedia_cipher_alg alg, xmedia_cipher_work_mode mode,
xmedia_cipher_key_length key_len, const xmedia_u8 *key, const xmedia_u8 iv[AES_IV_LENGTH])
{
xmedia_s32 ret = XMEDIA_SUCCESS;
xmedia_cipher_ctrl ctrl;
memset(&ctrl, 0, sizeof(xmedia_cipher_ctrl));
ctrl.alg = alg;
ctrl.mode = mode;
ctrl.key_by_ca = XMEDIA_TRUE;
ctrl.ca_type = type;
if (ctrl.alg == XMEDIA_CIPHER_ALG_AES) {
/*only support AES ECB/CBC/CFB/OFB/CTR*/
if (ctrl.mode <= XMEDIA_CIPHER_WORK_MODE_CTR && ctrl.mode >= XMEDIA_CIPHER_WORK_MODE_ECB) {
ctrl.aes_ctrl.bit_width = XMEDIA_CIPHER_BIT_WIDTH_128BIT;
ctrl.aes_ctrl.key_len = key_len;
if (ctrl.mode != XMEDIA_CIPHER_WORK_MODE_ECB) {
ctrl.aes_ctrl.iv_usage = 1; // must set for CBC , CFB mode
memcpy(ctrl.aes_ctrl.iv, iv, AES_IV_LENGTH);
}
if (key_len == XMEDIA_CIPHER_KEY_AES_128BIT) {
memcpy(ctrl.aes_ctrl.key, key, AES128_KEY_LENGTH);
} else {
memcpy(ctrl.aes_ctrl.key, key, AES_KEY_MAX_LENGTH);
}
}
}
ret = xmedia_cipher_config_handle(handle, &ctrl);
if (XMEDIA_SUCCESS != ret) {
return XMEDIA_FAILURE;
}
return XMEDIA_SUCCESS;
}
xmedia_s32 sample_cipher_efuse_vir(xmedia_void)
{
xmedia_s32 ret = XMEDIA_SUCCESS;
xmedia_u32 data_len = 16;
xmedia_handle chnid = 0;
xmedia_cipher_ca_type key_src;
xmedia_u8 u8Key[AES128_KEY_LENGTH];
xmedia_u8 enc_result[16];
xmedia_u8 dec_result[16];
ret = xmedia_cipher_init();
if (XMEDIA_SUCCESS != ret) {
return XMEDIA_FAILURE;
}
memset(u8Key, 0x0, AES128_KEY_LENGTH);
key_src = XMEDIA_CIPHER_KEY_SRC_KLAD_1;
ret = xmedia_cipher_klad_encrypt_key(XMEDIA_CIPHER_KEY_SRC_KLAD_1, XMEDIA_CIPHER_KLAD_TARGET_AES, aes_128_cbc_key, u8Key, AES128_KEY_LENGTH);
if (XMEDIA_SUCCESS != ret) {
ERR_CODE_CIPHER("Error: Klad Encrypt Key failed!\n");
return XMEDIA_FAILURE;
}
if (0 != memcmp(u8Key, aes_128_enc_key, 16)) {
ERR_CODE_CIPHER("Memcmp failed!\n");
print_buffer("clean key", aes_128_cbc_key, 16);
print_buffer("encrypt key", u8Key, 16);
return XMEDIA_FAILURE;
}
ret = xmedia_cipher_create_handle(&chnid);
if (XMEDIA_SUCCESS != ret) {
xmedia_cipher_exit();
return XMEDIA_FAILURE;
}
ret = set_config(chnid,
key_src,
XMEDIA_CIPHER_ALG_AES,
XMEDIA_CIPHER_WORK_MODE_CBC,
XMEDIA_CIPHER_KEY_AES_128BIT,
u8Key,
aes_128_cbc_IV);
if (XMEDIA_SUCCESS != ret) {
ERR_CODE_CIPHER("Set config info failed.\n");
goto __CIPHER_EXIT__;
}
print_buffer("clear text:", aes_128_src_buf, sizeof(aes_128_src_buf));
memset(enc_result, 0x0, data_len);
ret = xmedia_cipher_encrypt_vir(chnid, aes_128_src_buf, enc_result, data_len);
if (XMEDIA_SUCCESS != ret) {
ERR_CODE_CIPHER("Cipher encrypt failed.\n");
ret = XMEDIA_FAILURE;
goto __CIPHER_EXIT__;
}
print_buffer("encrypted text:", enc_result, data_len);
/* compare */
if (0 != memcmp(enc_result, aes_128_dst_buf, data_len)) {
ERR_CODE_CIPHER("Memcmp failed!\n");
ret = XMEDIA_FAILURE;
goto __CIPHER_EXIT__;
}
memset(dec_result, 0x0, data_len);
ret = set_config(chnid,
key_src,
XMEDIA_CIPHER_ALG_AES,
XMEDIA_CIPHER_WORK_MODE_CBC,
XMEDIA_CIPHER_KEY_AES_128BIT,
u8Key,
aes_128_cbc_IV);
if (XMEDIA_SUCCESS != ret) {
ERR_CODE_CIPHER("Set config info failed.\n");
goto __CIPHER_EXIT__;
}
print_buffer("before decrypt:", enc_result, data_len);
ret = xmedia_cipher_decrypt_vir(chnid, enc_result, dec_result, data_len);
if (XMEDIA_SUCCESS != ret) {
ERR_CODE_CIPHER("Cipher decrypt failed.\n");
ret = XMEDIA_FAILURE;
goto __CIPHER_EXIT__;
}
print_buffer("decrypted text:", dec_result, data_len);
/* compare */
if (0 != memcmp(dec_result, aes_128_src_buf, data_len)) {
ERR_CODE_CIPHER("Memcmp failed!\n");
ret = XMEDIA_FAILURE;
goto __CIPHER_EXIT__;
}
TEST_END_PASS();
__CIPHER_EXIT__:
xmedia_cipher_destroy_handle(chnid);
xmedia_cipher_exit();
return ret;
}
xmedia_s32 sample_cipher_efuse_phy(xmedia_void)
{
xmedia_s32 ret = XMEDIA_SUCCESS;
xmedia_u32 data_len = 16;
xmedia_u32 input_addr_phy = 0;
xmedia_u32 output_addr_phy = 0;
xmedia_u32 cached = 0;
xmedia_u8 *input_addr_vir = XMEDIA_NULL;
xmedia_u8 *output_addr_vir = XMEDIA_NULL;
xmedia_handle chnid = 0;
xmedia_cipher_ca_type key_src;
xmedia_u8 u8Key[AES128_KEY_LENGTH];
ret = xmedia_cipher_init();
if (XMEDIA_SUCCESS != ret) {
return XMEDIA_FAILURE;
}
memset(u8Key, 0x0, AES128_KEY_LENGTH);
key_src = XMEDIA_CIPHER_KEY_SRC_KLAD_1;
ret = xmedia_cipher_klad_encrypt_key(XMEDIA_CIPHER_KEY_SRC_KLAD_1, XMEDIA_CIPHER_KLAD_TARGET_AES, aes_128_cbc_key, u8Key, AES128_KEY_LENGTH);
if (XMEDIA_SUCCESS != ret) {
ERR_CODE_CIPHER("Error: Klad Encrypt Key failed!\n");
return XMEDIA_FAILURE;
}
if (0 != memcmp(u8Key, aes_128_enc_key, 16)) {
ERR_CODE_CIPHER("Memcmp failed!\n");
print_buffer("clean key", aes_128_cbc_key, 16);
print_buffer("encrypt key", u8Key, 16);
return XMEDIA_FAILURE;
}
ret = xmedia_cipher_create_handle(&chnid);
if (XMEDIA_SUCCESS != ret) {
xmedia_cipher_exit();
return XMEDIA_FAILURE;
}
input_addr_phy = (xmedia_u32)xmedia_mmz_alloc(XMEDIA_NULL, "CIPHER_BufIn",data_len);
if (0 == input_addr_phy) {
ERR_CODE_CIPHER("Error: Get phyaddr for input failed!\n");
goto __CIPHER_EXIT__;
}
input_addr_vir = xmedia_mmz_map(input_addr_phy, data_len, cached);
output_addr_phy = (xmedia_u32)xmedia_mmz_alloc(XMEDIA_NULL, "CIPHER_BufOut", data_len);
if (0 == output_addr_phy) {
ERR_CODE_CIPHER("Error: Get phyaddr for outPut failed!\n");
goto __CIPHER_EXIT__;
}
output_addr_vir = xmedia_mmz_map(output_addr_phy, data_len, cached);
if (0 == output_addr_vir) {
ERR_CODE_CIPHER("Errror: Get Viraddr for outPut failed!\n");
goto __CIPHER_EXIT__;
}
// For encrypt
ret = set_config(chnid,
key_src,
XMEDIA_CIPHER_ALG_AES,
XMEDIA_CIPHER_WORK_MODE_CBC,
XMEDIA_CIPHER_KEY_AES_128BIT,
u8Key,
aes_128_cbc_IV);
if (XMEDIA_SUCCESS != ret) {
ERR_CODE_CIPHER("Set config info failed.\n");
goto __CIPHER_EXIT__;
}
memset(input_addr_vir, 0x0, data_len);
memcpy(input_addr_vir, aes_128_src_buf, data_len);
print_buffer("clear text:", aes_128_src_buf, sizeof(aes_128_src_buf));
memset(output_addr_vir, 0x0, data_len);
ret = xmedia_cipher_encrypt(chnid, input_addr_phy, output_addr_phy, data_len);
if (XMEDIA_SUCCESS != ret) {
ERR_CODE_CIPHER("Cipher encrypt failed.\n");
ret = XMEDIA_FAILURE;
goto __CIPHER_EXIT__;
}
print_buffer("encrypted text:", output_addr_vir, sizeof(aes_128_dst_buf));
// compare
if (0 != memcmp(output_addr_vir, aes_128_dst_buf, data_len)) {
ERR_CODE_CIPHER("Memcmp failed!\n");
ret = XMEDIA_FAILURE;
goto __CIPHER_EXIT__;
}
//For decrypt
memcpy(input_addr_vir, aes_128_dst_buf, data_len);
memset(output_addr_vir, 0x0, data_len);
ret = set_config(chnid,
key_src,
XMEDIA_CIPHER_ALG_AES,
XMEDIA_CIPHER_WORK_MODE_CBC,
XMEDIA_CIPHER_KEY_AES_128BIT,
u8Key,
aes_128_cbc_IV);
if (XMEDIA_SUCCESS != ret) {
ERR_CODE_CIPHER("Set config info failed.\n");
goto __CIPHER_EXIT__;
}
print_buffer("before decrypt:", aes_128_dst_buf, sizeof(aes_128_dst_buf));
ret = xmedia_cipher_decrypt(chnid, input_addr_phy, output_addr_phy, data_len);
if (XMEDIA_SUCCESS != ret) {
ERR_CODE_CIPHER("Cipher decrypt failed.\n");
ret = XMEDIA_FAILURE;
goto __CIPHER_EXIT__;
}
print_buffer("decrypted text:", output_addr_vir, data_len);
// compare
if (0 != memcmp(output_addr_vir, aes_128_src_buf, data_len)) {
ERR_CODE_CIPHER("Memcmp failed!\n");
ret = XMEDIA_FAILURE;
goto __CIPHER_EXIT__;
}
TEST_END_PASS();
__CIPHER_EXIT__:
if (input_addr_phy > 0) {
xmedia_mmz_unmap(input_addr_vir);
xmedia_mmz_free(input_addr_phy);
}
if (output_addr_phy > 0) {
xmedia_mmz_unmap(output_addr_vir);
xmedia_mmz_free(output_addr_phy);
}
xmedia_cipher_destroy_handle(chnid);
xmedia_cipher_exit();
return ret;
}
int sample_cipher_efuse(xmedia_void)
{
xmedia_s32 ret = XMEDIA_SUCCESS;
ret = sample_cipher_efuse_vir();
if (ret != XMEDIA_SUCCESS) {
return ret;
}
ret = sample_cipher_efuse_phy();
if (ret != XMEDIA_SUCCESS) {
return ret;
}
return ret;
}