あどけない話

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

Haskell

関手、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_…

TLS 1.3 開発日記 その10 NSSサーバ

TLS 1.3 のテスト用に公開されているNSSサーバは2つあります。 https://franziskuskiefer.de:9913/ https://tls13.crypto.mozilla.org/ Haskell TLS 1.3 client では、前者とフルハンドシェイクできるのですが、後者は handshake error を返してきます。一方…

TLS 1.3 開発日記 その9 NewSessionTicket

kazuho さんと議論したメモ:サーバが送るNewSessionTicketは、当然セッションチケットを入れないければならない。以下の構造では ticket がそれにあたる: struct { uint32 ticket_lifetime; uint32 ticket_age_add; opaque ticket; Extension extensions; …

TLS 1.3 開発日記 その8 開発メモ

これは、http2 Advent Calendar 2016の25日目の記事です。この記事では、HaskellでTLS 1.3を開発した際に難しかった点をまとめます。自分のための覚書です。TLS 1.3のみをフルスクラッチで書くと、そこまで難しくないのかもしれませんが、TLS 1.2以前と共存…

TLS 1.3 開発日記 その7 0RTT

これは、http2 Advent Calendar 2016の24日目の記事です。この記事では、TLS 1.3 の4番目のハンドシェイクである 0RTT について説明します。0RTTとは、アプリケーションが目的の通信を始めるまでに、下位の層でパケットのやりとりがないことを意味します。準…

TLS 1.3 開発日記 その6 Pre Shared Key

これは、http2 Advent Calendar 2016の13日目の記事です。今日は、TLS 1.3 の第三番目のハンドシェイクである PSK (Pre Shared Key)について説明します。みなさんは、Pre Shared Key という言葉から何をイメージしますか? 多くの方は、通信路の暗号化に使う…