**110020015劉祐瑋 Hardware Security PA1- ROPUF** Hackmd link: https://hackmd.io/gROOz-h0T1uDLQNmhPmVcg?view # Backgroug 對電腦安全的需求顯著增加。物理不可複製函數 (PUF) 也被認為是物理單向函數,由於其製造成本低、固有的隨機性、固有的防篡改性和難以複製性,已成為一種突出的解決方案。這些特性使 PUF 成為基於硬體的安全設計的理想選擇,特別是密鑰產生和儲存。 PUF 利用晶片製造過程中的自然差異來產生獨特的裝置指紋,透過質詢回應協定提供安全的身份驗證和通訊方法。這些協議涉及向用戶發出挑戰,然後用戶必須根據一些先前商定的秘密資訊或密鑰提供回應,從而有效地證明其身份或合法性。從數學上講,PUF 可以描述為函數 ($R = f(C)$),它將一組挑戰或輸入 $(C)$ 映射到一組響應或輸出 $(R)$,從而透過 PUF 產生響應$(R)$機制。 # Specification 我們將會設計一個RO-PUF,下圖為整個設計的架構(input signal:橘色,output signal:紅色)。 ![image](https://hackmd.io/_uploads/BkTP27j1A.png) 這裡將會解釋每個module的功能。 ## Top PUF ### 輸入與輸出介面 | Signal Name | I/O | Width | Simple Description| | -------- | -------- | -------- |----------| | clk | I | 1 | 本系統為同步於時脈正緣之同步設計。 | | rst | I | 1 | 高位準非同步(active high asynchronous)之系統重置信號。 | | en | I | 1 | 使系統開始動作 | | output_ready | I | 1 | 為1時代表Slave端準備好接受資料,反之| | output_valid | O | 1 | 為1時代表Master端準備好傳送資料,表示目前的response為有效輸出,反之| | challenge | I | 8 | 8 bit challenge data| | response | O | 8 | 8 bit response data| ## FSM ### state intoduction - **RESET:** 當Top_PUF.rst信號拉起後會進入此state。並且下一個cycle會直接進入WAIT state。 - **WAIT**: 等待Top_PUF.en信號拉起後會進入CACL state。 - **CACL**: 在此state時會開始計算response,等待buffer.full拉起時會跳入DONE state。 - **DONE**: 等待slave(tb)端來接收response,當Top_PUF.output_ready拉高代表成功接收response進入RESET state。 ### verilog code 簡單介紹 ## Ring Oscillator ### 功能說明: 由14個not gate 與 1個 nand gate所組成且每個gate都有delay time,也正因如此可以設定不同的Delay time產生不同頻率的方波。 ### I/O interface: | Signal Name | I/O | Width | Simple Description| | -------- | -------- | -------- |----------| | en | I | 1 | 啟動ring oscillator。由FSM控制,當state=CALC時為1 | | ro_out | O | 1 | output | ### code 簡單介紹: ro.en(由state控制): ![image](https://hackmd.io/_uploads/ryfxNR8yC.png) gate dalay 設計: ![image](https://hackmd.io/_uploads/B1FQE0UJC.png =25%x) 可調delay time 讓我們設計出不同頻率的RO: ![image](https://hackmd.io/_uploads/Byi1BCLJ0.png =25%x) ## 8 to 1 MUX ### 功能說明: 這會有兩個MUX,MUXA 和MUXB。每個MUX會從8條不同頻率的ro_out選一條當OUTPUT,由Scrambler 的output當作sel信號來選擇。 ### I/O interface: | Signal Name | I/O | Width | Simple Description| | -------- | -------- | -------- |----------| | in | I | 8 | 每個bit為不同RO的OUTPUT| | sel | I | 3 | MUXA 為Scrabler_rdata[7:5]、MUXB 為Scrabler_rdata[2:0] | |out|O|1|output data| ### code 簡單介紹: ![image](https://hackmd.io/_uploads/BJ7yjCLkR.png) ## Counter ### 功能說明: 這裡對應到MUX也會有兩個Counter,當@(posedge clk)時,en 為1時,counter會加一,然後當counter等於8時會傳出finish訊號。三種狀況會使counter reset,第一種是當系統state =RESET 時,第二種是當另一個counter的finish拉高時會reset,第三種就是當自己數到8時也會自己reset。 ### I/O interface: | Signal Name | I/O | Width | Simple Description| | -------- | -------- | -------- |----------| | clk | I | 1 | CLK| | en | I | 1 | 連接MUX output signal | |rst|I|1|當state=RESET或另一個counter的finish拉高時會為1| |finished|O|1|當數到8時,會拉為1且只會維持一個cycle| ### code 簡單介紹: finished 設計:這裡我故意讓他只會有一個cycle為1,且注意因為不一定每次@ posedge cycle時en都剛好來,所以故意設計如果接連者來q會reset到1,但如果沒有接連者來會先reset 到0,這樣不論en有接著來或者沒接著來,reset後下一次en來都會為1,同時也可以確保finished 訊號只會維持一個cycle。 ![image](https://hackmd.io/_uploads/SJDGbJPyC.png) counter rst signal : 如果自己數到8內部會自己reset,同時finished信號也可以當作另一個counter 的reset 信號代表有一個已經數到另一個也要重數,當然系統reset時也要OR進去。 ![image](https://hackmd.io/_uploads/H1kDZ1vkC.png) ![image](https://hackmd.io/_uploads/SyaDZyvyA.png) ## Arb和Buffer ### 功能說明: Arb會比較從兩個counter端送出來的finished值,當counter A的finished大於counter B 的finished時out會為1(換句話說就是counter A比較快數到)。同時兩個finished會當作buffer的en(當兩個finished同時為1時不會拉高en)代表這時從arb比出來的值才是有效的,並且寫入data同時每次寫入時會做shift,當buffer存入8筆資料後會把full拉為1。 ### I/O interface of Arb: | Signal Name | I/O | Width | Simple Description| | -------- | -------- | -------- |----------| | in1 | I | 1 | 連接counter A 的finished| | in2 | I | 1 | 連接counter B 的finished | |out|O|1|in1>in2時為1,其餘時候為0| ### I/O interface of Buffer: | Signal Name | I/O | Width | Simple Description| | -------- | -------- | -------- |----------| | clk | I | 1 | CLK | | en | I | 1 | 使wdata有效輸入 | |rst|I|1|當state=RESET時會為1| |wdata|I|1|連接至arb_out| |rdata|O|8|連接至response| |Full|O|1|當寫入8筆資料後會拉高為1| ### code 簡單介紹: arb: ![image](https://hackmd.io/_uploads/BJ7igxwk0.png) buffer: 每次輸入資料會做shift,當輸入8資料後會拉起full,同時不能再寫入新的data。 ![image](https://hackmd.io/_uploads/SJtaxePJA.png) buffer_en: 因為finished 只會是1或0,當都是0或都是1時en為0,剩餘狀況為1。(應該要用xor,比較省資源但是只跑simulation就沒有特地去改過來了) buffer_rst: 當state為RESET時會重啟buffer。 ![image](https://hackmd.io/_uploads/H1YV-lPJR.png) ## Scrambler ### 功能說明: The scrambler receives an 8-bit Challenge input, and it will randomly encrypt the input using Non-linear Feedback Shift Register (NLFSR) to generate a output signal. While generating a new bit, it can perform bitwise XOR operation between this 8-bit Challenge input. The 8 bits coming out of the LFSR should be XORed with the 8 bits from the previous time point. the following figure gives the details of using LFSR to create NLFSR: ![image](https://hackmd.io/_uploads/HkmzhlDkA.png) 除此之外,我多設計了en這個signal,不為1時會讓chall等於wdata(亦即challenge from the testbench),當en為1時才會開啟Scrambler讓chall開始根據上圖做變動,也就是說我並不需要特別設計rst訊號,因為當en沒有為1時就會自動的接收新的challenge input。 ### I/O interface of Scrambler: | Signal Name | I/O | Width | Simple Description| | -------- | -------- | -------- |----------| | clk|I|1|CLK| | wdata | I | 8 | 連接challenge| | en | I | 1 | 當state=CACL時為1,開始運作 | |rdata|O|8| 連接至MUX_sel| ### code 簡單介紹 可以注意到當en不為1時,chall會為wdata,為當等於1時才會開始運作。 ![image](https://hackmd.io/_uploads/SyQ6uWv10.png =50%x) Scrambler_en: 當state為CACL時,才會為1。 ![image](https://hackmd.io/_uploads/BygqyMPy0.png) # testbench design 先設定輸出vcd檔,因為gtkwave我用比較習慣: ![image](https://hackmd.io/_uploads/HyBCkMwyR.png) 確保設計錯誤時可以結束模擬: ![image](https://hackmd.io/_uploads/HyO7gzPyC.png) 設定模擬CLK的週期: ![image](https://hackmd.io/_uploads/HyQdeMDJA.png) 設定連接到top_PUF的接線,注意這裡output_ready直接設為1,因為testbench隨時都可以接收資料,但如果今天進入系統等級時,CPU並不一定有空來接收資料: ![image](https://hackmd.io/_uploads/r1qXbGDyR.png) 設定如何給challenge ,且如何收response。一開始先讓系統rst ,然後輸入challenge且等待到下一個cycle才給en為了確保有效寫入Scrambler。最後等到output_valid拉高時代表這時的response為有效的輸出並且顯示出來。 如果要做下一筆前先等一個cycle,讓系統自己rst,這時在如上述一樣給challenge和收response。 ![image](https://hackmd.io/_uploads/H1PoPQDk0.png) # Waveform of each module ## Scrambler: 可以發現下圖符合上面Scrambler的specification。當chall(t0)=8'b11010100時,chall(t1)=8'b10111110。 ![image](https://hackmd.io/_uploads/SJ862mD1C.png) ## MUX and RO(以一組舉例就好,共兩組): 首先in[i] 代表不同的ro ring 的output。首先下圖可以發現當ro_en為1時會讓他震盪,為0時不會震盪(紅色框框為不震盪)。 ![image](https://hackmd.io/_uploads/HkYuRmDJA.png) 再者可以觀察到因為每個RO的delay time 不一樣,所以震盪頻率並不一樣。 ![image](https://hackmd.io/_uploads/S1Xby4Py0.png) 最後,可以發現由sel會選擇不同條RO output 作為MUX_out。 ![image](https://hackmd.io/_uploads/Hku9GNwJC.png) ## Counter and Arb: 我們可以發現如果en=1@posedge clkcounter時counter會加1。 ![image](https://hackmd.io/_uploads/HyrpOEDk0.png) 當數到8時,finished 會拉高同時finished只會維持一個cycle,除此之外q會reset(當下一個cycle en 為1時會直接reset 為1,如果en為0則會reset為0)。 ![image](https://hackmd.io/_uploads/B1xm9VDk0.png) ![image](https://hackmd.io/_uploads/Hk7BcVwkR.png) 除此之外如果兩者有一個先數到8時,另一個也會reset至0(這樣確保兩者新的一輪時,當en=1@posedge clk 第一次q都為1)。 ![image](https://hackmd.io/_uploads/SJDGi4DJA.png) arb會判斷哪一個先數到8(要對應buffer_en一起看才是有效輸出),counter A比較快時arb_out為1,反之。 ![image](https://hackmd.io/_uploads/H1x23Vv10.png) ## Buffer 可以發現en寫入8次後會拉高full訊號,並且等到接受到資料後會reset。(紅色框框為8次en代表寫入了8筆資料,藍色框框為寫入8筆資料後full拉高,並且因為上述所提testbech可以馬上收走資料,所以下一個cycle就rst) ![image](https://hackmd.io/_uploads/S1-gR4vyA.png) ## 整個testbench中最外層的Top_PUF 首先rst,會使state=RESET,經過1 cycle下一個會進入WAIT state,這時會把challenge 輸入至Scrambler,然後等待en拉高時會進入CACL state,最後當state=DONE時,output_valid會為1代表這時的response為有效輸出。因為testbench馬上就收走資料,所以下一個cycle就進入RESET state。 ![image](https://hackmd.io/_uploads/SyAIeSP1R.png) 同時我利用上面tb方法,連續兩次輸入一樣的challenge,驗證是否response一樣。 ![image](https://hackmd.io/_uploads/B1m4mBv1C.png) # Evalution To assess the performance of PUF circuits, several quality metrics, including Reliability, Uniformity, and Uniqueness, have been presented. In this Programing Assignment, I evaluate Uniformity and Uniqueness. ## Uniformity(UF): It estimates how uniform the proportion of 1s and 0s is in the PUF response bits. Uniformity reflects the randomness of the response bit and is measured as a percentage of the response bit’s Hamming weight (HW) according to the equation in below. 50% is the best value for uniformity: $$ Uniformity_i=\frac{1}{n}\sum_{j=1}^{n}u_{i,j}\times 100 \%$$ where $𝑢_{𝑖,𝑗}$ is the jth bit of n-bit response of ith chip. 我利用上面tb一口氣給入5筆challenge來測每筆的uniformity ![image](https://hackmd.io/_uploads/r1HHrHPJC.png) 第1筆uniformity為:37.5% 第2筆uniformity為:37.5% 第3筆uniformity為:37.5% 第4筆uniformity為:50% 第5筆uniformity為:75% ## Uniqueness (UQ): This statistic assesses the difference of a PUF’s responses to the same challenge when implemented on several PUF chips (k). The uniqueness is calculated as the inter-chip variation of various responses using below equation. 50% is the best value for UQ: $$ Uniqueness=\frac{2}{k(k-1))}\sum_{i=1}^{k-1}\sum_{j=i+1}^{k}\frac{HD(S_i,S_j)}{n}\times 100 \%$$ where $𝑆_𝑖$ is n-bit response of ith chip, $𝑆_𝑗$ is n-bit responses of jth chip, k is the quantity of PUF chips, and HD($𝑆_𝑖$ , $𝑆_𝑗$ ) is the Hamming Distance between n-bit responses $𝑆_𝑖$ and $𝑆_𝑗$. 我總共利用調不同的delay,假裝有3顆(k=3)不一樣的PUF來測試。 challenge 都為11010010 第一顆response: ![image](https://hackmd.io/_uploads/S1hpw7jkC.png) 第二顆response: ![image](https://hackmd.io/_uploads/SyV3_XsyR.png) 第三顆response: ![image](https://hackmd.io/_uploads/BytPY7skA.png) 所以由上面的公式我們可以計算出 Uniqueness=33% # Other PUF design (Bonus) 參考了教授上課的ref發現RO有很多種,其中一種如下,我將利用這個RO結合本次作業構思一個新的PUF。 ![image](https://hackmd.io/_uploads/BJADi4skA.png =50%x) 新的架構圖如下(其中我們一樣在not gate上設delay): ![image](https://hackmd.io/_uploads/Sk5SiVoyC.png) 大致上module與tb都跟上面介紹一致並沒有更改,在此就不特別介紹。 ## Result waveform: - ro output ![image](https://hackmd.io/_uploads/SJiCDEjkR.png) 可以知道他一樣震盪的起來,這樣就跟我們上面設計的RO有異曲同工之妙。 Uniformity: ![image](https://hackmd.io/_uploads/rJk_OEoyR.png) 這裡我就只計算一筆的Uniformity=62.5% Uniqueness: 我總共利用調不同的delay,假裝有3顆(k=3)不一樣的PUF來測試。 challenge 都為11010010 第一顆response: ![image](https://hackmd.io/_uploads/Syfl5NoyC.png) 第二顆response: ![image](https://hackmd.io/_uploads/HyIX9Nsk0.png) 第三顆response: ![image](https://hackmd.io/_uploads/S1HLcEsJC.png) 所以由上面的公式我們可以計算出 Uniqueness=33%