tttls1.3 0.3.3 → 0.3.5

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 (75) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +4 -2
  3. data/.rubocop.yml +16 -11
  4. data/.ruby-version +1 -1
  5. data/Gemfile +5 -4
  6. data/README.md +4 -4
  7. data/Rakefile +3 -3
  8. data/example/helper.rb +14 -5
  9. data/example/https_client_using_0rtt.rb +1 -1
  10. data/example/https_client_using_ech.rb +1 -1
  11. data/example/https_client_using_hrr_and_ech.rb +1 -1
  12. data/example/https_client_using_hrr_and_ticket.rb +1 -1
  13. data/example/https_client_using_status_request.rb +1 -1
  14. data/example/https_client_using_ticket.rb +1 -1
  15. data/example/https_client_using_ticket_and_ech.rb +3 -3
  16. data/example/https_server.rb +1 -1
  17. data/interop/client_spec.rb +57 -31
  18. data/interop/server_spec.rb +74 -46
  19. data/interop/spec_helper.rb +2 -2
  20. data/lib/tttls1.3/cipher_suites.rb +21 -16
  21. data/lib/tttls1.3/client.rb +89 -78
  22. data/lib/tttls1.3/connection.rb +6 -15
  23. data/lib/tttls1.3/cryptograph/aead.rb +26 -21
  24. data/lib/tttls1.3/ech.rb +13 -17
  25. data/lib/tttls1.3/endpoint.rb +4 -25
  26. data/lib/tttls1.3/key_schedule.rb +2 -2
  27. data/lib/tttls1.3/logging.rb +1 -1
  28. data/lib/tttls1.3/message/alert.rb +3 -4
  29. data/lib/tttls1.3/message/application_data.rb +1 -1
  30. data/lib/tttls1.3/message/certificate.rb +4 -7
  31. data/lib/tttls1.3/message/certificate_verify.rb +3 -5
  32. data/lib/tttls1.3/message/client_hello.rb +17 -15
  33. data/lib/tttls1.3/message/compressed_certificate.rb +3 -9
  34. data/lib/tttls1.3/message/encrypted_extensions.rb +1 -2
  35. data/lib/tttls1.3/message/extension/alpn.rb +2 -7
  36. data/lib/tttls1.3/message/extension/compress_certificate.rb +1 -2
  37. data/lib/tttls1.3/message/extension/cookie.rb +1 -2
  38. data/lib/tttls1.3/message/extension/early_data_indication.rb +1 -2
  39. data/lib/tttls1.3/message/extension/ech.rb +9 -19
  40. data/lib/tttls1.3/message/extension/ech_outer_extensions.rb +1 -3
  41. data/lib/tttls1.3/message/extension/key_share.rb +20 -49
  42. data/lib/tttls1.3/message/extension/pre_shared_key.rb +8 -20
  43. data/lib/tttls1.3/message/extension/psk_key_exchange_modes.rb +1 -2
  44. data/lib/tttls1.3/message/extension/record_size_limit.rb +1 -2
  45. data/lib/tttls1.3/message/extension/server_name.rb +1 -3
  46. data/lib/tttls1.3/message/extension/signature_algorithms.rb +1 -2
  47. data/lib/tttls1.3/message/extension/signature_algorithms_cert.rb +1 -1
  48. data/lib/tttls1.3/message/extension/status_request.rb +4 -12
  49. data/lib/tttls1.3/message/extension/supported_groups.rb +1 -4
  50. data/lib/tttls1.3/message/extension/supported_versions.rb +2 -8
  51. data/lib/tttls1.3/message/extension/unknown_extension.rb +2 -4
  52. data/lib/tttls1.3/message/extensions.rb +1 -9
  53. data/lib/tttls1.3/message/finished.rb +1 -2
  54. data/lib/tttls1.3/message/new_session_ticket.rb +6 -12
  55. data/lib/tttls1.3/message/record.rb +10 -25
  56. data/lib/tttls1.3/message/server_hello.rb +10 -21
  57. data/lib/tttls1.3/named_group.rb +13 -9
  58. data/lib/tttls1.3/server.rb +39 -35
  59. data/lib/tttls1.3/shared_secret.rb +118 -0
  60. data/lib/tttls1.3/utils.rb +0 -15
  61. data/lib/tttls1.3/version.rb +1 -1
  62. data/lib/tttls1.3.rb +1 -1
  63. data/spec/certificate_verify_spec.rb +1 -1
  64. data/spec/client_hello_spec.rb +22 -3
  65. data/spec/client_spec.rb +13 -13
  66. data/spec/endpoint_spec.rb +11 -11
  67. data/spec/key_schedule_spec.rb +4 -4
  68. data/spec/new_session_ticket_spec.rb +4 -4
  69. data/spec/pre_shared_key_spec.rb +8 -8
  70. data/spec/record_spec.rb +1 -1
  71. data/spec/server_hello_spec.rb +5 -5
  72. data/spec/server_spec.rb +8 -8
  73. data/tttls1.3.gemspec +2 -2
  74. metadata +7 -10
  75. data/example/https_client_using_grease_psk.rb +0 -58
