TLS 1.3 開発日記 その2 暗号スイート
これは、http2 Advent Calendar 2016の3日目の記事です。
今回は暗号スイートについて書きます。TLS 1.2 の暗号スイートは、たとえば以下のような感じでした。
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
これは次のような意味です。
- 鍵交換は使い捨て楕円Diffie Hellman(ECDHE:EllipticCurve Diffie Hellman, Ephemeral)
- サーバ認証はRSA
- 通信の暗号化はAES 128のGCM(Galois/Counter Model)モード
- ハッシュ関数がSHA256
TLS 1.1 以前だと、この暗号スイートのハッシュの意味が異なるんですが、面倒なので説明は割愛します。
TLS 1.3だと、暗号スイートが以下のようになります。
TLS_AES_128_GCM_SHA256
これは以下のような意味です。
暗号スイートは、TLS 1.2 と同様に、Client Hello でリストが提示され、Server Hello で選択されます。
さて、鍵交換とサーバ認証はどこにいってしまったのでしょうか?
TLS 1.3 の鍵交換
TLS 1.3 の鍵交換は、Client Helloのkey share拡張で提示されます。
struct { NamedGroup group; opaque key_exchange<1..2^16-1>; } KeyShareEntry; struct { select (Handshake.msg_type) { case client_hello: KeyShareEntry client_shares<0..2^16-1>; case hello_retry_request: NamedGroup selected_group; case server_hello: KeyShareEntry server_share; }; } KeyShare;
この中に、P256なECDHEの公開鍵やX25519なECDHEの公開鍵が入るわけです。見ての通り、サーバはその中から1つを選び対応する公開鍵をServer Helloに1つだけ入れます。
TLS 1.3のサーバ認証
TLS 1.3 のサーバ認証は、Client Helloのsignature algorithms拡張で提示されます。
enum { /* RSASSA-PKCS1-v1_5 algorithms */ rsa_pkcs1_sha1(0x0201), rsa_pkcs1_sha256(0x0401), rsa_pkcs1_sha384(0x0501), rsa_pkcs1_sha512(0x0601), /* ECDSA algorithms */ ecdsa_secp256r1_sha256(0x0403), ecdsa_secp384r1_sha384(0x0503), ecdsa_secp521r1_sha512(0x0603), /* RSASSA-PSS algorithms */ rsa_pss_sha256(0x0804), rsa_pss_sha384(0x0805), rsa_pss_sha512(0x0806), /* EdDSA algorithms */ ed25519(0x0807), ed448(0x0808), /* Reserved Code Points */ private_use(0xFE00..0xFFFF), (0xFFFF) } SignatureScheme; struct { SignatureScheme supported_signature_algorithms<2..2^16-2>; } SignatureSchemeList;
そして、Server Certificate Verifyで何が選択されたかが表明されます。
struct { SignatureScheme algorithm; opaque signature<0..2^16-1>; } CertificateVerify;
おまけ
どうして、鍵交換とサーバ認証が暗号スイートから切り離されたか疑問に思うことでしょう。その理由は、そのうち説明します。つまり日記はまだまだ続きます。