TLS 1.3 키 교환

X25519 · TLS_AES_128_GCM_SHA256 · 1번 왕복 · 비교: TLS 1.2 키 교환

수학 함수

X25519 · 디피-헬만

GA = a·GB = b·Gab·Ga·a·b·b·클라이언트 key_share서버 key_share공유 비밀값

a·(b·G) = b·(a·G) = ab·G

Curve25519: y² = x³ + 486662x² + x (mod 2²⁵⁵ − 19), G: x = 9

공개: G, A, B · 비밀: a, b

함수 정의

X25519(k, P)
= k·P (곡선 위의 점 P를 k번 더함)
HMAC(K, m)
= H((K ⊕ opad) ‖ H((K ⊕ ipad) ‖ m)), H = SHA-256
HKDF-Extract(salt, IKM)
= HMAC(salt, IKM)
HKDF-Expand(PRK, info, L)
= T₁ ‖ T₂ ‖ … 의 앞 L바이트, Tᵢ = HMAC(PRK, Tᵢ₋₁ ‖ info ‖ i)
HKDF-Expand-Label(S, label, ctx, L)
= HKDF-Expand(S, L ‖ "tls13 "+label ‖ ctx, L)
Derive-Secret(S, label, M)
= HKDF-Expand-Label(S, label, SHA-256(M), 32)

함수 의존 관계 (위 함수는 아래 함수로 만들어짐)

Derive-SecretHKDF-Expand-LabelHKDF-ExpandHKDF-ExtractHMACSHA-256트랜스크립트해시

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

TLS 1.3RFC 8446

기호이름정의 · 출처값
암호 스위트TLS_AES_128_GCM_SHA2561301
키 교환 그룹x25519001d
PSK가 없을 때 IKMEarly Secret = HKDF-Extract(0, 0)의 00000000000000000000000000000000000000000000000000000000000000000
레이블Derive-Secret · HKDF-Expand-Label에 쓰는 이름"derived", "c hs traffic", "s hs traffic", "key", "iv"
트래픽 키 길이AES-128-GCM16바이트
트래픽 IV 길이레코드 nonce의 기준값12바이트

HKDF-SHA256RFC 5869 · RFC 8446

기호이름정의 · 출처값
HashLen해시 길이SHA-256의 출력32바이트
최대 출력 길이255 · HashLen8160바이트
salt 기본값salt를 안 줬을 때: 0 × HashLen0000000000000000000000000000000000000000000000000000000000000000
TLS 1.3 label 접두어HkdfLabel의 label 앞에 붙는 "tls13 "746c73313320

Curve25519RFC 7748

기호이름정의 · 출처값
p소수 p (체의 크기)2²⁵⁵ − 197fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed
A곡선 계수 Av² = u³ + Au² + u486662
a24래더 상수 a24(A − 2) / 4121665
u(G)기준점 G의 u 좌표가장 작은 적합한 u9
ℓ위수 ℓ (부분군)2²⁵² + 277423177773723535358519377908836484931000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed
h보조인자 h (cofactor)곡선 위 점의 개수 = 8ℓ8

AES-256-GCMFIPS 197 · NIST SP 800-38D

기호이름정의 · 출처값
블록 크기AES의 입출력 단위128비트 (16바이트)
키 길이AES-256256비트 (32바이트)
Nr라운드 수AES-256 (AES-128은 10)14
IV(nonce) 길이권장값 · 이때 J₀ = IV ‖ 0³¹196비트 (12바이트)
카운터 시작값J₀의 마지막 32비트00000001
RGHASH 축약 상수x¹²⁸ + x⁷ + x² + x + 1 → 11100001 ‖ 0¹²⁰e1000000000000000000000000000000
t태그 길이최대값 (이 페이지에서 쓰는 값)128비트 (16바이트)