tttls1.3 0.3.5 → 0.3.7

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.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/Gemfile +2 -2
  4. data/README.md +1 -1
  5. data/lib/tttls1.3/client.rb +11 -5
  6. data/lib/tttls1.3/ech.rb +31 -90
  7. data/lib/tttls1.3/message/alert.rb +1 -0
  8. data/lib/tttls1.3/sslkeylogfile.rb +22 -0
  9. data/lib/tttls1.3/version.rb +1 -1
  10. data/lib/tttls1.3.rb +1 -0
  11. data/tttls1.3.gemspec +7 -4
  12. metadata +11 -121
  13. data/.github/workflows/ci.yml +0 -39
  14. data/.gitignore +0 -17
  15. data/spec/aead_spec.rb +0 -95
  16. data/spec/alert_spec.rb +0 -54
  17. data/spec/alpn_spec.rb +0 -55
  18. data/spec/application_data_spec.rb +0 -26
  19. data/spec/certificate_spec.rb +0 -82
  20. data/spec/certificate_verify_spec.rb +0 -51
  21. data/spec/change_cipher_spec_spec.rb +0 -26
  22. data/spec/cipher_suites_spec.rb +0 -39
  23. data/spec/client_hello_spec.rb +0 -105
  24. data/spec/client_spec.rb +0 -274
  25. data/spec/compress_certificate_spec.rb +0 -54
  26. data/spec/cookie_spec.rb +0 -98
  27. data/spec/early_data_indication_spec.rb +0 -64
  28. data/spec/ech_outer_extensions_spec.rb +0 -42
  29. data/spec/ech_spec.rb +0 -122
  30. data/spec/encrypted_extensions_spec.rb +0 -94
  31. data/spec/end_of_early_data_spec.rb +0 -28
  32. data/spec/endpoint_spec.rb +0 -167
  33. data/spec/error_spec.rb +0 -18
  34. data/spec/extensions_spec.rb +0 -250
  35. data/spec/finished_spec.rb +0 -55
  36. data/spec/fixtures/rsa_ca.crt +0 -18
  37. data/spec/fixtures/rsa_ca.key +0 -27
  38. data/spec/fixtures/rsa_rsa.crt +0 -18
  39. data/spec/fixtures/rsa_rsa.key +0 -27
  40. data/spec/fixtures/rsa_rsa_ocsp.crt +0 -18
  41. data/spec/fixtures/rsa_rsa_ocsp.key +0 -27
  42. data/spec/fixtures/rsa_rsassaPss.crt +0 -20
  43. data/spec/fixtures/rsa_rsassaPss.key +0 -27
  44. data/spec/fixtures/rsa_secp256r1.crt +0 -14
  45. data/spec/fixtures/rsa_secp256r1.key +0 -5
  46. data/spec/fixtures/rsa_secp384r1.crt +0 -14
  47. data/spec/fixtures/rsa_secp384r1.key +0 -6
  48. data/spec/fixtures/rsa_secp521r1.crt +0 -15
  49. data/spec/fixtures/rsa_secp521r1.key +0 -7
  50. data/spec/key_schedule_spec.rb +0 -221
  51. data/spec/key_share_spec.rb +0 -199
  52. data/spec/new_session_ticket_spec.rb +0 -80
  53. data/spec/pre_shared_key_spec.rb +0 -167
  54. data/spec/psk_key_exchange_modes_spec.rb +0 -45
  55. data/spec/record_size_limit_spec.rb +0 -61
  56. data/spec/record_spec.rb +0 -105
  57. data/spec/server_hello_spec.rb +0 -200
  58. data/spec/server_name_spec.rb +0 -110
  59. data/spec/server_spec.rb +0 -232
  60. data/spec/signature_algorithms_cert_spec.rb +0 -77
  61. data/spec/signature_algorithms_spec.rb +0 -104
  62. data/spec/spec_helper.rb +0 -990
  63. data/spec/status_request_spec.rb +0 -140
  64. data/spec/supported_groups_spec.rb +0 -79
  65. data/spec/supported_versions_spec.rb +0 -136
  66. data/spec/transcript_spec.rb +0 -83
  67. data/spec/unknown_extension_spec.rb +0 -90
  68. data/spec/utils_spec.rb +0 -235