@@ -72,9 +72,9 @@ RSpec.describe Endpoint do
72
72
  signature = cv.signature
73
73
 
74
74
  expect(Endpoint.verified_certificate_verify?(
75
- public_key: public_key,
76
- signature_scheme: signature_scheme,
77
- signature: signature,
75
+ public_key:,
76
+ signature_scheme:,
77
+ signature:,
78
78
  context: 'TLS 1.3, server CertificateVerify',
79
79
  hash: transcript.hash(digest, CT)
80
80
  )).to be true
@@ -104,15 +104,15 @@ RSpec.describe Endpoint do
104
104
  # used RSASSA-PSS signature_scheme, salt is a random sequence.
105
105
  # CertificateVerify.signature is random.
106
106
  signature = Endpoint.sign_certificate_verify(
107
- key: key,
108
- signature_scheme: signature_scheme,
107
+ key:,
108
+ signature_scheme:,
109
109
  context: 'TLS 1.3, server CertificateVerify',
110
110
  hash: transcript.hash(digest, CT)
111
111
  )
112
112
  expect(Endpoint.verified_certificate_verify?(
113
- public_key: public_key,
114
- signature_scheme: signature_scheme,
115
- signature: signature,
113
+ public_key:,
114
+ signature_scheme:,
115
+ signature:,
116
116
  context: 'TLS 1.3, server CertificateVerify',
117
117
  hash: transcript.hash(digest, CT)
118
118
  )).to be true
@@ -156,9 +156,9 @@ RSpec.describe Endpoint do
156
156
  signature = cv.signature
157
157
 
158
158
  expect(Endpoint.verified_certificate_verify?(
159
- public_key: public_key,
160
- signature_scheme: signature_scheme,
161
- signature: signature,
159
+ public_key:,
160
+ signature_scheme:,
161
+ signature:,
162
162
  context: 'TLS 1.3, server CertificateVerify',
163
163
  hash: transcript.hash(digest, CT)
164
164
  )).to be true
@@ -25,7 +25,7 @@ RSpec.describe KeySchedule do
25
25
  )
26
26
  KeySchedule.new(shared_secret: TESTBINARY_SHARED_SECRET,
27
27
  cipher_suite: CipherSuite::TLS_AES_128_GCM_SHA256,
28
- transcript: transcript)
28
+ transcript:)
29
29
  end
30
30
 
31
31
  it 'should generate secret' do
@@ -104,7 +104,7 @@ RSpec.describe KeySchedule do
104
104
  KeySchedule.new(psk: TESTBINARY_0_RTT_PSK,
105
105
  shared_secret: TESTBINARY_0_RTT_SHARED_SECRET,
106
106
  cipher_suite: CipherSuite::TLS_AES_128_GCM_SHA256,
107
- transcript: transcript)
107
+ transcript:)
108
108
  end
109
109
 
110
110
  it 'should generate server parameters write_key, iv' do
@@ -131,7 +131,7 @@ RSpec.describe KeySchedule do
131
131
  KeySchedule.new(psk: TESTBINARY_0_RTT_PSK,
132
132
  shared_secret: nil,
133
133
  cipher_suite: CipherSuite::TLS_AES_128_GCM_SHA256,
134
- transcript: transcript)
134
+ transcript:)
135
135
  end
136
136
 
137
137
  it 'should generate binder key for resumption PSKs' do
