Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

5.1 hsm-lite项目概述:教学级PKCS#11实现

项目定位

hsm-lite是一个教学级的PKCS#11实现:

hsm-lite定位:

教学导向:
├── 约600行核心C代码
├── 简洁清晰,突出核心流程
├── 可编译运行,真实测试
└── 不追求功能完备

实现范围:
├── 初始化:C_Initialize, C_Finalize
├── Slot管理:C_GetSlotList
├── Session管理:C_OpenSession, C_CloseSession
├── Object管理:C_CreateObject, C_DestroyObject, C_GetAttributeValue
├── 密钥生成:C_GenerateKey(AES)
├── 加密解密:C_Encrypt/C_Decrypt(AES-ECB/CBC)
└── 随机数:C_GenerateRandom

不实现:
├── RSA算法
├── 签名验证
├── 登录认证(C_Login)
├── 真实AES(使用XOR模拟)
└── 多线程安全

文件结构

实际文件结构(精简版):

hsm-lite/
├── hsm_lite.h        PKCS#11函数声明(约210行)
├── hsm_types.h       类型定义(约450行)
├── hsm_common.h      公共定义
├── hsm_lite.c        核心实现(约615行)
├── hsm_test.c        测试程序(约230行)
├── Makefile          多架构编译
└── README.md         项目文档

单文件架构

hsm-lite采用单文件实现,所有逻辑在hsm_lite.c中:

/* hsm_lite.c 内部结构 */

// 数据结构定义
typedef struct hsm_key_t { ... };     // AES密钥对象
typedef struct hsm_session_t { ... }; // Session对象
static struct { ... } g_ctx;          // 全局上下文

// 内部辅助函数
static hsm_session_t* find_session();
static hsm_key_t* find_key();
static CK_RV get_random_bytes();
static CK_RV aes_encrypt_ecb();       // 简化AES(XOR)
static CK_RV aes_encrypt_cbc();

// PKCS#11函数实现
CK_RV C_Initialize();
CK_RV C_Finalize();
CK_RV C_GetSlotList();
CK_RV C_OpenSession();
CK_RV C_CloseSession();
CK_RV C_GenerateKey();
CK_RV C_EncryptInit();
CK_RV C_Encrypt();
CK_RV C_DecryptInit();
CK_RV C_Decrypt();
CK_RV C_CreateObject();
CK_RV C_DestroyObject();
CK_RV C_GetAttributeValue();
CK_RV C_GenerateRandom();

核心数据结构

密钥对象

/* AES密钥对象(简化版) */

typedef struct {
    CK_OBJECT_HANDLE    handle;      // 对象句柄
    CK_BYTE             key[32];     // AES-256密钥值
    CK_ULONG            key_len;     // 密钥长度
    CK_BBOOL            in_use;      // 是否正在使用
} hsm_key_t;

Session对象

/* Session对象(简化版) */

typedef struct {
    CK_SESSION_HANDLE   handle;      // Session句柄
    CK_SLOT_ID          slot_id;     // Slot ID
    CK_BBOOL            in_use;      // 是否正在使用
    CK_BBOOL            is_rw;       // 是否读写Session
    
    /* 当前操作状态 */
    CK_MECHANISM_TYPE   active_mech; // 当前机制
    CK_OBJECT_HANDLE    active_key;  // 当前密钥
    CK_BBOOL            encrypt_init;// 加密已初始化
    CK_BBOOL            decrypt_init;// 解密已初始化
} hsm_session_t;

全局上下文

/* 全局上下文 */

static struct {
    CK_BBOOL            initialized;            // 是否已初始化
    hsm_session_t       sessions[HSM_MAX_SESSIONS]; // Session数组
    hsm_key_t           keys[HSM_MAX_OBJECTS];      // 密钥数组
    CK_ULONG            session_count;             // Session计数
    CK_ULONG            key_count;                 // 密钥计数
    CK_SESSION_HANDLE   next_session_handle;       // 下一个Session句柄
    CK_OBJECT_HANDLE    next_key_handle;           // 下一个密钥句柄
} g_ctx;

简化AES实现

hsm-lite使用XOR模拟AES加密(教学目的):

/* AES加密(简化:XOR模拟) */

static CK_RV aes_encrypt_ecb(CK_BYTE_PTR key, CK_BYTE_PTR data,
                              CK_ULONG len, CK_BYTE_PTR out)
{
    /* 教学简化:直接异或(非真实AES) */
    for (CK_ULONG i = 0; i < len; i++) {
        out[i] = data[i] ^ key[i % HSM_AES_KEY_SIZE];
    }
    return CKR_OK;
}

static CK_RV aes_decrypt_ecb(CK_BYTE_PTR key, CK_BYTE_PTR data,
                              CK_ULONG len, CK_BYTE_PTR out)
{
    /* XOR加密和解密相同 */
    for (CK_ULONG i = 0; i < len; i++) {
        out[i] = data[i] ^ key[i % HSM_AES_KEY_SIZE];
    }
    return CKR_OK;
}

CBC模式实现

/* CBC模式(简化版) */

