WEBVTT

1
00:00:00.000 --> 00:00:06.866
輸入只有 abc 三個字元，SHA 二五六最後卻交出二百五十六位元摘要。

2
00:00:06.866 --> 00:00:12.725
中間會把訊息補成五百一十二位元區塊，用三十二位元的字運算。

3
00:00:12.725 --> 00:00:19.593
摘要不能解密回原文，也不會自己證明作者身分；可信比對或簽章另有協定。

4
00:00:19.593 --> 00:00:28.280
SHA 二二四有不同初始值，SHA 五一二斜線二五六
也有自己的規則，不能任意拿截短值代替。

5
00:00:28.280 --> 00:00:35.670
這個動畫追的是選定核心，沒有宣稱 RTL 或晶片已通過驗證。

6
00:00:35.958 --> 00:00:38.235
abc 先進訊息整理層。

7
00:00:38.235 --> 00:00:42.765
這一層記原始長度，補位，再送五百一十二位元區塊。

8
00:00:42.765 --> 00:00:48.429
接下來畫的核心只處理補好的區塊，沒有替任意 byte 串流計數。

9
00:00:48.429 --> 00:00:52.581
因此軟體或 testbench 必須先準備輸入。

10
00:00:52.581 --> 00:00:58.028
把這個分界畫清楚，後面才能分辨是補位錯，還是核心算錯。

11
00:00:58.292 --> 00:01:01.701
原始長度 L 要小於二的六十四次方。

12
00:01:01.701 --> 00:01:07.116
補一個一，再補零，直到長度除以五百一十二餘四百四十八。

13
00:01:07.116 --> 00:01:10.525
剩下六十四位放原始 L，採大端順序。

14
00:01:10.525 --> 00:01:14.737
byte 對齊時，那個一會成為十六進位八十。

15
00:01:14.737 --> 00:01:18.748
看五十五 bytes：仍放得下，一塊就夠。

16
00:01:18.748 --> 00:01:22.759
五十六 bytes 會擠到長度欄位，要兩塊。

17
00:01:22.759 --> 00:01:27.372
空訊息一塊；六十三與六十四 bytes 也要兩塊。

18
00:01:27.372 --> 00:01:32.282
即使原文剛好填滿，補位仍不能省。

19
00:01:32.542 --> 00:01:39.039
abc 的 bytes 是十六進位六一、六二、六三，補位八十接在後面。

20
00:01:39.039 --> 00:01:43.368
最高三十二位是 W 零，值就是六一六二六三八零。

21
00:01:43.368 --> 00:01:48.485
原始長度是二十四 bits，所以 W 十五放十六進位一八。

22
00:01:48.485 --> 00:01:54.979
畫面把 bytes 排進 packed vector，先固定每一格的位置。

23
00:01:54.979 --> 00:02:00.052
不能因為 CPU 平常用小端，就反過來接這裡的字序。

24
00:02:00.333 --> 00:02:05.382
區塊開始時，把 H 零到 H 七複製成工作值 a 到 h。

25
00:02:05.382 --> 00:02:08.247
第一塊的 H 來自標準初始值。

26
00:02:08.247 --> 00:02:12.434
接下來六十四輪只更新工作值，H 先留著。

27
00:02:12.434 --> 00:02:20.147
輪末還要把結果加回這份起點；若每輪都把 H 覆寫，最後就找不到該加的原值。

28
00:02:20.147 --> 00:02:24.243
H 留住起點，工作暫存器負責往下跑。

29
00:02:24.500 --> 00:02:27.232
看一個縮成八位的示意字。

30
00:02:27.232 --> 00:02:32.719
循環右轉會把右邊出去的位元接回左邊，邏輯右移則補零。

31
00:02:32.719 --> 00:02:38.628
真正 SHA 的字是三十二位；固定旋轉量通常直接接線就能做。

32
00:02:38.628 --> 00:02:45.381
加法要另外看：每個字各自在二的三十二次方取模，最外面的進位丟掉。

33
00:02:45.381 --> 00:02:49.530
XOR 沒有進位，也不能代替這個加法。

34
00:02:49.792 --> 00:02:56.010
Choose 的 x 在每個位置選 y 或 z：x 
是一就選 y，是零就選 z。

35
00:02:56.010 --> 00:03:01.446
Majority 則看三個輸入，至少兩個相同就輸出那個值。

36
00:03:01.446 --> 00:03:05.716
把一位真值表排出來，再同時套到三十二個位置。

37
00:03:05.716 --> 00:03:07.464
它們彼此沒有進位。

38
00:03:07.464 --> 00:03:12.667
先驗這兩個組合積木，後面看到第一個錯值才有地方查。

39
00:03:12.958 --> 00:03:18.309
大寫 Sigma 零和一供輪運算使用，只做旋轉再 XOR。

40
00:03:18.309 --> 00:03:23.063
小寫 sigma 零和一供排程使用，還各有一個右移。

