本发明涉及计算机系统硬件错误检测技术领域,尤其是涉及一种基于差异化编码和语句签名的可信计算方法。
背景技术:
随着计算机技术的高速发展,计算机应用系统中的运算能力得到了指数级的提高,其硬件结构复杂度也越来越高。同时计算机广泛地运用在各个领域,其中包括轨道交通、航空航天、核工业控制、车联网控制、金融及交通管理等安全要求很高的领域,而在这些安全苛求系统(safety-criticalsystem)中的任何微小的故障,都可能造成巨大的人员伤亡或经济损失。
当计算机的硬件系统受到元器件老化、长期高温环境、积灰、强电磁干扰等因素影响时,处理器元器件的逻辑状态会发生非正常的改变,导致存储内容的翻转,这些故障可能是临时性的也可能是永久性的,其结果是处理器对变量执行错误的读写或执行错误的运算,此类错误若未被系统发现将导致错误的输出结果,这被称之为静默数据损坏(silentdatacorruption,sdc)。在安全苛求系统中,静默数据损坏将导致严重的后果。在轨道交通以及航空航天等安全等级很高的领域中,为保证系统的绝对安全,需要检测所有类型的硬件故障以保证静默数据损坏的错误覆盖率满足sil4要求。
目前使用的硬件错误检测技术分为硬件容错和软件容错两大类。基于硬件的典型容错方法有三模/双模冗余(tmr/dmr)、看门狗(watchdog)等,但基于硬件的容错方法成本很高,且性能较低,对于已经投入应用的商品化硬件,要实现这些方法需要改变硬件的内部结构,因此,在现代的系统应用中,越来越多地使用软件的方法来进行检错。
软件容错方法主要是通过冗余来实现,不需专门的硬件。其中一种方式是通过指令重复执行来实现容错,不过该方法只能检测瞬时性错误,无法检测永久性错误。另一种底层硬件错误的检测方法是安全编码理论,典型应用有an码和anbd码,但是an码只能检测运算错误而无法检测操作符错误与操作数错误,anbd码虽然能覆盖所有类型的硬件错误,但是其编码方式过于复杂,将给系统带来30-100倍的额外开销,在实际系统中并不实用。
目前的计算机硬件错误检测技术只能以大幅度地牺牲系统性能为代价来满足错误覆盖率的要求,难以实现性能与检错率的平衡。
技术实现要素:
本发明的目的就是为了克服上述现有技术存在的缺陷而提供一种基于差异化编码和语句签名的可信计算方法。
本发明的目的可以通过以下技术方案来实现:
一种基于差异化编码和语句签名的可信计算方法,所述的可信计算方法依次进行编码和编译步骤,具体包括以下步骤:
s1、对源代码分别进行变量编码、运算编码和分配语句签名操作,完成编码过程,同时编码过程伴随校验操作;
s2、采用编译器对代码进行编译,输出安全二进制代码。
s1中所述的变量编码操作具体为:对源代码分别以两个不同的常量为乘数进行an码编码,得到变量第一份编码数据和变量第二份编码数据。
s1中所述的运算编码操作包括以下步骤:
s101、判断运算表达式是否为复合表达式,若为是则对其进行拆分后,再进行s102,若为否,直接进行s102;
s102、判断运算表达式的操作符是否为双目操作符,若为是,则跳转至步骤s103,若为否跳转至步骤s105;
s103、根据操作符类型,对左操作数和右操作数的变量第一份编码数据分别进行相应操作符编码运算,得到运算结果第一份编码数据;
s104、根据操作符类型,对左操作数和右操作数的变量第二份编码数据分别进行相应操作符编码运算,得到运算结果第二份编码数据,结束步骤;
s105、根据操作符类型,对左操作数的变量第一份编码数据进行相应操作符编码运算,得到运算结果第一份编码数据;
s106、根据操作符类型,对左操作数的变量第二份编码数据进行相应操作符编码运算,得到运算结果第二份编码数据,结束步骤。
所述的分配语句签名操作包括以下步骤:
s111、定义一个全局变量存储运行时的签名;
s112、判断运算表达式是否为复合表达式,若为是,则对复合表达式进行拆分后进入s113,若为否,直接进入s113;
s113、为当前运算表达式分配一个唯一的签名;
s114、计算当前表达式的签名和上一条表达式的签名的差值获得签名补偿;
s115、根据签名补偿值,更新运行时签名值。
所述的变量编码操作中的常量选取满足a1=2k+2i,a2=2k-2i,k,i为任意正整数常量,a1、a2均为选取的常量。
s1中所述的校验操作包括对编码后数据的校验和运行时签名的校验。
所述的对编码后数据的校验具体包括以下步骤:
s201、获得待校验数据的运算结果第一份编码数据和运算结果第二份编码数据;
s202、判断两份编码数据之和是否满足低(k+1)位全为0,若为是,则进入s203,若为否,则程序执行过程中发生错误终止程序;
s203、判断两份编码数据之差是否满足低(i+1)位全为0,若为是,则进入s204,若为否,则程序执行过程中发生错误终止程序;
s204、判断待校验数据的两组解码值是否相等,若为是,则程序执行过程中未发生错误,继续执行程序,若为否,则程序执行过程中发生错误终止程序。
所述的运行时签名的校验具体包括以下步骤:
s211、判断当前运行时签名值与当前程序节点所执行完的最后一条语句的语句签名值是否相等,若为是,则转至s212,若为否,则转至s213;
s212、程序执行过程中未发生错误,继续执行程序;
s213、程序执行过程中发生错误,终止程序。
所述的运算编码类型包括算术运算编码、位运算编码和数组运算编码。
与现有技术相比,本发明具有以下优点:
(1)结合了an码和重复指令的方法,并引入了差异化的编码方法和签名的思想,性能开销远小于anbd码,而检错能力能覆盖所有错误类型,即能检测出an码和重复指令技术无法单独检测出的错误类型;
(2)使编码后数据运算中出现的错误能被检测到,可检测程序执行过程中的漏执行错误:引入了语句签名思想,用于检测语句漏执行错误和控制流错误;
(3)采用了差异化an码的编码方式,通过对编码参数的特定选取将除法运算转换为移位运算,用以提升性能,修改了乘法、除法部分的编码方式,同时实现了按位运算、数组运算的编码。
(4)编码后可使程序具有能检错的模块,一旦检测到错误就执行故障导向安全的机制;
(5)无需改动硬件,适用于任何硬件平台,具有较高灵活性。
附图说明
图1为工程实现流程图;
图2为编码流程图;
图3为数据编码示意图;
图4为运算编码示意图;
图5为语句签名模块示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明的一部分实施例,而不是全部实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都应属于本发明保护的范围。
实施例
本发明提供一种基于差异化编码和语句签名的可信计算技术,主要解决计算机硬件错误检测中性能与安全性的平衡问题。
如图1和图2所示,本发明采用的技术方案是:结合an码和重复指令的方法,引入了差异化的编码方法和签名的思想,对计算机程序中的变量和运算进行编码,并对语句分配签名,用来检测计算机硬件系统中的各种故障,该方案所覆盖的计算机系统硬件错误有:
1、以错误持续时间划分:
a)永久性错误;
b)间歇性错误;
c)瞬时性错误。
2、以错误发生位置划分:
a)操作数错误;
b)操作符错误;
c)运算错误;
d)漏执行错误。
数据编码
本发明所述方案所编码的数据包括以下类型:
1、变量数据:
a)数值变量;
b)布尔变量。
2、常量数据:
a)普通常量;
b)const类型常量。
如图3,数据编码的步骤如下:
1、对原始数据以常量a1为乘数进行an码编码,得变量的第一份编码数据;
2、对原始数据以常量a2为乘数进行an码编码,得变量的第二份编码数据;
3、结束。
其中数据常量a1和a2的选取满足需a1=2k+2i,a2=2k-2i,k,i为任意正整数常量。两组数据编码体现了重复指令的方法,每组数据则是采用an码的编码方式,而a1和a2取值的不同体现了差异化的思想。
在an码编码方案中,编码值的校验是通过除法操作来实现的,但是在计算机系统中,除法操作的开销是很大的,而在本发明所述方案中,通过上述a1和a2的取值方式,可以保证每一数据的两组编码值相加和相减的值都是2的整数倍,这样可以将除法操作转换为移位操作,移位操作在计算机系统中的时间开销相对于除法操作来说是非常低的,这一方法可以大大的提高程序的性能。
运算编码:
为检测运算过程中的错误,需在变量、常量编码的基础上,对运算进行编码,如图4。
本发明所述方案所编码的操作符包括以下类型:
1、算术运算
a)算术加法运算;
b)算术减法运算;
c)算术乘法运算;
d)算术除法运算。
2、位运算
a)按位与运算;
b)按位或运算;
c)按位非运算;
3、数组运算
a)数组赋值运算;
b)数组引用运算。
运算编码的步骤如下:
1、判断表达式是否为复合表达式,若是复合表达式,跳转至步骤2,若不是复合表达式,跳转至步骤3;
2、对复合表达式进行拆分,对拆分后的表达式进行依次运算编码,即跳转至步骤1;
3、判断表达式的操作符是否为双目操作,若是,跳转至步骤4,否则为单目操作,跳转至步骤6;
4、根据操作符类型,对左操作数和右操作数的第一份编码数据分别进行相应操作符编码运算,得到运算结果的第一份编码数据;
5、根据操作符类型,对左操作数和右操作数的第二份编码数据分别进行相应操作符编码运算,得到运算结果的第二份编码数据,跳转至步骤8;
6、根据操作符类型,对左操作数的第一份编码数据进行相应操作符编码运算,得到运算结果的第一份编码数据;
7、根据操作符类型,对左操作数的第二份编码数据进行相应操作符编码运算,得到运算结果的第二份编码数据,跳转至步骤8;
8、结束。
其中,得到两组运算结果,分别对应结果变量的第一份编码数据和第二份编码数据,而运算操作数的两组编码数据在运算过程中不会改变编码形式。
在算术运算编码中,加法操作符、减法操作符的编码可直接用编码值的运算替代原始运算。乘法操作符、除法操作符的编码为保证运算结果的编码一致性和保证不溢出,需利用中间变量对操作数的编码值进行二次编码和中间解码。特别地,除法操作符的编码根据业务需求的不同还分为向上取整、向下取整、四舍五入三种不同形式。
在位运算编码中,为保证编码数据的位一致性,需将操作数的两组数据分别相加和相减后再进行相应运算,之后根据所得两组结果的数学关系,解出结果值的两份编码数据以保持结果的编码一致性。
在数组运算的编码中,需考虑下标元素的出错情况,即引入下标元素编码。
加入语句签名:
如图5所示,对数据和运算进行编码之后,可以检测出运算错误、操作数错误和操作符错误,但无法检测语句漏执行错误,为了解决这一问题,需引入程序语句签名。
本发明所述方案需加入语句签名的语句包括以下类型:
1、变量赋值语句;
2、分支语句;
3、循环语句;
4、函数调用语句。
加入语句签名的步骤如下:
1、程序开始执行之前,定义一个全局变量存储运行时签名;
2、判断表达式是否为复合表达式,若是复合表达式,跳转至步骤3,若不是复合表达式,跳转至步骤4;
3、对复合表达式进行拆分,对拆分后的表达式依次加入语句签名,即跳转至步骤2;
4、为当前语句分配一个唯一的签名语句;
5、计算当前语句签名和上一条语句签名的差值获得签名补偿;
6、根据签名补偿值,更新运行时签名值;
7、结束。
语句签名的值是在每一次运行之前离线分配的。在程序开始执行之前,每一条语句会得到一个签名值,同时运行时签名会在每运行完一条语句之后实时更新,程序正确执行的情况下,运行时签名值等于上一条执行完的语句的签名值。
校验和解码:
为了检测程序执行过程中发生的所有类型错误,需要在相应的运行节点对编码后的数据以及运行时签名进行校验,而为了还原输出,还需要对编码后的数据进行解码。
本发明所述方案需进行的校验包括以下类型:
1、编码后数据的校验;
2、运行时签名的校验。
本发明所述方案需进行数据校验的数据包括以下类型:
1、函数的输出;
2、分支表达式的入口参数;
3、循环表达式的入口参数;
4、函数调用表达式的入口参数。
编码后数据的校验步骤如下:
1、获得待校验数据的第一份编码数据和第二份编码数据;
2、判断待校验数据的两份编码数据之和是否满足低(k+1)位为全0,若是,跳转至步骤3,否则跳转至步骤5;
3、判断待校验数据的两份编码数据之差是否满足低(i+1)位为全0,若是,跳转至步骤4,否则跳转至步骤5;
4、判断待校验数据两组解码值是否相等,若是,跳转至步骤6,否则跳转至步骤5;
5、程序执行过程中发生错误,终止程序,跳转至步骤7;
6、程序执行过程中未发生错误,继续执行程序,跳转至步骤7;
7、结束。
本发明所述方案需进行运行时签名校验的程序节点包括以下类型:
1、分支入口;
2、分支出口;
3、循环入口;
4、循环出口;
5、函数入口;
6、函数出口。
运行时签名的校验步骤如下:
1、获得当前运行时签名值;
2、获得当前程序节点所执行完的最后一条语句的语句签名值;
3、判断步骤1所得签名值和步骤2所得签名值是否相等,若是跳转至步骤5,否则跳转至步骤4;
4、程序执行过程中发生错误,终止程序,跳转至步骤6;
5、程序执行过程中未发生错误,继续执行程序,跳转至步骤6;
6、结束。
本发明所述方案需进行解码的数据包括以下类型:
1、函数的输入;
2、函数的输出。
数据解码的步骤如下:
1、获得待解码数据的第一份编码数据和第二份编码数据;
2、计算待解码数据的两份编码数据之和,右移(k+1)位,获得第一份解码数据;
3、计算待解码数据的两份编码数据之差,右移(i+1)位,获得第二份解码数据;
4、结束。
程序运行过程中所有的硬件错误都会在上述校验和解码的过程中被检测到。
数据校验过程中的右移操作实质上等同于解码过程中的右移操作,因此在实际应用中,校验和解码通常是同步进行的,这样可以进一步提高性能。
本发明结合了an码和重复指令的方法,并引入了差异化的编码方法和签名的思想,对单一变量进行了差异化的两组编码,使编码后数据运算中出现的错误能被检测到,可检测程序执行过程中的漏执行错误。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到各种等效的修改或替换,这些修改或替换都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。