試圖從 tls1.3 RFC8446 中理解 struct HkdfLabel
我正在查看RFC 8446第 7.1 節並試圖理解以下內容:
HKDF-Expand-Label(Secret, Label, Context, Length) = HKDF-Expand(Secret, HkdfLabel, Length) Where HkdfLabel is specified as: struct { uint16 length = Length; opaque label<7..255> = "tls13 " + Label; opaque context<0..255> = Context; } HkdfLabel; Derive-Secret(Secret, Label, Messages) = HKDF-Expand-Label(Secret, Label, Transcript-Hash(Messages), Hash.length)
HkdfLabel
似乎是幾個欄位的串聯,以使其“適合” 的簽名Hkdf.Expand(...)
。有幾點我不清楚:
構成
HkdfLabel
預期結構的部分是否按照它們定義的順序連接?例如length||label||context
length
= 以字節為單位的雜湊長度?的第一位沒有指定,假設為 0
0..6
?label
"tls13 " + Label
可能比分配給7..255
的位數更多或更少label
。如果不夠長則期望為零,或者如果太長則截斷為 256 位?相同的基本不確定性
context
,是context
總是正好是 256 位的想法嗎?假設上述是正確的,這是否意味著
HkdfLabel
將永遠是 528 位?
HkdfLabel = hashLength<0..15>||label<0..255>||context<0..255>
第 3 節解釋了資料結構及其作為八位字節字元串(或字節字元串:此 RFC 可互換使用“八位字節”和“字節”)的表示。特別參見第 3.1 節:
多字節數據項是字節的串聯,從左到右,從上到下。
An
HkdfLabel
是length
(big-endian,參見§3.3)的 2 個字節、 的 7 到 255 個字節label
和 0 到 255 個字節的串聯context
。§3.4解釋了<7..255>
它在 7 到 255 個字節(含)之間的含義。因此,長度HkdfLabel
可以是 9 到 514 個字節。返回的
length
欄位是作為參數傳遞的值。當它被呼叫時,這是散列的字節長度(不是位)(第 7.1 節:“ Hash.length是它的輸出長度,以字節為單位”)。HkdfLabel``HKDF-Expand-Label``Length``Derived-Secret
的前 6 個字節
label
是(第 7.1 節:“本文件中指定的標籤均為 ASCII 字元串”)74 6c 73 31 33 20
的 ASCII 編碼。"tls 13"
"tls13 " + Label
是一個 6 字節字元串與Label
. 由於結果必須至少有 7 個字節長,這有效地禁止了空標籤,我在任何地方都找不到明確說明。沒有填充或截斷。請再次注意,這些是以字節(八位字節)為單位的長度,而不是位。標籤的長度也必須最多為 249 字節才能適應。
Context
可以是 0 到 255 字節之間的任何位置