41
00:03:23.063 --> 00:03:25.836
畫面列出全部旋轉量與右移量。

42
00:03:25.836 --> 00:03:29.600
它們名稱很像，不能把排程接到大寫那組。

43
00:03:29.600 --> 00:03:34.308
逐條檢查，尤其注意右移移出的位元不會繞回來。

44
00:03:34.583 --> 00:03:37.415
先由舊工作值算 T 一和 T 二。

45
00:03:37.415 --> 00:03:44.499
T 一加上 h、大 Sigma 一、Choose、公
開 K 常數與本輪 W；T 二來自

46
00:03:44.499 --> 00:03:47.939
大 Sigma 零和 Majority。

47
00:03:47.939 --> 00:03:49.154
K 不用保密。

48
00:03:49.154 --> 00:03:55.023
新 a 是 T 一加 T 二，新 e 是舊 d 加 
T 一，其餘沿畫面的箭頭移動。

49
00:03:55.023 --> 00:04:04.173
先把新值全部算好，到緣一起保存；非阻塞賦值不會逐行把
新 a 再當成這輪舊 a。

50
00:04:04.458 --> 00:04:07.702
前十六個 W 從區塊直接拆出來。

51
00:04:07.702 --> 00:04:14.660
W 十六以後則依畫面公式，用前兩、前七、前十五與前十六的位置計算。

52
00:04:14.660 --> 00:04:16.835
每輪都需要自己的 W。

53
00:04:16.835 --> 00:04:23.575
先用軟體完整展開六十四字，留作獨立參考；硬體接著用較小的視窗。

54
00:04:23.575 --> 00:04:30.448
兩種表示法互相比對，比兩份同樣索引的程式更容易抓出共同錯誤。

55
00:04:30.708 --> 00:04:32.563
視窗 q 有十六格。

56
00:04:32.563 --> 00:04:39.598
本輪先拿舊 q 零送 round，再用舊 q 十四、
q 九、q 一與 q 零算新尾端。

57
00:04:39.598 --> 00:04:41.667
它對應十六輪後的 W。

58
00:04:41.667 --> 00:04:45.598
到上升緣，其他舊值往前移，新字放尾端。

59
00:04:45.598 --> 00:04:48.701
所有 taps 都讀移動前的視窗。

60
00:04:48.701 --> 00:04:54.224
若先移格再算，索引雖然沒改，拿到的輪次卻已經換了。

61
00:04:54.500 --> 00:04:58.940
零到四十七輪，視窗會產生 W 十六到 W 六十三。

62
00:04:58.940 --> 00:05:03.786
到了第四十八輪，最後需要的十六個字已經排在裡面。

63
00:05:03.786 --> 00:05:09.237
仍然每輪拿 q 零，但尾端可以補零，不用再算 W 六十四之後。

64
00:05:09.237 --> 00:05:16.250
看動畫時把輪數和視窗一起對，才能知道每個字是還沒用，還是已經用完。

65
00:05:16.500 --> 00:05:20.834
六十四輪完成，a 到 h 還要各自加回保存的 H。

66
00:05:20.834 --> 00:05:25.165
八個三十二位元加法分開取模，不能跨字接進位。

67
00:05:25.165 --> 00:05:28.512
這一步叫 feed-forward。

68
00:05:28.512 --> 00:05:30.875
現在才得到這塊完成的 H。

69
00:05:30.875 --> 00:05:39.690
若最後摘要錯，但每輪都對，先查這裡：起始 H 有沒有
保留，加法有沒有做，字與字有沒有誤接。

70
00:05:39.958 --> 00:05:42.154
換成需要兩塊的訊息。

71
00:05:42.154 --> 00:05:45.946
第一塊累加完成的 H，就是第二塊的起點。

72
00:05:45.946 --> 00:05:49.339
只有新訊息的第一塊才載標準初始值。

73
00:05:49.339 --> 00:05:53.730
每塊各自重新雜湊再串在一起，會改變計算結果。

74
00:05:53.730 --> 00:05:59.468
這條跨塊相依也解釋了為什麼控制器必須認得第一塊與續塊。

75
00:05:59.750 --> 00:06:04.626
valid 和 ready 在上升緣同為一，才收一塊。

76
00:06:04.626 --> 00:06:09.692
資料、first 與 last 都在這緣保存，不能分開換。

77
00:06:09.692 --> 00:06:17.681
來源先提出 valid，等不到 ready 就持續保
留資料，不能先等 ready 才肯提出。

78
00:06:17.681 --> 00:06:25.825
first 開始新訊息；last 指的是補位後最後一
塊，不是最後一段原始 bytes。

79
00:06:26.125 --> 00:06:30.272
WAIT_FIRST 只接受 first 為一。

80
00:06:30.272 --> 00:06:36.099
ROUND 跑六十四輪，ACCUM 做累加；如果不是 last，就去 

81
00:06:36.099 --> 00:06:40.611
WAIT_NEXT，只接受 first 為零的續塊。

