# RISC-V_KD_2024 **Repository Path**: Ziraffe/risc-v_-kd_2024 ## Basic Information - **Project Name**: RISC-V_KD_2024 - **Description**: 第四轮标准化密钥封装算法Kyber+数字签名算法Dilithium RISC-V SoC芯片 - **Primary Language**: Verilog - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2024-04-11 - **Last Updated**: 2025-03-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # RISC-V_KD_2024 ## 介绍 KD超标量处理器(Super-KD)+现代RISC-V Core形成的异构双核SoC。Kyber最高加解密性能可达80KOPS,Dilithium签名/验签性能:4.3万次/秒,数据传输速度最高1.25Gbps。 目前部分成果已被集成电路顶级期刊TCAS-II 2024收录: **J. Zhang et al., "Super K: A Superscalar CRYSTALS KYBER Processor Based on Efficient Arithmetic Array," in IEEE Transactions on Circuits and Systems II: Express Briefs, doi: 10.1109/TCSII.2024.3382772.** *(本工程RISC-V Core部分采用蜂鸟开源E203处理器,因此仅介绍Super-KD部分设计思想,由于保密原因部分代码并不开源,仅供学习分享!!!)。* ## 总体架构 Super-KD处理器架构沿用之前的Kyber协处理器设计方法,拥有两条完全独立的解码-执行-访存-写回流水线,唯一与现代超标量处理器的区别在于每个周期RISC-V Core只能发射一条指令给Super-KD(受限于ICB总线规则),但是考虑到基本每条指令的执行时间均为100周期左右,因此发射部分对处理器的吞吐率影响并不大。 ![alt text](./image/总体架构.png) ## 工程结构介绍 ``` ├─e203 //蜂鸟E203相关RTL │ ├─core │ ├─debug │ ├─fab │ ├─general │ ├─mems │ ├─perips │ ├─soc │ └─subsys ├─kd //Super-KD相关RTL │ ├─addr_ctr.v │ ├─ALU.v │ ├─binomial.v │ ├─cbd_core.v │ ├─ConstantData.v │ ├─CPA.v │ ├─CSA.v │ ├─Div2.v │ ├─expand_core.v │ ├─expand_mask.v │ ├─Func.v │ ├─IFU.v │ ├─kd_top.v │ ├─keccak.v │ ├─Kyber_Compress.v │ ├─Kyber_Decoder.v │ ├─Kyber_Decompress.v │ ├─MA.v │ ├─MAU.v │ ├─MA_s.v │ ├─MM.v │ ├─MR_ALPHA.v │ ├─MR_KD.v │ ├─MR_KYBER.v │ ├─MR_RUSED.v │ ├─MR_RUSED_DILI.v │ ├─MR_RUSED_KYBER.v │ ├─MS.v │ ├─MS_s.v │ ├─MUL22x12.v │ ├─MUL_MOD.v │ ├─NTT_AddrGen.v │ ├─POLY_ADDR_CTR.v │ ├─POLY_CALC.v │ ├─POLY_DECODER.v │ ├─rej_ms.v │ ├─rej_sample.v │ ├─ROM_H.v │ ├─ROM_L.v │ ├─ROM_M.v │ ├─ROM_TWIDDLE_DILI.v │ ├─ROM_TWIDDLE_KYBER.v │ ├─sample_in_ball.v │ ├─sha3.v │ ├─sha3_wrap.v │ ├─Shiftm.v │ ├─theta.v │ ├─thopichiiota.v │ ├─Top.v │ ├─width_convert.v ├─sdk //软件代码 ``` ## 数字签名原理 之前已经实现过Kyber密钥封装机制(KEM),然而KEM同样也存在一定问题,如果窃密方在信道中窃取了公钥,并通过和接收方一样的加密方式对信息进行加密并发送给发送方,发送方虽然可以正常解密,但无法分辨正确信息和虚假信息,这将导致双方通信失败,因此需要可以进行身份验证、防抵赖、防篡改的数字签名方案。Dilithium则是一种基于M-LWE和M-SIS(Module Short-Integer-Solution)的数字签名方案,其工作流程如下图所示。 ![alt text](./image/数字签名机制.png) 密钥生成阶段,发送方生成密钥对,该过程与Kyber的密钥生成步骤相似;签名阶段,首先对要发送的明文进行哈希散列采样得到明文的摘要,并通过私钥对摘要值进行签名,随后将签名值也就是密文发送给接收方,需要注意的是在签名的过程中需要对密文与密钥的数学依赖性进行验证,如果超过限制则会出现密钥泄露的风险,需要重新开始新一轮的采样与签名;验签阶段则是利用非对称加密公钥的配对特性,对密文进行单向解密,并且对发送的明文同样进行散列采样得到摘要,最后利用哈希函数抗碰撞特性和抗第二原像性对验签成功与否进行验证。 ## 核心算子 ### MM模乘器 #### KD快速模乘器 由于不同的格密码方案的安全参数和运算流程存在一定差异,因此如何对不同格密码方案采用软硬件协同设计进行实现,同时全面考虑核心算子功能、处理器架构与算法的适配性是一个重点。Kyber和Dilithium具有不同的模数与维度还有采样器类型如下: ![alt text](./image/Kyber.png) ![alt text](./image/Dilithium.png) 之前已经设计过基于Kyber的快速模乘器,通过将一个大数进行划分,分别进行模约运算,减少DSP资源消耗的同时通过流水线结构提高性能。 分而治之的设计思路不能直接应用于Dilithium上,因为Dilithium的模数较大,ROM中存储的模约数会非常多,导致资源消耗成比例增长。 因此我们设计了一种可复用的KD快速模乘算法: ![alt text](./image/快速模约算法.png) 我们将Kyber和Dilithium的模约运算通过运算式进行表示,不同模数q的模约运算表示为比特位之间的加减运算,然后提取Kyber和Dilithium模约运算中相同的部分进行电路复用。 最终设计的KD可复用快速模乘器如下: 1. **降低资源开销**:Kyber和Dilithium共用一部分模约电路 2. **提高运算带宽**:结合分而治之(D&C)Kyber快速模乘电路,该KD模乘器每周期可以完成4个Kyber系数或2个Dilithium系数的模乘操作 ![alt text](./image/KD快速模乘器.png) KD快速模乘器顶层为MM.v: ``` module MM( input clk, input rst_n, input kd_sel, //0:kyber 1:dilithium input [1:0] duv_mode, //00:du=10 01:du=11 10:dv=4 11:dv=5 input [1:0] compress, //00:no compress 01:compress 11:decompress input [1:0] decompose,//00:no decompose 01:(q-1)/44 11:(q-1)/16 input [23:0] mm_a, input [23:0] mm_b, output reg [23:0] mm_o ); ``` #### Decompose 可以发现我们所设计的模乘器不只支持原先Kyber中所涉及到的Compress/Decompress运算,同时新增了对DIlithium中Decompose的运算支持。 ![alt text](./image/Decompose.png) 实际上就是将一个数分为高位和低位,低位通过模α得到,高位通过计算减去低位后的数乘以一个常数(1025/11275)得到,这里我们**借鉴LUT分而治之策略实现模α**,采用的电路结构如下: ![alt text](./image/Decompose电路.png) ### PLU_OE Array 可重构PLU奇偶阵列的结构如图所示。四个24-bit数据被输入PLU,并按照数据通路相互计算,并行输出两个24-bit结果。PLU需要支持多种多项式运算类型。因此,模乘器(MM)、模加器(MA)和模减器(MS)被组合到PLU中,以完成基本的模运算。在模乘器、模加器和模减器的输入/输出数据路径的特定位置设置了八个MUX,以选择不同的计算模式。MUX由10-bit sel信号控制。**PLU可配置为七种计算模式,包括c+a-b、c-a-b、1/2(a+b)、1/2(a-b)-c、a+b、a-b和(a-b)-c**。每种模式的数据路径都包含五级寄存器(MM 内部有四个寄存器),这样PLU就能以全流水线的方式工作,从而提高计算性能。 ![alt text](./image/PLU.png) ### 存储计算架构 本设计使用了三块双端口RAM存储运算系数,分别为Sample RAM1,Poly RAM2,Poly RAM3,为了实现SIMD技术,Decoder部分只控制RAM地址的高5位,每个执行单元控制地址的低6位,如下图所示: ![alt text](./image/RAM1.png) ![alt text](./image/RAM2.png) ![alt text](./image/RAM3.png) 为了实现不同的数据通路,Hash单元和Poly单元有多条访存路线,如图所示: ![alt text](./image/数据通路.png) ### 超标量处理器架构 #### 乱序执行 在Kyber和Dilithium算法中,哈希采样和多项式运算可以重叠进行。大多数纯硬件设计通常使用紧凑固定的硬件计算架构来支持定制指令流的并行调度。这将很难与现代处理器流水线机制相结合,而且缺乏灵活性。 因此,本设计使用了一种乱序执行处理器结构,如图所示。两个独立的Hash单元和Poly单元可以在一个周期内同时执行从IF单元发出的指令,从而提高整个处理器的吞吐量。标量RISC-V内核可以按顺序发射指令,而无需在编译器层进行特殊的调度处理。由于两个单元之间存在数据依赖性,当两条指令的操作数地址指向相同的RAM时,Super-KD会产生气泡以阻塞流水线,从而避免RAW冲突。 ![alt text](./image/调度.png) #### 流水线调度策略 为了避免内存访问冲突,同时最大限度地减少流水线阻塞,本设计提出了一种流水线调度策略:Poly单元在完成第一轮从Sample RAM中获取的系数进行NTT后,将使用两个Poly RAM进行乒乓操作,Hash单元则会等待第一轮NTT结束后再执行吸收和挤压操作。**在三个关键步骤中,平均可减少30%左右的时间消耗**。 ## 性能评估 ### FPGA原型验证 Super-KD已在Xilinx UltraScale+ FPGA平台上进行原型验证,Kyber协议的内联汇编代码大小约为11.2KB-11.7KB,Dilithium协议的内联汇编代码大小约为12.3KB-14.6KB,三种安全等级的FPGA运行结果如下(最高频率270M下): |KEM|密钥生成(us)|密钥封装(us)|解封装(us)| |-|-|-|-| |Kyber-512 |5.36|10.84|14.31| |Kyber-768 |9.89|17.15|21.98| |Kyber-1024|17.36|26.37|29.83| |DS|密钥生成(us)|签名(us)|验签(us)| |-|-|-|-| |Dilithium-2|27.41|46.25|37.48| |Dilithium-3|45.75|90.30|61.03| |Dilithium-5|81.15|145.11|96.38| *这里的签名时间为一次成功的时间(Dilithium一次签名成功的概率≈21%)* |Work|Method|Platform|LUTs|FFs|CLBs|DSPs|BRAMs|Freq(MHz)| |-|-|-|-|-|-|-|-|-| |Super-KD|HW|UlrtaScale+|38893|8612|6691|8|11.5|270| ## 运行结果 ## 参考资料 ## 联系方式 email:964400235@qq.com