復習 Semigroup 結合則 (a・b)・c = a・(b・c) class Semigroup a where (<>) :: a -> a -> a Monoid 結合則 (a・b)・c = a・(b・c) 単位元 e・a = a・e = a class Semigroup a => Monoid a where mempty :: a mappend :: a -> a -> a mappend = (<>) 本題 H…
TLS 1.2で暗号路の鍵を更新する場合は、ハンドシェイクをやり直す(再ネゴシエーションする)必要があった。実装の視点からいうと、鍵更新はハンドシェイクに対して同期的だった訳だ。 TLS 1.3では、サーバやクライアントがハンドシェイクをし直すことなく、い…
はてなダイアリーからはてなブログに移行しました。今後も、細々とブログを書いていきます。 2018年8月、TLS 1.3がRFC8446になりました!(TLSのRFCは、伝統的にXX46という番号になります。) RFC8446の貢献者リストに僕の名前が載っていることを聞きつけたIIJ…
ドラフト25 ドラフト24までは、AEADに使う additonal_data は空文字列だった。ドラフト25からは、正しいレコードヘッダが使われることを遵守させるために、additonal_dataが以下のように定義された。 additional_data = TLSCiphertext.opaque_type || TLSCip…
自分で定義するデータの中には、足し算したくなるようなデータがある。たとえば、送信と受信のカウンターを定義したとしよう。 data Metrics = Metrics { rx :: Int , ts :: Int } deriving (Eq, Show) これは以下のように足し算できると嬉しいだろう。 > Me…
TLS 1.3 ドラフト24で重要な変更は1つだけ。レコードのバージョン。ドラフト23では ClientHello のレコードバージョンは 0x0301 (TLS 1.0) ServerHello のレコードバージョンは 0x0303 (TLS 1.2) に定められた。これはこれでよい。しかし、サーバから HelloR…
kazuho さんが実装を進めている picotls を使う方法のまとめ。picotls は TLS 1.3 のみを実装している。またデフォルトで利用できる ECDHE は P256 のみである。 インストール cmakeが必要なので、あらかじめインストールしておく。master ブランチが draft …
ID23での変更点: key_share拡張 Canonのプリンターが40を使っていることが判明したので、key_share拡張の値を40から51へ変更。 signature_algorithms_cert拡張 signature_algorithmsに加えてsignature_algorithms_cert拡張を新設した。CertificateVerify用…
これは「Haskell (その2) Advent Calendar 2017」の1日目の記事です。遅くなってすいません。読者として末尾再帰ぐらいは理解しているHaskellerを想定しています。 トップレベルとローカル関数 再帰を用いて関数を書いているとき、トップレベルで再帰するか…
BoringSSLでTLS 1.3を使う方法のまとめ。 インストール ビルドシステムNinjaをあらかじめインストールしておく。 % git clone https://boringssl.googlesource.com/boringssl % cd boringssl % mkdir build && cd build && cmake -GNinja .. && ninja bssl …
P256とかX25519とかPSSとか聞いても、よくわからない人のための用語解説。長い間TLSの世界では、鍵交換にも認証にもRSAが使われてきた。必要となる安全性が大きくなると、RSAの公開鍵は急激に大きくなり、したがって鍵交換や認証のコストが大きくなるという…
TLS 1.3 ID21までの仕様は、 ServerHelloの書式がTLS 1.2と異なる ChangeCipherSpecがない という特徴があった。ServerHelloが異なるということは、TLS 1.3に非対応であったWiresharkで表示できなくて辛いとか、パーサーの中で分岐しなければならないので関…
PatternSynonymsは、その名の通り、パターンの別名である。GHC 7.8.1 で導入された。GHC 7系のPatternSynonymsは、モジュール内に閉じて入れば何の問題もなかったが、モジュールの外へexportする際は、patternキーワードが必要であり、構成子らしくなかった…
何度読んでもよく分からないDNS関連のRFCを自分なりに読みやすいようにまとめる私的メモ。 ちなみに、僕は Haskell DNS ライブラリの作者で今も精力的に開発中。 RFC 1035 RFC 1035で定められている構造をトップダウン的に列挙する: メッセージ全体 +------…
TLS 1.3 ID21に追従した。 Add a per-ticket nonce so that each ticket is associated with a different PSK. NewSessionTicket に ticket_nounce が増えた。 struct { uint32 ticket_lifetime; uint32 ticket_age_add; opaque ticket_nonce; opaque ticket…
OpenSSLで、TLS 1.3を使う方法の覚書き。以下が参考になる。 TLS 1.3 support #963 Using TLS1.3 With OpenSSL ビルド OpenSSL が現在サポートしているのは draft 20。そのソースの取り出し方はこう: % git clone https://github.com/openssl/openssl.git (…
TLS 1.3 ID20に追従した。やったのは、これだけ。 Shorten labels for HKDF-Expand-Label so that we can fit within one compression block つまり、ラベルの文字列を変えただけ。現在、OpenSSLと相互試験中。ちなみに、Haskell tls ライブラリの TLS 1.3 …
TLS 1.2とTLS 1.3のAEAD の違いについて、AEADの一つであるAES 128 GCMを例にとって説明する。 TLS 1.2のAEAD 以下の3つのRFCをよーく読まないといけない。 RFC 5246: The Transport Layer Security (TLS) Protocol Version 1.2 RFC 5116: An Interface and …
Wiresharkはv2.3.0からTLS 1.3 draft 19に対応する。めでたい。すぐに使いたい人は、Nightlyビルドをとってくるとよい。追記:v2.5.0rc0-1840-gd35ed012ce から TLS 1.3 draft 22 に対応している。(draft 22 はまだ出てないけど。) 使ってみる ポート13443で…
開発日記 その8に書いた「拡張の再利用」の問題に進展があったので、記録しておく。 これまでの方針 拡張が再利用されていても、TLS 1.2 と TLS 1.3 では異なる拡張として扱う。 生じた問題 SignatureSchemeに対する問題: TLS 1.3 クライアントが Signature…
IETF 98 Chicago の Hackathon に向けて、Haskell TLS ライブラリを TLS 1.3 ID19 に対応させた話。僕は Hackathon には遠隔参加。ID19に一番乗りしたのは OpenSSL。辻川さんがテストサーバを上げてくれた。 Full と PSK Add pre-extract Derive-Secret stag…
経緯 Chrome は version 56 から TLS 1.3 ID 18 をサポート(0-RTT 以外)。 Chrome 56 の前にBlueCoatがある状態で Google サービスにアクセスしようとすると、アクセスできないことが判明。 ChromeはTLS.13をdisabledに戻した。 原因 TLS 1.3は、TLS 1.2と区…
TLS 1.2では Server Hello 拡張であった OCSP と SCT は、TLS 1.3ではハンドシェイクメッセージである Certificate の拡張となった。 OCSP 証明書は有効期限内であっても、失効している可能性がある。失効しているかを調べる伝統的なやり方は、CRL(Certifica…
NSSのビルド 以下を参照: https://github.com/bifurcation/mint (変更:)ブランチ: default は draft 22 NSSサーバの動かし方 共有ライブラリを使っている場合は、適当にパスを加える。nssroot ディレクトリで: % ./dist/$PLATFORM/bin/selfserv -d tests_…
TLS 1.3 のテスト用に公開されているNSSサーバは2つあります。 https://franziskuskiefer.de:9913/ https://tls13.crypto.mozilla.org/ Haskell TLS 1.3 client では、前者とフルハンドシェイクできるのですが、後者は handshake error を返してきます。一方…
kazuho さんと議論したメモ:サーバが送るNewSessionTicketは、当然セッションチケットを入れないければならない。以下の構造では ticket がそれにあたる: struct { uint32 ticket_lifetime; uint32 ticket_age_add; opaque ticket; Extension extensions; …
これは、http2 Advent Calendar 2016の25日目の記事です。この記事では、HaskellでTLS 1.3を開発した際に難しかった点をまとめます。自分のための覚書です。TLS 1.3のみをフルスクラッチで書くと、そこまで難しくないのかもしれませんが、TLS 1.2以前と共存…
これは、http2 Advent Calendar 2016の24日目の記事です。この記事では、TLS 1.3 の4番目のハンドシェイクである 0RTT について説明します。0RTTとは、アプリケーションが目的の通信を始めるまでに、下位の層でパケットのやりとりがないことを意味します。準…
これは、http2 Advent Calendar 2016の13日目の記事です。今日は、TLS 1.3 の第三番目のハンドシェイクである PSK (Pre Shared Key)について説明します。みなさんは、Pre Shared Key という言葉から何をイメージしますか? 多くの方は、通信路の暗号化に使う…
これは、http2 Advent Calendar 2016の12日目の記事です。今日は、第2番目のハンドシェイクである HRR (Hello Retry Request)について説明します。HRR とは、サーバがクライアントに Hello を再要求し、フルハンドシェイクをやり直すハンドシェイクです。以…