Network_PeyoTLS_Server - YoshikuniJujo/peyotls GitHub Wiki
モジュールの説明
モジュール名
Network.PeyoTLS.Server
モジュールの機能
TLSサーバ作成のための型や関数を公開している。 Network.PeyoTLS.Server.Bodyが公開している型や関数のうち公開すべきものだけを公開している。 ラッパーモジュール。
公開している型、値、関数
基本的な型、値、関数
PeyotlsM
よく使う型の別名。
type PeyotlsM = TlsM Handle SystemRNG
PeyotlsHandle
よく使う型の別名。
type PeyotlsHandle = TlsHandle Handle SystemRNG
TlsM
関数openで得たTlsHandleを使用するためのモナド。
type TlsM h g = ErrorT Alert (StateT (TlsState h g) (HandleMonad h))
エラーの際にはAlertを返すという機能とTlsStateを状態として保存する機能をHandleMonad hに追加している。 HandleMonad hはhを使用するコンテキストを提供するモナド。 HandleMonad HandleはIOとなる。
TlsState
TlsHandleを使用するための状態を保存している。 TlsHandleをキーとしてそれぞれの値を検索する。 以下の3つの段階で必要となる値をまとめたもの。
- handshakeの段階
- payloadの送受信
- renegotiation
TlsHandle
open関数によって返されるハンドル。
newtype TlsHandle h g = TlsHandleS {
tlsHandleS :: HandleBase h g } deriving Show
HandleBaseのラッパー。 ラッパーとしている理由はかつてはクライアント側と区別する必要があったから。 今はラッパーとする必要があるかどうかは不明。 調べてリファクタリングする必要がある。
Alert
TLS接続内で生じたエラーの種類を示す型。 ただし、TLSの仕様書が十分ではないため、どのエラーがどのAlertを返すかの対応づけが難しい。 現在では、ほとんどのエラーはNotDetectedにしてしまっている。
data Alert
= Alert AlertLevel AlertDesc String
| ExternalAlert String
| NotDetected String
deriving Show
ExternalAlertはモナドの階層関係を複雑にしないための苦肉の策。 もっといい方法を考えたい。
run
下のopen関数等のTLS通信を含むアクションを走らせるための関数。
run :: HandleLike h => TlsM h g a -> g -> HandleMonad h a
複数のTLSハンドルを扱うことができる。 エラーの処理は今のところ単純にエラーを返すようになっている。 また、送信と受信を別スレッドで行う等、複数のスレッドを使った場合、 sequence numberの整合性が取れず破綻する。
open
peyotlsパッケージの中心的な関数。 handshakeを行い、取得した鍵情報等をstateに保存し、それに対するアクセスのためのハンドルを返す。
open :: (ValidateHandle h, CPRG g) => h -> [CipherSuite] ->
[(CertSecretKey, CertificateChain)] -> Maybe CertificateStore ->
TlsM h g (TlsHandle h g)
それぞれの引数と返り値の説明
- h: 暗号化されていないハンドル
- Maybe CertificateStore: クライアント認証する場合のCA
- TlsM h g (TlsHandle h g): TLS用の状態つきのモナド内でTLS用のハンドルを返す
getNames
クライアントの証明書のCN(common name)とsubjectAltNameの値をリストにして返す。
getNames :: HandleLike h => TlsHandle h g -> TlsM h g [String]
checkName
クライアントの証明書のCNとsubfectAltNameの値からある名前が許可されているかどうかを調べる。 一応、ワイルドカード(hoge.*.comのようなもの)にも対応している。
checkName :: HandleLike h => TlsHandle h g -> String -> TlsM h g Bool
getCertificate
証明書の中身を入手する。 クライアントの証明書のfingerprintをチェックするために使える。
getCertificate :: HandleLike h =>
TlsHandle h g -> TlsM h g SignedCertificate