HKDF
Extract로 섞고, Expand로 늘림 · 둘 다 HMAC 하나로 만듦 · TLS 1.3 키 교환의 키 스케줄에 쓰임
HKDF-Extract(salt, IKM) = HMAC(salt, IKM)
salt (키)13바이트
000102030405060708090a0b0cIKM (메시지)16바이트
eab3b5ec9ca020ebb984ebb080eab092PRK32바이트
910d4742d8dc5006d60fe9c565bda5ec349e60aeaecbb81238e102fdf6d4a9b4HKDF-Expand(PRK, info, L)
- 1
T₁ = HMAC(PRK, info ‖ 0x01)
PRK (키)32바이트910d4742d8dc5006d60fe9c565bda5ec349e60aeaecbb81238e102fdf6d4a9b4info13바이트ec9888ec8b9c20ec9aa9eb8f84카운터 i1바이트01T₁32바이트d7a5816161d99e49ac54666006e6e09c27c50668d50a81456a198105af38d777 - 2
T₂ = HMAC(PRK, T₁ ‖ info ‖ 0x02)
PRK (키)32바이트910d4742d8dc5006d60fe9c565bda5ec349e60aeaecbb81238e102fdf6d4a9b4T₁32바이트↑ 1단계 결과d7a5816161d99e49ac54666006e6e09c27c50668d50a81456a198105af38d777info13바이트ec9888ec8b9c20ec9aa9eb8f84카운터 i1바이트02T₂32바이트b2364198763bb50cbbc288eaceed861638684314c30ca5d3da7f2483ff35d25a - 3
T₁ ‖ … ‖ T₂에서 앞 42바이트만 남기기
T₁ ‖ … ‖ T₂64바이트↑ 2단계 결과d7a5816161d99e49ac54666006e6e09c27c50668d50a81456a198105af38d777b2364198763bb50cbbc288eaceed861638684314c30ca5d3da7f2483ff35d25aOKM42바이트d7a5816161d99e49ac54666006e6e09c27c50668d50a81456a198105af38d777b2364198763bb50cbbc2
HKDF-Expand-Label(PRK, label, context, L)
- 1
길이 ‖ "tls13 "+label ‖ context를 이어 info 만들기
L16label"tls13 key"context0바이트(비어 있음)HkdfLabel13바이트길이0010label09746c733133206b6579context00 - 2
HkdfLabel을 info로 써서 HKDF-Expand 계산하기
PRK32바이트910d4742d8dc5006d60fe9c565bda5ec349e60aeaecbb81238e102fdf6d4a9b4HkdfLabel13바이트↑ 1단계 결과001009746c733133206b657900OKM16바이트e7a2a3691139509d67011d52093a3f55
Derive-Secret(PRK, label, 메시지)
- 1
메시지를 해시해서 context 만들기
메시지ClientHello ‖ ServerHello트랜스크립트 해시32바이트9e92191d8b479e6786d656ce2994776e3de6e75c997d87ffe04759588f94ab14 - 2
L = 32로 HKDF-Expand-Label 계산하기
PRK32바이트910d4742d8dc5006d60fe9c565bda5ec349e60aeaecbb81238e102fdf6d4a9b4label"c hs traffic"context = 트랜스크립트 해시32바이트↑ 1단계 결과9e92191d8b479e6786d656ce2994776e3de6e75c997d87ffe04759588f94ab14새 비밀값32바이트97c0b6a7c52343a3332a97726ba84bb2de68a0ae6dd654a532c00cf9ea4dcc5f
상수 · 표준이 정해 두어 누구나 같은 값
HKDF-SHA256RFC 5869 · RFC 8446
| 기호 | 이름 | 정의 · 출처 | 값 |
|---|---|---|---|
| HashLen | 해시 길이 | SHA-256의 출력 | 32바이트 |
| 최대 출력 길이 | 255 · HashLen | 8160바이트 | |
| salt 기본값 | salt를 안 줬을 때: 0 × HashLen | 0000000000000000000000000000000000000000000000000000000000000000 | |
| TLS 1.3 label 접두어 | HkdfLabel의 label 앞에 붙는 "tls13 " | 746c73313320 |
HMAC-SHA256RFC 2104 · FIPS 198-1
| 기호 | 이름 | 정의 · 출처 | 값 |
|---|---|---|---|
| B | 블록 크기 | SHA-256의 블록 크기 | 64바이트 |
| L | 출력 길이 | SHA-256의 출력 길이 | 32바이트 |
| ipad | 내부 패드 | 0x36을 B번 반복 | 36363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636 |
| opad | 외부 패드 | 0x5c를 B번 반복 | 5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c |