【ProVerif学习笔记】3:进程宏和进程书写的语法规则
1 进程宏
进程宏(Process Macros)用来定义子进程,因为在用ProVerif对协议进行建模时,直接一个大的主进程比较混乱,进程宏的形式为:
l e t R ( x 1 : t 1 , . . . , x n : t n ) = P . \bold{let} \ \ R(x_1:t_1,...,x_n:t_n)=P. let R(x1:t1,...,xn:tn)=P.
其中 R R R是宏的名字, P P P是子进程, x 1 , . . . , x n x_1,...,x_n x1,...,xn是 P P P里面的free变量,当使用这个宏时(原文叫macro expansion)就把使用时的参数传进去了。
例如:
free c:channel.free Cocks:bitstring [private].
free RSA:bitstring [private].
query attacker(Cocks).let R(x:bitstring) = out(c,x);0.let R'(y:bitstring) = 0.process R(RSA) | R'(Cocks)
第7行和第9行定义了两个过程宏R
和R'
,R
将参数x
从通道c
输出,R'
什么都不做。
第11行进行macro expansion,分别将定义的两个free变量作为参数传入,两个进程并发执行。
2 进程书写的语法规则
2.1 项和进程的语法
这里大部分都能和编程语言里的概念对应上,只有几个特别的部分需要说明。
P ∣ Q P \ | \ Q P ∣ Q表示进程 P P P和进程 Q Q Q的并发组合执行,即parallel composition。
! P !P !P表示无限个 P P P进程的并发组合执行,即infinite parallel composition,称为replication。
n e w n : t ; P \bold{new} \ \ n:t;P new n:t;P表示绑定进程 P P P中类型为 t t t的name n n n,即name restriction。
i f M t h e n P e l s e Q \bold{if} \ M \ \bold{then} \ P \ \bold{else} \ Q if M then P else Q是条件选择, M M M必须是一个计算布尔值的项,条件为真时执行P,假时执行Q,但是要注意 M M M执行失败的情况,例如 M M M中存在一个析构器,并且找不到与之对应的重写规则(rewrite rules),这个时候就是执行失败了,那么整个都不会执行。
l e t x = M i n P e l s e Q \bold{let} \ \ x=M \ \bold{in} \ P \ \bold{else} \ Q let x=M in P else Q是项求值,如果 M M M能执行成功,它的值会赋给 x x x( x x x进行自动类型推导,和 M M M的类型一致),然后执行 P P P。如果 M M M执行失败,那么执行 Q Q Q。
2. 2 模式匹配的语法
变量模式 x : t x:t x:t匹配类型为 t t t的任何模式,然后绑定给 x x x,常用在有显式或者隐式赋值的地方。
变量模式 x x x也是一样,但是要求 x x x的类型必须能通过上下文推导出来才行。
元组模式 ( T 1 , . . . , T n ) (T_1,...,T_n) (T1,...,Tn)匹配的就是和每个位置类型一致的元组 ( M 1 , . . . , M n ) (M_1,...,M_n) (M1,...,Mn)。
= M =M =M模式匹配的是一个与项 M M M相等的项 N N N。
2.3 作用域和绑定
这里主要讲了加括号和优先级的问题, P ∣ Q P \ | \ Q P ∣ Q是最先结合的,然后是if-then-else和let-in-else,最后是一元操作,如 ! P !P !P。所以 ! P ∣ Q !P \ | \ Q !P ∣ Q将被视为 ! ( P ∣ Q ) !(P \ | \ Q) !(P ∣ Q),这个和编程语言有挺大区别的。
还有就是省略 e l s e 0 else \ 0 else 0的习惯导致的意义不清晰,比如:
i f M = M ′ t h e n i f N = N ′ t h e n P e l s e Q \bold{if} \ M = M' \ \bold{then} \ \bold{if} \ N = N' \ \bold{then} \ P \ \bold{else} \ Q if M=M′ then if N=N′ then P else Q
它将被视为:
i f M = M ′ t h e n ( i f N = N ′ t h e n P e l s e Q ) \bold{if} \ M = M' \ \bold{then} \ (\bold{if} \ N = N' \ \bold{then} \ P \ \bold{else} \ Q) if M=M′ then (if N=N′ then P else Q)
即 e l s e else else总是和最近的没有匹配的 i f if if匹配,对于let-in-else也是一样。
2.4 标识符和注释
对于构造器和析构器,没有什么类型上的限制,只要是标识符就行。标识符是用字母、数字、下划线、单引号组成的序列,区分大小写,避开保留字,且必须以字母开头。
注释是用(*
和*)
括起来的部分,不支持嵌套注释。
2.5 保留字
among, axiom, channel, choice, clauses, const, def, diff, do, elimtrue, else, equation, equivalence, event, expand, fail, for, forall, foreach, free, fun, get, if, implementation, in, inj-event, insert, lemma, let, letfun, new, noninterf, not, nounif, or, otherwise, out, param, phase, pred, proba, process, proof, public vars, putbegin, query, reduc, restriction, secret, set, suchthat, sync, table, then, type, weaksecret, yield.
另外,ProVerif有内置类型bitstring、bool、time,以及逻辑量true、false,它们不属于保留字,可以被当作标识符,但是不建议这样做。
3 示例:书写握手协议
这里实际要用到上一章示例中定义的对称加密、非对称加密和签名的内容,这里把那些部分省略了没有写出来。
free c:channel.free s:bitstring [private].
query attacker(s).let clientA(pkA:pkey,skA:skey,pkB:spkey) =out(c,pkA);in(c,x:bitstring);let y = adec(x,skA) inlet (=pkB,k:key) = checksign(y,pkB) inout(c,senc(s,k)).let serverB(pkB:spkey,skB:sskey) =in(c,pkX:pkey);new k:key;out(c,aenc(sign((pkB,k),skB),pkX));in(c,x:bitstring);let z = sdec(x,k) in0.processnew skA:skey;new skB:sskey;let pkA = pk(skA) in out(c,pkA);let pkB = spk(skB) in out(c,pkB);( (!clientA(pkA,skA,pkB)) | (!serverB(pkB,skB)) )
在process
处开始的是主进程,可以看到为A
生成了非对称加密用的私钥,为B
生成了签名用的私钥,然后为它们都生成公钥,把公钥都从公共通道c
发送出去(以使得攻击者能访问这些公钥),再调用两个进程宏clientA
和serverB
来实现两个进程的并发执行,这里用replication的方式让两个主体都以无限数量会话并发执行。
协议流程和笔记2里学习的一样。即A
把自己公钥pkA
发出去。B
则是接收到这个公钥pkX
,然后B
创建了一个对称密钥k
(起到会话密钥的作用),和自己的公钥pkB
一起打包成元组,先用自己的私钥skB
签名,再用收到的公钥pkX
加密,然后发出去。A
接受到这个发来的bitstring
,然后用自己私钥解密,解密成功之后得到y
,然后用B
的公钥pkB
验证签名,如果验证通过了那么第一项就是pkB
(这里用=pkB
来匹配),第二项就是对称密钥k
了,A
再用这个k
给消息s
进行对称加密然后发出去。B
接收到发来的bitstring
之后,用自己刚刚创建的对称密钥k
解密就得到了内容z
,这应该和s
是一样的内容。
参考阅读
ProVerif的manual第3.1.3~3.1.5章节
【ProVerif学习笔记】3:进程宏和进程书写的语法规则相关推荐
- 学习笔记之卸载远程目标进程中的DLL模块(转)
学习笔记之卸载远程目标进程中的DLL模块 (2007-07-23 23:51:02) 转载▼ 学习笔记之卸载远程目标进程中的DLL模块2007/7/23 1.首先得把DLL模块中的线程结束 使用Cre ...
- Polyworks脚本开发学习笔记(十七)-制作宏脚本自定义工具条
Polyworks脚本开发学习笔记(十七)-制作宏脚本自定义工具条 做好的宏脚本程序,每次打开脚本加载程序太多麻烦,为了方便的调用脚本做各种操作,可以使用系统的自定义工具条功能将脚本加载到工具条上. ...
- TypeScript学习笔记1:变量赋值及书写方式
TS 和 JS 相对比的优势 TypeScript的安装步骤.运行问题及代码的简单运行 TypeScript学习笔记1:变量赋值及书写方式 TypeScript学习笔记2:数据类型 文章目录 变量赋值 ...
- MySQL学习笔记02【SQL基本概念与通用语法、数据库的CRUD操作】
MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...
- 【操作系统】Oranges学习笔记(五) 第六章 进程
文章目录 6.1 迟到的进程 6.2 进程概述 6.2.1 进程介绍 6.2.2 未雨绸缪--形成进程的必要考虑 6.2.3 参考的代码 6.3 最简单的进程 6.3.1 简单进程的关键技术预测 1. ...
- Linux 高并发学习笔记 - exec 函数簇重载进程
2.2.4 exec 函数簇重载进程 Linux 高并发学习笔记 - 笔记索引 execl.execlp.execle.execv.execvp.execvpe exec函数簇将重载进程,直接覆盖当前 ...
- 操作系统原理学习笔记(基础概念与进程)
学习视频 王道的操作系统原理,我在网上搜了一下,没有那个视频像湖科大那种推荐的人那么多,感觉这个还可以,就看这个了. 随看随记 进程运行前需要将需要执行的程序放置到内存中,内存再到CPU中执行程序. ...
- linux内核进程状态,深入理解 Linux 内核学习笔记(一):进程
进程 进程是任何多通道程序设计的操作系统中的基本概念,进程通常被定义为程序执行时的一个实例,在 Liunx 的源代码中,进程通常被称为 "任务". 进程描述符 进程描述符的作用是为 ...
- 【操作系统学习笔记】—— 【二】进程、线程、死锁
本文参考: JavaGuide 王道考研-操作系统 CS-Notes 文章目录 一.进程的概念.组成.特征 1. 概念 2. 进程的组成 PCB 程序段 数据段 3. 进程的特征 二.进程的状态 三. ...
最新文章
- 格伦布编码——rice编码无非是golomb编码M为2^x的特例
- 【视频课】言有三每天答疑,38课深度学习+超60小时分类检测分割数据算法+超15个Pytorch框架使用与实践案例助你攻略CV...
- ArcGis10安装
- 三维重建2: 地图构建-三角测量
- java 注解 静态变量_Spring中静态方法中使用@Resource注解的变量
- linux日志不区分大小写,windows系统迁移到linux下,Nginx实现url请求不区分大小写...
- 数据不够,游戏来凑!随机三维人物实现可泛化的行人再辨识(ReID)
- QWidget *parent
- java中map类型_Java中Map类型遍历的两种方式对比
- torch.randn
- A Singular Value Decomposition Approach For Recommendation Systems
- 算法设计与分析期末复习题(史上最详细)
- 地图转换|用arcgis 将cad转kmz
- 夏普Sharp AR-6120N 一体机驱动
- Android 音视频采集与软编码总结
- flooding matlab仿真,无线传感器网络flooding路由协议MATLAB仿真.doc
- 笔记本拆c面_继续拆解 C面下方还藏有玄机_神舟 战神GX8 PRO_笔记本评测-中关村在线...
- 数据结构课程设计 公交系统
- 效能大提升!百度与英特尔携手开拉新Nervana NNP芯片
- 上天、入水、下地,清洁机器人蓝海有多大?