raioquic 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.containerignore +4 -0
- data/.rubocop.yml +93 -0
- data/CHANGELOG.md +5 -0
- data/CODE_OF_CONDUCT.md +84 -0
- data/Containerfile +6 -0
- data/Gemfile +24 -0
- data/Gemfile.lock +113 -0
- data/LICENSE +28 -0
- data/README.md +48 -0
- data/Rakefile +16 -0
- data/Steepfile +8 -0
- data/example/curlcatcher.rb +18 -0
- data/example/interoperability/README.md +9 -0
- data/example/interoperability/aioquic/aioquic_client.py +47 -0
- data/example/interoperability/aioquic/aioquic_server.py +34 -0
- data/example/interoperability/key.pem +28 -0
- data/example/interoperability/localhost-unasuke-dev.crt +21 -0
- data/example/interoperability/quic-go/sample_server.go +61 -0
- data/example/interoperability/raioquic_client.rb +42 -0
- data/example/interoperability/raioquic_server.rb +43 -0
- data/example/parse_curl_example.rb +108 -0
- data/lib/raioquic/buffer.rb +202 -0
- data/lib/raioquic/core_ext.rb +54 -0
- data/lib/raioquic/crypto/README.md +5 -0
- data/lib/raioquic/crypto/aesgcm.rb +52 -0
- data/lib/raioquic/crypto/backend/aead.rb +52 -0
- data/lib/raioquic/crypto/backend.rb +12 -0
- data/lib/raioquic/crypto.rb +10 -0
- data/lib/raioquic/quic/configuration.rb +81 -0
- data/lib/raioquic/quic/connection.rb +2776 -0
- data/lib/raioquic/quic/crypto.rb +317 -0
- data/lib/raioquic/quic/event.rb +69 -0
- data/lib/raioquic/quic/logger.rb +272 -0
- data/lib/raioquic/quic/packet.rb +471 -0
- data/lib/raioquic/quic/packet_builder.rb +301 -0
- data/lib/raioquic/quic/rangeset.rb +113 -0
- data/lib/raioquic/quic/recovery.rb +528 -0
- data/lib/raioquic/quic/stream.rb +343 -0
- data/lib/raioquic/quic.rb +20 -0
- data/lib/raioquic/tls.rb +1659 -0
- data/lib/raioquic/version.rb +5 -0
- data/lib/raioquic.rb +12 -0
- data/misc/export_x25519.py +43 -0
- data/misc/gen_rfc8448_keypair.rb +90 -0
- data/raioquic.gemspec +37 -0
- data/sig/raioquic/buffer.rbs +37 -0
- data/sig/raioquic/core_ext.rbs +7 -0
- data/sig/raioquic/crypto/aesgcm.rbs +20 -0
- data/sig/raioquic/crypto/backend/aead.rbs +11 -0
- data/sig/raioquic/quic/configuration.rbs +34 -0
- data/sig/raioquic/quic/connection.rbs +277 -0
- data/sig/raioquic/quic/crypto.rbs +88 -0
- data/sig/raioquic/quic/event.rbs +51 -0
- data/sig/raioquic/quic/logger.rbs +57 -0
- data/sig/raioquic/quic/packet.rbs +157 -0
- data/sig/raioquic/quic/packet_builder.rbs +76 -0
- data/sig/raioquic/quic/rangeset.rbs +17 -0
- data/sig/raioquic/quic/recovery.rbs +142 -0
- data/sig/raioquic/quic/stream.rbs +87 -0
- data/sig/raioquic/tls.rbs +444 -0
- data/sig/raioquic.rbs +9 -0
- metadata +121 -0
@@ -0,0 +1,444 @@
|
|
1
|
+
module Raioquic
|
2
|
+
module TLS
|
3
|
+
TLS_VERSION_1_2: ::Integer # 0x0303
|
4
|
+
TLS_VERSION_1_3: ::Integer # 0x0304
|
5
|
+
TLS_VERSION_1_3_DRAFT_28: ::Integer # 0x7f1c
|
6
|
+
TLS_VERSION_1_3_DRAFT_27: ::Integer # 0x7f1b
|
7
|
+
TLS_VERSION_1_3_DRAFT_26: ::Integer # 0x7f1a
|
8
|
+
|
9
|
+
class AlertDescription
|
10
|
+
CLOSE_NOTIFY: 0
|
11
|
+
UNEXPECTED_MESSAGE: 10
|
12
|
+
BAD_RECORD_MAC: 20
|
13
|
+
RECORD_OVERFLOW: 22
|
14
|
+
HANDSHAKE_FAILURE: 40
|
15
|
+
BAD_CERTIFICATE: 42
|
16
|
+
UNSUPPORTED_CERTIFICATE: 43
|
17
|
+
CERTIFICATE_REVOKED: 44
|
18
|
+
CERTIFICATE_EXPIRED: 45
|
19
|
+
CERTIFICATE_UNKNOWN: 46
|
20
|
+
ILLEGAL_PARAMETER: 47
|
21
|
+
UNKNOWN_CA: 48
|
22
|
+
ACCESS_DENIED: 49
|
23
|
+
DECODE_ERROR: 50
|
24
|
+
DECRYPT_ERROR: 51
|
25
|
+
PROTOCOL_VERSION: 70
|
26
|
+
INSUFFICIENT_SECURITY: 71
|
27
|
+
INTERNAL_ERROR: 80
|
28
|
+
INAPPROPRIATE_FALLBACK: 86
|
29
|
+
USER_CANCELED: 90
|
30
|
+
MISSING_EXTENSION: 109
|
31
|
+
UNSUPPORTED_EXTENSION: 110
|
32
|
+
UNRECOGNIZED_NAME: 112
|
33
|
+
BAD_CERTIFICATE_STATUS_RESPONSE: 113
|
34
|
+
UNKNOWN_PSK_IDENTITY: 115
|
35
|
+
CERTIFICATE_REQUIRED: 116
|
36
|
+
NO_APPLICATION_PROTOCOL: 120
|
37
|
+
end
|
38
|
+
|
39
|
+
class Alert < StandardError
|
40
|
+
end
|
41
|
+
|
42
|
+
class AlertBadCertificate < Alert
|
43
|
+
def description: () -> ::Integer
|
44
|
+
end
|
45
|
+
|
46
|
+
class AlertCertificateExpired < Alert
|
47
|
+
def description: () -> ::Integer
|
48
|
+
end
|
49
|
+
|
50
|
+
class AlertDecryptError < Alert
|
51
|
+
def description: () -> ::Integer
|
52
|
+
end
|
53
|
+
|
54
|
+
class AlertHandshakeFailure < Alert
|
55
|
+
def description: () -> ::Integer
|
56
|
+
end
|
57
|
+
|
58
|
+
class AlertIllegalParameter < Alert
|
59
|
+
def description: () -> ::Integer
|
60
|
+
end
|
61
|
+
|
62
|
+
class AlertInternalError < Alert
|
63
|
+
def description: () -> ::Integer
|
64
|
+
end
|
65
|
+
|
66
|
+
class AlertProtocolVersion < Alert
|
67
|
+
def description: () -> ::Integer
|
68
|
+
end
|
69
|
+
|
70
|
+
class AlertUnexpectedMessage < Alert
|
71
|
+
def description: () -> ::Integer
|
72
|
+
end
|
73
|
+
|
74
|
+
class Direction
|
75
|
+
DECRYPT: 0
|
76
|
+
ENCRYPT: 1
|
77
|
+
end
|
78
|
+
|
79
|
+
class Epoch
|
80
|
+
INITIAL: 0
|
81
|
+
ZERO_RTT: 1
|
82
|
+
HANDSHAKE: 2
|
83
|
+
ONE_RTT: 3
|
84
|
+
end
|
85
|
+
|
86
|
+
class State
|
87
|
+
CLIENT_HANDSHAKE_START: 0
|
88
|
+
CLIENT_EXPECT_SERVER_HELLO: 1
|
89
|
+
CLIENT_EXPECT_ENCRYPTED_EXTENSIONS: 2
|
90
|
+
CLIENT_EXPECT_CERTIFICATE_REQUEST_OR_CERTIFICATE: 3
|
91
|
+
CLIENT_EXPECT_CERTIFICATE_CERTIFICATE: 4
|
92
|
+
CLIENT_EXPECT_CERTIFICATE_VERIFY: 5
|
93
|
+
CLIENT_EXPECT_FINISHED: 6
|
94
|
+
CLIENT_POST_HANDSHAKE: 7
|
95
|
+
SERVER_EXPECT_CLIENT_HELLO: 8
|
96
|
+
SERVER_EXPECT_FINISHED: 9
|
97
|
+
SERVER_POST_HANDSHAKE: 10
|
98
|
+
end
|
99
|
+
|
100
|
+
def self.load_pem_private_key: (::String) -> OpenSSL::PKey::PKey
|
101
|
+
| (::String, ::String) -> OpenSSL::PKey::PKey
|
102
|
+
def self.load_pem_x509_certificates: (::String) -> ::Array[OpenSSL::X509::Certificate]
|
103
|
+
def self.verify_certificate: (certificate: OpenSSL::X509::Certificate, ?chain: ::Array[untyped], ?server_name: ::String|nil, ?cadata: untyped, ?cafile: untyped, ?capath: untyped) -> void
|
104
|
+
|
105
|
+
class CipherSuite
|
106
|
+
AES_128_GCM_SHA256: ::Integer # 0x1301
|
107
|
+
AES_256_GCM_SHA384: ::Integer # 0x1302
|
108
|
+
CHACHA20_POLY1305_SHA256: ::Integer # 0x1303
|
109
|
+
EMPTY_RENEGOTIATION_INFO_SCSV: ::Integer # 0x00ff
|
110
|
+
end
|
111
|
+
|
112
|
+
class CompressionMethod
|
113
|
+
NULL: 0
|
114
|
+
end
|
115
|
+
|
116
|
+
class ExtensionType
|
117
|
+
SERVER_NAME: 0
|
118
|
+
STATUS_REQUEST: 5
|
119
|
+
SUPPORTED_GROUPS: 10
|
120
|
+
SIGNATURE_ALGORITHMS: 13
|
121
|
+
ALPN: 16
|
122
|
+
COMPRESS_CERTIFICATE: 27
|
123
|
+
PRE_SHARED_KEY: 41
|
124
|
+
EARLY_DATA: 42
|
125
|
+
SUPPORTED_VERSIONS: 43
|
126
|
+
COOKIE: 44
|
127
|
+
PSK_KEY_EXCHANGE_MODES: 45
|
128
|
+
KEY_SHARE: 51
|
129
|
+
QUIC_TRANSPORT_PARAMETERS: ::Integer # 0x0039
|
130
|
+
QUIC_TRANSPORT_PARAMETERS_DRAFT: ::Integer # 0xffa5
|
131
|
+
ENCRYPTED_SERVER_NAME: 65486
|
132
|
+
end
|
133
|
+
|
134
|
+
class Group
|
135
|
+
SECP256R1: ::Integer # 0x0017
|
136
|
+
SECP384R1: ::Integer # 0x0018
|
137
|
+
SECP521R1: ::Integer # 0x0019
|
138
|
+
X25519: ::Integer # 0x001d
|
139
|
+
X448: ::Integer # 0x001e
|
140
|
+
GREASE: ::Integer # 0xaaaa
|
141
|
+
end
|
142
|
+
|
143
|
+
class HandshakeType
|
144
|
+
CLIENT_HELLO: 1
|
145
|
+
SERVER_HELLO: 2
|
146
|
+
NEW_SESSION_TICKET: 4
|
147
|
+
END_OF_EARLY_DATA: 5
|
148
|
+
ENCRYPTED_EXTENSIONS: 8
|
149
|
+
CERTIFICATE: 11
|
150
|
+
CERTIFICATE_REQUEST: 13
|
151
|
+
CERTIFICATE_VERIFY: 15
|
152
|
+
FINISHED: 20
|
153
|
+
KEY_UPDATE: 24
|
154
|
+
COMPRESSED_CERTIFICATE: 25
|
155
|
+
MESSAGE_HASH: 254
|
156
|
+
end
|
157
|
+
|
158
|
+
class PskKeyExchangeMode
|
159
|
+
PSK_KE: 0
|
160
|
+
PSK_DHE_KE: 1
|
161
|
+
end
|
162
|
+
|
163
|
+
class SignatureAlgorithm
|
164
|
+
ECDSA_SECP256R1_SHA256: ::Integer # 0x0403
|
165
|
+
ECDSA_SECP384R1_SHA384: ::Integer # 0x0503
|
166
|
+
ECDSA_SECP521R1_SHA512: ::Integer # 0x0603
|
167
|
+
ED25519: ::Integer # 0x0807
|
168
|
+
ED448: ::Integer # 0x0808
|
169
|
+
RSA_PKCS1_SHA256: ::Integer # 0x0401
|
170
|
+
RSA_PKCS1_SHA384: ::Integer # 0x0501
|
171
|
+
RSA_PKCS1_SHA512: ::Integer # 0x0601
|
172
|
+
RSA_PSS_PSS_SHA256: ::Integer # 0x0809
|
173
|
+
RSA_PSS_PSS_SHA384: ::Integer # 0x080a
|
174
|
+
RSA_PSS_PSS_SHA512: ::Integer # 0x080b
|
175
|
+
RSA_PSS_RSAE_SHA256: ::Integer # 0x0804
|
176
|
+
RSA_PSS_RSAE_SHA384: ::Integer # 0x0805
|
177
|
+
RSA_PSS_RSAE_SHA512: ::Integer # 0x0806
|
178
|
+
|
179
|
+
# legacy
|
180
|
+
RSA_PKCS1_SHA1: ::Integer # 0x0201
|
181
|
+
SHA1_DSA: ::Integer # 0x0202
|
182
|
+
ECDSA_SHA1: ::Integer # 0x0203
|
183
|
+
end
|
184
|
+
|
185
|
+
def self.pull_block: (buf: ::Raioquic::Buffer, capacity: ::Integer) { (::Integer) -> untyped } -> untyped
|
186
|
+
def self.push_block: (buf: ::Raioquic::Buffer, capacity: ::Integer) { (untyped) -> untyped } -> untyped
|
187
|
+
def self.pull_list: (buf: ::Raioquic::Buffer, capacity: ::Integer, func: ::Proc) -> ::Array[untyped]
|
188
|
+
def self.push_list: (buf: ::Raioquic::Buffer, capacity: ::Integer, func: ::Proc, values: ::Array[untyped]) -> void
|
189
|
+
def self.pull_opaque: (buf: ::Raioquic::Buffer, capacity: ::Integer) -> ::String
|
190
|
+
def self.push_opaque: (buf: ::Raioquic::Buffer, capacity: ::Integer, value: untyped) -> void
|
191
|
+
def self.push_extension: (buf: ::Raioquic::Buffer, extension_type: ::Integer) { (untyped) -> untyped } -> void
|
192
|
+
type key_share_entry = [::Integer, ::String]
|
193
|
+
def self.pull_key_share: (buf: ::Raioquic::Buffer) -> key_share_entry
|
194
|
+
def self.push_key_share: (buf: ::Raioquic::Buffer, value: key_share_entry) -> void
|
195
|
+
def self.pull_alpn_protocol: (buf: ::Raioquic::Buffer) -> ::String
|
196
|
+
def self.push_alpn_protocol: (buf: ::Raioquic::Buffer, protocol: ::Integer) -> void
|
197
|
+
type psk_identity = [::String, ::Integer]
|
198
|
+
def self.pull_psk_identity: (buf: ::Raioquic::Buffer) -> psk_identity
|
199
|
+
def self.push_psk_identity: (buf: ::Raioquic::Buffer, entry: psk_identity) -> void
|
200
|
+
def self.pull_psk_binder: (buf: ::Raioquic::Buffer) -> ::String
|
201
|
+
def self.push_psk_binder: (buf: ::Raioquic::Buffer, binder: ::String) -> void
|
202
|
+
|
203
|
+
class OfferedPsks
|
204
|
+
attr_accessor identities: ::Array[psk_identity]
|
205
|
+
attr_accessor binders: ::Array[::String]
|
206
|
+
end
|
207
|
+
|
208
|
+
type tls_extension = [::Integer, ::String]
|
209
|
+
class ClientHello
|
210
|
+
attr_accessor random: ::String
|
211
|
+
attr_accessor legacy_session_id: ::String
|
212
|
+
attr_accessor cipher_suites: ::Array[::Integer]
|
213
|
+
attr_accessor legacy_compression_methods: ::Array[::Integer]
|
214
|
+
attr_accessor alpn_protocols: ::Array[::String] | nil
|
215
|
+
attr_accessor early_data: bool
|
216
|
+
attr_accessor key_share: ::Array[key_share_entry] | nil
|
217
|
+
attr_accessor pre_shared_key: OfferedPsks | nil
|
218
|
+
attr_accessor psk_key_exchange_modes: ::Array[::Integer] | nil
|
219
|
+
attr_accessor server_name: ::String | nil
|
220
|
+
attr_accessor signature_algorithms: ::Array[::Integer] | nil
|
221
|
+
attr_accessor supported_groups: ::Array[::Integer] | nil
|
222
|
+
attr_accessor supported_versions: ::Array[::Integer] | nil
|
223
|
+
attr_accessor other_extensions: ::Array[tls_extension]
|
224
|
+
end
|
225
|
+
|
226
|
+
def self.pull_client_hello: (::Raioquic::Buffer) -> ClientHello
|
227
|
+
def self.push_client_hello: (buf: ::Raioquic::Buffer, hello: ClientHello) -> void
|
228
|
+
|
229
|
+
class ServerHello
|
230
|
+
attr_accessor random: ::String
|
231
|
+
attr_accessor legacy_session_id: ::String
|
232
|
+
attr_accessor cipher_suite: ::Integer
|
233
|
+
attr_accessor compression_method: ::Integer
|
234
|
+
attr_accessor key_share: key_share_entry | nil
|
235
|
+
attr_accessor pre_shared_key: ::Integer | nil
|
236
|
+
attr_accessor supported_version: ::Integer | nil
|
237
|
+
attr_accessor other_extensions: ::Array[tls_extension]
|
238
|
+
end
|
239
|
+
|
240
|
+
def self.pull_server_hello: (::Raioquic::Buffer) -> ServerHello
|
241
|
+
def self.push_server_hello: (buf: ::Raioquic::Buffer, hello: ServerHello) -> void
|
242
|
+
|
243
|
+
class NewSessionTicket
|
244
|
+
attr_accessor ticket_lifetime: ::Integer
|
245
|
+
attr_accessor ticket_age_add: ::Integer
|
246
|
+
attr_accessor ticket_nonce: ::String
|
247
|
+
attr_accessor ticket: ::String
|
248
|
+
attr_accessor max_early_data_size: ::Integer | nil
|
249
|
+
attr_accessor other_extensions: ::Array[tls_extension]
|
250
|
+
end
|
251
|
+
|
252
|
+
def self.pull_new_session_ticket: (::Raioquic::Buffer) -> NewSessionTicket
|
253
|
+
def self.push_new_session_ticket: (buf: ::Raioquic::Buffer, new_session_ticket: NewSessionTicket) -> void
|
254
|
+
|
255
|
+
class EncryptedExtensions
|
256
|
+
attr_accessor alpn_protocol: ::String | nil
|
257
|
+
attr_accessor early_data: bool
|
258
|
+
attr_accessor other_extensions: ::Array[tls_extension]
|
259
|
+
end
|
260
|
+
|
261
|
+
def self.pull_encrypted_extensions: (::Raioquic::Buffer) -> EncryptedExtensions
|
262
|
+
def self.push_encrypted_extensions: (buf: ::Raioquic::Buffer, extensions: EncryptedExtensions) -> void
|
263
|
+
|
264
|
+
type certificate_entry = [::String, ::String]
|
265
|
+
class Certificate
|
266
|
+
attr_accessor request_context: ::String
|
267
|
+
attr_accessor certificates: ::Array[certificate_entry]
|
268
|
+
end
|
269
|
+
|
270
|
+
def self.pull_certificate: (::Raioquic::Buffer) -> Certificate
|
271
|
+
def self.push_certificate: (buf: ::Raioquic::Buffer, certificate: Certificate) -> void
|
272
|
+
|
273
|
+
class CertificateVerify
|
274
|
+
attr_accessor algorithm: ::Integer
|
275
|
+
attr_accessor signature: ::String
|
276
|
+
end
|
277
|
+
|
278
|
+
def self.pull_certificate_verify: (::Raioquic::Buffer) -> CertificateVerify
|
279
|
+
def self.push_certificate_verify: (buf: ::Raioquic::Buffer, verify: CertificateVerify) -> void
|
280
|
+
|
281
|
+
class Finished
|
282
|
+
attr_accessor verify_data: ::String
|
283
|
+
end
|
284
|
+
|
285
|
+
def self.pull_finished: (::Raioquic::Buffer) -> Finished
|
286
|
+
def self.push_finished: (buf: ::Raioquic::Buffer, finished: Finished) -> void
|
287
|
+
|
288
|
+
class KeySchedule
|
289
|
+
@algorithm: singleton(::OpenSSL::Digest)
|
290
|
+
@cipher_suite: CipherSuite
|
291
|
+
@generation: ::Integer
|
292
|
+
@hash: untyped # TODO: ::OpenSSL::Digest::SHA256 | ::OpenSSL::Digest::SHA384 | ::OpenSSL::Digest::SHA512
|
293
|
+
@hash_empty_value: untyped
|
294
|
+
@secret: ::String
|
295
|
+
|
296
|
+
def initialize: (::Integer) -> void
|
297
|
+
def certificate_verify_data: (::String) -> ::String
|
298
|
+
def finished_verify_data: (::String) -> ::String
|
299
|
+
def derive_secret: (::String) -> ::String
|
300
|
+
def extract: (::String) -> void
|
301
|
+
| () -> void
|
302
|
+
def update_hash: (::String) -> void
|
303
|
+
end
|
304
|
+
|
305
|
+
class KeyScheduleProxy
|
306
|
+
@schedules: ::Hash[::Integer, KeySchedule]
|
307
|
+
|
308
|
+
def initialize: (::Array[::Integer]) -> void
|
309
|
+
def extract: (::String) -> void
|
310
|
+
| () -> void
|
311
|
+
def select: (::Integer) -> KeySchedule
|
312
|
+
def update_hash: (::String) -> void
|
313
|
+
end
|
314
|
+
|
315
|
+
CIPHER_SUITES: ::Hash[::Integer, singleton(::OpenSSL::Digest)]
|
316
|
+
SIGNATURE_ALGORITHMS: ::Hash[::Integer, ::Array[untyped]] # TODO: [(::Symbol|nil), singleton(::OpenSSL::Digest)]
|
317
|
+
GROUP_TO_CURVE: ::Hash[::Integer, ::String]
|
318
|
+
CURVE_TO_GROUP: ::Hash[::String, ::Integer]
|
319
|
+
|
320
|
+
def self.cipher_suite_hash: (::Integer) -> singleton(OpenSSL::Digest)
|
321
|
+
def self.decode_public_key: ([::Integer, ::String]) -> (::OpenSSL::PKey::EC::Point | ::OpenSSL::PKey::PKey | nil)
|
322
|
+
def self.encode_public_key: (::OpenSSL::PKey::EC::Point) -> key_share_entry
|
323
|
+
def self.negotiate: [T] (supported: ::Array[T], offered: ::Array[T], ?exc: singleton(Alert)) -> (T | nil)
|
324
|
+
def self.push_message: (key_schedule: KeySchedule|KeyScheduleProxy, buf: ::Raioquic::Buffer) { (untyped) -> untyped } -> void
|
325
|
+
|
326
|
+
class SessionTicket
|
327
|
+
attr_accessor age_add: ::Integer
|
328
|
+
attr_accessor cipher_suite: CipherSuite
|
329
|
+
attr_accessor not_valid_after: ::Time
|
330
|
+
attr_accessor not_valid_before: ::Time
|
331
|
+
attr_accessor resumption_secret: ::String
|
332
|
+
attr_accessor server_name: ::String
|
333
|
+
attr_accessor ticket: ::String
|
334
|
+
attr_accessor max_early_data_size: (::Integer | nil)
|
335
|
+
attr_accessor other_extensions: ::Array[tls_extension]
|
336
|
+
|
337
|
+
def is_valid: () -> bool
|
338
|
+
def obfuscated_age: () -> ::Integer
|
339
|
+
end
|
340
|
+
|
341
|
+
class Context
|
342
|
+
type alpn_handler = ^(::Integer) -> void
|
343
|
+
type session_ticket_fetcher = ^(::String) -> (SessionTicket | nil)
|
344
|
+
type session_ticket_handler = ^(SessionTicket) -> void
|
345
|
+
|
346
|
+
attr_reader session_resumed: bool
|
347
|
+
attr_reader enc_key: ::String | nil
|
348
|
+
attr_reader dec_key: ::String | nil
|
349
|
+
attr_reader key_schedule: KeySchedule | nil
|
350
|
+
attr_reader alpn_negotiated: ::String | nil
|
351
|
+
attr_reader received_context: ::Array[tls_extension] | nil
|
352
|
+
attr_reader early_data_accepted: bool
|
353
|
+
|
354
|
+
attr_accessor state: ::Integer
|
355
|
+
attr_accessor handshake_extensions: ::Array[tls_extension]
|
356
|
+
attr_accessor certificate: ::OpenSSL::X509::Certificate | nil
|
357
|
+
attr_accessor certificate_chain: ::Array[::OpenSSL::X509::Certificate]
|
358
|
+
attr_accessor certificate_private_key: ::OpenSSL::PKey | nil
|
359
|
+
attr_accessor supported_groups: ::Array[::Integer]
|
360
|
+
attr_accessor supported_versions: ::Array[::Integer]
|
361
|
+
attr_accessor signature_algorithms: ::Array[::Integer]
|
362
|
+
attr_accessor new_session_ticket_cb: session_ticket_handler | nil
|
363
|
+
attr_accessor get_session_ticket_cb: session_ticket_fetcher | nil
|
364
|
+
attr_accessor session_ticket: SessionTicket | nil
|
365
|
+
attr_accessor alpn_cb: alpn_handler | nil
|
366
|
+
attr_accessor update_traffic_key_cb: ::Proc
|
367
|
+
|
368
|
+
@alpn_protocols: ::Array[::String]
|
369
|
+
@cadata: ::String | nil
|
370
|
+
@cafile: ::String | nil
|
371
|
+
@capath: ::String | nil
|
372
|
+
@certificate: ::OpenSSL::X509::Certificate | nil
|
373
|
+
@certificate_chain: ::Array[::OpenSSL::X509::Certificate]
|
374
|
+
@certificate_private_key: ::OpenSSL::PKey | nil
|
375
|
+
@handshake_extensions: ::Array[tls_extension]
|
376
|
+
@max_early_data: ::Integer | nil
|
377
|
+
@session_ticket: SessionTicket | nil
|
378
|
+
@server_name: ::String | nil
|
379
|
+
@verify_mode: ::Integer # OpenSSL::SSL::VERIFY_NONE or OpenSSL::SSL::VERIFY_PEER
|
380
|
+
@alpn_cb: alpn_handler | nil
|
381
|
+
@get_session_ticket_cb: session_ticket_fetcher | nil
|
382
|
+
@new_session_ticket_cb: session_ticket_handler | nil
|
383
|
+
@update_traffic_key_cb: ::Proc # TODO: How to define lambda that has four arguments?
|
384
|
+
@cipher_suites: ::Array[::Integer]
|
385
|
+
@legacy_compression_methods: [::Integer]
|
386
|
+
@psk_key_exchange_modes: [::Integer]
|
387
|
+
@signature_algorithms: ::Array[::Integer]
|
388
|
+
@supported_groups: ::Array[::Integer]
|
389
|
+
@supported_versions: ::Array[::Integer]
|
390
|
+
|
391
|
+
# state
|
392
|
+
@alpn_negotiated: ::String | nil
|
393
|
+
@early_data_accepted: bool
|
394
|
+
@key_schedule: KeySchedule | nil
|
395
|
+
@key_schedule_psk: ::Array[tls_extension] | nil
|
396
|
+
@received_extensions: ::Array[tls_extension] | nil
|
397
|
+
@key_schedule_proxy: KeyScheduleProxy | nil
|
398
|
+
@new_session_ticket: NewSessionTicket | nil
|
399
|
+
@peer_certificate: ::OpenSSL::X509::Certificate | nil
|
400
|
+
@peer_certificate_chain: ::Array[::OpenSSL::X509::Certificate]
|
401
|
+
@receive_buffer: ::String
|
402
|
+
@session_resumed: bool
|
403
|
+
@enc_key: ::String | nil
|
404
|
+
@dec_key: ::String | nil
|
405
|
+
@logger: untyped | nil # TODO: logger
|
406
|
+
@ec_key: ::OpenSSL::PKey::EC | nil
|
407
|
+
@ec_private_key: ::OpenSSL::BN
|
408
|
+
@x25519_private_key: untyped
|
409
|
+
@x448_private_key: untyped
|
410
|
+
@client_random: ::String | nil
|
411
|
+
@legacy_session_id: ::String | nil
|
412
|
+
@state: ::Integer
|
413
|
+
|
414
|
+
def initialize: (
|
415
|
+
is_client: bool,
|
416
|
+
?alpn_protocols: ::Array[::String],
|
417
|
+
?cadata: (::String | nil),
|
418
|
+
?cafile: (::String | nil),
|
419
|
+
?capath: (::String | nil),
|
420
|
+
?cipher_suites: (::Array[::Integer] | nil),
|
421
|
+
?logger: (untyped | nil), # TODO: logger
|
422
|
+
?max_early_data: (::Integer | nil),
|
423
|
+
?server_name: (::String | nil),
|
424
|
+
?verify_mode: (::Integer | nil),
|
425
|
+
) -> void
|
426
|
+
|
427
|
+
def handle_message: (input_data: ::String, output_buf: ::Hash[::Integer, Buffer]) -> void
|
428
|
+
def build_session_ticket: (new_session_ticket: NewSessionTicket, other_extensions: ::Array[tls_extension]) -> SessionTicket
|
429
|
+
def client_send_hello: (Buffer) -> void
|
430
|
+
def client_handle_hello: (input_buf: Buffer, output_buf: Buffer) -> void
|
431
|
+
def client_handle_encrypted_extensions: (Buffer) -> void
|
432
|
+
def client_handle_certificate: (Buffer) -> void
|
433
|
+
def client_handle_certificate_verify: (Buffer) -> void
|
434
|
+
def client_handle_finished: (input_buf: Buffer, output_buf: Buffer) -> void
|
435
|
+
def client_handle_new_session_ticket: (Buffer) -> void
|
436
|
+
def server_handle_hello: (input_buf: Buffer, initial_buf: Buffer, handshake_buf: Buffer, onertt_buf: Buffer) -> void
|
437
|
+
def server_handle_finished: (input_buf: Buffer, output_buf: Buffer) -> void
|
438
|
+
def setup_traffic_protection: (::Integer, ::Integer, ::String) -> void
|
439
|
+
def set_state: (::Integer) -> void
|
440
|
+
private def sign_with_params: (priv_key: ::OpenSSL::PKey::PKey|OpenSSL::PKey::RSA, signature_algorithm: ::Integer, verify_data: ::String) -> ::String
|
441
|
+
private def verify_with_params: (cert: ::OpenSSL::X509::Certificate, signature_algorithm: ::Integer, signature: ::String, verify_data: ::String) -> ::String
|
442
|
+
end
|
443
|
+
end
|
444
|
+
end
|
data/sig/raioquic.rbs
ADDED
metadata
ADDED
@@ -0,0 +1,121 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: raioquic
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Yusuke Nakamura
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-05-17 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: tttls1.3
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
description: Write a longer description or delete this line.
|
28
|
+
email:
|
29
|
+
- yusuke1994525@gmail.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- ".containerignore"
|
35
|
+
- ".rubocop.yml"
|
36
|
+
- CHANGELOG.md
|
37
|
+
- CODE_OF_CONDUCT.md
|
38
|
+
- Containerfile
|
39
|
+
- Gemfile
|
40
|
+
- Gemfile.lock
|
41
|
+
- LICENSE
|
42
|
+
- README.md
|
43
|
+
- Rakefile
|
44
|
+
- Steepfile
|
45
|
+
- example/curlcatcher.rb
|
46
|
+
- example/interoperability/README.md
|
47
|
+
- example/interoperability/aioquic/aioquic_client.py
|
48
|
+
- example/interoperability/aioquic/aioquic_server.py
|
49
|
+
- example/interoperability/key.pem
|
50
|
+
- example/interoperability/localhost-unasuke-dev.crt
|
51
|
+
- example/interoperability/quic-go/sample_server.go
|
52
|
+
- example/interoperability/raioquic_client.rb
|
53
|
+
- example/interoperability/raioquic_server.rb
|
54
|
+
- example/parse_curl_example.rb
|
55
|
+
- lib/raioquic.rb
|
56
|
+
- lib/raioquic/buffer.rb
|
57
|
+
- lib/raioquic/core_ext.rb
|
58
|
+
- lib/raioquic/crypto.rb
|
59
|
+
- lib/raioquic/crypto/README.md
|
60
|
+
- lib/raioquic/crypto/aesgcm.rb
|
61
|
+
- lib/raioquic/crypto/backend.rb
|
62
|
+
- lib/raioquic/crypto/backend/aead.rb
|
63
|
+
- lib/raioquic/quic.rb
|
64
|
+
- lib/raioquic/quic/configuration.rb
|
65
|
+
- lib/raioquic/quic/connection.rb
|
66
|
+
- lib/raioquic/quic/crypto.rb
|
67
|
+
- lib/raioquic/quic/event.rb
|
68
|
+
- lib/raioquic/quic/logger.rb
|
69
|
+
- lib/raioquic/quic/packet.rb
|
70
|
+
- lib/raioquic/quic/packet_builder.rb
|
71
|
+
- lib/raioquic/quic/rangeset.rb
|
72
|
+
- lib/raioquic/quic/recovery.rb
|
73
|
+
- lib/raioquic/quic/stream.rb
|
74
|
+
- lib/raioquic/tls.rb
|
75
|
+
- lib/raioquic/version.rb
|
76
|
+
- misc/export_x25519.py
|
77
|
+
- misc/gen_rfc8448_keypair.rb
|
78
|
+
- raioquic.gemspec
|
79
|
+
- sig/raioquic.rbs
|
80
|
+
- sig/raioquic/buffer.rbs
|
81
|
+
- sig/raioquic/core_ext.rbs
|
82
|
+
- sig/raioquic/crypto/aesgcm.rbs
|
83
|
+
- sig/raioquic/crypto/backend/aead.rbs
|
84
|
+
- sig/raioquic/quic/configuration.rbs
|
85
|
+
- sig/raioquic/quic/connection.rbs
|
86
|
+
- sig/raioquic/quic/crypto.rbs
|
87
|
+
- sig/raioquic/quic/event.rbs
|
88
|
+
- sig/raioquic/quic/logger.rbs
|
89
|
+
- sig/raioquic/quic/packet.rbs
|
90
|
+
- sig/raioquic/quic/packet_builder.rbs
|
91
|
+
- sig/raioquic/quic/rangeset.rbs
|
92
|
+
- sig/raioquic/quic/recovery.rbs
|
93
|
+
- sig/raioquic/quic/stream.rbs
|
94
|
+
- sig/raioquic/tls.rbs
|
95
|
+
homepage: https://example.com
|
96
|
+
licenses: []
|
97
|
+
metadata:
|
98
|
+
homepage_uri: https://example.com
|
99
|
+
source_code_uri: https://example.com
|
100
|
+
changelog_uri: https://example.com
|
101
|
+
rubygems_mfa_required: 'true'
|
102
|
+
post_install_message:
|
103
|
+
rdoc_options: []
|
104
|
+
require_paths:
|
105
|
+
- lib
|
106
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 3.0.0
|
111
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
112
|
+
requirements:
|
113
|
+
- - ">="
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: '0'
|
116
|
+
requirements: []
|
117
|
+
rubygems_version: 3.4.6
|
118
|
+
signing_key:
|
119
|
+
specification_version: 4
|
120
|
+
summary: Write a short summary, because RubyGems requires one.
|
121
|
+
test_files: []
|