あどけない話

インターネットに関する技術的な話など

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

これは以下のような意味です。

  • 通信の暗号化はAES 128のGCMモード (TLS 1.2 のそれとは方法が若干異なります)
  • ハッシュ関数がSHA256 (HMAC や HKDF などに使われます)

暗号スイートは、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;

おまけ

どうして、鍵交換とサーバ認証が暗号スイートから切り離されたか疑問に思うことでしょう。その理由は、そのうち説明します。つまり日記はまだまだ続きます。