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)
結果として、下記の通りデータ転送量を削減できます。
いくつか説明していきます
冗長, 不要なフィールドの廃止
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..." } }