あどけない話

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

Haskell

Implementing graceful-close in Haskell network library

Closing connections gracefully is an old and new problem in network programming. In the HTTP/1.1 days, this did not get attention since HTTP/1.1 is a synchronous protocol. However, as Niklas Hambüchen concretely and completely explained, H…

プログラミングHaskell第2版を翻訳しました

プログラミングHaskell第2版の翻訳とレビューが完了し、ラムダノートから発売されました。レビューしてくださった5名の方に、改めてお礼を申し上げたいと思います。閉じられたissueは177個ですが、複数の指摘を含むissueもあるので、大雑把に言って250箇所ぐ…

HTTP/2 server library in Haskell

I'm trying to develop QUIC in Haskell. In short, QUIC is a fast and reliable transport protocol based on UDP. You can think of it as TCP2. HTTP/2 over QUIC is now called HTTP/3. Two level dispatchings are necessary for QUIC: Dispatching QU…

実践的な Haskell debugging

私的なメモ。GHCを生でインストールし、cabalのラッパーであるcabを使っている。stackはたまに使うことがある程度。 例外が起きた場所を探す 以下で例外が起きたときにスタックトレースが取れる。 % prog +RTS -xc GHCiを使う方法もある。 ボトルネックを探…

Bringing TLS 1.3 to Haskell

Bringing TLS 1.3 to Haskell Haskell TLS library version 1.4.1 or earlier support SSL 2.0, SSL 3.0, TLS 1.0, TLS 1.1 and TLS 1.2. Here is brief summary of their security: SSL 2.0 is insecure and obsoleted by RFC 6176 SSL 3.0 is insecure and…

関手、Applicative、Monadの法則

Monadとは、Applicativeであるデータ構造で、(>>=)演算子を提供し、それがMonad法則を満たすものである。 正確に表現するとこうなんですが、「はぁ?」っ感じですよね。「満たすべき法則」とか言われると、まったく理解できません。でも、オススメの形に持っ…

さようなら遅延評価

Haskellがとっつきにくい原因の一つに遅延評価がある。入門書では、無限リストと遅延評価がことさら強調される。しかし、Haskellを業務で使ってみると、遅延評価が煩わしくなってくる。遅延評価なしでもほとんどのことは実現できるし、メモリーの使用量は推…

Haskell network library version 3.0

Brief history The first commit of the network library in Haskell was created by Simon Marlow in 2001. It says: Package 'net' moved over. URI & CGI still missing because they have dependencies on other bits that haven't made it over yet. So…

QUIC開発日記 その1 参戦

QUICや ああQUICや QUICや 詠み人知らず。QUICの実装の難しさに絶望した心境が詠まれたと伝う。 序章 2017年の7月ごろ、QUICの実装を始めました。Haskellの有名なシリアライザ/デシリアライザである binary や cereal では、バッファ操作ができないので、パ…

TLS 1.3 開発日記 その30 NewSessionTicket 再考

NewSessionTicketをいつ送るかの議論です。 まず、TLS 1.3 開発日記 その9 NewSessionTicketをお読み下さい。 Haskell TLS の実装では、Client Finished の値を予測して NewSessionTicket を作成し、handshake() API が送信していました。このときは、クライ…

SemigroupがMonoidに恋するとき

復習 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.3 開発日記 その29 Key update

TLS 1.2で暗号路の鍵を更新する場合は、ハンドシェイクをやり直す(再ネゴシエーションする)必要があった。実装の視点からいうと、鍵更新はハンドシェイクに対して同期的だった訳だ。 TLS 1.3では、サーバやクライアントがハンドシェイクをし直すことなく、い…

TLS 1.3 開発日記 その28 RFC8446

はてなダイアリーからはてなブログに移行しました。今後も、細々とブログを書いていきます。 2018年8月、TLS 1.3がRFC8446になりました!(TLSのRFCは、伝統的にXX46という番号になります。) RFC8446の貢献者リストに僕の名前が載っていることを聞きつけたIIJ…

あなたの知らないSemigroupの世界

自分で定義するデータの中には、足し算したくなるようなデータがある。たとえば、送信と受信のカウンターを定義したとしよう。 data Metrics = Metrics { rx :: Int , ts :: Int } deriving (Eq, Show) これは以下のように足し算できると嬉しいだろう。 > Me…

TLS 1.3 開発日記 その25 picotls

