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.

[参考译文] CC3235SF:验证代码内的 RSA 签名

Guru**** 2401645 points
Other Parts Discussed in Thread: CC3235SF, UNIFLASH, AES-128

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1510802/cc3235sf-verify-an-rsa-signature-inside-the-code

器件型号:CC3235SF
Thread 中讨论的其他器件: UNIFLASHAES-128

工具/软件:

您好、
我想 验证外部文件(OriginalFile,而不是文件系统中的文件)的签名。

我 可以 通过 OTA 获取签名、并通过 UART 或 SPI 获取哈希值 (SHA256)。
obs、则证书已在闪存中。

所以,我有所有需要的部分,但我总是 在关闭文件时收到错误(即签名被验证时)。

下面是到目前为止我拥有的:

  1. 执行 OTA 以在文件系统上获取 OriginalFileSignature.bin。
  2. 将文件读取到变量 signedHash[256]中。
  3. 从其他外部源获取 OriginalFileHash、放入 unsignedHash[32]。

以下是我要做的事情:

  1. 创建/覆盖名为 Data.bin 的新安全文件。
  2. 将 unSignedHash[32]写入 Data.bin。
  3. 关闭文件、将 signedHash[256]作为 Signature、并使用公钥将 CertName 指向证书。
  4. 如果已正确关闭、则表示已验证签名。

因此、如果它已成功写入/关闭、则会确认签名。

    FileHandle =  sl_FsOpen((unsigned char *)FileName,
                            SL_FS_CREATE | SL_FS_CREATE_SECURE | SL_FS_CREATE_MAX_SIZE( MaxSize )  | SL_FS_OVERWRITE ,
                            &MasterToken);
    if(FileHandle >= 0)
    {
        RetValWriteToFile = sl_FsWrite(FileHandle, 0, &unsignedHash[0], sizeof(unsignedHash));
        RetValCloseFile = sl_FsClose(FileHandle, CERTNAME, (const unsigned char *)&signedHash[0], sizeof(signedHash));
    }

    Display_printf(dispHandle, 0, 0, "The file [%s] opened: %s \t[%d]  \n\rWrote To File: %s \t[%d]  \n\rClosed/Verified: %s \t[%d]", FileName,
                   (FileHandle >= 0)        ? "Successfully" : "Error",  FileHandle, 
                   (RetValWriteToFile > 0)  ? "Successfully" : "Error",  RetValWriteToFile,  
                   (RetValCloseFile == 0)   ? "OK" : "Not ok",           RetValCloseFile);

我不确定应该如何构建签名。 在 OpenSSL 中、我尝试了以下操作。
(请注意 是 )

  • $ openssl dgst -SHA256 -binary -sign -out  <Data>

  • $ openssl dgst -sha1 -binary   -sign -out  <Data>

  • $ openssl dgst -SHA256 -binary <Data> >  
    $ cat   >>  
    $ openssl dgst -SHA256 -binary -sign -out    
    (这与我验证 CC3235SF 映像的方式相同)

然后我转身 到 c 中的一个数组(如“uint8_t signedHash[256]={0xf8、0x2C、...};“进行测试)。

基本上   是一个普通的安全文件、但我不知道如何使用 它们 (映像除外)。
我现在有“MasterToken=0",“,因为、因为我不知道如何使用/处理它。

关闭该文件时出现的错误是“-10289",–10289,这“这意味、意味着“SL_ERROR_FS_INFORT_SIGNATION_SECURITY_ALERT",“,</s>、
但当我直接使用 OpenSSL 验证时、工作正常。


希望对此问题提供任何帮助或建议!

