求助:CH571单独使用硬件AES模块的初始化问题。

你好,目前已使用CH571量产了一个项目(未使用BLE蓝牙功能),已开发使用了除BLE以外的所有资源,性价比很高。

现希望将硬件AES替代当前的软AES,集成到自定义bootloader中,以期达成两个优化目标:

1、大量节省代码空间。

2、大幅缩短执行时间。

关于你们官方的推荐函数(函数库libCH57x_ROM.a),调用RF初始化部分函数RF_RoleInit(),代码量约35KB以上(软件AES仅16KB左右),无法达成第一个优化目标。

因此,希望技术支持(不限于)以下几种途径:

1、更新函数库libCH57x_ROM.a,在函数库增加一个AES模块专用的简洁函数;

2、单独开放AES模块的硬件应用资料;

3、指出现有函数库中能达成以上目标的函数;

同时,希望可以脱离BLE单独使用RF模块,实现代码空间和资源需求更为灵活的无线连接。

期待你们的回复,谢谢~

把role初始化换成  BLE_RegInit(); 其他的保持,就可以了。 LIB里面未参与编译的函数是不占用代码空间的


你好,已按照你的方式试验,未能正确加解密。

测试代码:

BLE_RegInit();
//加密秘钥16个字节也就是128?bit
uint8_t?key[16]={0X00,0X11,0X22,0X33,0X44,0X55,0X66,0X77,0X88,0X99,0XAA,0XBB,0XCC,0XDD,0XEE,0XFF};
//需要加密的数据(保证16个字节,不够的自己填充)
uint8_t?source_buf[16]={0X00,0X01,0X02,0X03,0X04,0X05,0X06,0X07,0X08,0X09,0X0A,0X0B,0X0C,0X0D,0X0E,0X0F};
//?加密后数据存放区
uint8_t?encrypted_buf[16];
//?解密后数据存放区
uint8_t?deccrypted_buf[16];
//?开始加密,加密后的数据存放到encrypted_buf,
LL_Encrypt(?key,?source_buf,?encrypted_buf?);
//?开始解密,将解密后的数据存到deccrypted_buf,ch579?11us
LL_Decrypt(?key,?encrypted_buf,?deccrypted_buf?);

加密测试结果,全为0:

1652921096144947.png

解密测试结果,全为0:

1652921096127663.png


在使用

BLE_RegInit();

函数初始化,依然连接了一些函数,共约占用了6~8KB空间(部分太长没有截图):

无标题5.png

同时还占用了不少的RAM空间,约2~3KB:

1652922201166298.png

1652922201178756.png


请问还有替代方法吗?谢谢~


你好,请问有什么进展吗?


BLE_LibInit  这个也要


你好,以下是开启(与否)相应函数后的编译结果:

1、原始项目使用软件AES,不调用函数库:

Memory region? ? ? ? ?Used Size? Region Size? %age Used

? ? ? ? ? ?FLASH:? ? ? ?20680 B? ? ? ? 60 KB? ? ?33.66%

? ? ? ? ? ? ?RAM:? ? ? ?10904 B? ? ? ? 17 KB? ? ?62.64%


2、单独调用BLE_LibInit()函数后:

Memory region? ? ? ? ?Used Size? Region Size? %age Used

? ? ? ? ? ?FLASH:? ? ? ?57380 B? ? ? ? 60 KB? ? ?93.39%

? ? ? ? ? ? ?RAM:? ? ? ?14116 B? ? ? ? 17 KB? ? ?81.09%


3、单独调用BLE_RegInit()函数后:

Memory region? ? ? ? ?Used Size? Region Size? %age Used

? ? ? ? ? ?FLASH:? ? ? ?26020 B? ? ? ? 60 KB? ? ?42.35%

? ? ? ? ? ? ?RAM:? ? ? ?11896 B? ? ? ? 17 KB? ? ?68.34%


4、同时调用BLE_LibInit()和BLE_RegInit()函数后:

Memory region? ? ? ? ?Used Size? Region Size? %age Used