@@ -177,7 +177,7 @@ RSpec.describe KeySchedule do
177
177
  )
178
178
  KeySchedule.new(shared_secret: TESTBINARY_HRR_SHARED_SECRET,
179
179
  cipher_suite: CipherSuite::TLS_AES_128_GCM_SHA256,
180
- transcript: transcript)
180
+ transcript:)
181
181
  end
182
182
 
183
183
  it 'should generate server finished_key' do
@@ -23,10 +23,10 @@ RSpec.describe NewSessionTicket do
23
23
  end
24
24
 
25
25
  let(:message) do
26
- NewSessionTicket.new(ticket_lifetime: ticket_lifetime,
27
- ticket_age_add: ticket_age_add,
28
- ticket_nonce: ticket_nonce,
29
- ticket: ticket)
26
+ NewSessionTicket.new(ticket_lifetime:,
27
+ ticket_age_add:,
28
+ ticket_nonce:,
29
+ ticket:)
30
30
  end
31
31
 
32
32
  it 'should be generated' do
@@ -23,22 +23,22 @@ RSpec.describe PreSharedKey do
23
23
  let(:identities) do
24
24
  [
25
25
  PskIdentity.new(
26
- identity: identity,
27
- obfuscated_ticket_age: obfuscated_ticket_age
26
+ identity:,
27
+ obfuscated_ticket_age:
28
28
  )
29
29
  ]
30
30
  end
31
31
 
32
32
  let(:offered_psks) do
33
33
  OfferedPsks.new(
34
- identities: identities,
35
- binders: binders
34
+ identities:,
35
+ binders:
36
36
  )
37
37
  end
38
38
 
39
39
  let(:extension) do
40
40
  PreSharedKey.new(msg_type: HandshakeType::CLIENT_HELLO,
41
- offered_psks: offered_psks)
41
+ offered_psks:)
42
42
  end
43
43
 
44
44
  it 'should be generated' do
@@ -98,14 +98,14 @@ RSpec.describe PreSharedKey do
98
98
 
99
99
  let(:offered_psks) do
100
100
  OfferedPsks.new(
101
- identities: identities,
102
- binders: binders
101
+ identities:,
102
+ binders:
103
103
  )
104
104
  end
105
105
 
106
106
  let(:extension) do
107
107
  PreSharedKey.new(msg_type: HandshakeType::CLIENT_HELLO,
108
- offered_psks: offered_psks)
108
+ offered_psks:)
109
109
  end
110
110
 
111
111
  it 'should be generated' do
data/spec/record_spec.rb CHANGED
@@ -39,7 +39,7 @@ RSpec.describe Record do
39
39
  end
40
40
 
41
41
  it 'should generate valid serializable object' do
42
- expect(record.serialize).to eq ContentType::CCS \
42
+ expect(record.serialize).to eq ContentType::CCS \
43
43
  + ProtocolVersion::TLS_1_2 \
44
44
  + 1.to_uint16 \
45
45
  + ChangeCipherSpec.new.serialize
@@ -19,9 +19,9 @@ RSpec.describe ServerHello do
19
19
  end
20
20
 
21
21
  let(:message) do
22
- ServerHello.new(random: random,
23
- legacy_session_id_echo: legacy_session_id_echo,
24
- cipher_suite: cipher_suite)
22
+ ServerHello.new(random:,
23
+ legacy_session_id_echo:,
24
+ cipher_suite:)
25
25
  end
26
26
 
27
27
  it 'should be generated' do
@@ -121,8 +121,8 @@ RSpec.describe ServerHello do
121
121
 
122
122
  let(:message) do
123
123
  ServerHello.new(random: Message::HRR_RANDOM,
124
- legacy_session_id_echo: legacy_session_id_echo,
125
- cipher_suite: cipher_suite)
124
+ legacy_session_id_echo:,
125
+ cipher_suite:)
126
126
  end
127
127
 
128
128
  it 'should be generated' do
data/spec/server_spec.rb CHANGED
@@ -34,7 +34,6 @@ RSpec.describe Server do
34
34
  let(:ch) do
35
35
  ch = ClientHello.deserialize(TESTBINARY_CLIENT_HELLO)
36
36
 
