一种RTL硬件木马测试向量的生成方法与流程

文档序号:12962180阅读:456来源:国知局
一种RTL硬件木马测试向量的生成方法与流程

本发明涉及集成电路测试领域,具体涉及到一种rtl硬件木马测试向量的生成方法,可针对条件触发型硬件木马的特征快速生成具有高路径覆盖率、并包含可激活条件触发型硬件木马的测试向量。



背景技术:

在数字集成电路设计中,不同的设计环节对应着不同抽象层次的设计。抽象程度从高到低,分别是功能规范、算法级/微体系结构级设计、寄存器传输级设计(register-transferlevel,rtl)、门级(gatelevel)设计和物理级设计。硬件木马可以分布在不同的抽象层次上,主要有系统级、行为描述级、寄存器传输级、门级、晶体管级和物理级。njacob等人在文献“hardwaretrojans_currentchallengesandapproaches”中分析了目前硬件木马可能插入的阶段,已经提出的硬件木马较多的集中在功能设计阶段(寄存器传输级)。

目前的硬件木马检测技术中,只有很少的文献对功能设计阶段和物理设计阶段(门级)进行检测,绝大数的文献都集中在制造阶段的检测;功能设计阶段检测的技术使用的是形式化验证技术,物理设计阶段使用的功能分析,制造阶段使用的检测技术主要是侧信道分析和结构修改。侧信道分析是一种非破坏性的检测技术,主要分析电路中的时序、功率、电磁、热等信号,根据与黄金模板的比对发现木马。旁路分析能有效检测出较大规模的硬件木马,但容易受到工艺变量和各种噪声的影响,难以检测出小规模硬件木马。针对门级安全检测的门级信息流技术对原始门级网表生成包含信息流的门级信息流逻辑的门级网表,但是其新生成的门级网表复杂度与原始门级网表相比,高了近2^n倍,大大限制了其在实际中的应用。

寄存器传输级的硬件木马检测,近年来有一些新的方法提出。倪林等在文献“基于特征匹配的ip软核硬件木马检测”中提出一种硬件木马检查方法,该方法通过分析rtl级代码书写规则,从硬件木马在rtl级ip软核中实现的角度出发,基于trust-hub构建硬件木马特征识别库,通过分析硬件木马典型的逻辑结构和行为特征,对硬件木马特征库和待测ip软核进行逻辑抽象,进而完成ip软核硬件木马识别。特征匹配的方法需根据大量的硬件木马样板,创建特征库,然后做匹配。这种源自软件安全测试的方法无法发现新的恶意代码。候波等在文献“基于测试向量的硬件木马检测方法及系统”中了一种方法,通过获取集成电路中各电路节点的翻转信息和覆盖信息,将翻转信息和覆盖信息分别满足预设低翻转条件和预设低覆盖条件的电路节点选取为候选木马节点,根据候选木马节点的信息从测试向量中选取最终测试向量。

从这些文献可以分析出,主要的寄存器传输级安全检测方法集中在特征匹配、形式化验证、测试生成方面。形式化验证方法则在应对大规模复杂设计时仍然有很大的分析难度。测试生成方法仍然是一种非常重要的检测手段。由于采用穷举的方式对所有的输入值进行检测是不现实的,因此测试生成方法的关键问题在于测试向量空间不断增大的情况下,如何有效地生成测试向量值。因此寄存器传输级的安全检测,与测试生成方法密切相关。vvacharya等人在文献“branchguidedfunctionaltestgenerationatthertl”中采用了符号执行的方法对rtl级的硬件描述语言进行了分析。其基本思想是将verilog代码转换成c/c++,然后使用相对较为成熟的c/c++语言的符号执行方法进行分析,然后再将分析生成的测试向量重新用回到verilog代码中。这种方法没有直接对verilog代码进行分析,采用代码转换的方式,难以做到和原始verilog设计的完全一致。



技术实现要素:

针对现有技术的不足,本发明旨在提供一种rtl硬件木马测试向量的生成方法,用以解决检测条件触发型硬件木马的测试生成问题。该方法采用静态分析verilog代码的方法,采用多线程并发技术实现verilog代码的并发符号执行,从而达到快速生成高路径覆盖率的测试向量的目的。

