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:在 CC3235SF 上生成 ES256签名

Guru**** 2577385 points
Other Parts Discussed in Thread: CC3235SF, UNIFLASH

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/897756/cc3235sf-generating-es256-signature-on-cc3235sf

器件型号:CC3235SF
主题中讨论的其他器件: UNIFLASH

您好!

我想在 CC3235SF 上生成 ES256签名。  我在这里阅读过此帖子:

我想使用第0个预编程的恒定私有 ECC 密钥来实现这一目的。  我已验证我的 SHA256是否有效。  我是否遗漏了某种东西:

uint16_t ecc_signature_length = 0;

slNetUtilCryptoCmdSignAttrib_t signAttrib;

uint8_t SHA256_hash-32];
uint8_t ecc_buffer[512];

/*用于 b64url (header).b64url (payload)散列的 SHA256散列的初始加密*/
memset (&HMAC_params、0、sizeof (CryptoCC32XX_HmacParams));

if (cryptoCC32XX_handle == NULL)

   CryptoCC32XX_init();
   cryptoCC32XX_handle = CryptoCC32XX_open (0、CryptoCC32XX_HMAC);


/*清除散列内存*/
memset (&SHA256_hash-[0]、0、sizeof (SHA256_hash));
CryptoCC32XX_HmacParams_init (&HMAC_params);

