| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 3 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 3 个月前 |
PQCP 测试框架
PQCP测试框架遵循 OpenHiTLS 测试标准,采用统一的测试代码结构和数据文件格式。
目录结构
pqcp/testcode/
├── sdv/ # 软件设计验证(SDV)测试
│ ├── scloudplus/ # SCloud+ KEM算法测试
│ │ ├── test_suite_sdv_pqcp_scloudplus.c # 测试代码
│ │ └── test_suite_sdv_pqcp_scloudplus.data # 测试数据
│ ├── polarlac/ # Polarlac KEM算法测试
│ │ ├── test_suite_sdv_pqcp_polarlac.c
│ │ └── test_suite_sdv_pqcp_polarlac.data
│ └── composite_sign/ # 复合签名算法测试
│ ├── test_suite_sdv_pqcp_composite_sign.c
│ └── test_suite_sdv_pqcp_composite_sign.data
├── testdata/ # 测试数据文件
│ └── scloudplus/
│ └── scloudplus_testvector/ # 标准测试向量
└── README.md # 本文档
测试框架规范
1. 测试文件命名规范
测试代码文件:test_suite_sdv_<module>_<feature>.c
测试数据文件:test_suite_sdv_<module>_<feature>.data
例如:
test_suite_sdv_pqcp_scloudplus.ctest_suite_sdv_pqcp_scloudplus.data
2. 测试代码结构
测试代码使用 OpenHiTLS 标准格式:
/* BEGIN_HEADER */
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include "bsl_sal.h"
#include "pqcp_err.h"
#include "crypt_eal_pkey.h"
#include "crypt_eal_provider.h"
/* END_HEADER */
/* @
* @test SDV_CRYPTO_PQCP_<FEATURE>_TC001
* @spec -
* @title 测试标题
* @precon nan
* @brief 1. 测试步骤1
* 2. 测试步骤2
* @expect 期望结果
* @prior nan
* @auto FALSE
@ */
/* BEGIN_CASE */
void SDV_CRYPTO_PQCP_<FEATURE>_TC001(int bits)
{
TestMemInit();
// 测试实现
CRYPT_EAL_PkeyCtx *ctx = CRYPT_EAL_ProviderPkeyNewCtx(NULL, algId,
CRYPT_EAL_PKEY_KEM_OPERATE, "provider=pqcp");
ASSERT_TRUE(ctx != NULL);
// ... 测试逻辑
EXIT:
CRYPT_EAL_PkeyFreeCtx(ctx);
return;
}
/* END_CASE */
3. 测试数据文件格式
测试数据文件采用两行的格式:
TEST_NAME Description
TEST_NAME:param1:param2:...
示例:
SDV_CRYPTO_PQCP_SCLOUDPLUS_KEYGEN_API_TC001 SCloud+ 128-bit
SDV_CRYPTO_PQCP_SCLOUDPLUS_KEYGEN_API_TC001:128
SDV_CRYPTO_PQCP_SCLOUDPLUS_VECTOR_TC001 SCloud+ 128-bit
SDV_CRYPTO_PQCP_SCLOUDPLUS_VECTOR_TC001:128:"D20C193C...":"203E865F...":"DC473FB2...":"561CCBC4...":"44C004C0...":"68D056D1...":"92689FB7..."
参数类型:
int- 直接写数字,如128Hex*- 十六进制字符串,用双引号包围,如"D20C193C..."char*- 字符串,用双引号包围
4. 常用测试模式
4.1 API测试
测试基本API功能:
/* BEGIN_CASE */
void SDV_CRYPTO_PQCP_<MODULE>_API_TC001(int bits)
{
TestMemInit();
CRYPT_EAL_PkeyCtx *ctx = CRYPT_EAL_ProviderPkeyNewCtx(NULL, PQCP_PKEY_xxx,
CRYPT_EAL_PKEY_KEM_OPERATE, "provider=pqcp");
ASSERT_TRUE(ctx != NULL);
// 设置参数
uint32_t val = (uint32_t)bits;
int32_t ret = CRYPT_EAL_PkeyCtrl(ctx, CRYPT_CTRL_SET_PARA_BY_ID, &val, sizeof(val));
ASSERT_EQ(ret, PQCP_SUCCESS);
// 执行操作
ret = CRYPT_EAL_PkeyGen(ctx);
ASSERT_EQ(ret, PQCP_SUCCESS);
EXIT:
CRYPT_EAL_PkeyFreeCtx(ctx);
return;
}
/* END_CASE */
对应数据文件:
SDV_CRYPTO_PQCP_<MODULE>_API_TC001 <Module> 128-bit
SDV_CRYPTO_PQCP_<MODULE>_API_TC001:128
4.2 向量测试
使用标准测试向量验证算法正确性:
/* BEGIN_CASE */
void SDV_CRYPTO_PQCP_<MODULE>_VECTOR_TC001(int bits, Hex *alpha, Hex *randZ,
Hex *randM, Hex *expPk, Hex *expSk, Hex *expCipher, Hex *expSharedKey)
{
TestMemInit();
// 设置随机数回调
CRYPT_EAL_SetRandCallBack(TEST_<Module>Random);
// 复制测试向量到全局缓冲区
memcpy(gRandBuf[1], alpha->x, alpha->len);
memcpy(gRandBuf[0], randZ->x, randZ->len);
memcpy(gRandBuf[2], randM->x, randM->len);
// 创建上下文并测试
CRYPT_EAL_PkeyCtx *ctx = CRYPT_EAL_ProviderPkeyNewCtx(NULL, PQCP_PKEY_xxx,
CRYPT_EAL_PKEY_KEM_OPERATE, "provider=pqcp");
ASSERT_NE(ctx, NULL);
// ... 执行KeyGen, Encaps, Decaps并验证结果
EXIT:
CRYPT_EAL_PkeyFreeCtx(ctx);
return;
}
/* END_CASE */
对应数据文件:
SDV_CRYPTO_PQCP_<MODULE>_VECTOR_TC001 <Module> 128-bit
SDV_CRYPTO_PQCP_<MODULE>_VECTOR_TC001:128:"alpha_hex":"randZ_hex":"randM_hex":"pk_hex":"sk_hex":"cipher_hex":"sharedkey_hex"
5. 常用断言宏
ASSERT_TRUE(expr)- 断言表达式为真ASSERT_FALSE(expr)- 断言表达式为假ASSERT_EQ(a, b)- 断言相等ASSERT_NE(a, b)- 断言不相等ASSERT_COMPARE(msg, buf1, len1, buf2, len2)- 比较两个缓冲区
6. Provider 初始化
每个测试函数开始前需要初始化 provider:
TestMemInit();
ASSERT_EQ(TestPqcpProviderLoad(), 0); // 加载 PQCP provider
添加新的测试用例
步骤1:在 .c 文件中添加测试函数
/* @
* @test SDV_CRYPTO_PQCP_<MODULE>_NEWTEST_TC001
* @spec -
* @title 新测试用例
* @precon nan
* @brief 1. 步骤1
* 2. 步骤2
* @expect 期望结果
* @prior nan
* @auto FALSE
@ */
/* BEGIN_CASE */
void SDV_CRYPTO_PQCP_<MODULE>_NEWTEST_TC001(int bits)
{
TestMemInit();
ASSERT_EQ(TestPqcpProviderLoad(), 0);
// 测试代码
EXIT:
return;
}
/* END_CASE */
步骤2:在 .data 文件中添加测试数据
SDV_CRYPTO_PQCP_<MODULE>_NEWTEST_TC001 新测试描述
SDV_CRYPTO_PQCP_<MODULE>_NEWTEST_TC001:128
步骤3:构建和运行测试
cd /path/to/pqcp/testcode/script
# 重新构建测试
bash ./build_pqcp_sdv.sh
# 运行测试
bash ./execute_sdv.sh