Haskell
これは「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キーワードが必要であり、構成子らしくなかった…
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…
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 を再要求し、フルハンドシェイクをやり直すハンドシェイクです。以…
これは、http2 Advent Calendar 2016の8日目の記事です。今回はTLS 1.3のフルハンドシェイクについて書きます。 TLS 1.2のフルハンドシェイク おさらいとして、RFC5246からTLS 1.2のフルハンドシェイクの図を少し変更して抜粋します。角カッコは暗号化されて…
これは、http2 Advent Calendar 2016の7日目の記事です。今回はTLSのバージョンについて書きます。TLSのバージョンは、Client Hello と Server Hello を交換することで決めます。 Client Hello TLS 1.3 の Client Hello は、TLS 1.2 と互換性を維持するため…
これは、http2 Advent Calendar 2016の3日目の記事です。今回は暗号スイートについて書きます。TLS 1.2 の暗号スイートは、たとえば以下のような感じでした。 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 これは次のような意味です。 鍵交換は使い捨て楕円Diffie…
これは、http2 Advent Calendar 2016の1日目の記事です。現在、IETF で TLS 1.3 の標準化が大詰めを迎えています。僕も TLS 1.3 の標準化に参加しており、仕様の分かりにくい部分を直したり、TLS 1.3 を Haskell で実装したりしています。この開発日記のシリ…
Haskell 2010 では、同じファイルに重複したフィールドラベルを定義できない。たとえば、以下はエラーになる。 data Foo = Foo { same :: Int } data Bar = Bar { same :: Float } -- これはダメ この問題を解決する案は、OverloadedRecordFields と呼ばれ、…
これはHaskellスペースリーク Advent Calendar 2015の17日目の記事です。 :sprint と MonomorphismRestriction サンクのリークを防ぐには、どの式がサンクかを理解する必要がある。そのために便利なのが、GHCiの:sprint コマンドだ。MonomorphismRestriction…
これはHaskellスペースリーク Advent Calendar 2015の14日目の記事です。スレッドリークとは一般的に、終了させることを忘れたスレッドが残り続けることを言う。これは終了させ忘れたのが悪いという他ない。一方で、GHC では、スレッドを終了させたにもかか…
これはHaskellスペースリーク Advent Calendar 2015の8日目の記事です。IOのコードは、普通に書けば末尾呼び出しの最適化が効く形になる。たとえば、こんな感じ: foo :: Char -> String -> IO Int foo a b = do c <- bar a b zoo b c woo c woo :: Int -> I…
GHC 7.8.1 がリリースされ、type family がうまく扱えない問題が発覚したため、すぐに GHC 7.8.2 がリリースされました。このおかげで Yesod が、うまくビルドできるようになりました。しばらくして、GHC 7.8.3 もリリースされる気配があります。また、一ヶ…
BazQux(バズクックス)は、Google Reader の代替として密かに注目されている RSS リーダです。実装と運用を一人でやっている Vladimir Shabanov さんによると、BazQux のウリは、 高速である ブログのコメントも表示できる 複数のビューがある モバイルに対応…