W801_SDK_dev_env/demo/wm_avoid_copy_demo.c
2023-03-08 08:23:45 +01:00

79 lines
2.0 KiB
C

#include <string.h>
#include <assert.h>
#include "wm_include.h"
#include "wm_internal_flash.h"
#include "wm_crypto_hard.h"
#include "wm_demo.h"
#if DEMO_AVOID_COPY
extern void dumpBuffer(char *name, char* buffer, int len);
extern int config_flash_decrypt_param(uint32_t code_decrypt, uint32_t dbus_decrypt, uint32_t data_decrypt);
int avoid_copy_secret_firm(u32 addr)
{
int ret = 0;
char *buf = tls_mem_alloc(128);
u8 uuid[18];
if (buf == NULL)
{
return -1;
}
tls_fls_read_unique_id(uuid);
dumpBuffer("uuid", (char *)uuid, 18);
config_flash_decrypt_param(1, 1, 1);
tls_fls_read(addr, (u8 *)buf, 32);
dumpBuffer("decrypted data", buf, 32);
if(memcmp(uuid, buf, 9) || memcmp(&uuid[9], &buf[16], 9))
{
ret = -1;
}
tls_mem_free(buf);
return ret;
}
int avoid_copy_open_firm(u32 addr)
{
const u8 aesKey[] = {0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66};
psCipherContext_t ctx;
int ret = 0;
char *buf = tls_mem_alloc(128);
u8 uuid[18];
if (buf == NULL)
{
return -1;
}
tls_fls_read_unique_id(uuid);
dumpBuffer("uuid", (char *)uuid, 18);
tls_fls_read(addr, (u8 *)buf, 32);
tls_crypto_aes_init(&ctx, NULL, aesKey, 16, CRYPTO_MODE_ECB);
tls_crypto_aes_encrypt_decrypt(&ctx, (unsigned char *)buf, (unsigned char *)buf, 32, CRYPTO_WAY_DECRYPT);
dumpBuffer("decrypted data", buf, 32);
if(memcmp(uuid, buf, 9) || memcmp(&uuid[9], &buf[16], 9))
{
ret = -1;
}
tls_mem_free(buf);
return ret;
}
int avoid_copy_entry(void)
{
int type = 0;
FLASH_ENCRYPT_CTRL_Type encrypt_ctrl;
encrypt_ctrl.w = M32(HR_FLASH_ENCRYPT_CTRL);
type = encrypt_ctrl.b.code_decrypt;
if((type == 1 && avoid_copy_secret_firm(0x800F000)) || (type == 0 && avoid_copy_open_firm(0x800F000)))
{
printf("avoid copy %s firm start fail!\n", type == 1 ? "secret" : "open");
assert(0);
}
if (type == 1) /*restore for secret*/
M32(HR_FLASH_ENCRYPT_CTRL) = encrypt_ctrl.w;
printf("avoid copy %s firm start success!\n", type == 1 ? "secret" : "open");
return 0;
}
#endif