key_program

This commit is contained in:
Steven Dan
2026-03-30 17:54:29 +08:00
parent a4bd3cfc69
commit f548845a29
2 changed files with 195 additions and 177 deletions

View File

@@ -4,6 +4,7 @@
#include <quadflashlib.h>
#include <xcore/chanend.h>
#include <xcore/channel.h>
#include "hmac.h"
#include "xua_conf.h"
#define WRITE_ENABLE_COMMAND (0x06)
@@ -31,7 +32,7 @@
#define PRSCUR_COMMAND (0x42)
#define ERSCUR_COMMAND (0x44)
#define RDSCUR_COMMAND (0x48)
#define HMAC_LEN 60
#define KEY_BLOCK_LEN 100
#define HMAC_GEN_LEN 20
@@ -40,19 +41,17 @@ extern unsigned short XUA_Endpoint0_getVendorId();
unsigned char hid_reply[64] = {0};
#if 0
void printArrayHex1(uint8_t array[], int size, int elementsPerLine) {
for (int i = 0; i < size; i++) {
printf("0x%x, ", array[i]);
debug_printf("0x%x ", array[i]);
// 在达到每行元素个数时换行
if ((i + 1) % elementsPerLine == 0) {
printf("\n");
debug_printf("\n");
}
}
printf("\n");
debug_printf("\n");
}
#endif
#define settw(a,b) {__asm__ __volatile__("settw res[%0], %1": : "r" (a) , "r" (b));}
#define setc(a,b) {__asm__ __volatile__("setc res[%0], %1": : "r" (a) , "r" (b));}
@@ -79,7 +78,7 @@ typedef struct {
clock qspiClkblk;
} fl_QSPIPorts;
*/
fl_QSPIPorts p_opt_qflash_tile0 =
fl_QSPIPorts p_opt_tile0 =
{
XS1_PORT_1B,
XS1_PORT_1C,
@@ -87,7 +86,7 @@ fl_QSPIPorts p_opt_qflash_tile0 =
XS1_CLKBLK_3
};
fl_QSPIPorts p_opt_qflash_tile1 =
fl_QSPIPorts p_opt_tile1 =
{
XS1_PORT_1F,
XS1_PORT_1G,
@@ -125,10 +124,12 @@ int flash_opt_enable_ports(fl_QSPIPorts *p_qflash)
if (!result)
{
/* All okay.. */
debug_printf("flash_opt_enable_ports success\n");
return 1;
}
else
{
debug_printf("flash_opt_enable_ports failed\n");
return 0;
}
}
@@ -143,15 +144,6 @@ void flash_cmd_opt(unsigned int cmd,
unsigned char input[], unsigned int num_in,
unsigned char output[], unsigned int num_out)
{
debug_printf("flash_cmd_opt: cmd = %02x, num_in = %d, num_out = %d\n", cmd, num_in, num_out);
for (size_t i = 0; i < num_in; i++)
{
debug_printf("input[%d] = %02x\n", i, input[i]);
}
for (size_t i = 0; i < num_out; i++)
{
debug_printf("output[%d] = %02x\n", i, output[i]);
}
fl_command(cmd,input,num_in,output, num_out);
}
@@ -182,7 +174,7 @@ void flash_opt_unlock(void)
uint8_t did[3];
/* Reason: 使用 tile0 端口连接 Flash保持原有逻辑 */
if (flash_opt_enable_ports(&p_opt_qflash_tile0) == 0) {
if (flash_opt_enable_ports(&p_opt_tile0) == 0) {
debug_printf("flash_opt_unlock failed\n");
return;
}
@@ -293,8 +285,6 @@ unsigned compare_buff_diff(const uint8_t* actual, const uint8_t* expected, unsig
}
extern void hmac_sha1(const unsigned char *, unsigned long, const unsigned char * , unsigned long, unsigned char * );
void cal_hmac(uint8_t uid[], uint8_t did[], uint8_t hmac_bin[])
{
{
@@ -317,49 +307,64 @@ void cal_hmac(uint8_t uid[], uint8_t did[], uint8_t hmac_bin[])
hmac_sha1(key_bin, HMAC_GEN_LEN, msg_bin, HMAC_GEN_LEN, hmac_bin);
#if 0
printf("hmac_bin: \n");
printArrayHex1(hmac_bin, HMAC_LEN, 20);
#endif
}
}
uint8_t key_verify_old(unsigned sec_write, uint8_t expected_bin[], unsigned offset)
uint8_t opt_key_read(uint8_t key[], unsigned offset)
{
uint8_t read_bin[HMAC_LEN + 1];
uint8_t comp_bin[HMAC_LEN + 1];
uint8_t read_bin[KEY_BLOCK_LEN + 1];
uint8_t ret = 0;
if (flash_opt_enable_ports(&p_opt_tile0) == 0)
{
return 0;
}
flash_opt_read(read_bin, KEY_BLOCK_LEN + 1);
for (int i = 0; i < 20; i++)
{
key[i] = read_bin[i + offset * 20 + 1];
}
flash_opt_disable_ports();
return 1;
}
uint8_t key_verify_program(unsigned verify_write, uint8_t expected_bin[], unsigned offset)
{
uint8_t read_bin[KEY_BLOCK_LEN + 1];
uint8_t comp_bin[KEY_BLOCK_LEN + 1];
uint8_t uid[20];
uint8_t did[4];
uint8_t ret = 0;
uint8_t hmac_bin[20];
flash_opt_read(read_bin, HMAC_LEN + 1);
flash_opt_read(read_bin, KEY_BLOCK_LEN + 1);
flash_opt_read_uid(uid, 20);
flash_opt_read_did(did, 3);
cal_hmac(uid, did, hmac_bin);
if (sec_write)
if (verify_write)
{
if (offset == 0)
if (offset == 1)
{
for (int i = 0; i < 20; i++)
cal_hmac(uid, did, hmac_bin);
if (compare_buff_diff(hmac_bin, expected_bin, 20) == 0)
{
read_bin[i + 1] = expected_bin[i];
}
}
else if (offset == 1)
{
for (int i = 0; i < 20; i++)
{
read_bin[i + 21] = expected_bin[i];
return 0;
}
}
flash_opt_write2(&read_bin[1], HMAC_LEN);
for (int i = 0; i < 20; i++)
{
read_bin[i + offset * 20 + 1] = expected_bin[i];
}
flash_opt_write2(&read_bin[1], KEY_BLOCK_LEN);
delay_milliseconds(10);
flash_opt_read(comp_bin, HMAC_LEN + 1);
if (compare_buff_diff(&comp_bin[1], &read_bin[1], HMAC_LEN) == 1)
flash_opt_read(comp_bin, KEY_BLOCK_LEN + 1);
if (compare_buff_diff(&comp_bin[1], &read_bin[1], KEY_BLOCK_LEN) == 1)
{
debug_printf("compare OK\n");
ret = 1;
@@ -367,50 +372,18 @@ uint8_t key_verify_old(unsigned sec_write, uint8_t expected_bin[], unsigned offs
}
else
{
if (offset == 0)
flash_opt_read(read_bin, KEY_BLOCK_LEN + 1);
if (compare_buff_diff(expected_bin, &read_bin[offset * 20 + 1], 20) == 1)
{
flash_opt_read(read_bin, HMAC_LEN + 1);
if (compare_buff_diff(hmac_bin, &read_bin[1], 20) == 1)
{
debug_printf("key_verified\n");
ret = 1;
}
}
else if (offset == 1)
{
flash_opt_read(read_bin, HMAC_LEN + 1);
if (compare_buff_diff(hmac_bin, &read_bin[21], 20) == 1)
{
debug_printf("key_verified\n");
ret = 1;
}
debug_printf("key_verified\n");
ret = 1;
}
}
return ret;
}
void flash_read_uid(uint8_t *uid)
{
if (flash_opt_enable_ports(&p_opt_qflash_tile0) == 0)
{
return;
}
flash_opt_read_uid(uid, 20);
flash_opt_disable_ports();
}
void flash_read_did(uint8_t *did)
{
if (flash_opt_enable_ports(&p_opt_qflash_tile0) == 0)
{
return;
}
flash_opt_read_did(did, 3);
flash_opt_disable_ports();
}
void get_key_ret(uint8_t *buffer)
{
//printf("get_key_ret2\n");
@@ -423,35 +396,6 @@ void get_key_ret(uint8_t *buffer)
//printArrayHex1(buffer, 20, 20);
}
unsigned char g_hid_pass_data[64];
extern void hidSetChangePending(unsigned int);
void user_read_hidpass(unsigned char * hidPassData)
{
int i = 0;
for (i = 0; i < 64; i++)
{
hidPassData[i] = g_hid_pass_data[i];
debug_printf("hidPassData[%d] = %02x\n", i, hidPassData[i]);
g_hid_pass_data[i] = 0;
}
}
void user_set_hidpass(unsigned char *data)
{
#if HID_CONTROLS
for (int i = 0; i < 63; i++)
{
g_hid_pass_data[i] = data[i];
debug_printf("g_hid_pass_data[%d] = %02x\n", i, g_hid_pass_data[i]);
}
hidSetChangePending(0x1);
#endif
}
static chanend_t g_flash_opt_c;
void flash_opt_set_chan(chanend_t c) {
@@ -466,72 +410,49 @@ void flash_opt_exchange_buffer(uint8_t in[64], uint8_t out[64]) {
chan_in_buf_byte(g_flash_opt_c, out, 40);
}
void flash_opt_key(chanend_t c) {
uint8_t buffer[64], reply[40] = {0, 0, 0, 0};
uint32_t ret;
delay_milliseconds(2);
while (1) {
chan_in_buf_byte(c, buffer, 40);
if (flash_opt_enable_ports(&p_opt_qflash_tile1) == 0) {
reply[0] = 0;
}
else
{
switch (buffer[3])
{
case 9:
flash_opt_read_did(&reply[1], 3);
reply[0] = 0x55;
break;
case 10:
flash_opt_read_uid(&reply[1], 21);
reply[0] = 0x55;
break;
case 8:
ret = key_verify_old(1, &buffer[4], 0);
if (ret == 1)
{
debug_printf("write key ret 0x55\n");
reply[0] = 0x55;
}
else
{
reply[0] = 0;
}
break;
}
flash_opt_disable_ports();
chan_out_buf_byte(c, reply, 40) ;
}
}
}
uint8_t key_validate(void)
uint8_t key_validate(uint8_t offset)
{
uint8_t ret = 0;
uint8_t data[1] = {0};
if (flash_opt_enable_ports(&p_opt_qflash_tile0) == 0)
uint8_t read_bin[KEY_BLOCK_LEN + 1];
uint8_t uid[20];
uint8_t did[4];
uint8_t hmac_bin[20];
if (flash_opt_enable_ports(&p_opt_tile0) == 0)
{
return 0;
}
ret = key_verify_old(0, data, 0);
if (ret == 1)
flash_opt_read(read_bin, KEY_BLOCK_LEN + 1);
flash_opt_read_uid(uid, 20);
flash_opt_read_did(did, 3);
cal_hmac(uid, did, hmac_bin);
if (compare_buff_diff(hmac_bin, &read_bin[offset * 20 + 1], 20) == 1)
{
SetKeyFlag(0x20241224);
debug_printf("key_verified\n");
ret = 1;
}
ret = key_verify_old(0, data, 1);
if (ret == 1)
{
SetKeyFlag(0x20241224);
}
flash_opt_disable_ports();
return ret;
}
void read_uid_did(uint8_t uid[])
{
if (flash_opt_enable_ports(&p_opt_tile0) == 0)
{
return;
}
flash_opt_read_uid(uid, 20);
flash_opt_read_did(uid, 3);
flash_opt_disable_ports();
}
void program_key(uint8_t *buffer, int datalength)
{
if (buffer[0] == 0x77 && buffer[1] == 0x5B)
@@ -541,14 +462,13 @@ void program_key(uint8_t *buffer, int datalength)
{
case 1:
debug_printf("verify key\n");
if (flash_opt_enable_ports(&p_opt_qflash_tile0) == 0)
if (flash_opt_enable_ports(&p_opt_tile0) == 0)
{
hid_reply[0] = 0;
}
else
{
uint8_t data[1] = {0};
ret = key_verify_old(0, data, 0);
ret = key_verify_program(0, &buffer[3], 1);
if (ret == 1)
{
hid_reply[0] = 0x55;
@@ -562,13 +482,13 @@ void program_key(uint8_t *buffer, int datalength)
break;
case 2:
debug_printf("write key\n");
if (flash_opt_enable_ports(&p_opt_qflash_tile0) == 0)
if (flash_opt_enable_ports(&p_opt_tile0) == 0)
{
hid_reply[0] = 0;
}
else
{
ret = key_verify_old(1, &buffer[3], 0);
ret = key_verify_program(1, &buffer[3], 1);
debug_printf("write key ret %d\n", ret);
if (ret == 1)
@@ -584,7 +504,7 @@ void program_key(uint8_t *buffer, int datalength)
break;
case 3:
if (flash_opt_enable_ports(&p_opt_qflash_tile0) == 0)
if (flash_opt_enable_ports(&p_opt_tile0) == 0)
{
hid_reply[0] = 0;
}
@@ -597,7 +517,7 @@ void program_key(uint8_t *buffer, int datalength)
}
break;
case 4:
if (flash_opt_enable_ports(&p_opt_qflash_tile0) == 0)
if (flash_opt_enable_ports(&p_opt_tile0) == 0)
{
hid_reply[0] = 0;
}
@@ -610,7 +530,7 @@ void program_key(uint8_t *buffer, int datalength)
}
break;
case 5:
if (flash_opt_enable_ports(&p_opt_qflash_tile0) == 0)
if (flash_opt_enable_ports(&p_opt_tile0) == 0)
{
hid_reply[0] = 0;
}
@@ -623,6 +543,7 @@ void program_key(uint8_t *buffer, int datalength)
}
break;
case 6:
#if XUA_USB_EN == 1
debug_printf("get pid vid\n");
unsigned short pid = XUA_Endpoint0_getProductId();
unsigned short vid = XUA_Endpoint0_getVendorId();
@@ -631,22 +552,118 @@ void program_key(uint8_t *buffer, int datalength)
hid_reply[4] = (vid >> 8) & 0xff;
hid_reply[3] = vid & 0xff;
hid_reply[0] = 0x55;
#endif
break;
case 7:
debug_printf("write aizip key\n");
if (flash_opt_enable_ports(&p_opt_tile0) == 0)
{
hid_reply[0] = 0;
}
else
{
uint8_t ret = key_verify_program(1, &buffer[3], 0);
debug_printf("write key ret %d\n", ret);
if (ret == 1)
{
hid_reply[0] = 0x55;
}
else
{
hid_reply[0] = 0;
}
flash_opt_disable_ports();
}
break;
case 12:
debug_printf("verify aizip key\n");
if (flash_opt_enable_ports(&p_opt_tile0) == 0)
{
hid_reply[0] = 0;
}
else
{
ret = key_verify_program(0, &buffer[3], 0);
if (ret == 1)
{
hid_reply[0] = 0x55;
}
else
{
hid_reply[0] = 0;
}
flash_opt_disable_ports();
}
break;
case 13:
case 15:
case 17:
case 19:
case 21:
case 23:
case 25:
case 27:
case 29:
case 31:
case 33:
debug_printf("write key offset %d\n", ((buffer[2] - 13) / 2) + 2);
if (flash_opt_enable_ports(&p_opt_tile0) == 0)
{
hid_reply[0] = 0;
}
else
{
uint8_t ret = key_verify_program(1, &buffer[3], ((buffer[2] - 13) / 2) + 2);
debug_printf("write key ret %d\n", ret);
if (ret == 1)
{
hid_reply[0] = 0x55;
}
else
{
hid_reply[0] = 0;
}
flash_opt_disable_ports();
}
break;
case 14:
case 16:
case 18:
case 20:
case 22:
case 24:
case 26:
case 28:
case 30:
case 32:
case 34:
debug_printf("verify key offset %d\n", ((buffer[2] - 14) / 2) + 2);
if (flash_opt_enable_ports(&p_opt_tile0) == 0)
{
hid_reply[0] = 0;
}
else
{
ret = key_verify_program(0, &buffer[3], ((buffer[2] - 14) / 2) + 2);
if (ret == 1)
{
hid_reply[0] = 0x55;
}
else
{
hid_reply[0] = 0;
}
flash_opt_disable_ports();
}
break;
case 8:
case 9:
case 10:
//flash_opt_exchange_buffer(buffer, hid_reply);
// debug_printf("write aizip key tile 0 %02x\n", hid_reply[0]);
for (int i = 0; i < datalength; i++)
hid_reply[i] = 0;
case 11:
break;
}
}
else
{
//xmos_printf(&buffer[1], datalength - 1);
}
}