1. 程式人生 > 實用技巧 >Xilinx FPGA 的 DNA 加密

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 到底在晶片什麼位置呢?

應用

情景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

工程獲取