为了实现上述目的,本发明采用如下技术方案:

一种rtl硬件木马测试向量的生成方法,包括如下步骤:

s1生成verilog代码的控制流图cfg;

s2根据步骤s1生成的控制流图cfg,对待分析的模块文件使用并发符号执行技术,得到指定路径条件pc下输出变量的符号执行表达式,即<pc,exp>;

s3对步骤s2中得到的路径条件pc进行可满足性求解,得到可满足的路径条件集合及其对应的输入变量取值,生成测试向量;

s4依据步骤s3中得到的测试向量,由<pc,exp>的映射关系,求解出输出变量在可满足性求解的路径条件pc下对应的符号执行表达式exp的取值;得到<测试向量,输出向量>的映射关系。

需要说明的是,步骤s1中,通过定义语句结点类型,生成语句结点,建立语句结点的前驱和后继关系,生成控制流图。

进一步需要说明的是,步骤s1具体包括如下步骤:

s1.1设计的语句结点类型有:always,always_end,if,else,if_end,case,casex,casez,case_item,case_end,for,for_end,task,task_end,assign_block,assign_nonblock,assign_continuous,instantiation;

另外,整个代码的开始增加一个enter结点,结束增加一个exit结点,不确定类型是none结点,其中always,if,case(casex,casez),for,task所对应的结点为控制结点,enter和exit是控制结点,阻塞赋值、非阻塞赋值和连续赋值为赋值结点;采用开源的antrl4以及terenceparr撰写的verilog2001.g4,解析verilog寄存器传输级设计代码的语法,依次提取每条verilog语句进行分析;设计生成控制流图的语句结点;一条语句对应控制流图中的一个结点,语句结点的类型针对verilog可综合的语句设定;为了能够有效区分出不同模块文件中的变量,将所有分析的变量名改为如下形式:模块名_m_原变量名;

s1.2根据语句结点类型建立语句结点之间的前驱和后继关系:语句结点之间的控制流关系体现在控制结点之间以及控制结点和赋值结点之间的连接,对于赋值结点之间的连接,不表示控制关系,只是表示出赋值结点代表的语句在代码中的位置关系,添加的enter结点是整个代码的开始结点,exit结点是整个代码的结束结点,always语句段,例化语句和连续赋值语句之间是并行关系,always语句段内的if、case、for语句之间存在着语法相关的控制区间和控制顺序的关系;根据控制区间和控制关系确定出各个语句结点之间的前驱和后继关系;

s1.3依据每个语句结点之间的前驱和后继关系,采用广度优先遍历,生成verilog代码的控制流图cfg。

需要说明的是,步骤s2具体如下:

s2.1循环处理每一个例化语句,获取例化模块对应的子模块文件名,得到子模块文件的符号执行结果;

s2.2根据例化语句端口变量映射关系,将子模块端口变量名替换成待分析的模块文件端口变量名,同时将pc和exp中包含的子模块端口变量名替换成待分析的模块文件端口变量名;

s2.3待分析的模块文件进行符号执行操作,同时将路径条件pc转换为smt-libv2的语法形式,将exp转换为smt-libv2的语法形式化;然后返回输出变量对应的<pc,exp>集合。

进一步需要说明的是,步骤s2.3具体如下:

s2.3.1将pc和exp的verilog中缀表达式转换成前缀表达式的smt-libv2语法;其中,控制结点的路径条件=其所属控制结点的路径条件and自身条件;赋值结点的路径条件=其所属控制结点的路径条件;

s2.3.2针对always语句节点和assign_contiunous语句节点,启动子线程symbolexecutionthread对每一个always语句段和连续赋值语句并发进行分析;

s2.3.3当所有启动的子线程分析结束,将pc中的非输入变量替换成输入变量,得到<pc,exp>。

更进一步需要说明的是,步骤2.3.2具体如下:

s2.3.2.1从cfg中找到需要分析的always语句段的第一个结点,或者连续赋值语句结点作为subroot;

