BLE--CC2541的入门之加密OAD

Posted:   2020-04-09

Status:   Completed

Tags :   BLE CC2541 ble OAD 加密

Categories :   CC2541 BLE

Previous:   BLE--CC2541的入门之OAD

Next:   BLE--CC2541的入门之绑定与配对


OAD带加密

  • 只用OAD的话任何人都可以对你的设备进行升级操作,这样会导致一些不必要的损坏
  • 使用加密的OAD,这样只有经过加密且秘钥准确的镜像文件可以升级

环境要求

硬件

  • CCDebuger
  • CC2541开发板
  • USB Dongle

软件

配置加密OAD

下载BEM

工程路径

  • 协议栈Projects\ble\util\BEM
  • 更改加密秘钥 key
  • bem_main.c文件里把aesKey的内容更改为自己的
    1
    2
    3
    4
    
    static const uint8 aesKey[KEY_BLENGTH] = {
    // This dummy key must be replaced by a randomly generated key that is kept secret.
    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
    };
    
  • 编译工程生成BEM_CC254XF256.hex

下载方法

  • 用软件SmartRF Flash Programmer通过CC Debugger把BEM_CC254XF256.hex下载到芯片
  • 选择Erase,program and verify

配置加密引导ImageA

新建配置

Project->Edit Configurations->New

  • Based on connfiguration选择my-OAD-A config-encypted-boot

修改配置

修改compiler

修改C/C++ Compiler配置的Preprocessor选项 在Defind symbols中添加

1
FEATURE_OAD_SECURE

compiler-encypted-A

修改Linker

  • 修改config选项卡,在Linker configuration file的填入
    1
    
    $PROJ_DIR$\..\..\common\CC2540\cc254x_f256_imgAe.xcl
    

    linker-A

编译并下载image

编译

  • 这时应该出现一个警告,很重要,点击警告,去到警告位置,警告意思是:当前是否是加密引导镜像程序 warning warning1
  • 查看BOOTP_E_IMAGE_A宏定义,根据注释可知,如果当前不是引导程序注释掉#define BOOTP_E_IMAGE_A define_boot_E

下载

  • 和OAD下载imageA类似,在下载BEM后,跟着下载引导ImageA,选择Append and verify

读出片内程序

  • 和OAD做法一样

验证

  • 使用BLE Device Monitor查看,可以看到现在运行镜像是A
  • 如果此时你用OAD下载原来的.bin文件,会发现下载完成后,镜像仍然是A
  • 加密完成后,其他镜像不能加载,只加载加密后的镜像 encrypted-OAD-A

配置ImageA

Project->Edit Configurations->New

  • Based on connfiguration选择Encrypted-Boot-ImageA encrypted-A

修改配置

注释掉BOOTP_E_IMAGE_A

  • 打开oad_target.c,注释掉做引导Image时的那个警告 comment-boot-E

编译

  • 编译完成,无警告

配置ImageB

Project->Edit Configurations->New

  • Based on connfiguration选择Encrypted-ImageA encrypted-B

修改配置

修改compiler

修改C/C++ Compiler配置的Preprocessor选项

  • Defind symbols中把HAL_IMAGE_A修改为HAL_IMAGE_B compiler-B

修改Linker

  • 修改config选项卡,修改Linker configuration file内容把$PROJ_DIR$\..\..\common\CC2540\cc254x_f256_imgAe.xcl改为
    1
    
    $PROJ_DIR$\..\..\common\CC2540\cc254x_f256_imgBe.xcl
    

    linker-B

编译

  • 编译完成,无警告

升级文件的加密

EBL工程

工程路径

  • 协议栈Projects\ble\util\EBL

修改配置

修改compiler

修改C/C++ Compiler配置的Preprocessor选项

  • Defind symbols中添加
    1
    2
    
    SBL_SIGNER
    SBL_SECURE=FALSE
    

    EBL-symbols

修改加密秘钥

  • sbl_exec.c文件中把把aesKey的内容更改为和BEM工程的一致
    1
    2
    3
    4
    5
    6
    7
    8
    
    static const uint8 aesKey[KEY_BLENGTH] = {
    #if defined AES_TEST_VECS
    0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF
    #else
    // This dummy key must be replaced by a randomly generated key that is kept secret.
    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
    #endif
    };
    

    EBL-key

下载工程

  • 需要另一块开发板,
  • 如只有一块开发板,当加密镜像完成后,OAD下载镜像前需要把开发板重新下载BEM和引导镜像程序,直接把上边读出来的文件下进去就行了
  • 编译工程生成EBL_CC254x_UART0_ALT1.hex
  • 用软件SmartRF Flash Programmer通过CC Debugger把EBL_CC254x_UART0_ALT1.hex下载到芯片
  • 选择Erase,program and verify

加密镜像

加密ImageB

  • 打开SerialBootTool,端口选择开发板串口 serial-port
  • 选择Image-B文件加密,Projects\ble\SimpleBLEPeripheral\CC2541DB\Encrypted-ImageB\Exe文件夹内的SimpleBLEPeripheral.bin
  • 点击Load Image,载入镜像 serialboottool
  • load完成后,点击Encrypt Image,保存成加密后的bin文件

下载ImageB

  • 使用BLE Device Monitor下载
  • 下载完成后可以看到,下载成功 encrypted-OAD-B

加密ImageA

  • 和B一样,文件为Projects\ble\SimpleBLEPeripheral\CC2541DB\Encrypted-ImageA\Exe文件夹内的SimpleBLEPeripheral.bin

加密管理

  • 以后每次升级前都要使用EBL加密一次,加密后的文件才能进行OAD升级,由于EBL内含有秘钥,EBL加密程序建议单独使用一个开发板,并做好管理和备注