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