s2.3.2.2根据结点的后继关系,深度优先遍历以subroot为根的子树,对其中的每一个结点进行访问;如果是语句结点类型是非阻塞赋值、阻塞赋值或者连续赋值,则判断符号执行表达式exp中的非输入变量var_i的isdone标志;如果isdone为false,则子线程挂起,等待var_i符号执行结束,即等待var_i的isdone标志置为true;如果isdone为true,则取出var_i的<pc’,exp’>集合,用其中的exp’替换掉原表达式中的var_i,pc’和原赋值语句的pc进行与操作;

s2.3.2.3以subroot为根的子树的深度遍历结束,置always语句段中的被赋值变量或者连续赋值变量的isdone为true,通知因为本always变量集合或连续赋值变量挂起的子线程解挂。

需要说明的是,步骤s3具体如下:

s3.1逐条取出路径条件pc,构建smt-libv2形式的求解语句;

s3.2对smt-libv2形式的求解语句进行可满足性求解;

s3.3如果pc是可以求解的,则获取求解出的输入变量值,跳至步骤s3.1;否则不予处理

步骤3.4:对求解出的pc集合,进入步骤s4执行。

本发明的有益效果在于:可以通过分析verilog顶层文件,进而将整个相关子模块都自动分析完成,加快了rtl硬件木马测试向量生成的速度和有效性,提高了代码分析的分支覆盖率,提高了代码分析的整体效率。

附图说明

图1为本发明的整体设计方案流程图;

图2为本发明的控制流图生成流程示意图;

图3为本发明的并发符号执行流程示意图;

图4为本发明的测试向量生成流程示意图;

图5为本发明实施例1的uart.v中63-69行的控制流图示意图;

图6为本发明实施例1的uart.v中71-77行的控制流图示意图;

图7本发明实施例1的uart.v中79-86行的控制流图示意图;

图8本发明实施例1的uart.v中88-98行的控制流图示意图;

图9本发明实施例1的uart.v中100-111行的控制流图示意图。

具体实施方式

以下将结合附图对本发明作进一步的描述,需要说明的是,以下实施例以本技术方案为前提,给出了详细的实施方式和具体的操作过程,但本发明的范围并不限于本实施例。

如图1所示,所述rtl硬件木马测试向量的生成方法包括如下步骤

步骤1.生成verilog代码的控制流图cfg(controlflowgraph),如图2所示:

1.1)采用开源的antrl4以及terenceparr撰写的verilog2001.g4,解析verilog寄存器传输级设计代码的语法,依次提取每条verilog语句进行分析。设计生成控制流图的语句结点。一条语句对应控制流图中的一个结点,语句结点的类型针对verilog可综合的语句设定。具体设计的语句结点类型有:always,always_end,if,else,if_end,case,casex,casez,case_item(case语句分支),case_end,for,for_end,task,task_end,assign_block(阻塞赋值),assign_nonblock(非阻塞赋值),assign_continuous(连续赋值),instantiation(例化)。另外,整个代码的开始增加一个enter结点,结束增加一个exit结点,不确定类型是none结点。其中always,if,case(casex,casez),for,task所对应的结点为控制结点,enter和exit是控制结点,阻塞赋值、非阻塞赋值和连续赋值为赋值结点。

1.2)根据语句结点类型建立语句结点之间的前驱和后继关系。语句结点之间的控制流关系体现在控制结点之间以及控制结点和赋值结点之间的连接。对于赋值结点之间的连接,不表示控制关系,只是表示出赋值结点代表的语句在代码中的位置关系。添加的enter结点是整个代码的开始结点,exit结点是整个代码的结束结点。always语句段,例化语句和连续赋值语句之间是并行关系。always语句段内的if、case、for语句之间存在着控制区间和控制顺序的关系。根据控制区间和控制关系确定出各个语句结点之间的前驱和后继关系。

1.3)依据每个语句结点之间的前驱后继关系,采用广度优先遍历,生成verilog代码的控制流图cfg。

步骤2.根据步骤1生成的控制流图cfg,使用并发符号执行技术,得到指定路径条件pc(pathcondition)下输出变量的符号执行表达式,即只用输入变量和常量表示输出变量,如图3所示:

2.1)循环处理每一个例化语句,获取例化模块对应的文件名filename,得到子模块文件的符号执行结果。

