1、1硬件加密模块(FPGA 实现 AT88SC0104C 认证)使用说明书2目录1 简介 31.1 目的 31.2 资源占用 31.3 基本原理 31.4 系统结构框图 31.5 AT88SC0104 简介 41.6 晶体振荡器选用 61.7 FPGA 引脚定义 62 程序说明 72.1 VHDL/Verilog 模块文件说明 72.2 主控模块设计 72.3 I2C 模块说明 82.3.1 I2C 模块接口说明 92.4 GPA 函数电路设计 102.5 随机数产生模块设计 102.6 单片机程序设计 112.6.1 配置 FPGA 流程设计 113.操作方法 123.1 对 AT88SC01
2、04C 进行设置 123.2 对 EP2C8Q208(FPGA)进行配置 123.2.1(JTAG)配置方式 133.2.2 主动配置方式(AS)153.2.3 被动配置方式(PS)163.3 在 VHDL/Verilog 程序中的设置 173.3.1 密钥(Gc)设置 173.3.1.1 VHDL 程序中密钥(Gc)设置 173.3.1.2 Verilog 程序中密钥(Gc)设置 183.3.2 重复认证启动设置 193.3.4 认证成功后的 FPGA 关联设置 194DEMO 演示操作说明 205. 光盘文件说明 20简介31 简介1.1 目的防范电子装置被盗版的最有效手段目前仍然是设置盗
3、版障碍。为此,Atmel 公司于1999 年推出了用于防范盗版的安全存储器件 AT88SC153 和 AT88SC1608,又于 2003 年推出了具有双向认证且密文传送的新型安全存储器件 AT88SC0104C 系列,进一步提高了盗版的难度。试图从 I2C 接口通信数据(即 SDA)分析出密钥的可能性理论上存在,但在现实中并无意义。这是因为器件的密钥为 8 字节,按照算法即使用最快的 FPGA 穷举搜索也要万年以上。由于大多数单片机的程序易于被盗取且能够被反汇编,当盗版者获得了安全存储器件的详细资料后仍然有可能由盗取的单片机程序代码反汇编追踪安全存储器件的设置信息,使得电子产品被盗版的危险性
4、依然存在。这里给出将 AT88SC0104C 的全部认证流程置于 CPLD/FPGA 器件的方案。尽管CPLD/FPGA 中的设置代码易于被盗取,但由于不能反汇编,所以无法追踪出AT88SC0104C 的相关信息,从根本上杜绝了遭受追踪攻击的可能性。1.2 资源占用采用 EP2C8Q208 型 FPGA 时资源占用情况如下:引脚:2 个输出,分别用于时钟(SCL) )和数据输出( SDA_OUT) ;1 个输入(数据输入(SDA_IN) ;logic elements 1139 个,为总数(8256)的 14%;registers732 个。采用 40MHz 晶振的认证时间约 15ms。而采用
5、单片机认证所需的时间约 180ms。1.3 基本原理FPGA 设计部分主要完成 FPGA 和 0104C 上电配置完成之后,FPGA 使用 I2C 主机模式下单一从器件与 0104C 通讯并执行认证过程。认证成功后,FPGA 内部给出认证成功标志,并使能 FPGA 内部其它功能模块开始正常工作。1.4 系统结构框图本设计主要完成 FPGA 和 0104C 上电配置完成之后, FPGA 使用 I2C 主机模式与0104C 通讯并执行认证过程,认证成功后,产生相应的使能信号使能 FPGA 内部其它功能模块开始正常工作。在实际应用时,只需将本设计作为总体设计中的一个模块,简介4把使能信号连接其它设计
6、的使能端口。该设计主要包括主状态机的设计、时钟分频的设计、随机数产生的设计、I2C 串口通信接口的设计。结构框图如图 1 所示:SCLSDA系统时钟FPGA内部功能模块时钟分频随机数产生器数据加密算法比较器 I2C 串口通信模块验证成功AT88SC0104C使能信号图 1-1 系统结构框图1.5 AT88SC0104 简介AT88SC0104C 是 Atmel 公司于 2003 年推出的高安全性能存储卡。存储容量为128B。协议认证卡在协议认证后,所有传送的数据均采用密文传送方式,因而提高了存储数据的安全性。AT88SC0104C 协议认证卡的主要特点:通信协议符合 ISO/IEC78163
7、同步协议。工作电压为 2.75.5V。时钟频率最大为 1.5MHz。数据保存为 100 年。重复擦写次数为100000 次。ESD(静电防护)不小于 4000V。使用环境温度:商业级为 070;工业级为-4585。该协议认证卡的基本组成如图 1 所示:简介5VCCGND 电 源 管 理同 步 接 口SCL/CLKSDA/IO异 步 ISO接 口复 位 时 钟RST认 证 、 加 密 和 校 验数 据 变 换密 码 校 验复 位 应 答随 机 数 产 生EEPROM图1-2 AT88SC0104C基本组成框图采用 AT88SC0104C 对 FPGA 进行加密的基本工作流程:1硬件连接将 AT8
8、8SC0104C 与 FPGA 相连,只需将 AT88SC0104C 的 SCL 和 SDA 引脚分别与 FPGA 的任意两个 I/O 管脚连接即可。为了防止可能出现的 I2C 总线第 9 个脉冲无应答信号,将 SDA 分成一进一出的独立线路。同时为了确保 I2C 线路的 SDA 是 OC 或OD 线路,I2C 总线的时钟频率在 1.5MHz 以下。电气原理如图 2 所示。SCLSDAFPGASCLSDA INSDA OUTAT88SC010474HC07VCCGND图 1-3 AT88SC0104C 对 FPGA 加密的电气原理2AT88SC0104C 的配置按照加密功能的要求,对 AT88
9、SC0104C 的配置区的各数据进行配置。比如修改读写密码,修改密钥 GC 等等。具体修改方法详见读写编程器使用手册。3AT88SC0104C 的编程简介6将配置文件和部分保密数据事先按地址写入 AT88SC0104C 的配置区和用户区各单元。具体操作方法详见读写编程器使用手册。4AT88SC0104C 的熔断在系统调试成功以后,才将 AT88SC0104C 中的熔丝熔断。熔断之后,配置不再更改,这一点需特别注意。熔断的过程如下:1)向熔丝标志寄存器写入 06H;2)向熔丝标志寄存器写入 04H;3)向熔丝标志寄存器写入 00H。1.6 晶体振荡器 选用建议采用独立的 40MHz 有源晶体振荡
10、器,以确保整机工作的稳定性。1.7 FPGA 引脚定义必须在 FPGA 的设置中定义引脚见下表。这些引脚必须与硬件连接相一致。序号 Verilog/VHDL 文件中的名称输入/输出 用途1 CLK 输入 40MHz 晶体振荡器时钟输入2 SDA_IN 输入 AT88SC0104C 的 SDA 输出3 SDA_OUT 输出 AT88SC0104C 的 SDA 输入4 SCL 输出 AT88SC0104C 的 SCL 输入5 RST 输入 全局复位信号输入6 AGAIN_AUTHEN_KEY 输入 用于演示的重复启动认证输入示例程序中,已将 AGAIN_AUTHEN_KEY 引至 KEY4(按键)
11、,所以只要按下 KEY4 即可启动重复认证流程。如不需要由外部引脚启动重复认证流程,可以不定义AGAIN_AUTHEN_KEY 引脚。程序说明72 程序说明2.1VHDL/Verilog 模块文件说明main 主控模块I2C_transmitI2C 数据总线接口与控制模块I2C_clkI2C 总线时钟分频及 SCL 时钟产生模块five_clk 产生 AT88SC0104C 初始化所需的 5 个 CLK 模块GPAGPA 算法函数电路模块delay 延时 3msRNG.随机数产生模块inverse.v 非门(用于随机数生成)编译时使用增量编译,以免非门被综合掉。:Settings-Compil
12、ation Process Settings-Incremental Compilation-off(.)2.2 主控模块设计该模块主要完成主状态机的状态切换、产生其它模块的控制信号。根据前面设计的 FPGA 的工作流程将主状态机设计为 14 个状态:RESET、FIVE_CLK、GET_RANDOM、CI_FROM_GCX、READ_CI_A、GPA_A、GPA_B、 TRANS_20BYTE、JUSTIFY_A 、NEW_CIX、NEW_SK、READ_CI_B、JUSTIFY_B、 SK_REPLACE_GC、ALL_RIGHT ,一个状态对应工作流程中的一个流程。主控模块的设计及其与其
13、它模块之间的关系如图 2-1:其它设计使能端口SDASCLs t a t e _ c h a n g e主状态机I 2 C _ t r a n s m i tO S Cf i v e _ c l k I 2 C _ c l k随机数获取g p a _ s t a t e t r a i n _ s t a t eg p a _ c _ s t a t e n e w _ s k / n e w _ c i xG P A 控制信号G P A 函数延时 3 m s图 2-1 主控模块的设计及其与其它模块之间的关系方框图其中,状态 GPA_A、状态 GPA_B 由 gpa_state 状态机和 tr
14、ain_state 状态机实现对程序说明8GPA 算法的控制。2.3I2C 模块说明I2C 总线由 FPGA 控制,FPGA 所发出的字节系列都是由命令开始,随后如果是写操作则是数据字节,否则是读数据。I2C 总线备用时 SDA 和 SCL 都必须保持高电阻高电平状态,只有关闭 I2C 总线时才会将 SCL 钳位于低电平。在 I2C 总线上传送数据时,在 SCL 高电平期间 SDA 上必须保持有稳定的逻辑电平状态,高电平为数据 1,低电平为数据 0。I2C 总线在传送数据过程中共有三种类型信号,即开始信号、终止信号和应答信号。起始信号:SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送
15、数据。停止信号:SCL 为高电平时,SDA 由低电平向高电平跳变,终止传送数据。应答信号:FPGA 在接收到一个字节数据后,在下一个 SCL 高电平时向AT88SC0104C 发出低电平脉冲。 FPGA 在发送一个字节数据后,在下一个 SCL 高电平时读 SDA_IN,检测应答位是否为低电平,此时 SDA_OUT 应该钳位于高电平。时序如图 5 所示:A C K99 112 8S D A O U T S C L起始信号允许数据变化A C KF P G A 写操作停止信号释放总线以便0 1 0 4 C 应答F P G A 读操作图 2-2 I2C 总线时序图程序由主状态机和串并转换任务组成,其状
16、态机采用独热(one-hot)编码。状态转移如图 2-3 所示:写操作空闲 准备开始 发送命令 应答读数据 写数据应答停止 应答读操作图 2-3 读写状态转移程序说明9为了提高接口的稳定性,I2C 总线在读取数据时连续采样三次,采用三决二胜。在写命令或者写数据后如果 0104C 没有应答信号,则结束本次数据传输。2.3.1I2C 模块接口说明整个 I2C 系统用 sda_in、sda_out、scl 完成与 AT88SC0104C 的数据交换指定至具体引脚:sda_in:串行数据输入(读取 0104 发送的数据)sda_out:串行数据输出(传送给 0104 的数据)与 FPGA 内部的接口包
17、括: SIGNAL:go: I2C 启动信号shift_byte: FPGA 需要读(写)的字节数ready: I2C 模块接收了一个字节的数据(多字节读时表示一个字节传输完成,FPGA 读取该字节并储存供后续使用)send_ready:表示需要传递一个字节数据给 I2C(多字节写时表示 FPGA 应传输给I2C 模块一个字节数据以供传输)din: FPGA 写数据(传输给 0104 的数据)dout: FPGA 读数据(从 0104 读取的数据)I2C_stop: I2C 完成传输给定字节的数据与 FPGA 外部的接口:clk: FPGA 外部时钟rst:异步复位信号该模块 I2C 数据传输
18、过程:1起始信号产生2控制信号传递(8 字节)30104 应答(低电平为应答信号)4数据传输(读取数据时,连续采样三次,以提高工作可靠性)50104 应答6停止信号程序说明10I2C 为顶层文件,I2C_clk 为时钟分频部分,I2C_transmit 为 I2C 控制部分。该设计已用示波器验证。2.5 随机数产生模块设计本设计中利用这两个非门串联电路的时延的不确定性来实现振荡器的抖动,采用振荡采样法生成随机数,系统原理如图所示。为了防止被综合掉,在设计时将非门设计为一个模块(inverse) ,并使用增量编译。随机数输出QQSETCLRSRCLK图 2-4 随机数模型原理框图2.6 单片机程
19、序设计当用户选择采用单片机配置 FPGA 时,主控 MCU 采用 51 系列单片机,采用 C 语言编写单片机程序,主要编写 FPGA 的配置程序。只需将用户放置于配置程序之后即可。2.6.1 配置 FPGA 流程设计当电路板上 FPGA 配置方式设置成被动配置方式(PS )时,每次上电单片机都会自动对 FPGA 进行配置。通过初始化 FPGA 后,单片机将接收到的数据包数据逐个写入,每写入 1 字节判断写入成功标志脚,有利于配置各类 FPGA 芯片,有更好的兼容性。程序说明11开始nCONFIG=“0“,DCLK=“0“ 保持 2S 以上检测 nSTATUS0Y1nCONFIG=“1“,并等待
20、 5SDATA0 放入一位数据(lsb first) DCLK=“1“延时DCLK=“0“检测 nSTATUS1Y0Y返回写入下一位直至写完下传数据检测 Conf_done1Y0Y图 2-5 FPGA 配置数据流程图3.操作方法3.1 对 AT88SC0104C 进行设置具体操作步骤详见SC-RWP2 型AT88SCxx 系列读写编程器使用说明书。操作方法12特别注意:这里设置的AT88SC0104C 的密钥必须与 2.3中所设置的密钥完全相同。AT88SC0104C只有在被设置后才能将其焊装到电路板上。AT88SC0104C.dem3.2 对 EP2C8Q208(FPGA )进行配置本项目为
21、了兼容各种开发环境具备最常用的三类配置下载方式,以下分别说明各种方式的具体操作。3.2.1(JTAG)配置方式用于调试硬件操作:把ByteBlaster II下载线接到电路板中JTAG接口。软件操作:1.打开编程窗和配置文件。首先将实验系统和并口通信线连接好,打开电源。在菜单Tool 中选择Programmer,于是弹出如图3-1所示的编程窗。在Mode 栏中有4种编程模式可以选择:JTAG、Passive Serial、Active Serial 和In-Socket。为了直接对FPGA进行配置,在编程窗的编程模式Mode 中选JTAG(默认),并选中打勾下载文件右侧的第一小方框。注意要仔细
22、核对下载文件路径与文件名。如果此文件没有出现或有错,单击左侧“Add File”按钮,手动选择配置文件main.sof 。图3-1选择编程下载文件操作方法132.设置编程器。若是初次安装的Quartus II,在编程前必须进行编程器选择操作。这里准备选择ByteBlaster II LPT1。单击Hardware Setup 按钮可设置下载接口方式(图3-1),在弹出的Hardware Setup 对话框中(图3-2),选择Hardware settings 页,在Currently selected hardware框中选择ByteBlaster II LPT1(图3-3)。如果打开图3-2
23、所示的窗口内“Currently selectedhardware”右侧显示No Hardware,则必须加入下载方式。即点击Add Hardware 钮,在图4-27 所示的窗口中选择ByteBlaster II,再在弹出的窗中点击OK,使“Currently selected”右侧显示ByteBlaster II LPT1。3.最后单击下载标符Start 按钮,即进入对目标器件FPGA 的配置下载操作。当Progress 显示出100%,以及在底部的处理栏中出现“Configuration Succeeded”时,表示编程成功。注意,如果必要,可再次单击Start 按钮,直至编程成功。图3
24、-2加入编程下载方式操作方法14图3-3双击选中的编程方式名图3-4 ByteBlasterII 编程下载窗3.2.2 主动配置方式(AS)用于将程序下载至EPCS器件硬件操作:将ByteBlaster II 下载线与电路板上的AS_PS_J 接口相连接,将AS_PS_SEL的AS 一侧的3个套针连接,下载成功后须将下载线从电路板拔开,FPGA才会开动工作。软件操作:1选择编程模式和编程目标文件在如图3-5 所示窗口的Mode 栏,选择“Active Serial Programming ”编程模式,打开编程文件,选中文件main.pof,并选中打勾3 个编程操作项目,如图3-5所示。操作方法
25、15图3-5 ByteBlaster II 接口AS 模式编程窗口2AS 模式编程下载单击图3-5 所示窗口的Start,编程成功后将出现如图3-6所示信息。编程成功后FPGA将自动被EPCS 器件配置而进入工作状态。此后每次上电,FPGA 都能被EPCS4自动配置,进入正常工作状态。图3-6 AS 模式编程成功3.2.3 被动配置方式(PS)用于由单片机下载配置程序硬件操作:将AS_PS_SEL 的PS一侧的3个套针连接,将PS_J_SET套上(即连接)。软件操作:先由 VHDL 程序导出 main.hex 文件后写入存储器芯片 AT29C040,上电后使单片操作方法16机运行 CPU_SE
26、T_FPGA 子程序,单片机将读出 AT29C040 中的数据后,以 PS 方式对FPGA 芯片进行配置。HEXOUT 文件的形成:下装到 AT29C040 文件必须为后缀为 hexout 的文件,仿真软件 Quartus II 在 6.0版本不能默认产生 hexout 文件,必须人为设置产生格式文件步骤如下:打开项目,点击File菜单,选择Convert Programming Files如图一所示。鼠标左键点击Programming file type栏目的下拉箭头,选择Hexadecimal(Intel-Format)Output File for SRAM(.hexout)项。在 Fi
27、le name框中输入导出Hexout文件名字如:output_file.hexout, 在 中可选择导出文件存储路径。然后选中Input files to convert栏目中的SOF Data,左键点击Add File按钮。找到生成的相应的 sof文件并打开,此时相应的sof下载文件出现在相应的界面中。最后左键点击Generate按钮,则生成hexout的文件。图 3-7 HEXOUT 文件输出操作方法173.3 在 VHDL/Verilog 程序中的设置3.3.1 密钥(Gc)设置加密系统的密钥需要预先设置,分别储存在FPGA和AT88SC0104C中。如需修改,则必须在FPGA和AT8
28、8SC0104C中同时修改并保持一致。在VHDL/Verilog程序中修改密钥,只需修改主程序(main.vhd)或(main.v)中gc_mem的赋值并重新编译。例如,当密钥为123456789ABDEFF时,相应的设置如下: 3.3.1.1 VHDL 程序中密钥( Gc)设置/修改密匙时只需修改下面语句中gc_mem的赋值-GC-PROCESS (clk)BEGINIF (clkEVENT AND clk = 1) THENIF (state = FIVE_CLK) THENgc_mem(0) ALL_RIGHT,); Verilog 程序中设置如下:main m1 (.clk(clk),
29、.rst(rst),.sda_in(sda_in),.sda_out(sda_out),.scl(scl),操作方法19.ALL_RIGHT(ALL_RIGHT),.AGAIN_AUTHEN_KEY(AGAIN_AUTHEN);Sample M2(.start(ALL_RIGHT),);只有当认证成功时,ALL_RIGHT 信号为高电平,方可启动模块 Sample,如果认证不成功,则 ALL_RIGHT 信号为低电平,模块 Sample 不启动。操作方法204DEMO 演示操作说明采用的文件为示例程序,AT88SC0104C 采用的文件为: demo1.dem。文件中,已将 AT88SC010
30、4C 下装文件的密钥和 EP2C8 的下装文件的密钥均设置为0x123456789ABCDEFF。进入 QUARTUS II 后,打开 main 项目,下装代码,程序自动运行。按下KEY4 按键可以重复执行认证流程一次。只有在认证成功之后,5 个 LED 全部一起点亮。如要验证认证过程的正确性或有效性,可以按下列方式测试评估板:A. 取下 AT88SC0104C,上电后重复按下 KEY4 按键。此时 5 个 LED 都不会点亮。B. 如将 AT88SC0104C 的密钥与 VHDL/Verilig 程序中的密钥设置成不一样。此时 5 个 LED 都不会点亮。C. 全部采用示例程序,上电后 5 个 LED 会一起点亮。5. 光盘文件说明1. 单片机 C 语言源程序:CPU_SET_FPGA.c ; 2. 单片机目标代码程序:CPU_SET_FPGA.hex ; 3. AT88SC0104C 程序:AT88SC0104C.dem ;4. SC-RWP2 型 AT88SCxx 系列读写编程器使用说明书;5. FPGA 的 VHDL 项目文件与下载文件包:VHDL_program_files;6. FPGA 的 Verilog 项目文件与下载文件包:Verilog_program_files;