命令行执行
proverif xxx.pv
例子
(* test.pv:可达性学习*)
free c:channel.
free Id:bitstring [private].
free Pa:bitstring [private].
query attacker(Id).
query attacker(Pa).
process
out(c,Id);
0
第1行(* *)是注释。
第3行定义了一个信道,信道的名字是c,free类似于全局变量,标识这是一个全局都知道的知识,即攻击者也可以获取,说明信道c是公开的。
第5、6行定义了bitstring类型的变量Id和Pa,他们都是free的,但是用[private]限制了他们无法被攻击者获取到。
第11行定义了一个进程,第12行是这个进程内的一条语句,表示通过通道c将Id发送出去,第13行的0是进程结束标志也可以(也可以不写这个0和最后一个;)
第8行和第9行定义了对性质的查询,如query attacker (Id)在底层实际查询的是【not attacker (Id)】,即要判断命题【Id不会被攻击者窃取】是否是成立的。
命令行执行 proverif test.pv
例子文件hello_ext.pv如下:
(* hello_ext.pv: Hello Extended World Script *)
free c:channel.
free Id:bitstring [private].
free Pa:bitstring [private].
event evId.
event evPa.
query event(evId) ==> event(evPa).
process
out(c,Pa);
in(c,x:bitstring);
if x = Id then
event evId;
event evPa
else
event evPa
第8第9行用event关键字定义了两个事件。
第13行定义了一个进程,第14行是通过通道c将Pa发送出去,第15行是通过通道c接受一个数据,放在bitstring类型的变量x中,第16行判断x是否是Id,如果是就依次执行刚刚定义的两个event,否则只执行后一个。
第11行定义了一个查询,意思是如果事件evId发生了,那么事件evPa一定发生。
运行命令proverif hello_ext.pv,结果如下:
从结果中可以看到这个验证是通过了的,即执行了事件evId就一定执行了事件evPa。实际上在这个例子里evPa肯定没有执行,可以尝试验证query event(evCocks).,结果(是反过来证not):
Query not event(evCocks) is true.
本专栏整体参考自Proverif的User manual,链接:https://prosecco.gforge.inria.fr/personal/bblanche/proverif/