RTL Anti-Tampering Design / 07 / DRAFT

FSM 狀態編碼:碼距只保護指定的保存狀態

English · 故障實驗台

控制器正在檢查未授權映像。六位元狀態從 CHECK 變成 RELEASE,授權卻沒有完成。新碼字合法,狀態解碼器認得它,也因此開閘。本課先算哪些替換能造成這個結果。

這是碼字表,不是轉移圖。六組碼字距離都是 4。本課原創機制圖 7RTL / 07 / 機制與反例WAIT = 000000合法狀態碼CHECK = 001111合法狀態碼RELEASE = 110011合法狀態碼ERROR = 111100合法狀態碼001111 XOR 111100 = 110011距離=4。結果是合法 RELEASE,不是非法碼。這是碼字表,不是轉移圖。六組碼字距離都是 4。原創教學模型・尚未做 RTL、形式或晶片驗證

先寫完整狀態表

器材室用六格流程牌表示等候、檢查、可交付與錯誤,分別是WAIT、CHECK、RELEASE、ERROR。牌上只准四種圖樣,其餘是非法值。任兩張指定牌都差四格,所以改一至三格會落到非法圖樣;改四格可能變另一張完整牌。流程牌的距離只講保存狀態,不會證明器材真的經過檢查或這位學生有資格。

影片時序勘誤(英文 01:17–01:24):影片把 default 分支說成在接受緣之後才執行,容易把計算與保存混在一起。組合邏輯可以在緣前先算出下一態 ERROR;狀態暫存器則在本緣取樣後才更新。當下輸出仍須另外拒絕不安全交付。觀看該段請以這個區分為準。原影片與字幕保留,這段是明示勘誤,沒有宣稱已重製影片。

有限狀態機稱為 FSM,用暫存器保存目前階段。稀疏編碼在大位元空間中,只指定少數合法值。其他值能協助辨認錯誤,前提是實作真的識別它們,並拒絕不安全輸出。

本課六位元表為 WAIT=000000、CHECK=001111、RELEASE=110011、ERROR=111100。六組不同狀態配對都相差四位。只查 CHECK 到 RELEASE,可能漏掉其他較近配對;最小距離要遍歷整張表。

這張表中,一、二或三位儲存翻轉無法變成另一個命名狀態,只會得到非法值。四位則可能變成另一個合法態。因此,碼距支持的是有預算的替換主張,且仍須信任合法性檢查與輸出閘。

碼距擋住哪些翻轉?

CHECK牌是001111,四格遮罩111100把它變成110011,也就是RELEASE。遮罩碰巧與ERROR牌111100相同,卻只是『哪些格要改』,不是最終牌名。先做XOR再查狀態表,才不會以為發生了CHECK→ERROR。這對應mask=60;它超出三格預算,也沒有證明正常流程真的走到RELEASE。

名稱 六位元保存值 十六進位
WAIT 000000 00
CHECK 001111 0f
RELEASE 110011 33
ERROR 111100 3c

先算 CHECK XOR RELEASE:001111 XOR 110011 = 111100,四個 1 代表距離 4。其他五對 WAIT/CHECK、WAIT/RELEASE、WAIT/ERROR、CHECK/ERROR、RELEASE/ERROR 的 XOR 也各有四個 1。所以一至三位翻轉不能把任何一個命名狀態變成另一個命名狀態;它仍可能變成非法值,需要當拍拒絕。

實驗 mask=60 是十進位,等於十六進位 3c、二進位 111100。CHECK XOR mask = 001111 XOR 111100 = 110011,得到 RELEASE。Mask 和 ERROR 的碼字碰巧相同,但 mask 是運算元,不是轉移後狀態。四位翻轉已超出一至三位的預算;不能拿這個反例否定那個受限結論,也不能拿受限結論保證四位故障安全。

在 RELEASE,完整解碼與 illegal 檢查都通過。是否應放行,還要問這次交易是否被授權。綁定授權可擋住這條未授權替換;此教學替換不證明正常 FSM 走得過所有路徑。

當拍拒絕不安全輸出

門口看到一張不在表上的流程牌,必須在這次交器材前拒絕。值班員說『下一次鐘響換ERROR牌』,只能改變下一態,不能收回這次已交的器材。這對應當拍完整RELEASE解碼與next-state default。完整相等本來就拒絕非法牌,不要把旁邊的bad標簽算成第二套獨立防護;故事也不保證綜合後仍使用這四種圖樣。

