Intel-IPSec-MB子模块作用与设计原理分析文档
目录
- 概述
- 模块架构
- 核心功能模块
- 多缓冲区设计原理
- 性能优化策略
- 在SPDK中的应用
概述
Intel-IPSec-MB简介
Intel Multi-Buffer Crypto for IPsec Library (Intel-IPSec-MB) 是Intel开发的高性能IPSec加密库,专门针对Intel处理器优化的软件实现。该库提供了IPSec核心加密处理功能,在Intel处理器上提供业界领先的性能。
核心特性
- 多缓冲区处理: 同时处理多个加密作业,提高吞吐量
- SIMD优化: 充分利用SSE、AVX、AVX2、AVX512指令集
- 硬件加速: 利用AES-NI、PCLMULQDQ等硬件指令
- 乱序执行: 支持乱序(out-of-order)调度,提高CPU利用率
- 多种算法: 支持多种加密和完整性算法
主要功能
- 加密算法: AES-GCM, AES-CBC, AES-CTR, AES-ECB, DES, 3DES等
- 完整性算法: HMAC-SHA1/224/256/384/512, AES-XCBC, AES-CMAC, AES-GMAC等
- 组合模式: 加密+完整性验证的组合操作
- 无线算法: KASUMI, ZUC, SNOW3G (3GPP标准)
模块架构
目录结构
1 2 3 4 5 6 7 8 9 10 11
| intel-ipsec-mb/ ├── sse/ # SSE优化实现 ├── avx/ # AVX优化实现 ├── avx2/ # AVX2优化实现 ├── avx512/ # AVX512优化实现 ├── no-aesni/ # 无AES-NI的软件实现 ├── include/ # 内部头文件 ├── LibTestApp/ # 测试应用 ├── LibPerfApp/ # 性能测试应用 ├── intel-ipsec-mb.h # 公共API头文件 └── mb_mgr_code.h # 多缓冲区管理器代码
|
架构设计特点
多版本实现: 每个算法提供多个SIMD版本
- SSE版本: 使用SSE4.1指令集
- AVX版本: 使用AVX指令集
- AVX2版本: 使用AVX2指令集
- AVX512版本: 使用AVX512指令集
- VAES版本: 使用VAES和VPCLMULQDQ扩展(AVX512)
运行时选择: 根据CPU特性自动选择最优实现
汇编优化: 关键路径使用汇编语言实现
核心功能模块
1. 多缓冲区管理器 (Multi-Buffer Manager)
作用
多缓冲区管理器是Intel-IPSec-MB的核心组件,负责管理多个加密作业的调度和执行。
核心概念
Lane (通道): 每个lane可以处理一个独立的加密作业
- SSE: 4个lanes (HMAC-SHA1/256)
- AVX: 4-8个lanes
- AVX2: 8-16个lanes
- AVX512: 16-32个lanes
Job (作业): 表示一个加密/完整性验证任务
关键数据结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| struct MB_MGR { MB_MGR_AES_OOO aes_ooo; MB_MGR_HMAC_SHA_1_OOO hmac_sha_1_ooo; MB_MGR_HMAC_SHA_256_OOO hmac_sha_256_ooo; MB_MGR_HMAC_SHA_512_OOO hmac_sha_512_ooo; JOB_AES_HMAC jobs[MAX_JOBS]; get_next_job_t get_next_job; submit_job_t submit_job; flush_job_t flush_job; get_completed_job_t get_completed_job; };
struct MB_MGR_AES_OOO { AES_ARGS args; uint16_t lens[16]; uint64_t unused_lanes; JOB_AES_HMAC *job_in_lane[16]; uint64_t num_lanes_inuse; };
struct JOB_AES_HMAC { const void *aes_enc_key_expanded; const void *aes_dec_key_expanded; const uint8_t *src; uint8_t *dst; uint64_t msg_len_to_cipher_in_bytes; uint64_t msg_len_to_hash_in_bytes; const uint8_t *iv; uint8_t *auth_tag_output; JOB_STS status; JOB_CIPHER_MODE cipher_mode; JOB_HASH_ALG hash_alg; };
|
关键API
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| MB_MGR *alloc_mb_mgr(uint64_t flags);
JOB_AES_HMAC *get_next_job(MB_MGR *state);
JOB_AES_HMAC *submit_job(MB_MGR *state);
JOB_AES_HMAC *flush_job(MB_MGR *state);
JOB_AES_HMAC *get_completed_job(MB_MGR *state);
|
工作流程
1 2 3 4 5 6
| 1. 获取作业: job = get_next_job(mgr) 2. 填充作业: 设置job的各个字段(密钥、数据、IV等) 3. 提交作业: submit_job(mgr) // 将job添加到队列 4. 处理作业: 库内部使用SIMD指令并行处理多个作业 5. 获取结果: completed_job = get_completed_job(mgr) 6. 检查状态: if (completed_job->status == STS_COMPLETED)
|
2. 加密算法模块
支持的加密算法
AES系列:
- AES-GCM: Galois/Counter Mode(认证加密)
- AES-CBC: Cipher Block Chaining
- AES-CTR: Counter Mode
- AES-ECB: Electronic Codebook
- AES-CCM: Counter with CBC-MAC
其他算法:
- DES/3DES: 数据加密标准(遗留支持)
- KASUMI-F8: 3GPP加密算法
- ZUC-EEA3: 中国标准加密算法
- SNOW3G-UEA2: 3GPP加密算法
AES-GCM实现原理
GCM模式特点:
- 同时提供加密和认证
- 使用CTR模式进行加密
- 使用GHASH进行认证
关键数据结构:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| struct gcm_key_data { uint8_t expanded_keys[16 * 15]; union { struct { uint8_t shifted_hkey[16 * 8]; uint8_t shifted_hkey_k[16 * 8]; } sse_avx; struct { uint8_t shifted_hkey[16 * 8]; } avx2_avx512; struct { uint8_t shifted_hkey[16 * 48]; } vaes_avx512; } ghash_keys; };
struct gcm_context_data { uint8_t aad_hash[16]; uint64_t aad_length; uint64_t in_length; uint8_t current_counter[16]; };
|
GCM处理流程:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 1. 密钥扩展: aes_gcm_pre_128(key, key_data) - 扩展AES密钥 - 预计算GHASH密钥
2. 初始化: aes_gcm_init(key_data, ctx, iv, aad, aad_len) - 初始化计数器 - 处理AAD(Additional Authenticated Data)
3. 加密/解密: aes_gcm_enc_dec_update(key_data, ctx, dst, src, len) - CTR模式加密/解密 - 同时更新GHASH
4. 完成: aes_gcm_enc_dec_finalize(key_data, ctx, auth_tag, tag_len) - 生成认证标签
|
性能优化:
- 预计算: 预计算GHASH所需的密钥表
- 并行处理: 一次处理多个块(by8表示一次8个块)
- 硬件加速: 使用PCLMULQDQ指令加速GF(2^128)乘法
3. 完整性算法模块
支持的完整性算法
HMAC系列:
- HMAC-SHA1-96: SHA1的HMAC,96位截断
- HMAC-SHA2-224/256/384/512: SHA2系列的HMAC
AES系列:
- AES-XCBC-96: AES扩展CBC-MAC
- AES-CMAC-96: AES CMAC
- AES-GMAC: GCM的认证部分
其他:
- HMAC-MD5-96: MD5的HMAC(遗留支持)
- KASUMI-F9: 3GPP完整性算法
- ZUC-EIA3: 中国标准完整性算法
- SNOW3G-UIA2: 3GPP完整性算法
HMAC实现原理
HMAC算法:
1 2 3 4 5 6 7 8
| HMAC(K, m) = H((K ⊕ opad) || H((K ⊕ ipad) || m))
其中: - K: 密钥 - m: 消息 - H: 哈希函数(SHA1/SHA2等) - opad: 外部填充(0x5c重复) - ipad: 内部填充(0x36重复)
|
多缓冲区HMAC:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| struct MB_MGR_HMAC_SHA_1_OOO { SHA1_ARGS args; uint16_t lens[16]; uint64_t unused_lanes; HMAC_SHA1_LANE_DATA ldata[16]; uint32_t num_lanes_inuse; };
struct HMAC_SHA1_LANE_DATA { uint8_t extra_block[2 * 64 + 8]; JOB_AES_HMAC *job_in_lane; uint8_t outer_block[64]; uint32_t outer_done; };
|
处理流程:
1 2 3 4 5 6 7 8 9 10 11
| 1. 提交作业: submit_job_hmac_sha1(mgr) - 将作业分配到可用lane - 处理内部哈希(K ⊕ ipad || m)
2. 刷新作业: flush_job_hmac_sha1(mgr) - 完成所有lane的处理 - 处理外部哈希(K ⊕ opad || H_internal) - 生成认证标签
3. 获取结果: get_completed_job(mgr) - 返回已完成的作业
|
性能优化:
- 并行处理: 同时处理多个HMAC作业
- 硬件加速: 使用SHA-NI指令(如果可用)
- 批量处理: 一次处理多个块
4. 组合操作 (Chained Operations)
作用
支持加密和完整性验证的组合操作,这是IPSec的常见需求。
组合模式
CIPHER_HASH: 先加密后哈希
HASH_CIPHER: 先哈希后加密
实现原理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| struct JOB_AES_HMAC { JOB_CHAIN_ORDER chain_order; uint64_t cipher_start_src_offset_in_bytes; uint64_t hash_start_src_offset_in_bytes; };
void process_chained_job(JOB_AES_HMAC *job) { if (job->chain_order == CIPHER_HASH) { aes_encrypt(job); hmac_compute(job); } else { hmac_compute(job); aes_encrypt(job); } }
|
多缓冲区设计原理
核心思想
多缓冲区技术通过同时处理多个独立的加密作业来提高CPU利用率,充分利用SIMD指令集的并行能力。
设计原理
1. Lane分配机制
原理: 将多个作业分配到不同的lane,使用SIMD指令并行处理。
实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| int get_unused_lane(MB_MGR_AES_OOO *mgr) { int lane = extract_lane(mgr->unused_lanes); mgr->unused_lanes = remove_lane(mgr->unused_lanes, lane); return lane; }
void assign_job_to_lane(MB_MGR_AES_OOO *mgr, JOB_AES_HMAC *job, int lane) { mgr->job_in_lane[lane] = job; mgr->lens[lane] = job->msg_len_to_cipher_in_bytes; mgr->num_lanes_inuse++; }
|
2. 批量处理
原理: 当lane填满时,使用SIMD指令批量处理所有lane。
示例: AES-CBC加密(AVX版本,8个lane)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| void aes_cbc_enc_128_x8(MB_MGR_AES_OOO *mgr) { __m256i iv0 = _mm256_loadu_si256((__m256i*)mgr->args.IV[0]); __m256i iv1 = _mm256_loadu_si256((__m256i*)mgr->args.IV[1]); __m256i data0 = _mm256_loadu_si256((__m256i*)mgr->args.in[0]); __m256i encrypted0 = _mm256_aesenc_epi128(data0, key); _mm256_storeu_si256((__m256i*)mgr->args.out[0], encrypted0); }
|
3. 乱序执行
原理: 作业可以乱序完成,不需要按照提交顺序。
优势:
- 提高CPU利用率
- 减少等待时间
- 适应不同大小的作业
实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| JOB_AES_HMAC *submit_job(MB_MGR *mgr) { JOB_AES_HMAC *job = get_next_job(mgr); int lane = get_unused_lane(&mgr->aes_ooo); assign_job_to_lane(&mgr->aes_ooo, job, lane); if (mgr->aes_ooo.num_lanes_inuse >= NUM_LANES) { process_batch(mgr); } return job; }
void process_batch(MB_MGR_AES_OOO *mgr) { aes_cbc_enc_128_x8(mgr); for (int i = 0; i < NUM_LANES; i++) { if (mgr->job_in_lane[i]) { mgr->job_in_lane[i]->status = STS_COMPLETED_AES; mgr->job_in_lane[i] = NULL; } } mgr->num_lanes_inuse = 0; mgr->unused_lanes = ALL_LANES_FREE; }
|
4. 刷新机制
原理: 强制处理所有待处理的作业,即使lane未满。
实现:
1 2 3 4 5 6 7 8 9 10 11 12
| JOB_AES_HMAC *flush_job(MB_MGR *mgr) { if (mgr->aes_ooo.num_lanes_inuse > 0) { fill_empty_lanes(mgr); process_batch(mgr); } return get_completed_job(mgr); }
|
性能优化策略
1. SIMD向量化
原理
使用SIMD指令同时处理多个数据元素。
实现层次
SSE (4 lanes):
1 2 3 4 5 6 7 8 9 10 11
| __m128i data0 = _mm_loadu_si128((__m128i*)src[0]); __m128i data1 = _mm_loadu_si128((__m128i*)src[1]); __m128i data2 = _mm_loadu_si128((__m128i*)src[2]); __m128i data3 = _mm_loadu_si128((__m128i*)src[3]);
__m128i enc0 = _mm_aesenc_si128(data0, key); __m128i enc1 = _mm_aesenc_si128(data1, key); __m128i enc2 = _mm_aesenc_si128(data2, key); __m128i enc3 = _mm_aesenc_si128(data3, key);
|
AVX2 (8 lanes):
1 2 3 4 5 6 7 8
| __m256i data01 = _mm256_loadu_si256((__m256i*)src[0]); __m256i data23 = _mm256_loadu_si256((__m256i*)src[2]);
__m256i enc01 = _mm256_aesenc_epi128(data01, key);
|
AVX512 (16 lanes):
1 2 3 4 5 6 7
| __m512i data0_3 = _mm512_loadu_si512(src);
__m512i enc0_3 = _mm512_aesenc_epi128(data0_3, key);
|
2. 硬件指令利用
AES-NI指令
AESENC/AESDEC: AES加密/解密轮
1 2
| __m128i aesenc(__m128i data, __m128i round_key);
|
AESKEYGENASSIST: AES密钥生成
1 2
| __m128i aeskeygenassist(__m128i key, int round);
|
PCLMULQDQ指令
GF(2^128)乘法: 用于GCM的GHASH
1 2
| __m128i _mm_clmulepi64_si128(__m128i a, __m128i b, int imm8);
|
SHA-NI指令(如果可用)
SHA1/SHA256加速: 硬件SHA指令
1 2 3
| __m128i _mm_sha1msg1_epu32(__m128i a, __m128i b); __m128i _mm_sha1msg2_epu32(__m128i a, __m128i b);
|
3. 预计算优化
GCM密钥预计算
原理: 预计算GHASH所需的所有密钥表。
实现:
1 2 3 4 5 6 7 8 9 10 11 12
| void aes_gcm_precomp_128_sse(struct gcm_key_data *key_data) { uint8_t hkey[16]; for (int i = 0; i < 8; i++) { ghash_multiply(hkey, key_data->ghash_keys.sse_avx.shifted_hkey + i*16); } }
|
4. 内存对齐优化
对齐要求
- 16字节对齐: SSE操作
- 32字节对齐: AVX操作
- 64字节对齐: AVX512操作
实现
1 2 3 4 5 6 7 8
| DECLARE_ALIGNED(uint8_t buffer[256], 32);
if ((uintptr_t)ptr & 0x1F) { }
|
5. 缓存优化
数据布局
- 紧凑布局: 相关数据放在一起
- 对齐到缓存行: 64字节对齐
- 预取: 使用硬件预取指令
在SPDK中的应用
使用场景
- IPSec加密: 在NVMe over Fabrics等场景中提供IPSec加密支持
- 数据完整性: 提供数据完整性验证
- 高性能加密: 需要高吞吐量的加密场景
集成方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| #include "intel-ipsec-mb.h"
MB_MGR *mgr = alloc_mb_mgr(0);
JOB_AES_HMAC *job = get_next_job(mgr); job->cipher_mode = GCM; job->hash_alg = AES_GMAC; job->aes_enc_key_expanded = expanded_key; job->src = plaintext; job->dst = ciphertext; job->iv = iv; job->msg_len_to_cipher_in_bytes = len; job->msg_len_to_hash_in_bytes = len;
submit_job(mgr);
JOB_AES_HMAC *completed = get_completed_job(mgr); if (completed->status == STS_COMPLETED) { }
|
性能影响
- 高吞吐: 可达数十Gbps的加密吞吐量
- 低延迟: 批量处理减少延迟
- CPU效率: 充分利用SIMD指令,提高CPU利用率
算法支持矩阵
加密算法
| 算法 |
SSE |
AVX |
AVX2 |
AVX512 |
VAES |
| AES128-GCM |
by8 |
by8 |
by8 |
by8 |
by48 |
| AES256-GCM |
by8 |
by8 |
by8 |
by8 |
by48 |
| AES128-CBC |
x4 |
x8 |
- |
- |
x16 |
| AES256-CBC |
x4 |
x8 |
- |
- |
x16 |
| AES128-CTR |
by4 |
by8 |
- |
- |
by16 |
| AES256-CTR |
by4 |
by8 |
- |
- |
by16 |
| DES/3DES |
- |
- |
- |
x16 |
- |
完整性算法
| 算法 |
SSE |
AVX |
AVX2 |
AVX512 |
| HMAC-SHA1-96 |
x4 |
x4 |
x8 |
x16 |
| HMAC-SHA256-128 |
x4 |
x4 |
x8 |
x16 |
| HMAC-SHA512-256 |
x2 |
x2 |
x4 |
x8 |
| AES-XCBC-96 |
x4 |
x8 |
- |
- |
| AES-GMAC |
by8 |
by8 |
by8 |
by8 |
说明:
- byY: 单缓冲区,一次处理Y个块
- xY: 多缓冲区,同时处理Y个缓冲区
安全考虑
安全选项
- SAFE_DATA: 清除敏感数据(密钥、IV等)
- SAFE_PARAM: 参数验证
- SAFE_LOOKUP: 常量时间查找(防止时序攻击)
编译选项
1 2
| make SAFE_DATA=y SAFE_PARAM=y SAFE_LOOKUP=y
|
算法建议
- 避免使用: DES, 3DES, HMAC-MD5(遗留算法)
- 推荐使用: AES-GCM, HMAC-SHA256/512
总结
Intel-IPSec-MB是SPDK中重要的加密加速组件,通过以下方式提供高性能:
- 多缓冲区技术: 同时处理多个作业,提高吞吐量
- SIMD优化: 充分利用现代CPU的并行计算能力
- 硬件加速: 利用AES-NI、PCLMULQDQ等硬件指令
- 乱序执行: 提高CPU利用率
- 预计算优化: 减少运行时计算开销
这些优化使得Intel-IPSec-MB能够提供比标准实现高数倍到数十倍的性能,是SPDK实现高性能加密的关键组件之一。
文档版本: 1.0
最后更新: 2024年
正在加载留言…