tttls1.3 0.2.2 → 0.2.3
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 +4 -4
- data/.travis.yml +6 -0
- data/Rakefile +14 -0
- data/interop/Dockerfile +1 -1
- data/interop/client_spec.rb +15 -5
- data/interop/helper.rb +4 -0
- data/interop/server_spec.rb +24 -5
- data/lib/tttls1.3/client.rb +18 -0
- data/lib/tttls1.3/server.rb +21 -5
- data/lib/tttls1.3/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9b99157535ca4f2b06f4fc6d374116fbc6e496a7807184c56b31be11852d6e5f
|
4
|
+
data.tar.gz: 33ff8b94d80529bcabd7c4b3d8fe5ea9ee6513d1d90f4efe307f4edf7bbfb1ac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 29f4cd4e505e33ef0b6f03265a3ecdc8e988a32a965a9079b8c92ee57e50a6ad7e7864fb24d07a14b0ec956fce6ce1c85d9d8072e908e202393c1bd73ad54c1f
|
7
|
+
data.tar.gz: c5ed00504bbdb7ee0b051a3534ab2c51bbfdbadbd703ca761fb06367b85798217b04ba7b7d1a8003aeff756d3e9b8e7b6f7c375872250de4139e7400760608d4
|
data/.travis.yml
CHANGED
data/Rakefile
CHANGED
@@ -128,4 +128,18 @@ end
|
|
128
128
|
|
129
129
|
RuboCop::RakeTask.new
|
130
130
|
RSpec::Core::RakeTask.new(:spec)
|
131
|
+
|
132
|
+
desc 'interoperability test: TTTLS13::Client'
|
133
|
+
RSpec::Core::RakeTask.new(:interop_client) do |t|
|
134
|
+
t.pattern = Dir.glob('interop/client_spec.rb')
|
135
|
+
end
|
136
|
+
|
137
|
+
desc 'interoperability test: TTTLS13::Server'
|
138
|
+
RSpec::Core::RakeTask.new(:interop_server) do |t|
|
139
|
+
t.pattern = Dir.glob('interop/server_spec.rb')
|
140
|
+
end
|
141
|
+
|
142
|
+
desc 'interoperability test between openssl'
|
143
|
+
task interop: %i[interop_client interop_server]
|
144
|
+
|
131
145
|
task default: %i[rubocop spec]
|
data/interop/Dockerfile
CHANGED
data/interop/client_spec.rb
CHANGED
@@ -4,6 +4,7 @@
|
|
4
4
|
require_relative 'helper'
|
5
5
|
|
6
6
|
FIXTURES_DIR = __dir__ + '/../spec/fixtures'
|
7
|
+
PORT = 4433
|
7
8
|
|
8
9
|
RSpec.describe Client do
|
9
10
|
# testcases
|
@@ -147,28 +148,37 @@ RSpec.describe Client do
|
|
147
148
|
'rsa_rsa.crt',
|
148
149
|
'rsa_rsa.key',
|
149
150
|
key_share_groups: []
|
151
|
+
],
|
152
|
+
[
|
153
|
+
true,
|
154
|
+
'-alpn http/1.1',
|
155
|
+
'rsa_rsa.crt',
|
156
|
+
'rsa_rsa.key',
|
157
|
+
alpn: ['http/1.1']
|
150
158
|
]
|
151
159
|
# rubocop: enable Metrics/LineLength
|
152
160
|
].each do |normal, opt, crt, key, settings|
|
153
161
|
context 'client interop' do
|
154
162
|
before do
|
155
|
-
cmd =
|
156
|
-
+ 'openssl s_server ' \
|
163
|
+
cmd = 'openssl s_server ' \
|
157
164
|
+ "-cert /tmp/#{crt} " \
|
158
165
|
+ "-key /tmp/#{key} " \
|
159
166
|
+ '-tls1_3 ' \
|
160
167
|
+ '-www ' \
|
161
168
|
+ '-quiet ' \
|
162
169
|
+ opt
|
163
|
-
pid = spawn(
|
170
|
+
pid = spawn('docker run ' \
|
171
|
+
+ "--volume #{FIXTURES_DIR}:/tmp " \
|
172
|
+
+ "--publish #{PORT}:#{PORT} " \
|
173
|
+
+ 'openssl ' + cmd)
|
164
174
|
Process.detach(pid)
|
165
175
|
|
166
|
-
|
176
|
+
wait_to_listen(PORT)
|
167
177
|
end
|
168
178
|
|
169
179
|
let(:client) do
|
170
180
|
hostname = 'localhost'
|
171
|
-
@socket = TCPSocket.new(hostname,
|
181
|
+
@socket = TCPSocket.new(hostname, PORT)
|
172
182
|
settings[:ca_file] = FIXTURES_DIR + '/rsa_ca.crt'
|
173
183
|
Client.new(@socket, hostname, settings)
|
174
184
|
end
|
data/interop/helper.rb
CHANGED
data/interop/server_spec.rb
CHANGED
@@ -4,7 +4,9 @@
|
|
4
4
|
require_relative 'helper'
|
5
5
|
|
6
6
|
FIXTURES_DIR = __dir__ + '/../spec/fixtures'
|
7
|
-
|
7
|
+
PORT = 4433
|
8
|
+
|
9
|
+
tcpserver = TCPServer.open(PORT)
|
8
10
|
|
9
11
|
RSpec.describe Server do
|
10
12
|
# testcases
|
@@ -141,6 +143,20 @@ RSpec.describe Server do
|
|
141
143
|
FIXTURES_DIR + '/rsa_rsa.crt',
|
142
144
|
FIXTURES_DIR + '/rsa_rsa.key',
|
143
145
|
{}
|
146
|
+
],
|
147
|
+
[
|
148
|
+
true,
|
149
|
+
'-groups P-256:P-384:P-521 -alpn http/1.1',
|
150
|
+
FIXTURES_DIR + '/rsa_rsa.crt',
|
151
|
+
FIXTURES_DIR + '/rsa_rsa.key',
|
152
|
+
alpn: 'http/1.1'
|
153
|
+
],
|
154
|
+
[
|
155
|
+
false,
|
156
|
+
'-groups P-256:P-384:P-521 -alpn foo',
|
157
|
+
FIXTURES_DIR + '/rsa_rsa.crt',
|
158
|
+
FIXTURES_DIR + '/rsa_rsa.key',
|
159
|
+
alpn: 'http/1.1'
|
144
160
|
]
|
145
161
|
# rubocop: enable Metrics/LineLength
|
146
162
|
].each do |normal, opt, crt, key, settings|
|
@@ -153,15 +169,18 @@ RSpec.describe Server do
|
|
153
169
|
end
|
154
170
|
|
155
171
|
let(:client) do
|
172
|
+
wait_to_listen(PORT)
|
173
|
+
|
156
174
|
ip = Socket.ip_address_list.find(&:ipv4_private?).ip_address
|
157
175
|
cmd = 'echo -n ping | openssl s_client ' \
|
158
|
-
+
|
176
|
+
+ "-connect local:#{PORT} " \
|
159
177
|
+ '-tls1_3 ' \
|
160
178
|
+ '-CAfile /tmp/rsa_ca.crt ' \
|
161
179
|
+ '-servername localhost ' \
|
162
180
|
+ '-quiet ' \
|
163
181
|
+ opt
|
164
|
-
|
182
|
+
'docker run ' \
|
183
|
+
+ "--volume #{FIXTURES_DIR}:/tmp " \
|
165
184
|
+ "--add-host=local:#{ip} -it openssl " \
|
166
185
|
+ "sh -c \"#{cmd}\" 2>&1 >/dev/null"
|
167
186
|
end
|
@@ -173,7 +192,7 @@ RSpec.describe Server do
|
|
173
192
|
|
174
193
|
if normal
|
175
194
|
it "should accept request from openssl s_client ...#{opt}" do
|
176
|
-
spawn(
|
195
|
+
spawn(client)
|
177
196
|
expect { server.accept }.to_not raise_error
|
178
197
|
expect(server.read).to include 'ping'
|
179
198
|
expect { server.write('pong') }.to_not raise_error
|
@@ -181,7 +200,7 @@ RSpec.describe Server do
|
|
181
200
|
end
|
182
201
|
else # exceptions scenarios
|
183
202
|
it "should NOT accept request from openssl s_client ...#{opt}" do
|
184
|
-
spawn(
|
203
|
+
spawn(client)
|
185
204
|
expect { server.accept }.to raise_error ErrorAlerts
|
186
205
|
end
|
187
206
|
end
|
data/lib/tttls1.3/client.rb
CHANGED
@@ -50,6 +50,7 @@ module TTTLS13
|
|
50
50
|
signature_algorithms_cert: nil,
|
51
51
|
supported_groups: DEFAULT_CH_NAMED_GROUP_LIST,
|
52
52
|
key_share_groups: nil,
|
53
|
+
alpn: nil,
|
53
54
|
process_new_session_ticket: nil,
|
54
55
|
ticket: nil,
|
55
56
|
resumption_master_secret: nil,
|
@@ -280,6 +281,10 @@ module TTTLS13
|
|
280
281
|
@succeed_early_data = true \
|
281
282
|
if ee.extensions.include?(Message::ExtensionType::EARLY_DATA)
|
282
283
|
|
284
|
+
@alpn = ee.extensions[
|
285
|
+
Message::ExtensionType::APPLICATION_LAYER_PROTOCOL_NEGOTIATION
|
286
|
+
]&.protocol_name_list&.first
|
287
|
+
|
283
288
|
@state = ClientState::WAIT_CERT_CR
|
284
289
|
@state = ClientState::WAIT_FINISHED unless psk.nil?
|
285
290
|
when ClientState::WAIT_CERT_CR
|
@@ -397,6 +402,11 @@ module TTTLS13
|
|
397
402
|
@succeed_early_data
|
398
403
|
end
|
399
404
|
|
405
|
+
# @return [String]
|
406
|
+
def negotiated_alpn
|
407
|
+
@alpn
|
408
|
+
end
|
409
|
+
|
400
410
|
private
|
401
411
|
|
402
412
|
# @return [Boolean]
|
@@ -471,6 +481,8 @@ module TTTLS13
|
|
471
481
|
|
472
482
|
# @return [TTTLS13::Message::Extensions]
|
473
483
|
# @return [Hash of NamedGroup => OpenSSL::PKey::EC.$Object]
|
484
|
+
# rubocop: disable Metrics/AbcSize
|
485
|
+
# rubocop: disable Metrics/CyclomaticComplexity
|
474
486
|
def gen_ch_extensions
|
475
487
|
exs = []
|
476
488
|
# supported_versions: only TLS 1.3
|
@@ -507,8 +519,14 @@ module TTTLS13
|
|
507
519
|
# early_data
|
508
520
|
exs << Message::Extension::EarlyDataIndication.new if use_early_data?
|
509
521
|
|
522
|
+
# alpn
|
523
|
+
exs << Message::Extension::Alpn.new(@settings[:alpn].reject(&:empty?)) \
|
524
|
+
if !@settings[:alpn].nil? && !@settings[:alpn].empty?
|
525
|
+
|
510
526
|
[Message::Extensions.new(exs), priv_keys]
|
511
527
|
end
|
528
|
+
# rubocop: enable Metrics/AbcSize
|
529
|
+
# rubocop: enable Metrics/CyclomaticComplexity
|
512
530
|
|
513
531
|
# @param extensions [TTTLS13::Message::Extensions]
|
514
532
|
# @param binder_key [String, nil]
|
data/lib/tttls1.3/server.rb
CHANGED
@@ -50,6 +50,7 @@ module TTTLS13
|
|
50
50
|
cipher_suites: DEFAULT_SP_CIPHER_SUITES,
|
51
51
|
signature_algorithms: DEFAULT_SP_SIGNATURE_ALGORITHMS,
|
52
52
|
supported_groups: DEFAULT_SP_NAMED_GROUP_LIST,
|
53
|
+
alpn: nil,
|
53
54
|
loglevel: Logger::WARN
|
54
55
|
}.freeze
|
55
56
|
private_constant :DEFAULT_SERVER_SETTINGS
|
@@ -151,6 +152,16 @@ module TTTLS13
|
|
151
152
|
terminate(:illegal_parameter) unless ch.valid_key_share?
|
152
153
|
terminate(:unrecognized_name) unless recognized_server_name?(ch, @crt)
|
153
154
|
|
155
|
+
# alpn
|
156
|
+
if !@settings[:alpn].nil? && !@settings[:alpn].empty?
|
157
|
+
pnl = ch.extensions[
|
158
|
+
Message::ExtensionType::APPLICATION_LAYER_PROTOCOL_NEGOTIATION
|
159
|
+
]&.protocol_name_list || []
|
160
|
+
@alpn = pnl.find { |p| @settings[:alpn].include?(p) }
|
161
|
+
|
162
|
+
terminate(:no_application_protocol) if @alpn.nil?
|
163
|
+
end
|
164
|
+
|
154
165
|
@state = ServerState::RECVD_CH
|
155
166
|
when ServerState::RECVD_CH
|
156
167
|
logger.debug('ServerState::RECVD_CH')
|
@@ -209,7 +220,7 @@ module TTTLS13
|
|
209
220
|
logger.debug('ServerState::WAIT_FLIGHT2')
|
210
221
|
|
211
222
|
ch = transcript[CH]
|
212
|
-
ee = transcript[EE] = gen_encrypted_extensions(ch)
|
223
|
+
ee = transcript[EE] = gen_encrypted_extensions(ch, @alpn)
|
213
224
|
# TODO: [Send CertificateRequest]
|
214
225
|
ct = transcript[CT] = gen_certificate(@crt)
|
215
226
|
digest = CipherSuite.digest(@cipher_suite)
|
@@ -335,9 +346,9 @@ module TTTLS13
|
|
335
346
|
ksg = sp_groups.find do |g|
|
336
347
|
!ks_groups.include?(g) && @settings[:supported_groups].include?(g)
|
337
348
|
end
|
349
|
+
exs << Message::Extension::KeyShare.gen_hrr_key_share(ksg)
|
338
350
|
|
339
351
|
# TODO: cookie
|
340
|
-
exs << Message::Extension::KeyShare.gen_hrr_key_share(ksg)
|
341
352
|
|
342
353
|
sh = Message::ServerHello.new(
|
343
354
|
random: Message::HRR_RANDOM,
|
@@ -363,10 +374,11 @@ module TTTLS13
|
|
363
374
|
end
|
364
375
|
|
365
376
|
# @param ch [TTTLS13::Message::ClientHello]
|
377
|
+
# @param alpn [String]
|
366
378
|
#
|
367
379
|
# @return [TTTLS13::Message::EncryptedExtensions]
|
368
|
-
def gen_encrypted_extensions(ch)
|
369
|
-
Message::EncryptedExtensions.new(gen_ee_extensions(ch))
|
380
|
+
def gen_encrypted_extensions(ch, alpn = nil)
|
381
|
+
Message::EncryptedExtensions.new(gen_ee_extensions(ch, alpn))
|
370
382
|
end
|
371
383
|
|
372
384
|
# @param crt [OpenSSL::X509::Certificate]
|
@@ -424,9 +436,10 @@ module TTTLS13
|
|
424
436
|
end
|
425
437
|
|
426
438
|
# @param ch [TTTLS13::Message::ClientHello]
|
439
|
+
# @param alpn [String]
|
427
440
|
#
|
428
441
|
# @return [TTTLS13::Message::Extensions]
|
429
|
-
def gen_ee_extensions(ch)
|
442
|
+
def gen_ee_extensions(ch, alpn)
|
430
443
|
exs = []
|
431
444
|
|
432
445
|
# server_name
|
@@ -437,6 +450,9 @@ module TTTLS13
|
|
437
450
|
exs \
|
438
451
|
<< Message::Extension::SupportedGroups.new(@settings[:supported_groups])
|
439
452
|
|
453
|
+
# alpn
|
454
|
+
exs << Message::Extension::Alpn.new([alpn]) unless alpn.nil?
|
455
|
+
|
440
456
|
Message::Extensions.new(exs)
|
441
457
|
end
|
442
458
|
|
data/lib/tttls1.3/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tttls1.3
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- thekuwayama
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-06-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|