Compact TLS 1.3の提案仕様

TLS1.3の仕様を書いたEric Rescorla氏らより「Compact TLS 1.3」という提案仕様が提案されており、すでにWG Draftとなっています。

このCompact TLS (cTLS)は、よりコンパクトなTLSを定義しデータの通信量を削減しています(リソースなどが制限されたデバイスでも利用できるようにというモチベーションもあります)。TLS1.3自体とisomorphic(同型)でありやり取りされるメッセージの意味自体は同じですがメッセージのフォーマットは異なっており、cTLSとTLS1.3自体と相互通信はできません。

しかし、cTLS, TLS1.3両方に対応することはできるので、将来的にそういうサーバが出てくれば問題なく通信できるようになりそうです。

アプローチ

主なアプローチは

  • TLS1.3の冗長なフィールド、廃止されたフィールドを取り除きます (TLS1.2との互換性の都合形だけ入ってたフィールドなど)
  • 可変長整数を使い、整数値のフィールドを削減します
  • 不要な値の省略
  • デフォルト値を定義可能にするテンプレート (profile)

結果として、下記の通りデータ転送量を削減できます。
f:id:ASnoKaze:20200430000115p:plain

いくつか説明していきます

冗長, 不要なフィールドの廃止

TLS1.2との互換性のために確保されてた領域をクリーンアップしています

Record Layer

         struct {
             ContentType type;
             opaque fragment[TLSPlaintext.length];
         } TLSPlaintext;

ClientHello

         struct {
             Random random;
             CipherSuite cipher_suites<1..V>;
             Extension extensions<1..V>;
         } ClientHello;

ServerHello

         struct {
             Random random;
             CipherSuite cipher_suite;
             Extension extensions<1..V>;
         } ServerHello;

テンプレート(Profile)

ProfileはJSON形式で記述され、暗号関連のパラメータ・TLS拡張・証明書などが事前定義されており。ハンドシェイク時はこれらの値を使う場合は省略されます。また、randomの長さなども短く設定することもできます。

このProfileはクライアントとサーバで事前に共有されている必要があります。(標準Profileを定義するかや、ハンドシェイク中に使用しているProfileを相手に通知する方法などは現在議論中です。)

Profile例

   {
     "version": 772,
     "cipherSuite": "TLS_AES_128_CCM_8_SHA256",
     "dhGroup": "X25519",
     "signatureAlgorithm": "ECDSA_P256_SHA256",
     "randomSize": 8,
     "finishedSize": 8,
     "clientHelloExtensions": {
       "server_name": "000e00000b6578616d706c652e636f6d",
     },
     "certificateRequestExtensions": {
       "signature_algorithms": "00020403"
     },
     "knownCertificates": {
       "61": "3082...",
       "62": "3082..."
     }
   }