github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/crypto/tls/conn.go (about) 1 // Copyright 2010 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // TLSの低レベル接続とレコードレイヤー 6 7 package tls 8 9 import ( 10 "github.com/shogo82148/std/bytes" 11 "github.com/shogo82148/std/context" 12 "github.com/shogo82148/std/crypto/x509" 13 "github.com/shogo82148/std/net" 14 "github.com/shogo82148/std/sync" 15 "github.com/shogo82148/std/sync/atomic" 16 "github.com/shogo82148/std/time" 17 ) 18 19 // Connはセキュア接続を表します。 20 // net.Connインターフェースを実装しています。 21 type Conn struct { 22 // 定数 23 conn net.Conn 24 isClient bool 25 handshakeFn func(context.Context) error 26 quic *quicState 27 28 // isHandshakeCompleteは、接続が現在アプリケーションデータを転送している場合(つまり、ハンドシェイク処理を行っていない場合)にtrueです。 29 // isHandshakeCompleteがtrueである場合、handshakeErr == nilとなります。 30 isHandshakeComplete atomic.Bool 31 // ハンドシェイクの後の定数; ハンドシェイクミューテックスによって保護される 32 handshakeMutex sync.Mutex 33 handshakeErr error 34 vers uint16 35 haveVers bool 36 config *Config 37 38 // handshakesはこれまでに接続で行われたハンドシェイクの回数を数えます。再交渉が無効化されている場合、これは0または1です。 39 handshakes int 40 extMasterSecret bool 41 didResume bool 42 cipherSuite uint16 43 ocspResponse []byte 44 scts [][]byte 45 peerCertificates []*x509.Certificate 46 47 // activeCertHandlesにはpeerCertificates内の証明書のキャッシュハンドルが格納されており、アクティブな参照を追跡するために使用されます。 48 activeCertHandles []*activeCert 49 50 // verifiedChainsには、私たちが構築した証明書チェーンが含まれています。 51 // これは、サーバーが提示した証明書チェーンとは異なります。 52 verifiedChains [][]*x509.Certificate 53 // serverName には、クライアントが指定したサーバー名が含まれています。 54 serverName string 55 56 // secureRenegotiation は、サーバーが安全な再ネゴシエーション拡張を返した場合は true です。 57 // これは、サーバーの場合には無意味であり、再ネゴシエーションはサポートされていません。 58 secureRenegotiation bool 59 // ekmはキーマテリアルをエクスポートするためのクロージャです。 60 ekm func(label string, context []byte, length int) ([]byte, error) 61 62 // resumptionSecretは、処理または送信するための再開マスターシークレットです。または、NewSessionTicketメッセージを送信するためのものです。 63 resumptionSecret []byte 64 65 // ticketKeys は、この接続の有効なセッションチケットキーのセットです。 66 // 最初のキーは新しいチケットの暗号化に使用され、すべてのキーがデコードの試行に使用されます。 67 ticketKeys []ticketKey 68 69 // clientFinishedIsFirst は、最新のハンドシェイク中にクライアントが最初のFinishedメッセージを送信した場合にtrueです。これは記録されます。最初に送信されたFinishedメッセージはtls-uniqueチャネルバインディング値です。 70 clientFinishedIsFirst bool 71 72 // closeNotifyErrはalertCloseNotifyレコードの送信エラーです。 73 closeNotifyErr error 74 75 // closeNotifySent は、Conn が alertCloseNotify レコードを送信しようとした場合にtrueです。 76 closeNotifySent bool 77 78 // clientFinishedとserverFinishedには、最新のハンドシェイクでクライアントまたはサーバーが送信したFinishedメッセージが含まれています。これは、再ネゴシエーション拡張とtls-uniqueチャネルバインディングをサポートするために保持されます。 79 clientFinished [12]byte 80 serverFinished [12]byte 81 82 // clientProtocolは、ALPNプロトコルの協議結果です。 83 clientProtocol string 84 85 // 入力/出力 86 in, out halfConn 87 rawInput bytes.Buffer 88 input bytes.Reader 89 hand bytes.Buffer 90 buffering bool 91 sendBuf []byte 92 93 // bytesSentは送信されたアプリケーションデータのバイト数をカウントします。 94 // packetsSentはパケットの数をカウントします。 95 bytesSent int64 96 packetsSent int64 97 98 // retryCount は Conn.readRecord によって受信された、連続して進展しないレコードの数をカウントします。つまり、ハンドシェイクを進行させず、またアプリケーションデータを送信しないレコードです。in.Mutex によって保護されています。 99 retryCount int 100 101 // activeCallはCloseが呼び出されたかどうかを最下位ビットで示します。 102 // 残りのビット数はConn.Write内のゴルーチンの数です。 103 activeCall atomic.Int32 104 105 tmp [16]byte 106 } 107 108 // LocalAddrはローカルネットワークアドレスを返します。 109 func (c *Conn) LocalAddr() net.Addr 110 111 // RemoteAddrはリモートネットワークアドレスを返します。 112 func (c *Conn) RemoteAddr() net.Addr 113 114 // SetDeadlineは接続に関連付けられた読み込みと書き込みのタイムアウトを設定します。 115 // tのゼロ値は、 [Conn.Read] と [Conn.Write] がタイムアウトしないことを意味します。 116 // 書き込みがタイムアウトした後、TLSの状態が破損し、将来の書き込みは同じエラーを返します。 117 func (c *Conn) SetDeadline(t time.Time) error 118 119 // SetReadDeadlineは基礎となる接続の読み込みの期限を設定します。 120 // tのゼロ値は、 [Conn.Read] がタイムアウトしないことを意味します。 121 func (c *Conn) SetReadDeadline(t time.Time) error 122 123 // SetWriteDeadlineは、基礎となる接続に書き込みの期限を設定します。 124 // tのゼロ値は、 [Conn.Write] がタイムアウトしないことを意味します。 125 // 書き込みがタイムアウトした後、TLSの状態が壊れるため、以降の書き込みは同じエラーを返します。 126 func (c *Conn) SetWriteDeadline(t time.Time) error 127 128 // NetConnはcによってラップされた基になる接続を返します。 129 // ただし、この接続に直接書き込みまたは読み込みを行うと、TLSセッションが破損することに注意してください。 130 func (c *Conn) NetConn() net.Conn 131 132 // RecordHeaderError は、TLS レコードヘッダが無効な場合に返されます。 133 type RecordHeaderError struct { 134 // Msgはエラーを説明する人が読みやすい文字列を含んでいます。 135 Msg string 136 137 // RecordHeaderには、エラーを引き起こしたTLSレコードヘッダの5バイトが含まれています。 138 RecordHeader [5]byte 139 140 // Connは、クライアントが初期ハンドシェイクを送信しているが、TLSのように見えない場合の基礎となるnet.Connを提供します。 141 // ハンドシェイクが既に行われているか、接続にTLSアラートが書き込まれている場合は、nilです。 142 Conn net.Conn 143 } 144 145 func (e RecordHeaderError) Error() string 146 147 // Writeは接続にデータを書き込みます。 148 // 149 // [Conn.Handshake] を呼び出すため、無期限のブロッキングを防ぐために 150 // ハンドシェイクが完了していない場合、Writeを呼び出す前に 151 // [Conn.Read] とWriteの両方に期限を設定する必要があります。 152 // [Conn.SetDeadline] 、 [Conn.SetReadDeadline] 、および [Conn.SetWriteDeadline] を参照してください。 153 func (c *Conn) Write(b []byte) (int, error) 154 155 // Readは接続からデータを読み込みます。 156 // 157 // [Conn.Handshake] を呼び出すため、ハンドシェイクがまだ完了していない場合、 158 // Readが呼び出される前にReadと [Conn.Write] の両方にデッドラインを設定する必要があります 159 // 無制限のブロッキングを防ぐためです。 160 // [Conn.SetDeadline] 、 [Conn.SetReadDeadline] 、および [Conn.SetWriteDeadline] を参照してください。 161 func (c *Conn) Read(b []byte) (int, error) 162 163 // Closeは接続を閉じます。 164 func (c *Conn) Close() error 165 166 // CloseWriteは接続の書き込み側をシャットダウンします。ハンドシェイクが完了した後に一度だけ呼び出され、基礎となる接続上でCloseWriteを呼び出しません。ほとんどの呼び出し元は単に [Conn.Close] を使用すべきです。 167 func (c *Conn) CloseWrite() error 168 169 // Handshakeはクライアントまたはサーバーのハンドシェイクプロトコルを実行します。 170 // まだ実行されていない場合、ほとんどのこのパッケージの使用では、明示的にHandshakeを呼び出す必要はありません:最初の [Conn.Read] または [Conn.Write] が自動的に呼び出します。 171 // 172 // ハンドシェイクのキャンセルやタイムアウトの設定に関して制御するためには、 [Conn.HandshakeContext] または [Dialer] のDialContextメソッドを使用します。 173 // 174 // サーバーまたはクライアントが送信する証明書のRSAキーサイズは、拒否サービス攻撃を防ぐために、8192ビットに制限されています。この制限は、GODEBUG環境変数(例:GODEBUG=tlsmaxrsasize=4096)のtlsmaxrsasizeを設定することで上書きすることができます。 175 func (c *Conn) Handshake() error 176 177 // HandshakeContextは、クライアントまたはサーバーのハンドシェイクプロトコルを実行します。 178 // まだ実行されていない場合、提供されたコンテキストはnil以外である必要があります。 179 // ハンドシェイクが完了する前にコンテキストがキャンセルされた場合、ハンドシェイクは中断され、エラーが返されます。 180 // ハンドシェイクが完了すると、コンテキストのキャンセルは接続に影響を与えません。 181 // 182 // このパッケージのほとんどの使用では、明示的にHandshakeContextを呼び出す必要はありません:最初の [Conn.Read] または [Conn.Write] が自動的に呼び出します。 183 func (c *Conn) HandshakeContext(ctx context.Context) error 184 185 // ConnectionState関数は、接続に関する基本的なTLSの詳細を返します。 186 func (c *Conn) ConnectionState() ConnectionState 187 188 // OCSPResponseは、TLSサーバーからステープルされたOCSP応答を返します(クライアント接続の場合のみ有効)。 189 func (c *Conn) OCSPResponse() []byte 190 191 // VerifyHostnameは、ホストに接続するためのピア証明書チェーンが有効かどうかを確認します。有効であれば、nilを返します。そうでなければ、問題を説明するエラーを返します。 192 func (c *Conn) VerifyHostname(host string) error