static CK_RV aes_encrypt_cbc(CK_BYTE_PTR key, CK_BYTE_PTR iv,
                              CK_BYTE_PTR data, CK_ULONG len,
                              CK_BYTE_PTR out)
{
    CK_BYTE block[16];
    CK_BYTE *prev = iv;
    
    for (CK_ULONG i = 0; i < len; i += 16) {
        // 先与前一块异或
        for (CK_ULONG j = 0; j < 16 && i + j < len; j++) {
            block[j] = data[i + j] ^ prev[j];
        }
        // 再加密(XOR)
        aes_encrypt_ecb(key, block, 16, out + i);
        prev = out + i;  // 更新前一块指针
    }
    return CKR_OK;
}

为什么不实现真实AES?

简化设计原因:

教学目的:
├── 展示PKCS#11接口流程
├── 不需要真实密码算法
├── XOR足以演示加密概念
└── 真实AES需要大量代码

如需真实AES:
├── 可链接OpenSSL或Botan
├── 或使用Mbed TLS
└── 教学版保持简单

PKCS#11类型定义

hsm_lite.h定义的简化类型:

/* 基础类型 */

typedef unsigned long       CK_ULONG;
typedef unsigned char       CK_BYTE;
typedef unsigned char       CK_BBOOL;
typedef CK_ULONG            CK_FLAGS;

#define CK_TRUE              1
#define CK_FALSE             0

/* Handle类型 */

typedef CK_ULONG            CK_SLOT_ID;
typedef CK_ULONG            CK_SESSION_HANDLE;
typedef CK_ULONG            CK_OBJECT_HANDLE;

/* 返回值 */

typedef CK_ULONG            CK_RV;

#define CKR_OK                           0
#define CKR_SLOT_ID_INVALID              3
#define CKR_SESSION_HANDLE_INVALID       48
#define CKR_OBJECT_HANDLE_INVALID        66
#define CKR_MECHANISM_INVALID            112
#define CKR_FUNCTION_NOT_INITIALIZED     13

/* 对象类型 */

#define CKO_SECRET_KEY                   4
#define CKK_AES                          31

/* 机制类型 */

#define CKM_AES_KEY_GEN                  0x00001080
#define CKM_AES_ECB                      0x00001081
#define CKM_AES_CBC                      0x00001082

/* 属性类型 */

#define CKA_CLASS                        0
#define CKA_KEY_TYPE                     256
#define CKA_VALUE_LEN                    277
#define CKA_VALUE                        17

/* 结构定义 */

typedef struct CK_MECHANISM {
    CK_ULONG            mechanism;
    void               *pParameter;
    CK_ULONG            ulParameterLen;
} CK_MECHANISM;

typedef struct CK_ATTRIBUTE {
    CK_ULONG            type;
    void               *pValue;
    CK_ULONG            ulValueLen;
} CK_ATTRIBUTE;

支持的函数列表

hsm-lite实现的14个PKCS#11函数:

PKCS#11函数列表:

初始化管理:
├── C_Initialize      初始化PKCS#11库
└── C_Finalize        清理PKCS#11库

Slot管理:
└── C_GetSlotList     获取Slot列表(单Slot)

Session管理:
├── C_OpenSession     打开Session
└── C_CloseSession    关闭Session

Object管理:
├── C_CreateObject    创建对象
├── C_DestroyObject   销毁对象
└── C_GetAttributeValue 获取属性值

密钥操作:
└── C_GenerateKey     生成密钥(AES)

加密解密:
├── C_EncryptInit     初始化加密
├── C_Encrypt         执行加密
├── C_DecryptInit     初始化解密
└── C_Decrypt         执行解密

随机数:
└── C_GenerateRandom  生成随机数

一个类比:教学模型车

教学模型车类比:

hsm-lite(模型车)
│
├── 特点
│   ├── 简化:不是真实汽车
│   ├── 教学:展示汽车原理
│   ├── 可动:可以实际运行
│   └── 精简:去掉复杂部件
│
├── 保留部分
│   ├── 发动机(核心逻辑)
│   ├── 方向盘(接口层)
│   ├── 轮子(基础功能)
│   └── 车架(数据结构)
│
├── 简化部分
│   ├── 发动机→电池(XOR代替AES)
│   ├── 无变速箱(无多线程)
│   ├── 无刹车系统(无错误恢复)
│   └── 无安全气囊(无认证)
│
├── 学习价值
│   ├── 理解汽车架构
│   ├── 理解各部件作用
│   ├── 可以扩展改进
│   └── 为真实设计打基础
│
└── 不适合
    ├── 真实上路(生产环境)
    ├── 高速行驶(高性能)
    └── 长途旅行(长时间运行)

本篇小结

hsm-lite是一个教学级PKCS#11实现:

定位

  • 教学导向,约600行代码
  • 单文件实现,简洁清晰
  • 可编译运行,真实测试

文件结构

  • hsm_lite.h:函数声明
  • hsm_lite.c:核心实现
  • hsm_test.c:测试程序

实现范围

  • 初始化/Slot/Session管理
  • AES密钥生成/加密解密
  • Object创建/销毁/属性
  • 随机数生成

简化设计

  • XOR模拟AES(教学目的)
  • 单Slot设计
  • 无认证机制
  • 无多线程安全

下一节,我们将详细解析每个函数的实现。

【下集预告】

  • C_Initialize如何实现?

  • Session如何管理?

  • AES加密流程?

  • 测试程序如何运行?

下一节,核心接口实现。