zoukankan      html  css  js  c++  java
  • RT600之OTFAD

    OTFAD(On the fly decryption)是针对QSPI flash的一个解密模块。板子上电后,OTFAD自动解密。
    OTFAD的加密使用SB命令完成,SB的操作请参见博客RT600之SB。
    OTFAD支持PUF跟OTP key两套解密操作。
    加密过程:
    OTFAD kek >加密得到加密的image,key>对OTFAD kek加密得到加密的OTFAD kek,加密的OTFAD kek存储到固定位置
    解密过程:
    key ==> 解密OTFAD kek ==> 解密image
    key使用PUF或者OTP key管理。

    BD file解析

    options {
    }
    sources {
    myQspiConfile = "Image/unsigned_0xc000.bin"; #需要加密的image,使用LED demo
    key_store = "Key_store/key_store_otfad.bin"; #如果使用PUF管理key,此处需要填入SB/OTFAD key对应的key store
    }
    keyblob(0){
    (
    start = 0x08001000, #加密起始地址
    end = 0x080013ff, #加密结束地址
    key = "000102030405060708090A0B0C0D0E0F",
    counter = "0123456789ABCDEF"
    )
    }
    keyblob(1){
    (
    start = 0x08001400,
    end = 0x080033ff,
    key = "000102030405060708090A0B0C0D0E0F",
    counter = "0123456789ABCDEF"
    )
    }
    keyblob(2){
    (
    start = 0x08005000,
    end = 0x080063ff,
    key = "000102030405060708090A0B0C0D0E0F",
    counter = "0123456789ABCDEF"
    )
    }
    keyblob(3){
    (
    start = 0x08007000,
    end = 0x080083ff,
    key = "000102030405060708090A0B0C0D0E0F",
    counter = "0123456789ABCDEF"
    )
    }
    section (0) {
    load 0xc0000003 > 0xC000;
    enable qspi 0xC000; #enable QSPI flash
    erase 0x8000000..0x8010000; #擦除QSPI flash
    load 0xf000000f > 0xd000;
    enable qspi 0xd000; #写入FCB
    load key_store > 0x08000800; #写入key store,使用master key的话不需要写入key store
    encrypt(0){
    load myQspiConfile > 0x08001000; #写入image,由于写入的区域是加密的,image会使用key blob0加密后存储到flash中
    }
    keywrap (0) {
    load {{0102030405060708090a0b0c0d0e0f00}} > 0x08000000; #使用key对key blob 0加密后写入QSPI offset 0x0
    }
    keywrap (1) {
    load {{0102030405060708090a0b0c0d0e0f00}} > 0x08000040;
    }
    keywrap (2) {
    load {{0102030405060708090a0b0c0d0e0f00}} > 0x08000080;
    }
    keywrap (3) {
    load {{0102030405060708090a0b0c0d0e0f00}} > 0x080000C0;
    }
    }

    OTFAD key使用PUF管理

    1. 生成key store
      blhost -p COM5 -- key-provisioning enroll
      blhost -p COM5 -- key-provisioning set_user_key 2 Key_store/otfadkek.bin OTFAD kek key store,用于解密加密的OTFAD blok
      blhost -p com5 -- key-provisioning set_user_key 3 Key_store/SBKEK.bin SB用于receive-sb
      blhost -p com5 -- key-provisioning set_user_key 11 Key_store/userkey.bin 如果image签名,用于计算HMAC
      blhost -p com5 -- key-provisioning read_key_store Key_store/key_store_otfad.bin
    2. 生成SB,SB里面包含了如何配置OTFAD区域,OTFAD kek的存储,参考如上的bd file详解
      elftosb.exe -d -V -k Key_storeSBKEK.txt -f rt6xx -c BD_file26_OTFAD_PUF_XIP_unsigned.bd -o encrypt.sb2
    3. 烧写shadow register
      jlink.write_register(0x40130180, 0x201) 开启PUF,设置QSPI启动
      jlink.write_register(0x401301AC, 0x1) enable OTFAD
    4. receive-sb后jlink reset,OTFAD解密成功后会boot

    OTFAD使用master key管理

    1. 生成加密的SB
      elftosb.exe -d -V -k key/SBKEK.txt -f rt6xx -c BD_file/32_Unsigned_XIP_MasteKey_OTP.bd -o encrypt.sb2
    2. 根据bd文件中的OTFAD kek,计算得到写入fuse中的OTFAD key,使用如下的算法
      OTFAD_KEK = AES256_ENCRYPT(MASTERKEY256, OTFAD_key[127:0] fuse )
      也就是 OTFAD_key[127:0] fuse = AES256_DECRYPT(MASTERKEY256, OTFAD_KEK)
    3. 将master key,OTFAD key写入shadow register,使能OTFAD,烧写boot device为QSPI
    4. receive-sb后reset,OTFAD成功后会boot
  • 相关阅读:
    金斗云提醒用法说明
    金斗云提醒软件的原理
    缓存雪崩问题,缓存击穿问题,缓存一致性问题(内存+数据库)
    Spring的ApplicationEvent实现
    区块链技术--区块链的生成和链接
    区块链技术--比特币交易的锁定和解锁
    区块链技术--密码学
    区块链技术--比特币
    jedis中scan的实现
    KafkaManager对offset的两种管理方式
  • 原文地址:https://www.cnblogs.com/richard-xiong/p/9924649.html
Copyright © 2011-2022 走看看