tttls1.3 0.1.3 → 0.1.4
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/interop/client_spec.rb +5 -0
- data/lib/tttls1.3/client.rb +15 -17
- data/lib/tttls1.3/connection.rb +15 -14
- data/lib/tttls1.3/version.rb +1 -1
- data/spec/client_spec.rb +4 -2
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e5e95ca87bc146cc9021a42dc44ed5daef30a5d8fc7040ab4531c77045077e82
|
4
|
+
data.tar.gz: cae31fb5ec83ac405142d7c67b1b9298d2d0880dbd053e37e7edfd888e70cf9e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 32080b68a237890982c9407491e754df789460550e7b68a87d1f77a01749da79a7bc463dbb8b53659eb27aa1fc990e168454754fc7b1636ac474e43c61fecd1f
|
7
|
+
data.tar.gz: 5a43785680db1cda38f704ac0df711ff10c0d2cded4fc2620c7c5ad8ee15d4f682672983642ce50f4b371cddd93760d06d98839d6c7811323482add07fe7fbc9
|
data/interop/client_spec.rb
CHANGED
@@ -46,6 +46,10 @@ RSpec.describe Client do
|
|
46
46
|
' -sigalgs RSA-PSS+SHA512',
|
47
47
|
signature_algorithms_cert: [SignatureScheme::RSA_PKCS1_SHA256],
|
48
48
|
signature_algorithms: [SignatureScheme::RSA_PSS_RSAE_SHA512]
|
49
|
+
],
|
50
|
+
[
|
51
|
+
' -record_padding 8446',
|
52
|
+
{}
|
49
53
|
]
|
50
54
|
].each do |opt, settings|
|
51
55
|
context 'client interop' do
|
@@ -56,6 +60,7 @@ RSpec.describe Client do
|
|
56
60
|
+ '-key /tmp/server.key ' \
|
57
61
|
+ '-tls1_3 ' \
|
58
62
|
+ '-www ' \
|
63
|
+
+ '-quiet ' \
|
59
64
|
+ opt
|
60
65
|
pid = spawn(cmd)
|
61
66
|
Process.detach(pid)
|
data/lib/tttls1.3/client.rb
CHANGED
@@ -25,9 +25,6 @@ module TTTLS13
|
|
25
25
|
SignatureScheme::ECDSA_SECP256R1_SHA256,
|
26
26
|
SignatureScheme::ECDSA_SECP384R1_SHA384,
|
27
27
|
SignatureScheme::ECDSA_SECP521R1_SHA512,
|
28
|
-
SignatureScheme::RSA_PSS_PSS_SHA256,
|
29
|
-
SignatureScheme::RSA_PSS_PSS_SHA384,
|
30
|
-
SignatureScheme::RSA_PSS_PSS_SHA512,
|
31
28
|
SignatureScheme::RSA_PSS_RSAE_SHA256,
|
32
29
|
SignatureScheme::RSA_PSS_RSAE_SHA384,
|
33
30
|
SignatureScheme::RSA_PSS_RSAE_SHA512,
|
@@ -154,6 +151,7 @@ module TTTLS13
|
|
154
151
|
terminate(:illegal_parameter) unless valid_sh_cipher_suite?
|
155
152
|
terminate(:illegal_parameter) unless valid_sh_compression_method?
|
156
153
|
# only TLS 1.3
|
154
|
+
terminate(:illegal_parameter) unless valid_sh_random?
|
157
155
|
terminate(:protocol_version) unless negotiated_tls_1_3?
|
158
156
|
|
159
157
|
if sh.hrr?
|
@@ -387,7 +385,7 @@ module TTTLS13
|
|
387
385
|
# @return [TTTLS13::Message::Extensions]
|
388
386
|
# rubocop: disable Metrics/AbcSize
|
389
387
|
# rubocop: disable Metrics/CyclomaticComplexity
|
390
|
-
def
|
388
|
+
def gen_ch_extensions
|
391
389
|
exs = []
|
392
390
|
# supported_versions: only TLS 1.3
|
393
391
|
exs << Message::Extension::SupportedVersions.new(
|
@@ -431,7 +429,7 @@ module TTTLS13
|
|
431
429
|
|
432
430
|
# @return [TTTLS13::Message::ClientHello]
|
433
431
|
def send_client_hello
|
434
|
-
exs =
|
432
|
+
exs = gen_ch_extensions
|
435
433
|
ch = Message::ClientHello.new(
|
436
434
|
cipher_suites: CipherSuites.new(@settings[:cipher_suites]),
|
437
435
|
extensions: exs
|
@@ -648,23 +646,23 @@ module TTTLS13
|
|
648
646
|
# 1. supported_versions == ["\x03\x04"]
|
649
647
|
# 2. legacy_versions == ["\x03\x03"]
|
650
648
|
#
|
651
|
-
# @raise [TTTLS13::Error::ErrorAlerts]
|
652
|
-
#
|
653
649
|
# @return [Boolean]
|
654
650
|
def negotiated_tls_1_3?
|
655
651
|
sh = @transcript[SH]
|
652
|
+
sh_lv = sh.legacy_version
|
656
653
|
sh_sv = sh.extensions[Message::ExtensionType::SUPPORTED_VERSIONS]
|
657
654
|
&.versions
|
658
|
-
|
659
|
-
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
|
666
|
-
|
667
|
-
|
655
|
+
|
656
|
+
sh_lv == Message::ProtocolVersion::TLS_1_2 &&
|
657
|
+
sh_sv&.first == Message::ProtocolVersion::TLS_1_3
|
658
|
+
end
|
659
|
+
|
660
|
+
# @return [Boolean]
|
661
|
+
def valid_sh_random?
|
662
|
+
sh_r8 = @transcript[SH].random[-8..]
|
663
|
+
|
664
|
+
sh_r8 != DOWNGRADE_PROTECTION_TLS_1_2 &&
|
665
|
+
sh_r8 != DOWNGRADE_PROTECTION_TLS_1_1
|
668
666
|
end
|
669
667
|
|
670
668
|
# @return [Boolean]
|
data/lib/tttls1.3/connection.rb
CHANGED
@@ -353,34 +353,35 @@ module TTTLS13
|
|
353
353
|
#
|
354
354
|
# @return [Boolean]
|
355
355
|
# rubocop: disable Metrics/AbcSize
|
356
|
+
# rubocop: disable Metrics/CyclomaticComplexity
|
356
357
|
def certified_certificate?(certificate_list, ca_file = nil, hostname = nil)
|
357
|
-
store = OpenSSL::X509::Store.new
|
358
|
-
store.set_default_paths
|
359
|
-
store.add_file(ca_file) unless ca_file.nil?
|
360
|
-
|
361
358
|
cert_bin = certificate_list.first.cert_data
|
362
359
|
cert = OpenSSL::X509::Certificate.new(cert_bin)
|
363
360
|
|
364
|
-
chain = certificate_list[1..].map(&:cert_data).map do |c|
|
365
|
-
OpenSSL::X509::Certificate.new(c)
|
366
|
-
end
|
367
|
-
# TODO: parse authorityInfoAccess::CA Issuers
|
368
|
-
|
369
|
-
ctx = OpenSSL::X509::StoreContext.new(store, cert, chain)
|
370
|
-
|
371
361
|
# not support CN matching, only support SAN matching
|
372
362
|
unless hostname.nil?
|
373
363
|
san = cert.extensions.find { |ex| ex.oid == 'subjectAltName' }
|
374
|
-
|
364
|
+
return false if san.nil?
|
365
|
+
|
375
366
|
ostr = OpenSSL::ASN1.decode(san.to_der).value.last
|
376
367
|
san_match = OpenSSL::ASN1.decode(ostr.value).map(&:value)
|
377
368
|
.map { |s| s.gsub('.', '\.').gsub('*', '.*') }
|
378
369
|
.any? { |s| hostname.match(/#{s}/) }
|
379
|
-
return
|
370
|
+
return false unless san_match
|
380
371
|
end
|
381
|
-
|
372
|
+
store = OpenSSL::X509::Store.new
|
373
|
+
store.set_default_paths
|
374
|
+
store.add_file(ca_file) unless ca_file.nil?
|
375
|
+
chain = certificate_list[1..].map(&:cert_data).map do |c|
|
376
|
+
OpenSSL::X509::Certificate.new(c)
|
377
|
+
end
|
378
|
+
# TODO: parse authorityInfoAccess::CA Issuers
|
379
|
+
ctx = OpenSSL::X509::StoreContext.new(store, cert, chain)
|
380
|
+
now = Time.now
|
381
|
+
ctx.verify && cert.not_before < now && now < cert.not_after
|
382
382
|
end
|
383
383
|
# rubocop: enable Metrics/AbcSize
|
384
|
+
# rubocop: enable Metrics/CyclomaticComplexity
|
384
385
|
end
|
385
386
|
# rubocop: enable Metrics/ClassLength
|
386
387
|
end
|
data/lib/tttls1.3/version.rb
CHANGED
data/spec/client_spec.rb
CHANGED
@@ -230,7 +230,8 @@ RSpec.describe Client do
|
|
230
230
|
end
|
231
231
|
|
232
232
|
it 'should check downgrade protection value' do
|
233
|
-
expect
|
233
|
+
expect(client.send(:valid_sh_random?)).to be false
|
234
|
+
expect(client.send(:negotiated_tls_1_3?)).to be true
|
234
235
|
end
|
235
236
|
end
|
236
237
|
|
@@ -252,7 +253,8 @@ RSpec.describe Client do
|
|
252
253
|
end
|
253
254
|
|
254
255
|
it 'should check downgrade protection value' do
|
255
|
-
expect
|
256
|
+
expect(client.send(:valid_sh_random?)).to be false
|
257
|
+
expect(client.send(:negotiated_tls_1_3?)).to be true
|
256
258
|
end
|
257
259
|
end
|
258
260
|
|
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.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- thekuwayama
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-05-
|
11
|
+
date: 2019-05-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -173,7 +173,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
173
173
|
- !ruby/object:Gem::Version
|
174
174
|
version: '0'
|
175
175
|
requirements: []
|
176
|
-
rubygems_version: 3.0.
|
176
|
+
rubygems_version: 3.0.3
|
177
177
|
signing_key:
|
178
178
|
specification_version: 4
|
179
179
|
summary: TLS 1.3 implementation in Ruby
|