Default 分支把下一態送進 ERROR,影響的是目前接受緣之後。若輸出解碼器已讓非法目前態放行,下一拍復原就太晚。RELEASE 要完整比對,當下非法態也要擋住同一接受緣。

小模型只在 state=RELEASE 時放行。非法態另以 bad 回報。Sticky 能保存歷史供後續復原,不能代替當拍阻擋。此解碼的完整相等已拒絕非法態,不要把另一個閘說成額外獨立覆蓋。

RTL 常數不保證綜合後編碼相同。須檢查產出的 netlist 是否重編碼、暫存器寬度及輸出邏輯。OpenTitan 提供稀疏 FSM 儲存用的 flop wrapper,但 wrapper 與 assertion 本身不能證明整個控制器安全。稀疏 FSM 原始碼

分清狀態替換與正常轉移

這次演練從已保存CHECK牌開始,改一次後在edge1看交付。改四格變成完整RELEASE,牌子稽核不報非法,原資格卻仍拒絕。加binding要另外看獨立許可,對應bind政策;這份許可來自harness。演練只換一張牌,沒有實際走完WAIT→CHECK→RELEASE,也沒有把測試許可變成現成產品電路。

主實驗從已保存 CHECK 開始。在 edge 1 接受前,一次事件 XOR 六個保存位元,遍歷六十四種 mask。Reference 映像未授權。狀態解碼、來源、時脈與重置,以及最終接受端保持可信。

Mask=111100,也就是十六進位 3c,把 001111 改成 110011。解碼器看到合法 RELEASE,bad 維持 false,請求便 commit。它影響四位,超出三位主張,但落在擴大後的四位預算內。

Bind 政策另要求獨立授權。因目前映像未獲許可,它能擋住合法態反例。模型從可信 harness 提供這個值。練習指出欠缺條件;真正設計仍須建立來源與完整性。

找出最近的合法放行碼

先改CHECK一格,看門口拒絕,再改四格到RELEASE,看未綁資格的門口放行。其他四格改動還可能得到WAIT或ERROR,沒有交器材也不一定報非法。這對應六十四種mask裡的合法落點。授權RELEASE不改牌的控制,只證明解碼可放行;流程是否走得通要看下一課的交易。

選 CHECK、mask=1 並關閉 binding。結果非法,commit 為 false。再試兩位或三位 mask。接著輸入 60,即 0x3c 的十進位。顯示碼變成 RELEASE,請求也被接受。把軌跡與狀態表一起保存。

已執行枚舉遍歷 CHECK 的每個 mask,並查所有配對距離。六十四種 CHECK mask 中,只有一種到未授權 RELEASE。其他四位 mask 可能到合法 WAIT 或 ERROR。因此,沒有 commit 的軌跡不能一律標為已偵測。

解碼正向控制設 RELEASE、授權 true、binding true、mask=0。第八課另跑正常 WAIT→CHECK→RELEASE 交易。單獨解碼控制不能證明完整控制器可達放行,也沒有證明轉移條件可信。

待驗證 RTL/SVA

把四張流程牌寫成RTL常數,門口完整比對RELEASE,再檢查另有依據的auth_bound_i。交付簿每有一次接受,稽核就核對完成與真實許可,對應reference_complete與reference_pass。紙上流程牌只是編碼示例;尚未編譯的SVA不能證明制造後的牌子、scan或輸出路徑安全。

讀懂本課的性質:狀態碼與交易授權

稽核員看『牌子合法嗎』和『這次器材能交嗎』,是兩個問題。四格改出RELEASE會過第一關,未綁定而發生交付時,獨立未授權簿讓授權 assertion 失敗。Cover用授權RELEASE檢查一個可交付情況;如果一直掛WAIT牌,拒絕性質可能永遠成立,但沒有服務。此處仍沒有檢驗轉移條件的真假。

SVA 是 SystemVerilog Assertions;assertion 是檢查規則,不是放行電路。以下每個上升緣,reset 未生效時,若 accepted_commit(第九課用 csr_commit)為 1,|-> 要求右側判準在同一緣成立。沒有接受時,這條蘊涵不會報授權失敗;還需要正常工作的正向控制。disable iff (!rst_n) 排除 reset 有效期間;不能據此保證 reset 安全。