data/spec/client_spec.rb DELETED
@@ -1,274 +0,0 @@
1
- # encoding: ascii-8bit
2
- # frozen_string_literal: true
3
-
4
- require_relative 'spec_helper'
5
- using Refinements
6
-
7
- RSpec.describe Client do
8
- context 'client' do
9
- let(:record) do
10
- mock_socket = SimpleStream.new
11
- client = Client.new(mock_socket, 'localhost')
12
- extensions, _priv_keys = client.send(:gen_ch_extensions)
13
- client.send(:send_client_hello, extensions)
14
- Record.deserialize(mock_socket.read, Cryptograph::Passer.new).first
15
- end
16
-
17
- it 'should send default ClientHello' do
18
- expect(record.type).to eq ContentType::HANDSHAKE
19
-
20
- message = record.messages.first
21
- expect(message.msg_type).to eq HandshakeType::CLIENT_HELLO
22
- expect(message.legacy_version).to eq ProtocolVersion::TLS_1_2
23
- expect(message.cipher_suites)
24
- .to eq [CipherSuite::TLS_AES_256_GCM_SHA384,
25
- CipherSuite::TLS_CHACHA20_POLY1305_SHA256,
26
- CipherSuite::TLS_AES_128_GCM_SHA256]
27
- expect(message.legacy_compression_methods).to eq ["\x00"]
28
- end
29
- end
30
-
31
- context 'client' do
32
- let(:message) do
33
- msg_len = TESTBINARY_SERVER_HELLO.length
34
- mock_socket = SimpleStream.new
35
- mock_socket.write(ContentType::HANDSHAKE \
36
- + ProtocolVersion::TLS_1_2 \
37
- + msg_len.to_uint16 \
38
- + TESTBINARY_SERVER_HELLO)
39
- client = Client.new(mock_socket, 'localhost')
40
- client.send(:recv_server_hello).first
41
- end
42
-
43
- it 'should receive ServerHello' do
44
- expect(message.msg_type).to eq HandshakeType::SERVER_HELLO
45
- expect(message.legacy_version).to eq ProtocolVersion::TLS_1_2
46
- expect(message.cipher_suite).to eq CipherSuite::TLS_AES_128_GCM_SHA256
47
- expect(message.legacy_compression_method).to eq "\x00"
48
- end
49
- end
50
-
51
- context 'client' do
52
- let(:client) do
53
- mock_socket = SimpleStream.new
54
- mock_socket.write(TESTBINARY_SERVER_PARAMETERS_RECORD)
55
- Client.new(mock_socket, 'localhost')
56
- end
57
-
58
- let(:cipher) do
59
- Cryptograph::Aead.new(
60
- cipher_suite: CipherSuite::TLS_AES_128_GCM_SHA256,
61
- write_key: TESTBINARY_SERVER_PARAMETERS_WRITE_KEY,
62
- write_iv: TESTBINARY_SERVER_PARAMETERS_WRITE_IV,
63
- sequence_number: SequenceNumber.new
64
- )
65
- end
66
-
67
- it 'should receive EncryptedExtensions' do
68
- message, = client.send(:recv_encrypted_extensions, cipher)
69
- expect(message.msg_type).to eq HandshakeType::ENCRYPTED_EXTENSIONS
70
- end
71
-
72
- it 'should receive Certificate' do
73
- client.send(:recv_encrypted_extensions, cipher) # to skip
74
- message, = client.send(:recv_certificate, cipher)
75
- expect(message.msg_type).to eq HandshakeType::CERTIFICATE
76
- end
77
-
78
- it 'should receive CertificateVerify' do
79
- client.send(:recv_encrypted_extensions, cipher) # to skip
80
- client.send(:recv_certificate, cipher) # to skip
81
- message, = client.send(:recv_certificate_verify, cipher)
82
- expect(message.msg_type).to eq HandshakeType::CERTIFICATE_VERIFY
83
- end
84
-
85
- it 'should receive Finished' do
86
- client.send(:recv_encrypted_extensions, cipher) # to skip
87
- client.send(:recv_certificate, cipher) # to skip
88
- client.send(:recv_certificate_verify, cipher) # to skip
89
- message, = client.send(:recv_finished, cipher)
90
- expect(message.msg_type).to eq HandshakeType::FINISHED
91
- end
92
- end
93
-
94
- context 'client' do
95
- let(:cipher_suite) do
96
- CipherSuite::TLS_AES_128_GCM_SHA256
97
- end
98
-
99
- let(:transcript) do
100
- ch = ClientHello.deserialize(TESTBINARY_CLIENT_HELLO)
101
- sh = ServerHello.deserialize(TESTBINARY_SERVER_HELLO)
102
- ee = EncryptedExtensions.deserialize(TESTBINARY_ENCRYPTED_EXTENSIONS)
103
- ct = Certificate.deserialize(TESTBINARY_CERTIFICATE)
104
- cv = CertificateVerify.deserialize(TESTBINARY_CERTIFICATE_VERIFY)
105
- sf = Finished.deserialize(TESTBINARY_SERVER_FINISHED)
106
- transcript = Transcript.new
107
- transcript.merge!(
108
- CH => [ch, TESTBINARY_CLIENT_HELLO],
109
- SH => [sh, TESTBINARY_SERVER_HELLO],
110
- EE => [ee, TESTBINARY_ENCRYPTED_EXTENSIONS],
111
- CT => [ct, TESTBINARY_CERTIFICATE],
112
- CV => [cv, TESTBINARY_CERTIFICATE_VERIFY],
113
- SF => [sf, TESTBINARY_SERVER_FINISHED]
114
- )
115
- transcript
116
- end
117
-
118
- let(:finished_key) do
119
- key_schedule = KeySchedule.new(
120
- shared_secret: TESTBINARY_SHARED_SECRET,
121
- cipher_suite:,
122
- transcript:
123
- )
124
- key_schedule.client_finished_key
125
- end
126
-
127
- let(:record) do
128
- mock_socket = SimpleStream.new
129
- client = Client.new(mock_socket, 'localhost')
130
- digest = CipherSuite.digest(cipher_suite)
131
- hash = transcript.hash(digest, EOED)
132
- signature = Endpoint.sign_finished(
133
- digest:,
134
- finished_key:,
135
- hash:
136
- )
137
- hs_wcipher = Cryptograph::Aead.new(
138
- cipher_suite:,
139
- write_key: TESTBINARY_CLIENT_FINISHED_WRITE_KEY,
140
- write_iv: TESTBINARY_CLIENT_FINISHED_WRITE_IV,
141
- sequence_number: SequenceNumber.new
142
- )
143
- client.send(:send_finished, signature, hs_wcipher)
144
- hs_rcipher = Cryptograph::Aead.new(
145
- cipher_suite:,
146
- write_key: TESTBINARY_CLIENT_FINISHED_WRITE_KEY,
147
- write_iv: TESTBINARY_CLIENT_FINISHED_WRITE_IV,
148
- sequence_number: SequenceNumber.new
149
- )
150
- Record.deserialize(mock_socket.read, hs_rcipher).first
151
- end
152
-
153
- it 'should send Finished' do
154
- expect(record.type).to eq ContentType::APPLICATION_DATA
155
-
156
- message = record.messages.first
157
- expect(message.msg_type).to eq HandshakeType::FINISHED
158
- expect(message.serialize).to eq TESTBINARY_CLIENT_FINISHED
159
- end
160
- end
161
-
162
- context 'client' do
163
- let(:cipher_suite) do
164
- CipherSuite::TLS_AES_128_GCM_SHA256
165
- end
166
-
167
- let(:ct) do
168
- Certificate.deserialize(TESTBINARY_CERTIFICATE)
169
- end
170
-
171
- let(:cv) do
172
- CertificateVerify.deserialize(TESTBINARY_CERTIFICATE_VERIFY)
173
- end
174
-
175
- let(:sf) do
176
- Finished.deserialize(TESTBINARY_SERVER_FINISHED)
177
- end
178
-
179
- let(:transcript) do
180
- ch = ClientHello.deserialize(TESTBINARY_CLIENT_HELLO)
181
- sh = ServerHello.deserialize(TESTBINARY_SERVER_HELLO)
182
- ee = EncryptedExtensions.deserialize(TESTBINARY_ENCRYPTED_EXTENSIONS)
183
- transcript = Transcript.new
184
- transcript.merge!(
185
- CH => [ch, TESTBINARY_CLIENT_HELLO],
186
- SH => [sh, TESTBINARY_SERVER_HELLO],
187
- EE => [ee, TESTBINARY_ENCRYPTED_EXTENSIONS],
188
- CT => [ct, TESTBINARY_CERTIFICATE],
189
- CV => [cv, TESTBINARY_CERTIFICATE_VERIFY],
190
- SF => [sf, TESTBINARY_SERVER_FINISHED]
191
- )
192
- end
193
-
194
- let(:key_schedule) do
195
- KeySchedule.new(
196
- shared_secret: TESTBINARY_SHARED_SECRET,
197
- cipher_suite:,
198
- transcript:
199
- )
200
- end
201
-
202
- let(:client) do
203
- Client.new(nil, 'localhost')
204
- end
205
-
206
- let(:cf) do
207
- Finished.deserialize(TESTBINARY_CLIENT_FINISHED)
208
- end
209
-
210
- it 'should verify server CertificateVerify' do
211
- hash = transcript.hash(CipherSuite.digest(cipher_suite), CT)
212
- expect(client.send(:verified_certificate_verify?, ct, cv, hash))
213
- .to be true
214
- end
215
-
216
- it 'should verify server Finished' do
217
- digest = CipherSuite.digest(cipher_suite)
218
- hash = transcript.hash(digest, CV)
219
- expect(Endpoint.verified_finished?(
220
- finished: sf,
221
- digest:,
222
- finished_key: key_schedule.server_finished_key,
223
- hash:
224
- )).to be true
225
- end
226
-
227
- it 'should sign client Finished' do
228
- digest = CipherSuite.digest(cipher_suite)
229
- hash = transcript.hash(digest, EOED)
230
- expect(Endpoint.sign_finished(
231
- digest:,
232
- finished_key: key_schedule.client_finished_key,
233
- hash:
234
- )).to eq cf.verify_data
235
- end
236
- end
237
-
238
- context 'client, received Certificate signed by private CA,' do
239
- let(:certificate) do
240
- server_crt = OpenSSL::X509::Certificate.new(
241
- File.read(__dir__ + '/fixtures/rsa_rsa.crt')
242
- )
243
- Certificate.new(certificate_list: [CertificateEntry.new(server_crt)])
244
- end
245
-
246
- it 'should not certify certificate' do
247
- expect(Endpoint.trusted_certificate?(certificate.certificate_list))
248
- .to be false
249
- end
250
-
251
- it 'should certify certificate, received path to private ca.crt' do
252
- expect(Endpoint.trusted_certificate?(
253
- certificate.certificate_list,
254
- __dir__ + '/fixtures/rsa_ca.crt'
255
- )).to be true
256
- end
257
- end
258
-
259
- context 'client using PSK' do
260
- let(:client) do
261
- Client.new(nil, 'localhost')
262
- end
263
-
264
- let(:ticket_nonce) do
265
- nst = NewSessionTicket.deserialize(TESTBINARY_NEW_SESSION_TICKET)
266
- nst.ticket_nonce
267
- end
268
-
269
- it 'should generate PSK from NewSessionTicket of previous handshake' do
270
- expect(client.send(:gen_psk_from_nst, TESTBINARY_RES_MASTER, ticket_nonce,
271
- 'SHA256')).to eq TESTBINARY_0_RTT_PSK
272
- end
273
- end
274
- end
@@ -1,54 +0,0 @@
1
- # encoding: ascii-8bit
2
- # frozen_string_literal: true
3
-
4
- require_relative 'spec_helper'
5
- using Refinements
6
-
7
- RSpec.describe Alpn do
8
- context 'valid compress_certificate' do
9
- let(:algorithms) do
10
- [CertificateCompressionAlgorithm::ZLIB]
11
- end
12
-
13
- let(:extension) do
14
- CompressCertificate.new(algorithms)
15
- end
16
-
17
- it 'should be generated' do
18
- expect(extension.extension_type)
19
- .to eq ExtensionType::COMPRESS_CERTIFICATE
20
- expect(extension.algorithms).to eq algorithms
21
- end
22
-
23
- it 'should be serialized' do
24
- expect(extension.serialize)
25
- .to eq ExtensionType::COMPRESS_CERTIFICATE \
26
- + 3.to_uint16 \
27
- + 2.to_uint8 \
28
- + "\x00\x01"
29
- end
30
- end
31
-
32
- context 'invalid compress_certificate, empty,' do
33
- let(:extension) do
34
- CompressCertificate.new([])
35
- end
36
-
37
- it 'should not be generated' do
38
- expect { extension }.to raise_error(ErrorAlerts)
39
- end
40
- end
41
-
42
- context 'valid compress_certificate binary' do
43
- let(:extension) do
44
- CompressCertificate.deserialize(TESTBINARY_COMPRESS_CERTIFICATE)
45
- end
46
-
47
- it 'should generate valid object' do
48
- expect(extension.extension_type)
49
- .to eq ExtensionType::COMPRESS_CERTIFICATE
50
- expect(extension.algorithms)
51
- .to eq [CertificateCompressionAlgorithm::ZLIB]
52
- end
53
- end
54
- end
data/spec/cookie_spec.rb DELETED
@@ -1,98 +0,0 @@
1
- # encoding: ascii-8bit
2
- # frozen_string_literal: true
3
-
4
- require_relative 'spec_helper'
5
- using Refinements
6
-
7
- RSpec.describe Cookie do
8
- context 'valid cookie' do
9
- let(:cookie) do
10
- OpenSSL::Random.random_bytes(2**16 - 3)
11
- end
12
-
13
- let(:extension) do
14
- Cookie.new(cookie)
15
- end
16
-
17
- it 'should be generated' do
18
- expect(extension.extension_type).to eq ExtensionType::COOKIE
19
- expect(extension.cookie).to eq cookie
20
- end
21
-
22
- it 'should be serialized' do
23
- expect(extension.serialize).to eq ExtensionType::COOKIE \
24
- + (2**16 - 1).to_uint16 \
25
- + (2**16 - 3).to_uint16 \
26
- + cookie
27
- end
28
- end
29
-
30
- context 'ignored cookie, empty,' do
31
- let(:extension) do
32
- Cookie.new('')
33
- end
34
-
35
- it 'should be generated' do
36
- expect(extension.extension_type).to eq ExtensionType::COOKIE
37
- expect(extension.cookie).to eq ''
38
- end
39
- end
40
-
41
- context 'ignored cookie, nil,' do
42
- let(:extension) do
43
- Cookie.new(nil)
44
- end
45
-
46
- it 'should not be generated' do
47
- expect(extension.extension_type).to eq ExtensionType::COOKIE
48
- expect(extension.cookie).to eq ''
49
- end
50
- end
51
-
52
- context 'invalid cookie, too long,' do
53
- let(:extension) do
54
- Cookie.new('a' * (2**16 - 2))
55
- end
56
-
57
- it 'should not be generated' do
58
- expect { extension }.to raise_error(ErrorAlerts)
59
- end
60
- end
61
-
62
- context 'valid cookie binary' do
63
- let(:extension) do
64
- Cookie.deserialize(TESTBINARY_COOKIE)
65
- end
66
-
67
- it 'should generate object' do
68
- expect(extension.extension_type).to eq ExtensionType::COOKIE
69
- expect(extension.cookie).to eq TESTBINARY_COOKIE[2..]
70
- end
71
-
72
- it 'should generate serializable object' do
73
- expect(extension.serialize).to eq ExtensionType::COOKIE \
74
- + TESTBINARY_COOKIE.prefix_uint16_length
75
- end
76
- end
77
-
78
- context 'cookie binary, empty,' do
79
- let(:extension) do
80
- Cookie.deserialize("\x00\x00")
81
- end
82
-
83
- it 'should generat object' do
84
- expect(extension.extension_type).to eq ExtensionType::COOKIE
85
- expect(extension.cookie).to eq ''
86
- end
87
- end
88
-
89
- context 'invalid cookie binary, malformed binary,' do
90
- let(:extension) do
91
- Cookie.deserialize(TESTBINARY_COOKIE[0...-1])
92
- end
93
-
94
- it 'should return nil' do
95
- expect(extension).to be nil
96
- end
97
- end
98
- end
@@ -1,64 +0,0 @@
1
- # encoding: ascii-8bit
2
- # frozen_string_literal: true
3
-
4
- require_relative 'spec_helper'
5
- using Refinements
6
-
7
- RSpec.describe EarlyDataIndication do
8
- context 'valid early_data_indication, NewSessionTicket,' do
9
- let(:extension) do
10
- EarlyDataIndication.new(2**32 - 1)
11
- end
12
-
13
- it 'should be generated' do
14
- expect(extension.extension_type).to eq ExtensionType::EARLY_DATA
15
- expect(extension.max_early_data_size).to eq 2**32 - 1
16
- end
17
-
18
- it 'should be serialized' do
19
- expect(extension.serialize).to eq ExtensionType::EARLY_DATA \
20
- + 4.to_uint16 \
21
- + (2**32 - 1).to_uint32
22
- end
23
- end
24
-
25
- context 'valid early_data_indication, ClientHello or EncryptedExtensions,' do
26
- let(:extension) do
27
- EarlyDataIndication.new(nil)
28
- end
29
-
30
- it 'should be generated' do
31
- expect(extension.extension_type).to eq ExtensionType::EARLY_DATA
32
- expect(extension.max_early_data_size).to be nil
33
- end
34
-
35
- it 'should be serialized' do
36
- expect(extension.serialize).to eq ExtensionType::EARLY_DATA \
37
- + 0.to_uint16
38
- end
39
- end
40
-
41
- context 'valid early_data_indication binary, NewSessionTicket,' do
42
- let(:extension) do
43
- EarlyDataIndication.deserialize(TESTBINARY_EARLY_DATA_INDICATION_NST,
44
- HandshakeType::NEW_SESSION_TICKET)
45
- end
46
-
47
- it 'should generate valid object' do
48
- expect(extension.extension_type).to eq ExtensionType::EARLY_DATA
49
- expect(extension.max_early_data_size).to eq 1024
50
- end
51
- end
52
-
53
- context 'valid early_data_indication binary, ClientHello,' do
54
- let(:extension) do
55
- EarlyDataIndication.deserialize(TESTBINARY_EARLY_DATA_INDICATION_CH,
56
- HandshakeType::CLIENT_HELLO)
57
- end
58
-
59
- it 'should generate valid object' do
60
- expect(extension.extension_type).to eq ExtensionType::EARLY_DATA
61
- expect(extension.max_early_data_size).to be nil
62
- end
63
- end
64
- end
@@ -1,42 +0,0 @@
1
- # encoding: ascii-8bit
2
- # frozen_string_literal: true
3
-
4
- require_relative 'spec_helper'
5
- using Refinements
6
-
7
- RSpec.describe ECHOuterExtensions do
8
- context 'valid ech_outer_extensions, [key_share]' do
9
- let(:extension) do
10
- ECHOuterExtensions.new([ExtensionType::KEY_SHARE])
11
- end
12
-
13
- it 'should be generated' do
14
- expect(extension.extension_type).to eq ExtensionType::ECH_OUTER_EXTENSIONS
15
- expect(extension.outer_extensions).to eq [ExtensionType::KEY_SHARE]
16
- end
17
-
18
- it 'should be serialized' do
19
- expect(extension.serialize).to eq ExtensionType::ECH_OUTER_EXTENSIONS \
20
- + 3.to_uint16 \
21
- + 2.to_uint8 \
22
- + ExtensionType::KEY_SHARE
23
- end
24
- end
25
-
26
- context 'valid ech_outer_extensions binary' do
27
- let(:extension) do
28
- ECHOuterExtensions.deserialize(TESTBINARY_ECH_OUTER_EXTENSIONS)
29
- end
30
-
31
- it 'should generate valid object' do
32
- expect(extension.extension_type).to be ExtensionType::ECH_OUTER_EXTENSIONS
33
- expect(extension.outer_extensions).to eq [ExtensionType::KEY_SHARE]
34
- end
35
-
36
- it 'should generate serializable object' do
37
- expect(extension.serialize)
38
- .to eq ExtensionType::ECH_OUTER_EXTENSIONS \
39
- + TESTBINARY_ECH_OUTER_EXTENSIONS.prefix_uint16_length
40
- end
41
- end
42
- end
data/spec/ech_spec.rb DELETED
@@ -1,122 +0,0 @@
1
- # encoding: ascii-8bit
2
- # frozen_string_literal: true
3
-
4
- require_relative 'spec_helper'
5
- using Refinements
6
-
7
- RSpec.describe ECHClientHello do
8
- context 'valid ECHClientHello outer binary' do
9
- let(:extension) do
10
- ECHClientHello.deserialize(TESTBINARY_ECH_OUTER)
11
- end
12
-
13
- it 'should generate valid object' do
14
- expect(extension.extension_type)
15
- .to eq ExtensionType::ENCRYPTED_CLIENT_HELLO
16
- expect(extension.type).to eq ECHClientHelloType::OUTER
17
- expect(extension.cipher_suite.kdf_id.uint16).to eq 1
18
- expect(extension.cipher_suite.aead_id.uint16).to eq 1
19
- expect(extension.config_id).to eq 32
20
- expect(extension.enc.length).to eq 32
21
- expect(extension.payload.length).to eq 239
22
- end
23
-
24
- it 'should be serialized' do
25
- expect(extension.serialize)
26
- .to eq ExtensionType::ENCRYPTED_CLIENT_HELLO \
27
- + 281.to_uint16 \
28
- + ECHClientHelloType::OUTER \
29
- + 1.to_uint16 \
30
- + 1.to_uint16 \
31
- + 32.to_uint8 \
32
- + extension.enc.prefix_uint16_length \
33
- + extension.payload.prefix_uint16_length
34
- end
35
- end
36
-
37
- context 'valid ECHClientHello inner binary' do
38
- let(:extension) do
39
- ECHClientHello.deserialize(TESTBINARY_ECH_INNER)
40
- end
41
-
42
- it 'should generate valid object' do
43
- expect(extension.extension_type)
44
- .to eq ExtensionType::ENCRYPTED_CLIENT_HELLO
45
- expect(extension.type).to eq ECHClientHelloType::INNER
46
- end
47
-
48
- it 'should be serialized' do
49
- expect(extension.serialize)
50
- .to eq ExtensionType::ENCRYPTED_CLIENT_HELLO \
51
- + 1.to_uint16 \
52
- + ECHClientHelloType::INNER \
53
- end
54
- end
55
-
56
- context 'valid ECHEncryptedExtensions binary' do
57
- let(:extension) do
58
- ECHEncryptedExtensions.deserialize(TESTBINARY_ECH_EE)
59
- end
60
-
61
- it 'should generate valid object' do
62
- expect(extension.extension_type)
63
- .to eq ExtensionType::ENCRYPTED_CLIENT_HELLO
64
- expect(extension.retry_configs.is_a?(Array)).to be_truthy
65
- expect(extension.retry_configs.length).to eq 1
66
- expect(extension.retry_configs.first.is_a?(ECHConfig)).to be_truthy
67
- end
68
- end
69
-
70
- context 'valid ECHHelloRetryRequest binary' do
71
- let(:extension) do
72
- ECHHelloRetryRequest.deserialize(TESTBINARY_ECH_HRR)
73
- end
74
-
75
- it 'should generate valid object' do
76
- expect(extension.extension_type)
77
- .to eq ExtensionType::ENCRYPTED_CLIENT_HELLO
78
- expect(extension.confirmation).to eq "\x00" * 8
79
- end
80
- end
81
- end
82
-
83
- RSpec.describe Ech do
84
- context 'EncodedClientHelloInner length' do
85
- let(:server_name) do
86
- 'localhost'
87
- end
88
-
89
- let(:client) do
90
- Client.new(nil, server_name)
91
- end
92
-
93
- let(:maximum_name_length) do
94
- 0
95
- end
96
-
97
- let(:encoded) do
98
- extensions, = client.send(:gen_ch_extensions)
99
- inner_ech = Message::Extension::ECHClientHello.new_inner
100
- Message::ClientHello.new(
101
- legacy_session_id: '',
102
- cipher_suites: CipherSuites.new(DEFAULT_CH_CIPHER_SUITES),
103
- extensions: extensions.merge(
104
- Message::ExtensionType::ENCRYPTED_CLIENT_HELLO => inner_ech
105
- )
106
- )
107
- end
108
-
109
- let(:padding_encoded_ch_inner) do
110
- Ech.padding_encoded_ch_inner(
111
- encoded.serialize[4..],
112
- server_name.length,
113
- maximum_name_length
114
- )
115
- end
116
-
117
- it 'should be equal placeholder_encoded_ch_inner_len' do
118
- expect(Ech.placeholder_encoded_ch_inner_len)
119
- .to eq padding_encoded_ch_inner.length
120
- end
121
- end
122
- end