跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
折叠
品牌标识

YunTu Forum

YTMicro.com
  1. 主页
  2. Discussion & Question
  3. YT SDK
  4. 关于SHA256+RSA3072验签无法导入N的问题

关于SHA256+RSA3072验签无法导入N的问题

已定时 已固定 已锁定 已移动 YT SDK
2 帖子 2 发布者 563 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • yishui66Y 离线
    yishui66Y 离线
    yishui66
    写于 最后由 编辑
    #1

    一、背景
    现需求公钥在产线上写入N和E,下位机能支持用N和E验签。

    二、现状
    我在ME05的demo(即RSA_example.c)里尝试进行实现,(实际是要在LE05里跑的)

    测试代码如下:

    //确定了问题不在哈希,也不在签名,也不在长度,而在 N 导入不正确。
    void test_rsa_import(void)
    {
        int ret;
        mbedtls_rsa_context rsa;
        mbedtls_mpi N_mpi, E_mpi;
    
        mbedtls_rsa_init(&rsa);
        mbedtls_mpi_init(&N_mpi);
        mbedtls_mpi_init(&E_mpi);
    
        // 先打印 N/E_mpi 确认
        print_bytes("N input (first bytes)", N, 16);
        print_bytes("E input", E, sizeof(E));
    
        // 导入 N/E
        if ((ret = mbedtls_mpi_read_binary(&N_mpi, N, sizeof(N))) != 0) {
            PRINTF("Failed to read N_mpi: -0x%x\r\n", -ret);
            goto cleanup;
        }
        if ((ret = mbedtls_mpi_read_binary(&E_mpi, E, sizeof(E))) != 0) {
            PRINTF("Failed to read E_mpi: -0x%x\r\n", -ret);
            goto cleanup;
        }
        print_rsa_pubkey(&rsa);
        rsa.MBEDTLS_PRIVATE(len) = mbedtls_mpi_size(&N_mpi);
        if ((ret = mbedtls_rsa_import(&rsa, &N_mpi, NULL, NULL, NULL, &E_mpi)) != 0) {
            PRINTF("rsa_import failed: -0x%x\r\n", -ret);
            goto cleanup;
        }
        print_rsa_pubkey(&rsa);
        if ((ret = mbedtls_rsa_complete(&rsa)) != 0) {
            PRINTF("rsa_complete failed: -0x%x\r\n", -ret);
            goto cleanup;
        }
    
        if ((ret = mbedtls_rsa_check_pubkey(&rsa)) != 0) {
            PRINTF("rsa_check_pubkey failed: -0x%x\r\n", -ret);
            goto cleanup;
        }
    
        PRINTF("rsa.len = %zu bytes\r\n", mbedtls_mpi_size(&rsa.MBEDTLS_PRIVATE(N)));
        print_rsa_pubkey(&rsa);
    
    cleanup:
        mbedtls_rsa_free(&rsa);
        mbedtls_mpi_free(&N_mpi);
        mbedtls_mpi_free(&E_mpi);
    }
    

    串口打印出的内容如下:
    7da040d1-63b4-489a-8949-e4d85fb54041-97d95537-6a0d-4ff2-9340-64b000af3d61.png
    也就是N导入失败。
    我确认过哈希值,签名值,原始N,E 均正确。
    完整验签代码如下:

    int RSA_verify_with_N_E(void)
    {
        int ret = 0;
        mbedtls_rsa_context rsa;
        mbedtls_mpi N_mpi, E_mpi;
    
        mbedtls_rsa_init(&rsa);
        mbedtls_mpi_init(&N_mpi);
        mbedtls_mpi_init(&E_mpi);
    
        /* 导入模数和公钥指数 */
        if ((ret = mbedtls_mpi_read_binary(&N_mpi, N, sizeof(N))) != 0) {
            PRINTF("Failed to read N: -0x%X\n", -ret);
            goto cleanup;
        }
    
        if ((ret = mbedtls_mpi_read_binary(&E_mpi, E, sizeof(E))) != 0) {
            PRINTF("Failed to read E: -0x%X\n", -ret);
            goto cleanup;
        }
    
        print_bytes("N_mpi before import", N, sizeof(N));
        print_bytes("E_mpi before import", E, sizeof(E));
        PRINTF("N_mpi size = %zu, E_mpi size = %zu\r\n", mbedtls_mpi_size(&N_mpi), mbedtls_mpi_size(&E_mpi));
    
        if ((ret = mbedtls_rsa_import(&rsa, &N_mpi, NULL, NULL, NULL, &E_mpi)) != 0) {
            PRINTF("rsa_import failed: -0x%X\n", -ret);
            goto cleanup;
        }
    
        if ((ret = mbedtls_rsa_complete(&rsa)) != 0) {
            PRINTF("rsa_complete failed: -0x%X\n", -ret);
            goto cleanup;
        }
    
        if ((ret = mbedtls_rsa_check_pubkey(&rsa)) != 0) {
            PRINTF("rsa_check_pubkey failed: -0x%X\n", -ret);
            goto cleanup;
        }
    
        PRINTF("rsa.len = %zu bytes\n", mbedtls_mpi_size(&rsa.MBEDTLS_PRIVATE(N)));
        print_rsa_pubkey(&rsa);
    
        /* 计算 SHA-256 哈希 */
        uint8_t hash[32];
        if ((ret = mbedtls_md(
                mbedtls_md_info_from_type(MBEDTLS_MD_SHA256),
                message, sizeof(message),
                hash)) != 0) {
            PRINTF("SHA256 computation failed: -0x%X\n", -ret);
            goto cleanup;
        }
        PRINTF("SHA256 hash", hash, sizeof(hash));
    
        /* 验签,hashlen 固定 32 */
        ret = mbedtls_rsa_rsassa_pkcs1_v15_verify(
            &rsa,
            MBEDTLS_MD_SHA256,
            32,
            hash,
            signature_data
        );
    
        if (ret == 0) {
            PRINTF("SIGNATURE VERIFIED SUCCESSFULLY!\n");
        } else {
            PRINTF("SIGNATURE VERIFICATION FAILED: -0x%X\n", -ret);
        }
    
    cleanup:
        mbedtls_rsa_free(&rsa);
        mbedtls_mpi_free(&N_mpi);
        mbedtls_mpi_free(&E_mpi);
    
        return ret;
    }
    

    请云途大佬帮忙看看该怎么实现背景中描述的应用场景

    感谢

    我的ME工程如附件:c5b497a7-76a6-4132-94f4-f8fd43340db1-MbedTls_with_PSA_Demo.zip

    1 条回复 最后回复
    0
    • FrankF 离线
      FrankF 离线
      Frank YunTu
      写于 最后由 编辑
      #2

      DerKey_convert.zip 参考这个文件

      1 条回复 最后回复
      1

    • 云途开发生态介绍

      快速上手云途开发生态

    • 云途论坛规则/Yuntu Forum Rules

      发帖前请查看

    • YT CONFIG TOOL调查问卷

      帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...

    • can
      19
      demo
      19
      uds
      11
      lin stack
      9
      fbl
      5
      md14
      5
      yt-link
      5
      adc模块
      4
      Online Users
      • 登录

      • 登录或注册以进行搜索。
      • 第一个帖子
        最后一个帖子
      0
      • 版块
      • 最新
      • 标签
      • 热门