Xilinx FPGA 的 DNA 加密


欲觀原文,請君移步

Xilinx FPGA都有一個獨特的 ID ,也就是 Device DNA ,這個 ID 相當於我們的身份證,在 FPGA 芯片生產的時候就已經固定在芯片的 eFuse 寄存器中,具有不可修改的屬性。在xilinx 7series 和 7series 以前,ID 都是 57bit 的,但是在 Xilinx 的 Ultraslace 架構下是 96bit 。

獲取 Device DNA

JTAG獲取

Vivado 中通過 JTAG 查看 DNA PORT信息。

Primitive 獲取

Xilinx 的提供的 DNA_PORT Primitive模型和時序圖如下

原語

7系列(A7/K7/Z7/V7)的FPGA使用如下原語

   DNA_PORT #(
      .SIM_DNA_VALUE(57'h000000000000000)  // Specifies a sample 57-bit DNA value for simulation
   )
   DNA_PORT_inst (
      .DOUT(DOUT),   // 1-bit output: DNA output data.
      .CLK(CLK),     // 1-bit input: Clock input.
      .DIN(DIN),     // 1-bit input: User data input pin.
      .READ(READ),   // 1-bit input: Active high load DNA, active low read input.
      .SHIFT(SHIFT)  // 1-bit input: Active high shift enable input.
   );

Ultraslace系列(VU+/VU/KU+/KU)的FPGA使用如下原語

   DNA_PORTE2 #(
      .SIM_DNA_VALUE(96'h000000000000000000000000)  // Specifies a sample 96-bit DNA value for simulation
   )
   DNA_PORTE2_inst (
      .DOUT(DOUT),   // 1-bit output: DNA output data
      .CLK(CLK),     // 1-bit input: Clock input
      .DIN(DIN),     // 1-bit input: User data input pin
      .READ(READ),   // 1-bit input: Active-High load DNA, active-Low read input
      .SHIFT(SHIFT)  // 1-bit input: Active-High shift enable input
   );

仿真

仿真程序如下所示(小編使用 7 系列FPGA)


module DNA_capture(
    
    input               sys_clk,    
    input               dna_rdy,
    output  [56:0]      dna_data,
    output              dna_valid
);
 
    wire                dna_dout;
    wire                dna_read;
    wire                dna_shift;
    

    reg     [56:0]      dna_reg = 0;
    reg     [7:0]       dna_cnt = 0;


    
   DNA_PORT #(
      .SIM_DNA_VALUE(57'h123456789abcdef)  // Specifies a sample 57-bit DNA value for simulation
   )
   DNA_PORT_inst (
      .DOUT(dna_dout),   // 1-bit output: DNA output data.
      .CLK(sys_clk),     // 1-bit input: Clock input.
      .DIN(1'b0),     // 1-bit input: User data input pin.
      .READ(dna_read),   // 1-bit input: Active high load DNA, active low read input.
      .SHIFT(dna_shift)  // 1-bit input: Active high shift enable input.
   );

    always@(posedge sys_clk)
    if(dna_rdy)begin
        if(dna_cnt == 7'd103)
            dna_cnt <= dna_cnt;
        else 
            dna_cnt <= dna_cnt + 1'b1;
    end
    
    
    assign dna_read = dna_cnt == 8'd20;
    //
    assign dna_shift = (dna_cnt >= 8'd45) && (dna_cnt <= (8'd45+8'd57-1));
 
    always @ (posedge sys_clk)
    begin
        if(dna_shift)begin
        dna_reg[56:0] <= {dna_reg[55:0],dna_dout};
        end
    end
    
    assign dna_data = dna_reg;
    assign dna_valid = dna_cnt == (8'd45+8'd57-1);

endmodule

實現

小編所使用開發板為zc7035,讀出該芯片的DNA為如下所示,與JTAG讀出一致。

那么 DNA 到底在芯片什么位置呢?

DNA在芯片上的位置

應用

情景1

用戶在邏輯上可以通過特定的接口把這個 Device DNA 讀取出來,經過一系列加密算法之后和預先在外部 Flash 存儲的一串加密后的字節串做比較,這個 flash 存儲的加密后的字節串也是由該DNA經過加密后得到,FPGA 加載程序后可以先從FPGA 讀出該段字節做比較,如果相同,則讓 FPGA 啟動相應的邏輯,如不同,則代表該FPGA沒有經過用戶授權,用戶邏輯上可以關閉FPGA的邏輯功能甚至可以通過一些手段讓硬件損壞。流程如下:

  1. 器件上電,加載程序,進行FPGA配置。

  2. 讀取FPGA DNA,並將其發送給加密算法。

  3. 加密算法生成有效的結果。

  4. 比較結果和存儲的校驗值,如果結果和存儲的校驗值相同,則程序可以正常運行。否則,禁止程序運行,或設置定時炸彈,破壞外部設備。

情景2

開發項目需雙方公司協作過程中,經常會出現 A 公司向 B 公司申請工程源碼。然而工程源碼中存在商業價值高或保密性較高的軟核部分。傳統的代碼加密機制如 ngc, edif, dcp 等封裝,ip 封裝很難做到將原核保護的作用。A 公司仍然可以拿到 B 公司工程源碼中的高價值軟核,雖然無法知道軟核的內部結構,但是參考外部接口及源碼中的邏輯即可知道其操作用法,將軟核復制,應用於自身公司的其他產品中。在商業競爭過程中,這是十分不利於 B 公司的情況。

所以在所有的高商業價值的軟核或者 dcp 模塊中,再進行封裝一層 DNA 授權小功能塊,該模塊的功能為檢測 FPGA DNA 號,與授權的 DNA 號進行對比,兩者一致后生成授權標志信號,邏輯可以利用此標志信號做到代碼只有在授權時才能正常工作的情況。由於每片 FPGA 的 DNA 號具有唯一性和不可更改性,將該模塊封裝后外部無修改接口,做到用戶即使拿到功能源碼,里面的內核也不可復制到其他 FPGA 上運行,以達到保護知識產權的作用。

參考鏈接

  1. 關於 Xilinx-FPGA 的 DNA 的使用場景和讀取方法
https://blog.csdn.net/ladywn/article/details/84393123
  1. Xilinx FPGA的程序加密方法
http://xilinx.eetrend.com/d6-xilinx/article/2018-03/12713.html

工程獲取


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM