继上一次编写vivado加密文章之后,细读赛灵思 UG1118,进行详细学习整理如下文。如有疑问可自行阅读英文版本手册。
一、VIVADO加密的TCL命令
Tcl命令在vivado的Tcl Console中输入,命令模板为:
encrypt [-key <arg>] -lang <arg> [-quiet] [-verbose] [-ext <arg>] <files>...
各关键字说明:
-key:秘钥可以存在于HDL源文件的行中,也可以放置在单独的秘钥文件中。-key指定秘钥信息的位置。
-lang:指示需要加密的文件是使用verilog还是VHDL。
-quiet:手册未介绍,直接忽略。
-verbose:手册未介绍,直接忽略。
-ext:使用该关键字,可以防止源文件被覆盖,将加密文件输出到新指定的文件名中。若不使用,则覆盖源文件,导致源文件丢失,建议提前复制保存源文件。
Files:源文件
Tcl命令示例:encrypt -lang verilog -ext .vp -key keyfile.txt myip.v
其中,keyfile.txt为秘钥文件。命令运行后,即可生成尾缀为.vp的加密文件。
需要注意,该方式只能加密verilog,systemveriloig,VHDL文件,其余文件不可加密。
二、秘钥文件的生成
1.先展示一个完整秘钥文件的内容:
完整示例:
`pragma protect version = 2
`pragma protect encrypt_agent = "XILINX"
`pragma protect encrypt_agent_info = "Xilinx Encryption Tool 2021"
`pragma protect begin_commonblock
`pragma protect control error_handling = "delegated"
`pragma protect control child_visibility = "delegated"
`pragma protect control decryption = (activity==simulation)? "false" :"true"
`pragma protect end_commonblock
`pragma protect begin_toolblock
`pragma protect rights_digest_method="sha256"
`pragma protect key_keyowner = "Xilinx", key_keyname= "xilinxt_2021_01", key_method = "rsa", key_public_key
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApgf7F4kYh0oSFzJBRoRb
nsrAqn24fVbI7xdNG2t9G8pouFfwIXGGmQgYqYZDSmUu0wrrj3ulLvUnjRtmtziJ
1RDOYdyko1SuBEyGT1frzUu9xNitAXxp29hOrVPeKO6kGU81XHJCRJ7uWh7rwoyf
HSUpreifLybt+UT5fyvHu21IxvOR6GHKWaQ4wdL7Txguuyf92XLJIZABEgmuVlPK
/NjJjVRK3c/vMuQLvbihNapkyCiLIWNwDbo9oWXr7NSo3we8u6IlFmP5V8WcOmXZ
/PZqp3QOkY2Jlm1yQt3O8PpU/8qzB7zcHjm3+Q+wB8yUYn/IMwN0t09l2AdBR37G
EwIDAQAB
`pragma protect control xilinx_configuration_visible = "false"
`pragma protect control xilinx_enable_modification = "false"
`pragma protect control xilinx_enable_probing = "false"
`pragma protect control xilinx_enable_netlist_export = "false"
`pragma protect control xilinx_enable_bitstream = "true"
`pragma protect control decryption = (xilinx_activity==simulation)?"false" : "true"
`pragma protect end_toolblock = ""
2.秘钥选择:
用户可以选择赛灵思公用秘钥,也可以选择第三方提供的秘钥。因条件限制,目前只使用赛灵思公用秘钥,其存在于赛灵思安装路径下:<Install_Dir>/Vivado/<version>/data/pubkey/
将文件中内容复制在`pragma protect begin_toolblock之后,参考上述标黄部分。
`pragma protect rights_digest_method="sha256" `pragma protect key_keyowner = "Xilinx", key_keyname= "xilinxt_2021_01", key_method = "rsa" 是一组强制的编译指示语句,用于定义供应商的加密秘钥等相关属性,该部分语句放在特定权利开始(紧跟`pragma protect begin_toolblock之后)
后面的乱码部分即具体的秘钥内容。
另外需要注意的时,`pragma protect时加密verilog文件的关键字,如果要加密VHDL,秘钥文件中的`pragma protect需要变更为`protect。
秘钥选择完毕后,从上往下分别介绍。
3.普通权利、特定权利、条件权利
序号 | 语法示例 | 含义 | 备注 |
1 | `pragma protect version = 2 | 使用IEEE-1735-2014 V2版本 | |
2 | `protect encrypt_agent = “XILINX” `protect encrypt_agent_info = “Xilinx Encryption Tool 2017" | 标识加密工具 | |
3 | `protect begin_commonblock ... `protect end_commonblock | IEEE-1735-2014 V2中包括三种类型的权力,包括普通权利、特定权利、条件性权利,用以向不同客户提供加密文件不同范围的展示内容。 省略号内具体描述普通权利。 | 详见普通权利部分 |
4 | `protect begin_toolblock ... `protect end_toolblock=”” | 每个秘钥文件中至少有一个特定权利模块,秘钥存在于该部分内。 省略号内具体描述特定权利以及秘钥。 另外,特定权利可覆盖普通权利的内容。 | 详见特定权利部分 |
名称 | 含义 | 默认值 | 可选值 | 赛灵思可选值 |
error_handling | 允许展示错误信息? | “delegated” | “delegated” (委托工具) “srcrefs” (秘密) “plaintext” (纯文本) | “delegated” |
runtime_visibility | 运行时允许展示tcl或者输出报告? | “delegated” | “delegated” “interface_names” “all_names” | “delegated” |
child_visibility | 如果一个受保护的模块实例化了一个未受保护的子模块,那么应该如何在该子模块上处理error_handling和runtime_visibility? 显示的消息可能会通过受保护区域公开路径名。 | “delegated” | “delegated” “allowed” “denied” | “delegated” “allowed” Note: “delegated” = “denied” |
decryption | 允许工具解密模块吗?这个功能一般用于条件性权利。 | “delegated” | “delegated” “true” “false” | “delegated” “true” “false“ Note: “delegated” = “true” |
名称 | 含义 | 赛灵思可选值 | 默认值 |
xilinx_configuration_visible | LUT值是在查看器编辑器中是可见的吗? | “true”,“false” | “false” |
xilinx_enable_modification | 保护区域的网表信息可以被修改吗? | “true”,“false” | “false” |
xilinx_enable_probing | 用户可以在保护区域插入调试探针吗? | “true”,“false” | “false” |
xilinx_enable_netlist_export | 允许vivado导出保护区域的网表信息吗? | “true”,“false” | “true” |
xilinx_enable_bitstream | 允许vivado生成比特流吗? | “true”,“false” | “true” |
xilinx_schematic_visibility | 允许vivado展示保护区域的模块名称吗? | “true”,“false” | “false” |
再介绍一下IEEE-1735-2014 V2编译指示语法。
普通权利和特定权利的语法:
模板:`protect control <right> = <rights_expression>
示例:`protect control error_handling = "delegated"
其中,control为指示权利访问的关键字,固定不变; <right>为上述表格中的名称; <rights_expression>为上述表格中的赛灵思可选值。
条件权利的语法
模板:`protect control <right> = <condition> ? <true_expression> : <false_expression>
示例:`protect control decryption = (xilinx_activity==simulation) ? "false" : "true"
其中,activity是IEEE 1735-2014 V2标准中的条件关键字,在赛灵思中替换为xilinx_activity。
此示例表示,仅在simulation时,不加密,在synthesis和implementation时都进行加密。
数值 | 含义 |
simulation | 仿真 |
synthesis | 综合 |
implementation | 实现 |
如示例中展示,条件权利语句可以在普通权利和特定权利范围内使用。
三、加密checkpoint
使用该命令,可以直接生成一个加密的.dcp文件,可以将此文件提供给客户,可以隐藏所有的HDL文件和IP核文件,具有很好的保密性。(.dcp文件实际为工程综合完成后的压缩文件,需要先综合完成后再输入命令生成.dcp文件)
模板:write_checkpoint [-key <arg>] -encrypt <file>
输出名称为file的dcp文件
示例1: write_checkpoint -encrypt my_ip.dcp
此示例中没有指定秘钥文件,因此使用赛灵思默认的设置:
Common rights:
error_handling = "delegated"
Xilinx tool rights:
xilinx_configuration_visible = "false"
xilinx_enable_modification = "false"
xilinx_enable_probing = "false"
xilinx_enable_netlist_export = "false”
示例2:write_checkpoint -key keyfile.txt -encrypt my_ip.dcp
指定使用秘钥文件keyfile.txt进行加密输出。
四、若需要加密多个.v文件到一个加密文件中,可以使用下面的方式
1、在控制台console上输入tcl命令切换到保存.v文件的目录下。
比如:cd E:/tmp/Encryption_test/project_1/project_1.srcs/encryption
2、输入tcl命令,将此文件夹下所有的.v文件复制到一个文件中。
比如:exec $env(COMSPEC) /c copy *.v all.v
3、对合成后的文件进行加密
按照刚开始所讲的,使用秘钥加密即可。
比如:encrypt -key C:/Users/YDQ/Desktop/key_files_ydq.txt -ext .enctypt -lang verilog all.v
将all.v加密输出名称为all.enctypt的加密文件。