kazuho さんが実装を進めている picotls を使う方法のまとめ。picotls は TLS 1.3 のみを実装している。またデフォルトで利用できる ECDHE は P256 のみである。 インストール cmakeが必要なので、あらかじめインストールしておく。master ブランチが draft …

TLS 1.3 開発日記 その24 ID23

ID23での変更点: key_share拡張 Canonのプリンターが40を使っていることが判明したので、key_share拡張の値を40から51へ変更。 signature_algorithms_cert拡張 signature_algorithmsに加えてsignature_algorithms_cert拡張を新設した。CertificateVerify用…

goな関数

これは「Haskell (その2) Advent Calendar 2017」の1日目の記事です。遅くなってすいません。読者として末尾再帰ぐらいは理解しているHaskellerを想定しています。 トップレベルとローカル関数 再帰を用いて関数を書いているとき、トップレベルで再帰するか…

TLS 1.3 開発日記 その23 BoringSSL

BoringSSLでTLS 1.3を使う方法のまとめ。 インストール ビルドシステムNinjaをあらかじめインストールしておく。 % git clone https://boringssl.googlesource.com/boringssl % cd boringssl % mkdir build && cd build && cmake -GNinja .. && ninja bssl …

TLS 1.3 開発日記 その22 公開鍵暗号の動向

P256とかX25519とかPSSとか聞いても、よくわからない人のための用語解説。長い間TLSの世界では、鍵交換にも認証にもRSAが使われてきた。必要となる安全性が大きくなると、RSAの公開鍵は急激に大きくなり、したがって鍵交換や認証のコストが大きくなるという…

TLS 1.3 開発日記 その21 TLS 1.3 ID22

TLS 1.3 ID21までの仕様は、 ServerHelloの書式がTLS 1.2と異なる ChangeCipherSpecがない という特徴があった。ServerHelloが異なるということは、TLS 1.3に非対応であったWiresharkで表示できなくて辛いとか、パーサーの中で分岐しなければならないので関…

PatternSynonymsのススメ

PatternSynonymsは、その名の通り、パターンの別名である。GHC 7.8.1 で導入された。GHC 7系のPatternSynonymsは、モジュール内に閉じて入れば何の問題もなかったが、モジュールの外へexportする際は、patternキーワードが必要であり、構成子らしくなかった…

TLS 1.3 開発日記 その20 TLS 1.3 ID21

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…

TLS 1.3 開発日記 その19 OpenSSL

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 開発日記 その18 TLS 1.3 ID20

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.3 開発日記 その17 AEAD

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 …

TLS 1.3 開発日記 その16 Wireshark

Wiresharkはv2.3.0からTLS 1.3 draft 19に対応する。めでたい。すぐに使いたい人は、Nightlyビルドをとってくるとよい。追記:v2.5.0rc0-1840-gd35ed012ce から TLS 1.3 draft 22 に対応している。(draft 22 はまだ出てないけど。) 使ってみる ポート13443で…

TLS 1.3 開発日記 その15 RSAPSSとX25519

開発日記 その8に書いた「拡張の再利用」の問題に進展があったので、記録しておく。 これまでの方針 拡張が再利用されていても、TLS 1.2 と TLS 1.3 では異なる拡張として扱う。 生じた問題 SignatureSchemeに対する問題: TLS 1.3 クライアントが Signature…

TLS 1.3 開発日記 その14 TLS 1.3 ID19

IETF 98 Chicago の Hackathon に向けて、Haskell TLS ライブラリを TLS 1.3 ID19 に対応させた話。僕は Hackathon には遠隔参加。ID19に一番乗りしたのは OpenSSL。辻川さんがテストサーバを上げてくれた。 Full と PSK Add pre-extract Derive-Secret stag…

TLS 1.3 開発日記 その12 OCSP と SCT

TLS 1.2では Server Hello 拡張であった OCSP と SCT は、TLS 1.3ではハンドシェイクメッセージである Certificate の拡張となった。 OCSP 証明書は有効期限内であっても、失効している可能性がある。失効しているかを調べる伝統的なやり方は、CRL(Certifica…

TLS 1.3 開発日記 その11 NSS

NSSのビルド 以下を参照: https://github.com/bifurcation/mint (変更:)ブランチ: default は draft 22 NSSサーバの動かし方 共有ライブラリを使っている場合は、適当にパスを加える。nssroot ディレクトリで: % ./dist/$PLATFORM/bin/selfserv -d tests_…