82
00:06:40.611 --> 00:06:45.310
最後一塊完成後去 OUTPUT_HOLD，保存摘要。

83
00:06:45.310 --> 00:06:49.445
等待續塊時 busy 可以是零，但訊息還沒結束。

84
00:06:49.445 --> 00:06:55.240
看工作是否完成，要讀這些階段和 last，不能只讀 busy。

85
00:06:55.500 --> 00:06:57.849
E 零收區塊並初始化。

86
00:06:57.849 --> 00:07:06.017
第一輪到 E 一才做，六十四輪跑到 E 六十四；E 
六十五累加，最後區塊此時摘要有效。

87
00:07:06.017 --> 00:07:10.530
最早 E 六十六交付，E 六十七收下一份新訊息。

88
00:07:10.530 --> 00:07:17.623
接受到有效六十五拍，續塊間隔六十六拍，單塊新訊息間隔至少六十七拍。

89
00:07:17.623 --> 00:07:24.501
這些數字假設一輪一拍、獨立累加器；共享加法器或加管線就要重新排。

90
00:07:24.501 --> 00:07:28.290
頻率仍要做綜合、佈局與時序分析。

91
00:07:28.542 --> 00:07:33.419
摘要 valid 已經是一，但接收端 ready 還是零。

92
00:07:33.419 --> 00:07:38.283
H、摘要資料與 valid 必須留住，不能接新區塊覆蓋。

93
00:07:38.283 --> 00:07:43.709
等到兩者同為一的緣，才記傳送完成，回 WAIT_FIRST。

94
00:07:43.709 --> 00:07:47.637
testbench 分開記錄運算完成和交付。

95
00:07:47.637 --> 00:07:52.852
背壓時先查值有沒有變，再查傳送有沒有多一筆或少一筆。

96
00:07:53.167 --> 00:07:57.260
低有效同步 reset 到上升緣才清暫存器。

97
00:07:57.260 --> 00:08:02.127
H、工作值、視窗和控制回起點，正在處理的訊息取消。

98
00:08:02.127 --> 00:08:08.551
解除後要重新送 first 為一的第一塊，不能從被取消的中間區塊續跑。

99
00:08:08.551 --> 00:08:17.077
scoreboard 也要刪掉那份期待摘要，不然它會
把沒有交付的取消交易當成漏掉答案。

100
00:08:17.333 --> 00:08:18.792
回到 abc。

101
00:08:18.792 --> 00:08:26.970
NIST 標為 t 等於零的值，是第一輪之後，對應這
裡 E 一，不能拿 E 零剛載入的值比。

102
00:08:26.970 --> 00:08:34.310
第一輪 a 是五 d 六 a ebcd，e 是 fa
 二 a 四六二二；完整摘要在畫面下方。

103
00:08:34.310 --> 00:08:39.483
從第一個分歧開始查，比拿最後摘要猜原因更有效。

104
00:08:39.750 --> 00:08:43.130
W 零不對，查補位和 byte 順序。

105
00:08:43.130 --> 00:08:48.099
W 十六先錯，查小 sigma、taps 和先讀後更新。

106
00:08:48.099 --> 00:08:52.471
每輪對但摘要錯，查 feed-forward。

107
00:08:52.471 --> 00:08:57.639
短訊息對、長訊息錯，查跨塊 H 與 first、last。

108
00:08:57.639 --> 00:09:01.216
若值對卻筆數錯，就看背壓和握手紀錄。

109
00:09:01.216 --> 00:09:05.740
這個順序跟著值的來源走，能縮小要查的電路。

110
00:09:06.000 --> 00:09:12.231
軟體可以比對完整排程與摘要，還不能替 RTL testbench 通過。

111
00:09:12.231 --> 00:09:19.542
硬體測試要加入多區塊、輸入空拍、隨機背壓、錯誤 first
，還有各階段 reset。

112
00:09:19.542 --> 00:09:22.832
只在握手緣記帳，比對值、筆數和順序。

113
00:09:22.832 --> 00:09:27.218
加上 timeout，才不會把核心卡住當成還在等。

114
00:09:27.218 --> 00:09:30.310
這裡提供的是要完成的驗證工作。

115
00:09:30.583 --> 00:09:36.849
實作時可以先做純組合 round，接排程與常數，再整合狀態和控制。

116
00:09:36.849 --> 00:09:41.777
H、工作值與十六格視窗共一千零二十四位元，控制另算。

117
00:09:41.777 --> 00:09:43.862
訊息整理層還要接上來。

118
00:09:43.862 --> 00:09:51.823
若拿摘要做可信啟動或 HMAC，也得補協定與金鑰處理
，功能向量沒有涵蓋抗故障或側通道。

119
00:09:51.823 --> 00:10:00.819
換成五十六 bytes 的輸入試一次：wrapper
 要多送一塊，控制器是否仍保留第一塊算完的 H？