2.2)根据例化语句端口变量映射关系,将子模块端口变量名替换成待分析的模块文件端口变量名,同时将pc和exp中包含的子模块端口变量名替换成待分析的模块文件端口变量名。

2.3)待分析的模块文件进行符号执行操作,同时将路径条件pc转换为smt-libv2的语法形式。

返回输出变量对应的<pc,exp>集合

其中2.3)中的符号执行是整个设计方案的关键点之一,具体的设计是:将控制结点路径条件pc和符号执行表达式exp的verilog中缀表达式转换成前缀表达式的smt-libv2语法。其中,控制结点的路径条件=其所属控制结点的路径条件and自身条件;赋值结点的路径条件=其所属控制结点的路径条件。针对always语句节点和assign_contiunous语句节点,启动子线程symbolexecutionthread对每一个always语句段和连续赋值语句并发进行分析。当所有启动的子线程分析结束,将pc中的非输入变量替换成输入变量。

子线程symbolexecutionthread实现了并发执行always语句和连续赋值的功能。由于变量之间的相关性,一个always语句段或者连续赋值语句中的被赋值变量可能依赖与其他always语句段或者连续赋值语句中的变量,在这种情况下需要挂起子线程,等待被依赖变量的子线程执行结束。具体的设计是:从cfg中找到需要分析的always语句段的第一个结点,或者连续赋值语句结点作为subroot。根据结点的后继关系,深度优先遍历以subroot为根的子树,对其中的每一个结点进行访问。如果是语句结点类型是非阻塞赋值、阻塞赋值或者连续赋值,则判断符号执行表达式中的非输入变量var_i的isdone标志。如果isdone为false,则子线程挂起,等待var_i符号执行结束,即等待var_i的isdone标志置为true;如果isdone为true,则取出var_i的<pc’,exp’>集合,用其中的exp’替换掉原表达式中的var_i,pc’和原赋值语句的pc进行与操作。以subroot为根的子树的深度遍历结束,置always语句段中的被赋值变量或者连续赋值变量的isdone为true,通知因为本always变量集合或连续赋值变量挂起的子线程解挂。

步骤3.对步骤2中得到的路径条件进行可满足性求解,得到可满足的路径条件pc集合及其对应的输入变量取值,生成测试向量。此部分使用了微软公司的求解器z3,实现了verilog代码各个路径条件pc的可满足性求解。具体设计如下:

3.1)逐条取出路径条件pc,构建smt-libv2形式的pc语句;

3.2)对smt-libv2形式的pc语句进行可满足性求解;

3.3)如果pc是可以求解的,则获取求解出的输入变量值,跳至3.1);否则不予处理。

步骤4.如图4所示,依据步骤3中得到的测试向量,由<pc,exp>的映射关系,求解出输出变量在可满足性求解的路径条件pc下对应的表达式exp的取值;得到<测试向量,输出向量>的映射关系。由于经过了可满足性求解,使得测试向量空间大大缩减,从而使得<测试向量,输出向量>的映射关系大大小于原始的映射关系空间。从映射关系中,即可以发现导致异常输出向量的测试向量值。

实施例1

选取trust-hub上的rs232-t400为分析对象,其中包含了三个verilog文件:uart.v,u_xmit.v,u_rec.v。此三个verilog文件如下文所示。顶层文件uart.v中的木马触发器比较发送和接收的数据,在两者都等于8’h4c时,木马被激活。木马的负载部分会将接收数据中的4bit替换掉。

1.uart.v程序源码:

2.u_xmit.v程序源码:

3.u_rec.v程序源码:

本实施例以uart.v为例,其中含有2个例化语句,将会依次分析u_xmit.v和u_rec.v。

步骤1:控制流图的生成

1)深度遍历uart.v文件的语法解析树(parsetree),获取语句结点的信息。例如:整个文件的第一个结点是enter结点,最后一个结点是exit结点,得到的语句信息是:

(1)第0个结点,enter结点,索引值0,控制区间[3,116](3,和116表示语句所在的行号,后继步骤方括号中数值表示相同含义);

(2)第1个结点,例化结点,对应例化文件u_xmit.v,索引值1,控制区间[63,70],其控制结点为enter,enter的控制区间为[3,116];

