注册

密码机引擎接口C语言动态库使用KID模式执行SQL报错“生成密钥失败”

momo 2025/11/20 160 1 已解决

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:V8
【操作系统】:Linux
【CPU】:Intel
【问题描述】*:

参照文档:密码机引擎接口

示例C实现代码:

// 算法声明
typedef struct dm_alg_s {
    ulint  cipher_id;
    byte  *cipher_name;
    byte   type;
    ulint  blk_size;
    ulint  kh_size;
    byte   work_mode;
} dm_alg_t;

static const dm_alg_t dm_algs[] = {
    {6002, (byte *)"SM4_KID_NOPAD", CYT_TYPE_SYM_STREAM_ENCRYPT, 16, 16, WORK_MODE_KID},
};

// 创建密钥
lint
cipher_get_key_id(ulint cipher_id, byte *key_id, ulint key_id_size, ulint *key_size)
{
    *key_size = snprintf(key_id, key_id_size, "ID123456789012345678901234567890");
    return DM_TRUE;
}

// 销毁密钥
lint
cipher_free_key_id(ulint cipher_id, byte *key_id, ulint key_id_size)
{
    return DM_TRUE;
}

示例SQL语句:

create tablespace "TEST_ENC2" datafile '/dmdata/data/DAMENG/TEST_ENC2.DBF' size 200 autoextend
 on maxsize 16777215 CACHE = NORMAL encrypt with SM4_KID_NOPAD

管理工具报错:

执行失败(语句1)
-2295: 第2 行附近出现错误:
生成密钥失败

我打印的完整日志:

2025-11-20 17:21:55.063042 [debug]: !!! crypto_get_name(): crypto_name=0x9b6eeb8, len=0x7ffe6307d5f8
2025-11-20 17:21:55.063090 [debug]: !!! crypto_get_type(): crypto_type=0(0x9b6eec0)
2025-11-20 17:21:55.063102 [debug]: !!! cipher_get_count(): NUM_SUPPORTED_ALGS=3
2025-11-20 17:21:55.063116 [debug]: !!! cipher_get_info_ex(): seqno=1, cipher_id=1661457908, cipher_name=0x7ffe6307d608, type=0x7ffe6307d5f1, blk_size=0x7ffe6307d5fc, kh_size=0x7ffe6307d600, work_mode=0x7ffe6307d5f2
2025-11-20 17:21:55.063123 [debug]: seqno=1, cipher_id=6000, cipher_name=SM4_ECB_NOPAD, type=1, blk_size=16, kh_size=16, work_mode=32
2025-11-20 17:21:55.063136 [debug]: !!! cipher_get_para(): cipher_id=6000, para_id=0, value=0x7ffe6307d5f3
2025-11-20 17:21:55.063143 [debug]: !!! cipher_get_para(): cipher_id=6000, para_id=1, value=0x7ffe6307d604
2025-11-20 17:21:55.063152 [debug]: !!! cipher_get_info_ex(): seqno=2, cipher_id=1661457908, cipher_name=0x7ffe6307d608, type=0x7ffe6307d5f1, blk_size=0x7ffe6307d5fc, kh_size=0x7ffe6307d600, work_mode=0x7ffe6307d5f2
2025-11-20 17:21:55.063158 [debug]: seqno=2, cipher_id=6001, cipher_name=SM4_EXTKEY_NOPAD, type=1, blk_size=16, kh_size=16, work_mode=64
2025-11-20 17:21:55.063164 [debug]: !!! cipher_get_para(): cipher_id=6001, para_id=0, value=0x7ffe6307d5f3
2025-11-20 17:21:55.063170 [debug]: !!! cipher_get_para(): cipher_id=6001, para_id=1, value=0x7ffe6307d604
2025-11-20 17:21:55.063179 [debug]: !!! cipher_get_info_ex(): seqno=3, cipher_id=1661457908, cipher_name=0x7ffe6307d608, type=0x7ffe6307d5f1, blk_size=0x7ffe6307d5fc, kh_size=0x7ffe6307d600, work_mode=0x7ffe6307d5f2
2025-11-20 17:21:55.063185 [debug]: seqno=3, cipher_id=6002, cipher_name=SM4_KID_NOPAD, type=2, blk_size=16, kh_size=16, work_mode=67
2025-11-20 17:21:55.063191 [debug]: !!! cipher_get_para(): cipher_id=6002, para_id=0, value=0x7ffe6307d5f3
2025-11-20 17:21:55.063197 [debug]: !!! cipher_get_para(): cipher_id=6002, para_id=1, value=0x7ffe6307d604
2025-11-20 17:23:24.436861 [debug]: !!! cipher_get_cipher_text_size(): inner_id=6002, encrypt_para=(nil), plain_text_size=16
2025-11-20 17:23:24.436996 [debug]: !!! cipher_get_cipher_text_size(): inner_id=6002, encrypt_para=(nil), plain_text_size=512
2025-11-20 17:23:24.437011 [debug]: !!! cipher_get_key_id(): cipher_id=6002, key_id=0x7ff45d8d4fd0, key_id_size=128, key_size=32(0x7ff45d8d4fcc)
2025-11-20 17:23:24.437025 [debug]: !!! cipher_free_key_id(): cipher_id=6002, key_id=0x7ff45d8d4fd0, key_id_size=32
  [0x7ff45c8d2fd0:32]:
  49:44:31:32:33:34:35:36:37:38:39:30:31:32:33:34:35:36:37:38:39:30:31:32:33:34:35:36:37:38:39:30   ID123456789012345678901234567890

描述:

  1. 除了WORK_MODE_KID外的其他模式,都可以正常工作
  2. WORK_MODE_KID模式下,无论是BLOCK和STREAM都报一样的错
  3. 文档要求实现的接口均加了日志打印,界面点击执行SQL,看流程直接调用cipher_get_key_id后就cipher_free_key_id了,free能看到我传入的key_id,实现get函数时,无论我返回false(0)、true(1)、甚至我返回key_id长度,数据库都报这个错

问题:

  1. 不知道代码错在哪?
  2. 达梦对于创建密钥时的调用机制和流程是怎样的?
回答 0
暂无回答
扫一扫
联系客服