此致
David

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

    (我还尝试将数据作为 Base64 字符串并对生成的文本文件签名。
    但一切都会导致–10289 错误。)

    (将数据写入打开的文件似乎工作正常,关闭文件时发生错误。)

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

    如果有更好的方法来验证外部文件的签名,那么我愿意接受建议。

    当我们让它起作用时、如果给错误的签名 15 次、将出现安全警报
    将装置锁定在安全状态。 这会使其无法使用(在我们的情况下不理想)。

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

    您好、

    我目前不在办公室、下周还会回来、但错误意味着无法验证签名。

    可以是签名本身、也可以是用于验证签名的证书。

    基本上、您可以阅读 NWP 指南中有关关闭安全文件的第 8.4.6 章。

    您还可以尝试使用 Uniflash 而不是 openssl、看看它是否起作用。

    它应该在“Tools"选项“选项下。

    此致、

    Shlomi

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

    您好、

    您是否按照我的建议尝试过 Uniflash 而不是 SSL?

    我不知道你在想什么,也不知道该怎么办。“

    基本上,创建签名的方式是首先计算文件的摘要,然后将私钥应用于摘要。

    根据您所描述的内容、您可以得到摘要并将其称为  unsignedHash[]、将其写入文件并以 signedHash[]作为签名关闭?

     signedHash[]是 为其计算 unsignedHash[]的原始文件的签名。

    您能解释一下吗?

    Shlomi

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

    您好、

    感谢您抽出宝贵的时间进行此调查。
    我明白这有点令人困惑、但我基本上只想验证 CC3235SF 之外的文件。
    希望这能 更好地解释它。

    该文件位于另一个处理器的闪存中、 太大、无法在一个处理器中读取。
    因此、我们以块为单位计算哈希值、并将结果发送给 CC3235SF。

    每当我们更新文件时、都要使用 CC3235SF 的安全性对其进行验证。 我们可以添加签名版本的哈希值
    这意味着 CC3235SF 可以访问哈希值和带签名版本的哈希值。

    现在、我们要通过任一方式进行验证
    1.签名散列,并与签名进行比较-(这里我们将密钥作为安全文件)
    2.将哈希保存为安全文件,使用签名作为签名-(我没有得到这个工作)

    这两种解决方案都存在问题
    1.暴露钥匙的风险较高。 -(另外,不确定是否可以在软件内部创建数字签名)
    2.可能“砖“的单位,如果它失败 15 次-(根据我的理解)

    选项 (2.) 会对照信任根内的实际证书进行检查、这非常好。
    否则、我们只需使用 (1.) 使用 HMAC、效果不那么好、但简单得多。

    回答您的问题(这是 2 个月前的问题,因此可能记不清)、
    但下面是我的测试:

    由于我必须在代码中进行验证、因此从 Uniflash 获取了签名输出并将其放入一个数组中。
    我尝试使用 Uniflash 和 OpenSSL 的输出(两种情况下输出相同):
    1.作为字符串
    2.作为 B64,
    3.作为字节数组

    并尝试使用 AES-256(带 RSA-2048 密钥)、AES-128(带 RSA-1024 密钥)以及 EC 密钥。 我甚至尝试了
    将哈希值和签名连接为保存的文件(就像我们对 SW-Image 所做的那样)。 我知道关键是好的
    AES-256 RSA-2048(对软件进行签名的相同密钥,该器件正常工作)。 但我总是收到 错误

    即使我们使用 HMAC 选项(我知道如何操作)、我们仍需要从软件中运行安全文件。
    因为我们很快就会开始将一些材料存储为安全文件。

    另外、澄清您的最后一个问题。 是的、我尝试保存/关闭 unsignedHash、并以 signedHash 作为签名。
    是的、signedHash 和 unsignedHash 是从同一个文件(使用 Catalog 中证书的私钥签名)计算得出的。
    签名在 Uniflash 和 OpenSSL 中具有相同的输出、可以成功使用 OpenSSL 进行验证。

    感谢您的帮助!

     

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

    您好、

    描述很清楚,但也许我仍然缺少一些东西。

    当我们关闭文件系统中的安全文件时、底层情况是计算该文件的哈希值、并将其与签名对应的公钥(在证书中)进行比较。 由于签名是匹配私钥和同一文件哈希的结果、因此它们应匹配。

    在您的情况下,似乎你需要的原始文件是长文件,不是在我们的文件系统上,因为散列是在这个文件。 您尝试在我们的文件系统上创建一个文件、该文件仅为长文件的散列值、并为长文件提供签名、而不是您存储在输出文件系统中的短文件。

    实际发生的情况是、我们将计算长文件的哈希值、因此它与签名不匹配。

    Shlomi