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行定义了两个过程宏RR'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发送出去(以使得攻击者能访问这些公钥),再调用两个进程宏clientAserverB来实现两个进程的并发执行,这里用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:进程宏和进程书写的语法规则相关推荐

  1. 学习笔记之卸载远程目标进程中的DLL模块(转)

    学习笔记之卸载远程目标进程中的DLL模块 (2007-07-23 23:51:02) 转载▼ 学习笔记之卸载远程目标进程中的DLL模块2007/7/23 1.首先得把DLL模块中的线程结束 使用Cre ...

  2. Polyworks脚本开发学习笔记(十七)-制作宏脚本自定义工具条

    Polyworks脚本开发学习笔记(十七)-制作宏脚本自定义工具条 做好的宏脚本程序,每次打开脚本加载程序太多麻烦,为了方便的调用脚本做各种操作,可以使用系统的自定义工具条功能将脚本加载到工具条上. ...

  3. TypeScript学习笔记1:变量赋值及书写方式

    TS 和 JS 相对比的优势 TypeScript的安装步骤.运行问题及代码的简单运行 TypeScript学习笔记1:变量赋值及书写方式 TypeScript学习笔记2:数据类型 文章目录 变量赋值 ...

  4. MySQL学习笔记02【SQL基本概念与通用语法、数据库的CRUD操作】

    MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...

  5. 【操作系统】Oranges学习笔记(五) 第六章 进程

    文章目录 6.1 迟到的进程 6.2 进程概述 6.2.1 进程介绍 6.2.2 未雨绸缪--形成进程的必要考虑 6.2.3 参考的代码 6.3 最简单的进程 6.3.1 简单进程的关键技术预测 1. ...

  6. Linux 高并发学习笔记 - exec 函数簇重载进程

    2.2.4 exec 函数簇重载进程 Linux 高并发学习笔记 - 笔记索引 execl.execlp.execle.execv.execvp.execvpe exec函数簇将重载进程,直接覆盖当前 ...

  7. 操作系统原理学习笔记(基础概念与进程)

    学习视频 王道的操作系统原理,我在网上搜了一下,没有那个视频像湖科大那种推荐的人那么多,感觉这个还可以,就看这个了. 随看随记 进程运行前需要将需要执行的程序放置到内存中,内存再到CPU中执行程序. ...

  8. linux内核进程状态,深入理解 Linux 内核学习笔记(一):进程

    进程 进程是任何多通道程序设计的操作系统中的基本概念,进程通常被定义为程序执行时的一个实例,在 Liunx 的源代码中,进程通常被称为 "任务". 进程描述符 进程描述符的作用是为 ...

  9. 【操作系统学习笔记】—— 【二】进程、线程、死锁

    本文参考: JavaGuide 王道考研-操作系统 CS-Notes 文章目录 一.进程的概念.组成.特征 1. 概念 2. 进程的组成 PCB 程序段 数据段 3. 进程的特征 二.进程的状态 三. ...

最新文章

  1. 格伦布编码——rice编码无非是golomb编码M为2^x的特例
  2. 【视频课】言有三每天答疑,38课深度学习+超60小时分类检测分割数据算法+超15个Pytorch框架使用与实践案例助你攻略CV...
  3. ArcGis10安装
  4. 三维重建2: 地图构建-三角测量
  5. java 注解 静态变量_Spring中静态方法中使用@Resource注解的变量
  6. linux日志不区分大小写,windows系统迁移到linux下,Nginx实现url请求不区分大小写...
  7. 数据不够,游戏来凑!随机三维人物实现可泛化的行人再辨识(ReID)
  8. QWidget *parent
  9. java中map类型_Java中Map类型遍历的两种方式对比
  10. torch.randn
  11. A Singular Value Decomposition Approach For Recommendation Systems
  12. 算法设计与分析期末复习题(史上最详细)
  13. 地图转换|用arcgis 将cad转kmz
  14. 夏普Sharp AR-6120N 一体机驱动
  15. Android 音视频采集与软编码总结
  16. flooding matlab仿真,无线传感器网络flooding路由协议MATLAB仿真.doc
  17. 笔记本拆c面_继续拆解 C面下方还藏有玄机_神舟 战神GX8 PRO_笔记本评测-中关村在线...
  18. 数据结构课程设计 公交系统
  19. 效能大提升!百度与英特尔携手开拉新Nervana NNP芯片
  20. 上天、入水、下地,清洁机器人蓝海有多大?

热门文章

  1. 【天光学术】诉讼法论文:论交通肇事罪的认定与处理【开题报告 法学硕士研究生毕业论文】
  2. 飞凌嵌入式丨2020年技术干货合集大放送!
  3. 前照灯检测仪_原来前照灯的检测步骤是这样的
  4. 凌华服务器维护手册,鸿鹄专业电脑 成功修复台湾凌华ADLINK工控设备。
  5. 马斯克成全球首富!万字最新访谈披露,信息量极大,远见令人震撼
  6. 计算机网络--2020春-平时小测2--习题答案
  7. 一老一小保险参保时间
  8. 软件测试工程师常见面试题和笔试题
  9. STM32-DA发送正弦波
  10. 如何制作证件照?证件照怎么在线制作?