You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
4.7 KiB
120 lines
4.7 KiB
#pragma once
|
|
#include "string.h"
|
|
|
|
/*
|
|
V1.2:
|
|
|
|
更新:
|
|
修正配置密钥长度为4字节、8字节时,取用户自定义 ID越界导致运算的密钥结果不正确的问题。
|
|
MINI-Pro脱机下载器 V1.20B 版本固件后使用V1.2版本代码;
|
|
MINI脱机下载器 V1.4A2 版本固件后使用V1.2版本代码;
|
|
|
|
影响:
|
|
前提条件:
|
|
(1).MINI版脱机下载器在升级了固件到V1.4A2后,使得MINI脱机下载器内置的是V1.2版本代码;
|
|
(2).MINI-Pro版脱机下载器在升级了固件到V1.20B后,使得MINI脱机下载器内置的是V1.2版本代码;
|
|
(3).密钥长度配置为4字节、8字节的情况;
|
|
导致现象:
|
|
(1).由于修正了算法里密钥长度为 4/8字节时的运算逻辑,会导致运算出的密钥结果(仅密钥长度为4/8字节受影响)
|
|
与V1.1版本前的代码运算结果不同!
|
|
解决办法:
|
|
(1).MINI-Pro版脱机下载器已经升级到V1.20B版本固件的用户可以回退到旧版本固件继续使用。
|
|
(2).MINI版脱机下载器已经升级到V1.4A2版本固件的用户可以回退到旧版本固件继续使用。
|
|
不受影响的情况:
|
|
(1).只要密钥长度为12字节均不受影响;
|
|
V1.1:
|
|
|
|
更新:
|
|
MINI版脱机下载器V1,3A5版固件使用V1.1版本代码,V1.1版本代码修复了V1.0版本
|
|
调用UID_Encryption_Key_Check(),UID_Encryption_Key_Calculate()使用大端
|
|
模式有可能出现的内存越界问题。
|
|
影响:
|
|
前提条件:
|
|
(1).在升级了MINI版脱机下载器的固件到V1.3A5后,使得MINI脱机下载器内置的是V1.1版本代码;
|
|
(2).此前 使用V1.3A4及之前版本固件的MINI脱机下载器 配置为大端模式,且用户程序使用的是最初的V1.0版本代码;
|
|
导致现象:
|
|
(1).后续使用V1.3A5版本固件的MINI脱机下载器,开启了UID自定义加密功能,然后继续烧录包含了V1.0版本代码的用户程序,
|
|
由于V1.1版本计算的大端模式密钥与V1.0版本计算的密钥不一致,因此会导致芯片中会出现会造成密钥验证不通过的问题!
|
|
解决办法:
|
|
(1).将用户程序中的V1.0版代码同步更新到V1.1版代码。
|
|
不受影响的情况:
|
|
(1).此前使用 小端模式 配置的用户产品不会受到V1.1版本代码更新以及MINI脱机下载器固件更新的影响;
|
|
(2).如果已经使用V1.0代码的产品后续使用IAP方式升级则不会受到影响;
|
|
(3).如果已经使用V1.0代码的产品后续使用MINI脱机下载器升级产品 且 不开启UID自定义加密功能重新更新密钥不会受到影响,
|
|
但是如果使用脱机下载器升级产品的话,建议更新用户代码的了的UID自定义加密代码为V1.1,同时开启UID自定义加密重新更新密钥;
|
|
(4)MINI-Pro版脱机下载器首版固件中使用的是V1.1版本的代码,不受影响;
|
|
V1.0:
|
|
MINI版脱机下载器V1.3A4版固件及之前的固件中均使用了V1.0版本的代码;
|
|
*/
|
|
|
|
typedef enum
|
|
{
|
|
LENGTH_4 = 4,
|
|
LENGTH_8 = 8,
|
|
LENGTH_12 = 12
|
|
|
|
}eKeyLengthType;
|
|
|
|
typedef enum
|
|
{
|
|
LITTLE_ENDIA = 0,
|
|
BIG_ENDIA
|
|
|
|
}eEndiaType;
|
|
|
|
|
|
typedef enum
|
|
{
|
|
ALGORITHM_0 = 0,
|
|
ALGORITHM_1,
|
|
ALGORITHM_2,
|
|
ALGORITHM_3,
|
|
ALGORITHM_4
|
|
|
|
}eAlgorithmType;
|
|
|
|
|
|
/****************** 调用以下函数完成密钥验证 ******************/
|
|
/*
|
|
输入:
|
|
pKey, 指向密钥的存储区域的指针,密钥的起始存储地址
|
|
pUID, 指向UID的存储区域的指针, UID的起始存储地址
|
|
pCustomID, 指向用户设定的自定义ID存储区域的指针
|
|
keyLength, 密钥的字节长度,可选项参考枚举类型 eKeyLengthType的定义
|
|
endiaType, 大小端序选择,可选项参考枚举类型 eEndiaType的定义
|
|
AlgorithmNum,计算UID加密密钥的算法选择,可选项参考枚举类型 eAlgorithmType的定义
|
|
输出:
|
|
无
|
|
返回:
|
|
返回密钥验证的结果:
|
|
0,正确
|
|
1,错误
|
|
*/
|
|
char UID_Encryption_Key_Check(void *pKey, //[IN]
|
|
void *pUID, //[IN]
|
|
void *pCustomID, //[IN]
|
|
eKeyLengthType keyLength, //[IN]
|
|
eEndiaType endiaType, //[IN]
|
|
eAlgorithmType AlgorithmNum); //[IN]
|
|
/****************** 调用以下函数完成密钥计算 ******************/
|
|
/*
|
|
输入:
|
|
pUID, 指向UID的存储区域的指针用户应该预先分配好, UID的起始存储地址
|
|
pCustomID, 指向用户设定的自定义ID存储区域的指针
|
|
keyLength, 密钥的字节长度,可选项参考枚举类型 eKeyLengthType的定义
|
|
endiaType, 大小端序选择,可选项参考枚举类型 eEndiaType的定义
|
|
AlgorithmNum,计算UID加密密钥的算法选择,可选项参考枚举类型 eAlgorithmType的定义
|
|
输出:
|
|
pKey, 指向一块内存区域,用于存放计算出的密钥
|
|
返回:
|
|
返回密钥验证的结果:
|
|
0,正确
|
|
1,错误
|
|
*/
|
|
void UID_Encryption_Key_Calculate(void *pKey, //[OUT]
|
|
void *pUID, //[IN]
|
|
void *pCustomID, //[IN]
|
|
eKeyLengthType keyLength, //[IN]
|
|
eEndiaType endiaType, //[IN]
|
|
eAlgorithmType AlgorithmNum);//[IN]
|
|
|