This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC3220:有关 OTA 证书的问题

Guru**** 2577335 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/733524/cc3220-question-about-ota-certificate

器件型号:CC3220

您好!

我正在尝试用我自己的 ECDSA prime256v1证书替换 dummy_ota_vendor_cert.der。

我希望 OTA 证书在文件系统上进行安全签名。  但是、我从  SL_NetUtilCmd (SL_NETUTIL_crype_cmd_install_op...()命令收到错误代码 SL_ERROR_NETUTIL_crypto_crypto_ine_param (-12291)。

当我删除安全和重新编程的标志时、它会成功工作。

当我设置安全、无签名和重新编程时、它会成功工作。

当我设置安全、有符号和公共读取标志并重新编程时、我再次得到错误。

我正在使用我用于所有其他已签名文件的相同密钥对 OTA 证书进行签名、没有问题。

这是否是与 sl_NetUtilCmd ()函数验证指定的 OTA 证书文件不能签名的限制?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Ironman、

    假定相应的公共证书已加载到文件系统中、则 NWP 在读取文件时不应出现签名问题。 这听起来可能是一个需要调查的错误。

    顺便说一下、您希望对公共证书进行加密是否有某种原因? 根据定义、这不应是需要保护的东西。

    此致、
    Michael
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Ironman、

    为了确保我正确复制测试用例、您能否发布用于测试证书安装的代码? 正如我在上一篇文章中提到的、使用安全+签名的证书文件应该可以正常工作、因此能够在我的结尾复制您的问题对于调试非常有帮助。

    谢谢、
    Michael
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Michael、

    根据我之前的问题 https://e2e.ti.com/support/wireless-connectivity/wifi/f/968/t/732325中的理解 ,使用 OTA 证书验证 ota.cmd 文件不会验证返回根证书存储的信任链。  因此、我希望在初始编程时在文件系统上签署 OTA 证书、以确保其完整性。

    当我使用以下命令加载文件而不带"secure"标志或带有"secure、nosignaturet"标志时、下载的 OTA 验证成功。

    C:\ti\uniflash_4.2.2\simplelink\Gen2\bin\SLImageCreator.exe 工程 add_file --fs_path "dummy_ota_vendor_cert.der"--name UniFlash-CC3220SF --file "dummy_ota_vendor_cert.der"--project_path projects --flags nofailure 

    C:\ti\uniflash_4.2.2\simplelink\Gen2\bin\SLImageCreator.exe 工程 add_file --fs_path "dummy_ota_vendor_cert.der"--name UniFlash-CC3220SF --file "dummy_ota_vendor_cert.der"--project_path projects --flags secure、nofailsafe、nosignaturetest

    当我使用以下命令加载文件时、在验证 ota.cmd 文件期间收到-12291错误。

    C:\ti\uniflash_4.2.2\simplelink\Gen2\bin\SLImageCreator.exe 工程 add_file --fs_path "dummy_ota_vendor_cert.der"--name UniFlash-CC3220SF --file "dummy_ota_vendor_cert.der"--project_path projects --flags secure、nofailsafe --priv" dummy-trusted-cert 项--cert "dummy"--cert "dummy-trusted-trusted-trusted" 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Ironman、

    我是否可以拥有您在用于安装证书的 CC3220上运行的 API 调用? 拥有该代码将使我能够验证您在 CC3220上安装证书的方式是否有任何变化。

    此致、
    Michael
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Michael、

    这里是我用于安装证书和验证的代码。  它来自 OTA 示例工程中的 OtaArchive.c 文件。

    int16_t verifySignature (char * psig、uint32_t SigFileSize、uint8_t * pDigest)
    {
    SlNetUtilCryptoPubKeyInfo_t *pInfoKey;
    SlNetUtilCryptoCmdKeyMgnt_t keyAttrib;
    SlNetUtilCryptoCmdlVerifyAttrib_t verAttrib;
    uint16_t resultLen = 0;
    uint8_t buf[sl_NETUTIL_CMD_buffer_size];
    uint8_t *姓名;
    uint8_t *验证 Buf;
    内部16_t 状态;
    内部32_t 验证结果;
    
    /*为签名验证过程分配缓冲区*/
    verifyBuf =(uint8_t *) malloc (SHA256_Digest + SigFileSize);
    if (verifyBuf =空)
    {
    /*分配失败,返回错误。 *
    返回-1;
    }
    
    keyAttrib.Objid = ota_certificate_index;
    keyAttrib.SubCmd = sl_NETUTIL_crype_uninstall_sub_CMD;
    /*卸载密钥以确保新证书未通过 OTA 更新。 这种情况可将密钥替换为证书*/
    状态= sl_NetUtilCmd (sl_NETUTIL_crypto_CMD_INSTALL_OP、(uint8_t *)&keyAttrib、sizeof (SlNetUtilCryptoCmdKeyMgnt_t)、NULL、0、NULL、 resultLen);
    
    keyAttrib.Objid = ota_certificate_index;
    keyAttrib.SubCmd = sl_NETUTIL_crype_install_sub_CMD;
    pInfoKey =(SlNetUtilCryptoPubKeyInfo_t *) buf;
    pInfoKey->KeyAlgo = sl_NETUTIL_crypto_pub_key_算法;
    pInfoKey->KeyParams.EcParams.CurveType = SL_NETUTIL_crype_EC_curve_type_named;
    pInfoKey->KeyParams.EcParams.CurveParams.NamedCurveParams = SL_NETUTIL_crypto_EC_named_curve_SECP256R1;
    pInfoKey->CertFileNameLen = strlen (ota_certificate_name)+1;
    pInfoKey->KeyFileNameLen = 0;
    name =((_u8 *) pInfoKey)+ sizeof (SlNetUtilCryptoPubKeyInfo_t);
    strcpy ((char *) name、ota_certificate_name);
    /*在文件系统中安装来自证书的新密钥*/
    status = sl_NetUtilCmd (sl_NETUTIL_crype_CMD_INSTALL_OP、(_u8 *)&keyAttrib、sizeof (SlNetUtilCryptoCmdKeyMgnt_t)、
    (_u8 *) pInfoKey、sizeof (slNetUtilCryptoPubKeyInfo_t)+ pInfoKey->CertFileNameLen、NULL、&resultLen);
    if (状态< 0)
    {
    免费(verifyBuf);
    /*安装证书失败*/
    返回状态;
    }
    
    /*使用安装的证书验证签名*/
    memcpy (verifyBuf、pDigest、SHA256_Digize_size);
    memcpy (verifyBuf + SHA256_Digest;psig、SigFileSize);
    
    verAttrib.Flags = 0;
    verAttrib.Objid = ota_certificate_index;
    verAttrib.SigType = SL_NETUTIL_Crypto_SIG_DIGESTwECDSA;
    verAttrib.MsgLen = SHA256_Digest;
    verAttrib.SigLen = SigFileSize;
    
    resultLen = 4;
    状态= sl_NetUtilCmd (sl_NETUTIL_crype_CMD_verify_MSG、(_u8 *)&verAttrib、
    sizeof (slNetUtilCryptoCmdVerifyAttrib_t)、verifyBuf、SHA256_Digize_size + SigFileSize、
    (_u8 *)&verifyResult,&resultLen);
    
    /*如果签名无效,则返回特殊的错误代码*/
    if ((Status =0)&&(verifyResult < 0))
    {
    免费(verifyBuf);
    /*进程成功(状态=0)且验证失败-安全警报*/
    返回 archive_status_bundle_cmd_signature_not _valid;
    }
    免费(verifyBuf);
    返回状态;
    }