HKDF

Extract로 섞고, Expand로 늘림 · 둘 다 HMAC 하나로 만듦 · TLS 1.3 키 교환의 키 스케줄에 쓰임

HKDF-Extract(salt, IKM) = HMAC(salt, IKM)

salt (키)13바이트
000102030405060708090a0b0c
IKM (메시지)16바이트
eab3b5ec9ca020ebb984ebb080eab092
PRK32바이트
910d4742d8dc5006d60fe9c565bda5ec349e60aeaecbb81238e102fdf6d4a9b4

HKDF-Expand(PRK, info, L)

  1. 1

    T₁ = HMAC(PRK, info ‖ 0x01)

    PRK (키)32바이트
    910d4742d8dc5006d60fe9c565bda5ec349e60aeaecbb81238e102fdf6d4a9b4
    info13바이트
    ec9888ec8b9c20ec9aa9eb8f84
    카운터 i1바이트
    01
    T₁32바이트
    d7a5816161d99e49ac54666006e6e09c27c50668d50a81456a198105af38d777
  2. 2

    T₂ = HMAC(PRK, T₁ ‖ info ‖ 0x02)

    PRK (키)32바이트
    910d4742d8dc5006d60fe9c565bda5ec349e60aeaecbb81238e102fdf6d4a9b4
    T₁32바이트↑ 1단계 결과
    d7a5816161d99e49ac54666006e6e09c27c50668d50a81456a198105af38d777
    info13바이트
    ec9888ec8b9c20ec9aa9eb8f84
    카운터 i1바이트
    02
    T₂32바이트
    b2364198763bb50cbbc288eaceed861638684314c30ca5d3da7f2483ff35d25a
  3. 3

    T₁ ‖ … ‖ T₂에서 앞 42바이트만 남기기

    T₁ ‖ … ‖ T₂64바이트↑ 2단계 결과
    d7a5816161d99e49ac54666006e6e09c27c50668d50a81456a198105af38d777b2364198763bb50cbbc288eaceed861638684314c30ca5d3da7f2483ff35d25a
    OKM42바이트
    d7a5816161d99e49ac54666006e6e09c27c50668d50a81456a198105af38d777b2364198763bb50cbbc2

HKDF-Expand-Label(PRK, label, context, L)

  1. 1

    길이 ‖ "tls13 "+label ‖ context를 이어 info 만들기

    L
    16
    label
    "tls13 key"
    context0바이트
    (비어 있음)
    HkdfLabel13바이트
    길이0010
    label09746c733133206b6579
    context00
  2. 2

    HkdfLabel을 info로 써서 HKDF-Expand 계산하기

    PRK32바이트
    910d4742d8dc5006d60fe9c565bda5ec349e60aeaecbb81238e102fdf6d4a9b4
    HkdfLabel13바이트↑ 1단계 결과
    001009746c733133206b657900
    OKM16바이트
    e7a2a3691139509d67011d52093a3f55

Derive-Secret(PRK, label, 메시지)

  1. 1

    메시지를 해시해서 context 만들기

    메시지
    ClientHello ‖ ServerHello
    트랜스크립트 해시32바이트
    9e92191d8b479e6786d656ce2994776e3de6e75c997d87ffe04759588f94ab14
  2. 2

    L = 32로 HKDF-Expand-Label 계산하기

    PRK32바이트
    910d4742d8dc5006d60fe9c565bda5ec349e60aeaecbb81238e102fdf6d4a9b4
    label
    "c hs traffic"
    context = 트랜스크립트 해시32바이트↑ 1단계 결과
    9e92191d8b479e6786d656ce2994776e3de6e75c997d87ffe04759588f94ab14
    새 비밀값32바이트
    97c0b6a7c52343a3332a97726ba84bb2de68a0ae6dd654a532c00cf9ea4dcc5f

상수 · 표준이 정해 두어 누구나 같은 값

HKDF-SHA256RFC 5869 · RFC 8446

기호이름정의 · 출처값
HashLen해시 길이SHA-256의 출력32바이트
최대 출력 길이255 · HashLen8160바이트
salt 기본값salt를 안 줬을 때: 0 × HashLen0000000000000000000000000000000000000000000000000000000000000000
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