? ? ? ? ? ?FLASH:? ? ? ?57384 B? ? ? ? 60 KB? ? ?93.40%

? ? ? ? ? ? ?RAM:? ? ? ?14116 B? ? ? ? 17 KB? ? ?81.09%


测试代码:

????BLE_LibInit(NULL);
????BLE_RegInit();
//????LLE_DevInit();
????//?加密秘钥?16个字节也就是128?bit
????uint8_t?key[16]?=?{0X00,0X11,0X22,0X33,0X44,0X55,0X66,0X77,0X88,0X99,0XAA,0XBB,0XCC,0XDD,0XEE,0XFF};
????//?需要加密的数据(保证16个字节,不够的自己填充)
????uint8_t?source_buf[16]?=?{0X00,0X01,0X02,0X03,0X04,0X05,0X06,0X07,0X08,0X09,0X0A,0X0B,0X0C,0X0D,0X0E,0X0F};
????//?加密后数据存放区
????uint8_t?encrypted_buf[16];
????//?解密后数据存放区
????uint8_t?deccrypted_buf[16];
????//?开始加密,加密后的数据存放到encrypted_buf,
????LL_Encrypt(?key,?source_buf,?encrypted_buf?);
????//?开始解密,将解密后的数据存到deccrypted_buf,ch579?11us
????LL_Decrypt(?key,?encrypted_buf,?deccrypted_buf?);

运行结果:

????????????加密和解密结果均为0。

不太清楚为啥这么多问号出现在这里,貌似都是空格造成的。


image.png

image.png

void RF_Init(void)
{
    uint8_t    state;
    rfConfig_t rfConfig;

    uint8_t key[16] = {0X00,0X11,0X22,0X33,0X44,0X55,0X66,0X77,0X88,0X99,0XAA,0XBB,0XCC,0XDD,0XEE,0XFF};
    //?需要加密的数据(保证16个字节,不够的自己填充)
    uint8_t source_buf[16]={0X00,0X01,0X02,0X03,0X04,0X05,0X06,0X07,0X08,0X09,0X0A,0X0B,0X0C,0X0D,0X0E,0X0F};
    uint8_t enc_buf[16];
    uint8_t en_buf[16];

    tmos_memset(&rfConfig, 0, sizeof(rfConfig_t));
    taskID = TMOS_ProcessEventRegister(RF_ProcessEvent);
    rfConfig.accessAddress = 0x71764129; // 禁止使用0x55555555以及0xAAAAAAAA ( 建议不超过24次位反转,且不超过连续的6个0或1 )
    rfConfig.CRCInit = 0x555555;
    rfConfig.Channel = 8;
    rfConfig.Frequency = 2480000;
    rfConfig.LLEMode = LLE_MODE_BASIC | LLE_MODE_EX_CHANNEL; // 使能 LLE_MODE_EX_CHANNEL 表示 选择 rfConfig.Frequency 作为通信频点
    rfConfig.rfStatusCB = RF_2G4StatusCallBack;
    rfConfig.RxMaxlen = 251;
    state = RF_Config(&rfConfig);


    LL_Encrypt(key,source_buf,enc_buf);
    PRINT(" LL_Encrypt:\n");
    for(state=0;state<16;state++)
    {
        PRINT(" %x  ", enc_buf[state]);
    }
    PRINT(" \n ");

    LL_Decrypt(key,enc_buf,en_buf);
    PRINT(" LL_Decrypt:\n");
    for(state=0;state<16;state++)
    {
        PRINT(" %x  ", en_buf[state]);
    }
    PRINT(" \n ");

    PRINT("rf 2.4g init: %x\n", state);
    { // RX mode
        state = RF_Rx(TX_DATA, 10, 0xFF, 0xFF);
        PRINT("RX mode.state = %x\n", state);
    }

    // { // TX mode
    //  tmos_set_event( taskID , SBP_RF_PERIODIC_EVT );
    // }
}

image.png


只有登录才能回复,可以选择微信账号登录