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

renegotiation関連

renegotiate

setCipherSuites

setKeyCerts

setCertificateStore

cipher suite

CipherSuite

KeyEx

BulkEnc

その他

ValidateHandle

CertSecretKey