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)