(3)第2个结点,例化结点,对应例化文件u_rec.v,索引值2,控制区间[72,81],其控制结点为enter,enter的控制区间为[3,116];

(4)第3个结点,always结点,索引值3,控制区间[83,90],其控制结点为enter,enter的控制区间为[3,116];

(5)第4个结点,if结点,索引值4,控制区间[84,89],其控制结点为always结点(结点3),always结点控制区间为[83,90];

(6)第5个结点,阻塞赋值结点,索引值5,控制区间[85,85],其控制结点为if结点(结点4),if结点的控制区间为[84,89];

(7)第6个结点,else结点,索引值6,控制区间[87,89],其控制结点为if结点(结点4),if结点的控制区间为[84,89];

(8)第7个结点,阻塞赋值结点,索引值7,控制区间[88,88],其控制结点为else结点(结点6),else结点的控制区间为[87,89];

(9)第8个结点,if语句段结束结点,索引值8,控制区间[89,89],其控制结点为if结点(结点6),if结点的控制区间为[84,89];

(10)第9个结点,always语句段结束结点,索引值9,控制区间[90,90],其控制结点为always结点(结点3),always结点的控制区间为[83,90];

(11)以此类推,到最后的结点第32个结点,exit结点,索引值32,控制区间[116,116],其控制结点为enter结点,enter结点的控制区间为[3,116]。

2)通过语句结点之间的控制区间所属关系,建立各个结点之间的前驱和后继关系。对于1)中得到的语句结点,

(1)结点0为enter结点;

(2)结点1为例化结点,因为其控制结点为enter,所以结点1的前驱包含结点0,结点0的后继包含结点1;

(3)结点2为例化结点,因为其控制结点为enter,所以结点2的前驱包含结点0,结点0的后继包含结点2;

(4)结点3为always结点,因为其控制结点为enter,所以结点3的前驱包含结点0,结点0的后继包含结点3;

(5)结点4为if结点,因为其控制结点为结点3,所以结点4的前驱包含结点3,结点3的后继包含结点4;

(6)结点5为阻塞赋值结点,因为其控制结点为结点4,所以结点5的前驱包含结点4,结点4的后继包含结点5;

(7)结点6为else结点,因为其控制结点为结点4,所以结点6的前驱包含结点4,结点4的后继包含结点6;

(8)结点7为阻塞赋值结点,因为其控制结点为结点6,所以结点7的前驱包含结点6,结点6的后继包含结点7;

(9)结点8为if语句段结束结点,因为其控制结点为结点4,所以结点8的前驱包含结点5和7,结点5的后继包含结点8,结点7的后继包含结点8;

(10)结点9为always语句段结束结点,因为其控制结点为结点3,所以结点9的前驱包含结点8,结点8的后继包含结点9;

(11)以此类推,得到所有语句结点的前驱和后继关系。

3)根据广度优先算法进行遍历,最后得到如图5-9所示的uart.v的控制流图。图5-9中的数值表示语句结点在源代码中的行号,enter表示代码开始的行号,exit结点表示代码结束的行号。

4)同法得到u_ximt.v,u_rec.v的控制流图。

步骤2:并发符号执行

1)如果有例化模块,则对每一个例化模块文件进行递归的并发符号执行。则uart.v的两个例化语句会引起对u_ximt.v和u_rec.v两个文件的并发符号执行;

对于u_ximt.v文件的并发符号执行,其结果经过递归调用返回给uart.v文件的并发符号执行过程(为了能够有效区分出不同模块文件中的变量,设定变量名的形式为:模块名_m_原变量名,如原u_xmit.v中的变量sys_clk,改为u_xmit_m_sys_clk)。

2)由uart.v文件63-69行,分析出端口映射关系如下:

u_xmit_m_sys_clk<->uart_m_sys_clk

u_xmit_m_sys_rst_l<->uart_m_sys_rst_l

u_xmit_m_uart_xmith<->uart_m_uart_xmit_datah

u_xmit_m_xmith<->uart_m_xmith

u_xmit_m_xmit_datah<->uart_m_xmit_datah

u_xmit_m_xmit_doneh<->uart_m_xmit_doneh

依据上面得到的端口映射关系将u_ximt.v的执行结果替换成uart.v文件中的变量。

