github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/crypto/tls/quic.go (about)

     1  // Copyright 2023 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  package tls
     6  
     7  import (
     8  	"github.com/shogo82148/std/context"
     9  )
    10  
    11  // QUICEncryptionLevelは、ハンドシェイクメッセージを送信するために使用されるQUIC暗号化レベルを表します。
    12  type QUICEncryptionLevel int
    13  
    14  const (
    15  	QUICEncryptionLevelInitial = QUICEncryptionLevel(iota)
    16  	QUICEncryptionLevelEarly
    17  	QUICEncryptionLevelHandshake
    18  	QUICEncryptionLevelApplication
    19  )
    20  
    21  func (l QUICEncryptionLevel) String() string
    22  
    23  // QUICConnは、RFC 9001で説明されているように、基礎となるトランスポートとしてQUICの実装を使用する接続を表します。
    24  //
    25  // QUICConnのメソッドは同時に使用することはできません。
    26  type QUICConn struct {
    27  	conn *Conn
    28  
    29  	sessionTicketSent bool
    30  }
    31  
    32  // QUICConfigは [QUICConn] を設定します。
    33  type QUICConfig struct {
    34  	TLSConfig *Config
    35  }
    36  
    37  // QUICEventKindはQUIC接続上での操作の種類です。
    38  type QUICEventKind int
    39  
    40  const (
    41  	// QUICNoEventは利用可能なイベントが存在しないことを示します。
    42  	QUICNoEvent QUICEventKind = iota
    43  
    44  	// QUICSetReadSecretとQUICSetWriteSecretは、特定の暗号化レベルの読み取りと書き込みの秘密情報を提供します。
    45  	// QUICEvent.Level、QUICEvent.Data、QUICEvent.Suiteが設定されます。
    46  	//
    47  	// Initial暗号化レベルの秘密情報は、最初の宛先接続IDから派生され、QUICConnによって提供されません。
    48  	QUICSetReadSecret
    49  	QUICSetWriteSecret
    50  
    51  	// QUICWriteDataはCRYPTOフレームでピアに送信するデータを提供します。
    52  	// QUICEvent.Dataが設定されています。
    53  	QUICWriteData
    54  
    55  	// QUICTransportParametersは相手のQUICトランスポートパラメータを提供します。
    56  	// QUICEvent.Dataが設定されています。
    57  	QUICTransportParameters
    58  
    59  	// QUICTransportParametersRequiredは、呼び出し元がピアに送信するためのQUICトランスポートパラメータを提供する必要があることを示します。呼び出し元は、QUICConn.SetTransportParametersを使用してトランスポートパラメータを設定し、QUICConn.NextEventを再度呼び出す必要があります。
    60  	// QUICConn.Startを呼び出す前にトランスポートパラメータが設定されている場合、接続は決してQUICTransportParametersRequiredイベントを生成しません。
    61  	QUICTransportParametersRequired
    62  
    63  	// QUICRejectedEarlyDataは、サーバーが私たちが提供したものであっても、0-RTTデータを拒否したことを示しています。これは、QUICEncryptionLevelApplicationのキーが返される前に返されます。
    64  	QUICRejectedEarlyData
    65  
    66  	// QUICHandshakeDone は、TLS ハンドシェイクが完了したことを示します。
    67  	QUICHandshakeDone
    68  )
    69  
    70  // QUICEventはQUIC接続で発生するイベントです。
    71  //
    72  // イベントの種類はKindフィールドで指定されます。
    73  // 他のフィールドの内容は、種別によって異なります。
    74  type QUICEvent struct {
    75  	Kind QUICEventKind
    76  
    77  	// QUICSetReadSecret、QUICSetWriteSecret、およびQUICWriteDataに対する設定。
    78  	Level QUICEncryptionLevel
    79  
    80  	// QUICTransportParameters、QUICSetReadSecret、QUICSetWriteSecret、およびQUICWriteDataに設定します。
    81  	// この内容はcrypto/tlsによって所有され、次のNextEvent呼び出しまで有効です。
    82  	Data []byte
    83  
    84  	// QUICSetReadSecretおよびQUICSetWriteSecretに設定します。
    85  	Suite uint16
    86  }
    87  
    88  // QUICClientは、QUICTransportを基礎とした新しいTLSクライアント側接続を返します。設定はnilであってはなりません。
    89  //
    90  // 設定のMinVersionは、少なくともTLS 1.3である必要があります。
    91  func QUICClient(config *QUICConfig) *QUICConn
    92  
    93  // QUICServerは、下層トランスポートとしてQUICTransportを使用した新しいTLSサーバーサイド接続を返します。設定はnilにできません。
    94  //
    95  // 設定のMinVersionは、少なくともTLS 1.3である必要があります。
    96  func QUICServer(config *QUICConfig) *QUICConn
    97  
    98  // Startはクライアントまたはサーバーのハンドシェイクプロトコルを開始します。
    99  // 接続イベントを生成する場合があり、 [QUICConn.NextEvent] で読み取ることができます。
   100  //
   101  // Startは1度以上呼び出すことはできません。
   102  func (q *QUICConn) Start(ctx context.Context) error
   103  
   104  // NextEventは接続で発生する次のイベントを返します。
   105  // イベントが利用できない場合は、Kindが [QUICNoEvent] のイベントを返します。
   106  func (q *QUICConn) NextEvent() QUICEvent
   107  
   108  // Closeは接続を閉じ、進行中のハンドシェイクを停止します。
   109  func (q *QUICConn) Close() error
   110  
   111  // HandleDataはピアから受信したハンドシェイクバイトを処理します。
   112  // 接続イベントを生成することがあり、 [QUICConn.NextEvent] で読み取ることができます。
   113  func (q *QUICConn) HandleData(level QUICEncryptionLevel, data []byte) error
   114  
   115  type QUICSessionTicketOptions struct {
   116  	// EarlyDataは0-RTTで使用できるかどうかを指定します。
   117  	EarlyData bool
   118  }
   119  
   120  // SendSessionTicketはクライアントにセッションチケットを送信します。
   121  // これにより、接続イベントが生成され、 [QUICConn.NextEvent] で読み取ることができます。
   122  // 現在、一度しか呼び出すことはできません。
   123  func (q *QUICConn) SendSessionTicket(opts QUICSessionTicketOptions) error
   124  
   125  // ConnectionStateは接続に関する基本的なTLSの詳細を返します。
   126  func (q *QUICConn) ConnectionState() ConnectionState
   127  
   128  // SetTransportParametersはピアに送信するためのトランスポートパラメータを設定します。
   129  //
   130  // サーバ接続では、クライアントのトランスポートパラメータを受信した後にトランスポートパラメータを設定することができます。 [QUICTransportParametersRequired] を参照してください。
   131  func (q *QUICConn) SetTransportParameters(params []byte)