37
- # X25519 is unsupported so @named_group uses SECP256R1.
38
37
  key_share = KeyShare.new(
39
38
  msg_type: HandshakeType::CLIENT_HELLO,
40
39
  key_share_entry: [
@@ -77,7 +76,8 @@ RSpec.describe Server do
77
76
  expect(ee.extensions[ExtensionType::SERVER_NAME].server_name).to eq ''
78
77
  expect(ee.extensions).to include(ExtensionType::SUPPORTED_GROUPS)
79
78
  expect(ee.extensions[ExtensionType::SUPPORTED_GROUPS].named_group_list)
80
- .to eq [NamedGroup::SECP256R1,
79
+ .to eq [NamedGroup::X25519,
80
+ NamedGroup::SECP256R1,
81
81
  NamedGroup::SECP384R1,
82
82
  NamedGroup::SECP521R1]
83
83
  end
@@ -175,9 +175,9 @@ RSpec.describe Server do
175
175
  signature = cv.signature
176
176
  digest = CipherSuite.digest(cipher_suite)
177
177
  expect(Endpoint.verified_certificate_verify?(
178
- public_key: public_key,
179
- signature_scheme: signature_scheme,
180
- signature: signature,
178
+ public_key:,
179
+ signature_scheme:,
180
+ signature:,
181
181
  context: 'TLS 1.3, server CertificateVerify',
182
182
  hash: transcript.hash(digest, CT)
183
183
  )).to be true
@@ -208,14 +208,14 @@ RSpec.describe Server do
208
208
 
209
209
  let(:key_schedule) do
210
210
  KeySchedule.new(shared_secret: TESTBINARY_SHARED_SECRET,
211
- cipher_suite: cipher_suite,
212
- transcript: transcript)
211
+ cipher_suite:,
212
+ transcript:)
213
213
  end
214
214
 
215
215
  let(:signature) do
216
216
  digest = CipherSuite.digest(cipher_suite)
217
217
  Endpoint.sign_finished(
218
- digest: digest,
218
+ digest:,
219
219
  finished_key: key_schedule.server_finished_key,
220
220
  hash: transcript.hash(digest, CV)
221
221
  )
data/tttls1.3.gemspec CHANGED
@@ -13,7 +13,7 @@ Gem::Specification.new do |spec|
13
13
  spec.description = spec.summary
14
14
  spec.homepage = 'https://github.com/thekuwayama/tttls1.3'
15
15
  spec.license = 'MIT'
16
- spec.required_ruby_version = '>=3.1'
16
+ spec.required_ruby_version = '>= 3.1.0'
17
17
 
18
18
  spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
19
19
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
@@ -23,5 +23,5 @@ Gem::Specification.new do |spec|
23
23
  spec.add_dependency 'ech_config', '~> 0.0.3'
24
24
  spec.add_dependency 'hpke'
25
25
  spec.add_dependency 'logger'
26
- spec.add_dependency 'openssl'
26
+ spec.add_dependency 'openssl', '>= 3'
27
27
  end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tttls1.3
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.3.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - thekuwayama
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2024-04-19 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: bundler
@@ -72,14 +71,14 @@ dependencies:
72
71
  requirements:
73
72
  - - ">="
74
73
  - !ruby/object:Gem::Version
75
- version: '0'
74
+ version: '3'
76
75
  type: :runtime
77
76
  prerelease: false
78
77
  version_requirements: !ruby/object:Gem::Requirement
79
78
  requirements:
80
79
  - - ">="
81
80
  - !ruby/object:Gem::Version
82
- version: '0'
81
+ version: '3'
83
82
  description: TLS 1.3 implementation in Ruby (Tiny Trial TLS1.3 aka tttls1.3)
84
83
  email:
85
84
  - thekuwayama@gmail.com
@@ -102,7 +101,6 @@ files:
102
101
  - example/https_client_using_0rtt.rb
103
102
  - example/https_client_using_ech.rb
104
103
  - example/https_client_using_grease_ech.rb
105
- - example/https_client_using_grease_psk.rb
106
104
  - example/https_client_using_hrr.rb
107
105
  - example/https_client_using_hrr_and_ech.rb
108
106
  - example/https_client_using_hrr_and_ticket.rb
@@ -160,6 +158,7 @@ files:
160
158
  - lib/tttls1.3/named_group.rb
161
159
  - lib/tttls1.3/sequence_number.rb
162
160
  - lib/tttls1.3/server.rb
161
+ - lib/tttls1.3/shared_secret.rb
163
162
  - lib/tttls1.3/signature_scheme.rb
164
163
  - lib/tttls1.3/sslkeylogfile.rb
165
164
  - lib/tttls1.3/transcript.rb
@@ -224,7 +223,6 @@ homepage: https://github.com/thekuwayama/tttls1.3
224
223
  licenses:
225
224
  - MIT
226
225
  metadata: {}
227
- post_install_message:
228
226
  rdoc_options: []
229
227
  require_paths:
230
228
  - lib
@@ -232,15 +230,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
232
230
  requirements:
233
231
  - - ">="
234
232
  - !ruby/object:Gem::Version
235
- version: '3.1'
233
+ version: 3.1.0
236
234
  required_rubygems_version: !ruby/object:Gem::Requirement
237
235
  requirements:
238
236
  - - ">="
239
237
  - !ruby/object:Gem::Version
240
238
  version: '0'
241
239
  requirements: []
242
- rubygems_version: 3.5.3
243
- signing_key:
240
+ rubygems_version: 3.6.7
244
241
  specification_version: 4
245
242
  summary: TLS 1.3 implementation in Ruby (Tiny Trial TLS1.3 aka tttls1.3)
246
243
  test_files:
@@ -1,58 +0,0 @@
1
- # encoding: ascii-8bit
2
- # frozen_string_literal: true
3
-
4
- require_relative 'helper'
5
- HpkeSymmetricCipherSuite = \
6
- ECHConfig::ECHConfigContents::HpkeKeyConfig::HpkeSymmetricCipherSuite
7
-
8
- uri = URI.parse(ARGV[0] || 'https://localhost:4433')
9
- ca_file = __dir__ + '/../tmp/ca.crt'
10
- req = simple_http_request(uri.host, uri.path)
11
-
12
- rr = Resolv::DNS.new.getresources(
13
- uri.host,
14
- Resolv::DNS::Resource::IN::HTTPS
15
- )
16
- settings_2nd = {
17
- ca_file: File.exist?(ca_file) ? ca_file : nil,
18
- alpn: ['http/1.1'],
19
- ech_config: rr.first.svc_params['ech'].echconfiglist.first,
20
- ech_hpke_cipher_suites:
21
- TTTLS13::STANDARD_CLIENT_ECH_HPKE_SYMMETRIC_CIPHER_SUITES,
22
- sslkeylogfile: '/tmp/sslkeylogfile.log'
23
- }
24
- process_new_session_ticket = lambda do |nst, rms, cs|
25
- return if Time.now.to_i - nst.timestamp > nst.ticket_lifetime
26
-
27
- settings_2nd[:ticket] = nst.ticket
28
- settings_2nd[:resumption_main_secret] = rms
29
- settings_2nd[:psk_cipher_suite] = cs
30
- settings_2nd[:ticket_nonce] = nst.ticket_nonce
31
- settings_2nd[:ticket_age_add] = nst.ticket_age_add
32
- settings_2nd[:ticket_timestamp] = nst.timestamp
33
- end
34
- settings_1st = {
35
- ca_file: File.exist?(ca_file) ? ca_file : nil,
36
- alpn: ['http/1.1'],
37
- process_new_session_ticket: process_new_session_ticket,
38
- ech_config: rr.first.svc_params['ech'].echconfiglist.first,
39
- ech_hpke_cipher_suites:
40
- TTTLS13::STANDARD_CLIENT_ECH_HPKE_SYMMETRIC_CIPHER_SUITES,
41
- sslkeylogfile: '/tmp/sslkeylogfile.log'
42
- }
43
-
44
- [
45
- # Initial Handshake:
46
- settings_1st,
47
- # Subsequent Handshake:
48
- settings_2nd
49
- ].each do |settings|
50
- socket = TCPSocket.new(uri.host, uri.port)
51
- client = TTTLS13::Client.new(socket, uri.host, **settings)
52
- client.connect
53
- client.write(req)
54
-
55
- print recv_http_response(client)
56
- client.close unless client.eof?
57
- socket.close
58
- end