HMAC_params.MoreData = 0;
/*生成散列*/
CryptoCC32XX_SIGN (cryptoCC32XX_Handle、
             CryptoCC32XX_HMAC_SHA256、
             已编码报头和已编码有效载荷[0]、
             strlen (&enceded_header_and_enced_payload[0])、
             SHA256_hash-[0]、
             HMAC_params (&H);

/*计算哈希的 ECC 签名*/
signAttrib.Flags = 0;
signAttrib.Objid = 0;
signAttrib.SigType = SL_NETUTIL_Crypto_SIG_SHA256wECDSA;
ecc_signature_length = 255;

memset (&ecc_buffer[0]、0、sizeof (ecc_buffer));

SL_NetUtilCmd (SL_NETUTIL_crypto_CMD_sign_MSG、
          (uint8_t *) signAttrib、
          sizeof (slNetUtilCryptoCmdSignAttrib_t)、
          SHA256_hash-[0]、
          sizeof (SHA256_hash)、
          &ECC_buffer[0]、
          &ECC_signature_length);

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

     sl_NetUtilCmd (sl_NETUTIL_crypto_CMD_sign_MSG、...) 在原始缓冲器上工作(而不是在摘要上工作)。

    NetUtil 命令在使用 EC 签名之前计算摘要(使用 SHA2)。

    BR、

    Kobi

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

    您好、Kobi、

    感谢您的回复!  最终、它与 JWT 一起使用以连接到 Google 的 MQTT 平台。  在继续协同工作时、我有几个问题:

    由于我们使用芯片中的 ECC 密钥对、我编写了代码来将 x9.63公共 ECC 密钥提取到主机。  然后、将此密钥转换为 public.pem 格式、并将其放置在 Google 的云平台上、用于该特定器件。  这是否可行?

    其次、您是否想简单地查看我的代码以查看我是否正在正确创建签名?

    /*
     *此文件基于 Google 的 IOT Core SDK 中的源代码。
     *

    #include
    #include
    #include
    #include
    /* TI 驱动程序头文件*/
    #include
    #include
    #include

    #include "JWT.h"

    #define JWT_HEADER_BUF_SIZE    40.
    #define JWT_PAYLOAD_BUF_SIZE   256
    #define JWT_MAX_signature_size 132
    #define JWT_PROJECTID_MAX_LEN  200

    静态字符 JWT[256];

    静态空 JWT_URL_base64_encode_buffer (uint8_t* data_TO_encode、
                                            size_t data_TO_encode_size、
                                            char* encoded_data_destination、
                                            size_t* encoded_data_size)

       *encoded_data_size = sizeof (JWT)- strlen (&JWT[0]);

       StrMpl_encodeBase64 (DATA_TO_encode、
                           DATA_TO_encode_size、
                           (uint8_t*) encoded_data_destination、
                           encoded_data_size);

       size_t i;

       对于(i = 0;i <*编码数据大小;i++)
       {
           switch (enceded_data_destination[i])
           {
               案例'+':
                   encoded_data_destination[i]="-";
                   中断;
               案例"/":
                   encoded_data_destination[i]='_';
                   中断;
               案例'=':
                   encoded_data_destination[i]= 0;
                   *encoded_data_size-;
                   中断;
               默认值:
                   中断;
           }
       }



    静态空 JWT_CREATE _B64h_B64p (const char* project_id、uint32_t expiration_sec)

     size_t bytes_written = 0;
     size_t 索引= 0;

     /*创建标头*/
     字符头[JWT_HEADER_BUF_SIZE];
     memset (&header[0]、0、JWT_HEADER_BUF_SIZE);
     memcpy (&header[0]、"{\"ALG\":\"ES256\"、\"典型值\":\"JWT\"}"、strlen ("{\"ALG\":\"ES256\"、\"典型值\":\"JWT\"}));

     /*创建有效载荷*/
     //TODO、从现在起设置为今天的日期、时间= UTC 中午12:00
     uint32_t CURRENT_TIME_IN_sec = 1587470400;
     char PAYLOAD[JWT_PAYLOAD_BUF_SIZE];
     memset (&PAYLOAD[0]、0、JWT_PAYLOAD_BUF_SIZE);

     snprintf (有效载荷、
              JWT_PAYLOAD_BUF_SIZE、
              "{\"IAT\":%ld、\"exp\":%ld、\"波特率\":\"%s\"}"、
              Current_TIME_IN_sec、
              Current_TIME_IN_sec + Expiration_Period_sec、
              项目 ID);

     /* base64编码头*/
     JWT_URL_base64_encode_buffer ((uint8_t*)&header[0]、
                                  strlen (标头)、
                                  &JWT[索引]、
                                  字节写入(&B);
     index += bytes_written;
     /*添加第一个分隔 b64 (h)和 b64 (p)的点*/
     JWT[index++]='.';

     JWT_URL_base64_encode_buffer ((uint8_t*)&PAYLOAD[0]、
                                  strlen (有效载荷)、
                                  &JWT[索引]、
                                  字节写入(&B);


    //创建 JWT:b64 (h).b64 (p).b64 (ECC (SHA256 (b64 (h).b64 (p))))
    // h =标头
    // p =有效载荷
    // b64 = base64
    // SHA =安全哈希算法
    // ECC =椭圆曲线加密
    void JWT_create (const char* project_id、uint32_t expiration_sec)

       size_t bytes_written = 0;
       size_t 索引= 0;

       /*清除 JWT */
       memset (&JWT[0]、0、sizeof (JWT));

       /*创建 base64编码报头和有效载荷:b64 (h).b64 (p)*/
       jwt_create_b64h_b64p (project_id、expiration_period_sec);

       /*创建 b64(h).b64(p)的 es256签名:SHA256 (b64(h).b64(p))*/
       uint16_t bytes_written ECC 签名= 255;
       uint8_t ecc_signature[JWT_MAX_signature_size];
       memset (&ecc_signature[0]、0、JWT_MAX_signature_size);

       slNetUtilCryptoCmdSignAttrib_t signAttrib;
       signAttrib.Flags = 0;
       signAttrib.Objid = 0;
       signAttrib.SigType = SL_NETUTIL_Crypto_SIG_SHA256wECDSA;//这是唯一支持的类型*/

       SL_NetUtilCmd (SL_NETUTIL_crypto_CMD_sign_MSG、
                     (uint8_t *) signAttrib、
                     sizeof (slNetUtilCryptoCmdSignAttrib_t)、
                     (const uint8_t *)&JWT[0]、
                     strlen (&JWT[0])、
                     &ECC_signature[0]、
                     字节_写入_ecc_signature);

     /*添加分隔 b64 (h).b64 (p)和 b64 (eccsignature)的第二个点*/
     索引= strlen (&JWT[0]);
     JWT[index++]='.';

     JWT_URL_base64_encode_buffer (&ECC_signature[0]、
                                  Bytes_written;ecc_signature、
                                  &JWT[索引]、
                                  字节写入(&B);


    const char* jwt_get()

       返回&JWT[0];


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

    您好 Ben、

    使用器件密钥的标准方法是读取 CSR (证书签名请求)并使用它生成器件证书。

    您可以使用 uniflash 工具(您需要在 DeviceIdenity 菜单中启用 CSR)、使用 SDK (请参阅 http://dev.ti.com/tirex/explore/node?node=AMpkGCJkwCqQ.cWUJcYKJA__fc2e6sr__LATEST)或直接从代码 (请参阅 Certificate 中的 SL_NETUIL_crypto_save_sign_sign_request 和 Certificate_signing 示例中的"Certificate_signing_CC3235SF_LAUNCHXL_nortos_ccs"示例获取器件 CSR。

    然后、CSR (包括器件公钥)将比使用有效的证书颁发机构(Google 可接受的根 CA)对公钥进行签名并创建器件证书要多。  

    我不熟悉 Google MQTT 的要求、但他们可能会描述所需的程序。

    您还可以从器件创建自签名证书、但这不是典型的方法。

    您还可以在 http://www.ti.com/lit/ug/swpu332a/swpu332a.pdf 中阅读相关内容

    关于您的代码、我只能验证 slNetUTilCmd 器件是否正常。 在 JWT 创建方面、我无能为力、并假设您使用的 base64实用程序正常、并且缓冲区大小正常。

    BR、

    Kobi   

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

    您好、Kobi、

    我已经通过 Uniflash 加载 Google 的根 CA 连接到 Google。  我对 JWT 进行硬编码以成功完成此操作。

    我想、在您看来、加密库是否能够使用常数密钥对的私钥 x9.63原始私钥创建 ES256签名?  我很确定这是我的问题所在。

    我对所有证书都很满意、实际上很直观;不过、感谢您抽出宝贵的时间!

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

    如果使用设备私钥对 JWT 进行签名,服务器如何验证签名? 如何向服务器提供公钥?

    有关  NetUtil 命令的更多详细信息,请参见 www.ti.com/.../swru455j.pdf 的第17.1章。 我认为它符合 ES256要求、

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

    我非常熟悉该文档。  我想您已经回答了我的问题。  这是一个非常复杂的集成、我已经在其中呆了很长时间、因此、如果我看起来好像在抓钳、我会感到很抱歉。

    器件公钥在制造时发送到 google。  我有读取 ECC 公钥(x9.63格式)并将其转换为.pem 格式的代码。

    文件系统上加载了 google 中的根 CA。

    JWT 包含使用 ECC 私钥创建的 ES256签名。

    我开始认为 x9.63公钥的转换可能已经不好了。

    谢谢、