あどけない話

Internet technologies

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…

TLS 1.3 開発日記 その27 ID 25/26

ドラフト25 ドラフト24までは、AEADに使う additonal_data は空文字列だった。ドラフト25からは、正しいレコードヘッダが使われることを遵守させるために、additonal_dataが以下のように定義された。 additional_data = TLSCiphertext.opaque_type || TLSCip…

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

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

TLS 1.3 開発日記 その26 ID 24

TLS 1.3 ドラフト24で重要な変更は1つだけ。レコードのバージョン。ドラフト23では ClientHello のレコードバージョンは 0x0301 (TLS 1.0) ServerHello のレコードバージョンは 0x0303 (TLS 1.2) に定められた。これはこれでよい。しかし、サーバから HelloR…

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キーワードが必要であり、構成子らしくなかった…

DNSの書式

DNS

何度読んでもよく分からないDNS関連のRFCを自分なりに読みやすいようにまとめる私的メモ。 ちなみに、僕は Haskell DNS ライブラリの作者で今も精力的に開発中。 RFC 1035 RFC 1035で定められている構造をトップダウン的に列挙する: メッセージ全体 +------…

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][Haskell]TLS 1.3 開発日記 その13 TLS 1.3を遮断する中継装置

経緯 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.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 という言葉から何をイメージしますか? 多くの方は、通信路の暗号化に使う…

TLS 1.3 開発日記 その5 Hello Retry Request

これは、http2 Advent Calendar 2016の12日目の記事です。今日は、第2番目のハンドシェイクである HRR (Hello Retry Request)について説明します。HRR とは、サーバがクライアントに Hello を再要求し、フルハンドシェイクをやり直すハンドシェイクです。以…