由uart.v文件71-77行,分析出端口映射关系如下:

u_rec_m_sys_rst_l<->uart_m_sys_rst_l

u_rec_m_sys_clk<->uart_m_sys_clk

u_rec_m_uart_datah<->uart_m_uart_rec_datah

u_rec_m_rec_datah<->uart_m_rec_datah_rec

u_rec_m_rec_readyh<->uart_m_rec_readyh

依据上面得到的端口映射关系将u_rec.v的执行结果替换成uart.v文件中的变量。

并发符号执行剩余的always语句段和连续赋值语句,返回输出变量对应的<pc,exp>集合如下:

并发符号执行一个verilog文件中的always语句段和连续赋值语句的结果如下(多线程并发执行具有一定的随机性,每次每个子线程运行的顺序不一定相同,但相关变量之间的约束执行是不变的。表中的数值表示运行语句对应源代码中的行号):

表1:u_ximt.v并发符号执行的过程

表2:u_rec.v并发符号执行的过程

表3:uart.v并发符号执行的过程

返回的<pc,exp>的结果总共594条,形式如下:

pc=(andtrue(=(bvnotuart_m_sys_rst_l)(_bv10))),

exp=uart_m_rec_datah=#b00000000

其中,pc和exp都是smt-libv2的语法形式

步骤3:可满足性求解

1)逐条取出步骤2中得到的<pc,exp>中的路径条件pc;

2)对pc语句进行可满足性求解;

3)如果pc是可以求解的,则获取求解出的输入变量值,跳至1);否则不予处理

最后得到可以求解的pc。uart_m_rec_datah得到3个可满足的求解,uart_m_uart_xmit_datah得到6个可满足的求解,uart_m_xmit_doneh得到5个可满足的求解,uart_m_rec_readyh得到5个可满足的求解。

步骤4:得到每个输出变量求解对应的输入变量向量。

1)输出变量uart_m_rec_datah,是受木马激活后影响的变量,其对应的输入变量求解值有3组是可满足的:

(1)uart_m_sys_rst_l=0,对应的情况是复位信号有效,为低电平时,uart_m_rec_datah被复位为0;

(2)uart_m_sys_rst_l=1,uart_m_xmit_datah=76,uart_m_uart_rec_datah=0。对应的情况是当uart_m_xmit_datah=uart_m_rec_datah,uart_m_rec_datah=76时,uart_m_rec_datah受到木马激活影响后输出异常;

(3)uart_m_sys_rst_l=1,uart_m_xmit_datah=76,uart_m_uart_rec_datah=1,对应的情况是当除了第1和第2种情况外,uart_m_rec_datah没有受到木马激活影响的正常输出,始终保持发送方串行输入前的8bit数据等于接收方串行输出的8bit数据。

2)uart_m_uart_xmit_datah,其对应的可满足解有:

(1)uart_m_sys_rst_l=0,对应的情况是发送有限状态机中x_idle状态的一个路径条件;

(2)uart_m_sys_rst_l=1,对应的情况是发送有限状态机中x_start状态,x_wait状态,x_shift状态,x_stop状态和default状态五个条件路径。

3)uart_m_xmit_doneh,其对应的可满足解有5个:

(1)uart_m_sys_rst_l=0,对应的情况是复位路径条件;取值为0

(2)uart_m_sys_rst_l=1,对应的情况有发送有限状态机中的x_idle状态并且uart_m_xmith=0,x_stop状态和default状态的三个路径条件,以及其他剩余状态的一个路径条件。取值为1

4)uart_m_rec_readyh,其对应的可满足解有5个:

(1)uart_m_sys_rst_l=0,对应的情况是复位路径条件;取值为0

(2)uart_m_sys_rst_l=1,对应的情况有接收有限状态机中的r_start,r_stop和default的三个路径条件,以及其他剩余状态的一个路径条件。取值为1

分析结果显示,本发明方法可以快速自动化的构造出少量而有效的测试向量,具有高路径覆盖率,并且可以包含激活条件触发型硬件木马的测试向量。

对于本领域的技术人员来说,可以根据以上的技术方案和构思,给出各种相应的改变和变形,而所有的这些改变和变形,都应该包括在本发明权利要求的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1