Cover 找一條符合條件的路徑,不證明所有交易正確。Reference 是 testbench(測試平台)獨立保存的期望值,harness 是提供輸入、注入預算與判準的測試外框,DUT 是被測設計。本課的兩態模型只計 0、1,不模擬 X 或拍內延遲;「兩態」不指 FSM 只有兩個狀態。語法與接線對照可回查第一課第 5 節。片段尚未編譯,不能把列出性質當成已證明。

localparam logic [5:0] Wait=6'h00, Check=6'h0f, Release=6'h33, Error=6'h3c;
assign illegal = !(state_q inside {Wait,Check,Release,Error});
assign grant = (state_q == Release) && !illegal && auth_bound_i;
assert property (@(posedge clk) disable iff (!rst_n)
  accepted_commit |-> reference_complete && reference_pass);
cover property (@(posedge clk) disable iff (!rst_n)
  state_q == Release && reference_pass && accepted_commit);

RTL/SVA 尚未編譯。ERROR 可達性、輸出解碼故障、scan 存取與綜合重編碼,都要另查。請回第四課,用獨立 grant 目標檢查解碼後輸出受擾;本課儲存枚舉沒有涵蓋它。最小距離四,也沒有涵蓋錯誤 CHECK 條件選到合法下一態。下一課會處理這個問題。

檢查你的推理

給同學四張流程牌,請他先算六組距離,再說明哪張改後的牌能交器材。最後問『下一拍換ERROR』是否來得及阻止本拍。這些題對應完整碼表、輸出解碼與接受緣;算出最小距離4仍沒有回答錯誤條件能否選到合法下一態。

1. 四狀態表要查幾組不同配對?

六組。

2. 三位元故障能到另一命名狀態嗎?

這張表內不能。

3. 哪個 mask 把 CHECK 改成 RELEASE?

0x3c,十進位 60。

4. Default:ERROR 保證當拍阻擋嗎?

不保證,輸出閘當拍就必須安全。

5. 綜合後要查什麼?

實際狀態碼、保存寬度及輸出邏輯是否保留。

工程收尾

交接時把CHECK牌、四格遮罩與未授權交付紀錄放在一起,別只留『合法RELEASE』截圖。下面同一器材室例子逐項說清保存預算與授權缺口;正常流程與實體檢查仍另外列,沒有從一張流程牌推論整個控制器。

威脅與故障模型

從CHECK牌一次改六格中的mask,edge1觀察交付。至多三格的主張先信任查牌與門口,沒有涵蓋四格替換。

Edge 1 前一次六位元狀態 XOR,從 CHECK 枚舉六十四種 mask;碼距主張限定低於四位。其他邏輯與 reference 可信。
根因

四格把CHECK改成完整RELEASE,牌沒有非法,學生仍沒有許可。問題是合法牌與真授權不同。

四位翻轉得到合法 RELEASE。合法性解碼不報錯,授權卻仍為 false。
防禦

門口完整查RELEASE並核對獨立資格;制造後還查編碼是否保留。多一張流程牌本身沒有建立資格來源。

完整狀態與輸出解碼,加上另有可信依據的授權;還須驗證綜合保留表示法。
驗證

把六組牌距和六十四種CHECK改動都算完,再試授權RELEASE。後者只是解碼控制,正常排隊流程另外測。

Node 已查全部配對距離、六十四種 CHECK mask 及授權 RELEASE 解碼。正常流程另在第八課測。
界線

用遮罩換牌沒有經歷檢查階段。不得把這條流跡說成轉移、scan或實物驗證;正常路線交給下一課。

解碼枚舉不能支持轉移、netlist、scan、實體或形式驗證結果。
遷移練習

若把一張合法牌改近CHECK,先重算六組距離,再找新增的一格或兩格替換。只查CHECK到RELEASE會漏掉新的最小距離。

把一個狀態碼改近。重算最小距離,找出新增的低位元替換。

故障實驗台 / 07

在實驗臺把raw、seen與state讀成原牌、改後圖樣與查表牌名;bad只報非法圖樣,commit表示交付。重設後保持同一拒絕資格,切換binding,看完整RELEASE為何仍應拒絕。這個實驗沒有增加一條真實轉移歷史,也沒有量測器材室門的反應速度。

已執行有限、兩態教學模型。RTL 模擬、合成、形式證明與晶片驗證均尚未執行。Reference 欄位是可信測試平台的觀察,不是晶片多出來的防禦。

Reference 是獨立判準。紅色列表示接受了判準不允許的操作;出現 alert 無法撤回已接受的操作。

各列先觀察該緣前的狀態,再更新與注入儲存故障。

開啟完整教材