tttls1.3 0.3.4 → 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.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +4 -2
- data/.rubocop.yml +16 -11
- data/.ruby-version +1 -1
- data/Gemfile +3 -3
- data/README.md +4 -4
- data/Rakefile +3 -3
- data/example/helper.rb +1 -1
- data/example/https_client_using_0rtt.rb +1 -1
- data/example/https_client_using_ech.rb +1 -1
- data/example/https_client_using_hrr_and_ech.rb +1 -1
- data/example/https_client_using_hrr_and_ticket.rb +1 -1
- data/example/https_client_using_status_request.rb +1 -1
- data/example/https_client_using_ticket.rb +1 -1
- data/example/https_client_using_ticket_and_ech.rb +3 -3
- data/example/https_server.rb +1 -1
- data/interop/client_spec.rb +57 -31
- data/interop/server_spec.rb +74 -46
- data/interop/spec_helper.rb +2 -2
- data/lib/tttls1.3/cipher_suites.rb +21 -16
- data/lib/tttls1.3/client.rb +86 -73
- data/lib/tttls1.3/connection.rb +6 -15
- data/lib/tttls1.3/cryptograph/aead.rb +26 -16
- data/lib/tttls1.3/ech.rb +11 -15
- data/lib/tttls1.3/endpoint.rb +4 -25
- data/lib/tttls1.3/key_schedule.rb +1 -1
- data/lib/tttls1.3/logging.rb +1 -1
- data/lib/tttls1.3/message/alert.rb +3 -4
- data/lib/tttls1.3/message/certificate.rb +4 -7
- data/lib/tttls1.3/message/certificate_verify.rb +3 -5
- data/lib/tttls1.3/message/client_hello.rb +9 -15
- data/lib/tttls1.3/message/compressed_certificate.rb +3 -9
- data/lib/tttls1.3/message/encrypted_extensions.rb +1 -2
- data/lib/tttls1.3/message/extension/alpn.rb +1 -6
- data/lib/tttls1.3/message/extension/compress_certificate.rb +1 -2
- data/lib/tttls1.3/message/extension/cookie.rb +1 -2
- data/lib/tttls1.3/message/extension/early_data_indication.rb +1 -2
- data/lib/tttls1.3/message/extension/ech.rb +9 -16
- data/lib/tttls1.3/message/extension/ech_outer_extensions.rb +1 -2
- data/lib/tttls1.3/message/extension/key_share.rb +17 -43
- data/lib/tttls1.3/message/extension/pre_shared_key.rb +8 -17
- data/lib/tttls1.3/message/extension/psk_key_exchange_modes.rb +1 -2
- data/lib/tttls1.3/message/extension/record_size_limit.rb +1 -2
- data/lib/tttls1.3/message/extension/server_name.rb +1 -2
- data/lib/tttls1.3/message/extension/signature_algorithms.rb +1 -2
- data/lib/tttls1.3/message/extension/status_request.rb +4 -12
- data/lib/tttls1.3/message/extension/supported_groups.rb +1 -4
- data/lib/tttls1.3/message/extension/supported_versions.rb +2 -8
- data/lib/tttls1.3/message/extension/unknown_extension.rb +2 -3
- data/lib/tttls1.3/message/extensions.rb +1 -7
- data/lib/tttls1.3/message/finished.rb +1 -2
- data/lib/tttls1.3/message/new_session_ticket.rb +6 -12
- data/lib/tttls1.3/message/record.rb +10 -23
- data/lib/tttls1.3/message/server_hello.rb +10 -21
- data/lib/tttls1.3/named_group.rb +12 -6
- data/lib/tttls1.3/server.rb +39 -34
- data/lib/tttls1.3/shared_secret.rb +118 -0
- data/lib/tttls1.3/utils.rb +0 -15
- data/lib/tttls1.3/version.rb +1 -1
- data/lib/tttls1.3.rb +1 -1
- data/spec/certificate_verify_spec.rb +1 -1
- data/spec/client_hello_spec.rb +4 -4
- data/spec/client_spec.rb +13 -13
- data/spec/endpoint_spec.rb +11 -11
- data/spec/key_schedule_spec.rb +4 -4
- data/spec/new_session_ticket_spec.rb +4 -4
- data/spec/pre_shared_key_spec.rb +8 -8
- data/spec/record_spec.rb +1 -1
- data/spec/server_hello_spec.rb +5 -5
- data/spec/server_spec.rb +8 -8
- data/tttls1.3.gemspec +2 -2
- metadata +7 -10
- data/example/https_client_using_grease_psk.rb +0 -58
data/lib/tttls1.3/endpoint.rb
CHANGED
@@ -26,9 +26,9 @@ module TTTLS13
|
|
26
26
|
def self.gen_cipher(cipher_suite, write_key, write_iv)
|
27
27
|
seq_num = SequenceNumber.new
|
28
28
|
Cryptograph::Aead.new(
|
29
|
-
cipher_suite
|
30
|
-
write_key
|
31
|
-
write_iv
|
29
|
+
cipher_suite:,
|
30
|
+
write_key:,
|
31
|
+
write_iv:,
|
32
32
|
sequence_number: seq_num
|
33
33
|
)
|
34
34
|
end
|
@@ -60,7 +60,6 @@ module TTTLS13
|
|
60
60
|
# @raise [TTTLS13::Error::ErrorAlerts]
|
61
61
|
#
|
62
62
|
# @return [String]
|
63
|
-
# rubocop: disable Metrics/CyclomaticComplexity
|
64
63
|
def self.sign_certificate_verify(key:, signature_scheme:, context:, hash:)
|
65
64
|
content = "\x20" * 64 + context + "\x00" + hash
|
66
65
|
|
@@ -92,7 +91,6 @@ module TTTLS13
|
|
92
91
|
terminate(:internal_error)
|
93
92
|
end
|
94
93
|
end
|
95
|
-
# rubocop: enable Metrics/CyclomaticComplexity
|
96
94
|
|
97
95
|
# @param public_key [OpenSSL::PKey::PKey]
|
98
96
|
# @param signature_scheme [TTTLS13::SignatureScheme]
|
@@ -103,7 +101,6 @@ module TTTLS13
|
|
103
101
|
# @raise [TTTLS13::Error::ErrorAlerts]
|
104
102
|
#
|
105
103
|
# @return [Boolean]
|
106
|
-
# rubocop: disable Metrics/CyclomaticComplexity
|
107
104
|
def self.verified_certificate_verify?(public_key:, signature_scheme:,
|
108
105
|
signature:, context:, hash:)
|
109
106
|
content = "\x20" * 64 + context + "\x00" + hash
|
@@ -136,7 +133,6 @@ module TTTLS13
|
|
136
133
|
terminate(:internal_error)
|
137
134
|
end
|
138
135
|
end
|
139
|
-
# rubocop: enable Metrics/CyclomaticComplexity
|
140
136
|
|
141
137
|
# @param digest [String] name of digest algorithm
|
142
138
|
# @param finished_key [String]
|
@@ -154,27 +150,10 @@ module TTTLS13
|
|
154
150
|
#
|
155
151
|
# @return [Boolean]
|
156
152
|
def self.verified_finished?(finished:, digest:, finished_key:, hash:)
|
157
|
-
sign_finished(digest
|
153
|
+
sign_finished(digest:, finished_key:, hash:) \
|
158
154
|
== finished.verify_data
|
159
155
|
end
|
160
156
|
|
161
|
-
# @param key_exchange [String]
|
162
|
-
# @param priv_key [OpenSSL::PKey::$Object]
|
163
|
-
# @param group [TTTLS13::NamedGroup]
|
164
|
-
#
|
165
|
-
# @return [String]
|
166
|
-
def self.gen_shared_secret(key_exchange, priv_key, group)
|
167
|
-
curve = NamedGroup.curve_name(group)
|
168
|
-
terminate(:internal_error) if curve.nil?
|
169
|
-
|
170
|
-
pub_key = OpenSSL::PKey::EC::Point.new(
|
171
|
-
OpenSSL::PKey::EC::Group.new(curve),
|
172
|
-
OpenSSL::BN.new(key_exchange, 2)
|
173
|
-
)
|
174
|
-
|
175
|
-
priv_key.dh_compute_key(pub_key)
|
176
|
-
end
|
177
|
-
|
178
157
|
# @param certificate_list [Array of CertificateEntry]
|
179
158
|
# @param ca_file [String] path to ca.crt
|
180
159
|
# @param hostname [String]
|
@@ -9,7 +9,7 @@ module TTTLS13
|
|
9
9
|
# @param shared_secret [String]
|
10
10
|
# @param cipher_suite [TTTLS13::CipherSuite]
|
11
11
|
# @param transcript [TTTLS13::Transcript]
|
12
|
-
def initialize(
|
12
|
+
def initialize(shared_secret:, cipher_suite:, transcript:, psk: nil)
|
13
13
|
@digest = CipherSuite.digest(cipher_suite)
|
14
14
|
@hash_len = CipherSuite.hash_len(cipher_suite)
|
15
15
|
@key_len = CipherSuite.key_len(cipher_suite)
|
data/lib/tttls1.3/logging.rb
CHANGED
@@ -42,12 +42,11 @@ module TTTLS13
|
|
42
42
|
# rubocop: enable Layout/HashAlignment
|
43
43
|
|
44
44
|
class Alert
|
45
|
-
attr_reader :level
|
46
|
-
attr_reader :description
|
45
|
+
attr_reader :level, :description
|
47
46
|
|
48
47
|
# @param level [TTTLS13::Message::AlertLevel]
|
49
48
|
# @param description [String] value of ALERT_DESCRIPTION
|
50
|
-
def initialize(level: nil
|
49
|
+
def initialize(description:, level: nil)
|
51
50
|
@level = level
|
52
51
|
@description = description
|
53
52
|
if @level.nil? && (@description == ALERT_DESCRIPTION[:user_canceled] ||
|
@@ -74,7 +73,7 @@ module TTTLS13
|
|
74
73
|
|
75
74
|
level = binary[0]
|
76
75
|
description = binary[1]
|
77
|
-
Alert.new(level
|
76
|
+
Alert.new(level:, description:)
|
78
77
|
end
|
79
78
|
|
80
79
|
# @return [TTTLS13::Error::ErrorAlerts]
|
@@ -12,9 +12,7 @@ module TTTLS13
|
|
12
12
|
private_constant :APPEARABLE_CT_EXTENSIONS
|
13
13
|
|
14
14
|
class Certificate
|
15
|
-
attr_reader :msg_type
|
16
|
-
attr_reader :certificate_request_context
|
17
|
-
attr_reader :certificate_list
|
15
|
+
attr_reader :msg_type, :certificate_request_context, :certificate_list
|
18
16
|
|
19
17
|
# @param certificate_request_context [String]
|
20
18
|
# @param certificate_list [Array of CertificateEntry]
|
@@ -60,8 +58,8 @@ module TTTLS13
|
|
60
58
|
i == binary.length
|
61
59
|
|
62
60
|
Certificate.new(
|
63
|
-
certificate_request_context
|
64
|
-
certificate_list:
|
61
|
+
certificate_request_context:,
|
62
|
+
certificate_list:
|
65
63
|
)
|
66
64
|
end
|
67
65
|
|
@@ -115,8 +113,7 @@ module TTTLS13
|
|
115
113
|
end
|
116
114
|
|
117
115
|
class CertificateEntry
|
118
|
-
attr_reader :cert_data
|
119
|
-
attr_reader :extensions
|
116
|
+
attr_reader :cert_data, :extensions
|
120
117
|
|
121
118
|
# @param cert_data [OpenSSL::X509::Certificate]
|
122
119
|
# @param extensions [TTTLS13::Message::Extensions]
|
@@ -5,9 +5,7 @@ module TTTLS13
|
|
5
5
|
using Refinements
|
6
6
|
module Message
|
7
7
|
class CertificateVerify
|
8
|
-
attr_reader :msg_type
|
9
|
-
attr_reader :signature_scheme
|
10
|
-
attr_reader :signature
|
8
|
+
attr_reader :msg_type, :signature_scheme, :signature
|
11
9
|
|
12
10
|
# @param signature_scheme [TTTLS13::SignatureScheme]
|
13
11
|
# @param signature [String]
|
@@ -51,8 +49,8 @@ module TTTLS13
|
|
51
49
|
unless signature_len + 4 == msg_len &&
|
52
50
|
signature_len + 8 == binary.length
|
53
51
|
|
54
|
-
CertificateVerify.new(signature_scheme
|
55
|
-
signature:
|
52
|
+
CertificateVerify.new(signature_scheme:,
|
53
|
+
signature:)
|
56
54
|
end
|
57
55
|
end
|
58
56
|
end
|
@@ -37,13 +37,8 @@ module TTTLS13
|
|
37
37
|
private_constant :APPEARABLE_CH_EXTENSIONS
|
38
38
|
|
39
39
|
class ClientHello
|
40
|
-
attr_reader :msg_type
|
41
|
-
|
42
|
-
attr_reader :random
|
43
|
-
attr_reader :legacy_session_id
|
44
|
-
attr_reader :cipher_suites
|
45
|
-
attr_reader :legacy_compression_methods
|
46
|
-
attr_reader :extensions
|
40
|
+
attr_reader :msg_type, :legacy_version, :random, :legacy_session_id, :cipher_suites, :legacy_compression_methods,
|
41
|
+
:extensions
|
47
42
|
|
48
43
|
# @param legacy_version [String]
|
49
44
|
# @param random [String]
|
@@ -52,10 +47,9 @@ module TTTLS13
|
|
52
47
|
# @param legacy_compression_methods [Array of String]
|
53
48
|
# @param extensions [TTTLS13::Message::Extensions]
|
54
49
|
# rubocop: disable Metrics/ParameterLists
|
55
|
-
def initialize(legacy_version: ProtocolVersion::TLS_1_2,
|
50
|
+
def initialize(cipher_suites:, legacy_version: ProtocolVersion::TLS_1_2,
|
56
51
|
random: OpenSSL::Random.random_bytes(32),
|
57
52
|
legacy_session_id: OpenSSL::Random.random_bytes(32),
|
58
|
-
cipher_suites:,
|
59
53
|
legacy_compression_methods: ["\x00"],
|
60
54
|
extensions: Extensions.new)
|
61
55
|
@msg_type = HandshakeType::CLIENT_HELLO
|
@@ -118,12 +112,12 @@ module TTTLS13
|
|
118
112
|
raise Error::ErrorAlerts, :decode_error unless i == msg_len + 4 &&
|
119
113
|
i == binary.length
|
120
114
|
|
121
|
-
ClientHello.new(legacy_version
|
122
|
-
random
|
123
|
-
legacy_session_id
|
124
|
-
cipher_suites
|
125
|
-
legacy_compression_methods
|
126
|
-
extensions:
|
115
|
+
ClientHello.new(legacy_version:,
|
116
|
+
random:,
|
117
|
+
legacy_session_id:,
|
118
|
+
cipher_suites:,
|
119
|
+
legacy_compression_methods:,
|
120
|
+
extensions:)
|
127
121
|
end
|
128
122
|
# rubocop: enable Metrics/AbcSize
|
129
123
|
# rubocop: enable Metrics/MethodLength
|
@@ -5,9 +5,7 @@ module TTTLS13
|
|
5
5
|
using Refinements
|
6
6
|
module Message
|
7
7
|
class CompressedCertificate
|
8
|
-
attr_reader :msg_type
|
9
|
-
attr_reader :certificate_message
|
10
|
-
attr_reader :algorithm
|
8
|
+
attr_reader :msg_type, :certificate_message, :algorithm
|
11
9
|
|
12
10
|
# @param certificate_message [TTTLS13::Message::Certificate]
|
13
11
|
# @param algorithm [CertificateCompressionAlgorithm]
|
@@ -41,8 +39,6 @@ module TTTLS13
|
|
41
39
|
#
|
42
40
|
# @return [TTTLS13::Message::CompressedCertificate]
|
43
41
|
# rubocop: disable Metrics/AbcSize
|
44
|
-
# rubocop: disable Metrics/CyclomaticComplexity
|
45
|
-
# rubocop: disable Metrics/PerceivedComplexity
|
46
42
|
def self.deserialize(binary)
|
47
43
|
raise Error::ErrorAlerts, :internal_error if binary.nil?
|
48
44
|
raise Error::ErrorAlerts, :decode_error if binary.length < 5
|
@@ -70,13 +66,11 @@ module TTTLS13
|
|
70
66
|
HandshakeType::CERTIFICATE + ct_bin.prefix_uint24_length
|
71
67
|
)
|
72
68
|
CompressedCertificate.new(
|
73
|
-
certificate_message
|
74
|
-
algorithm:
|
69
|
+
certificate_message:,
|
70
|
+
algorithm:
|
75
71
|
)
|
76
72
|
end
|
77
73
|
# rubocop: enable Metrics/AbcSize
|
78
|
-
# rubocop: enable Metrics/CyclomaticComplexity
|
79
|
-
# rubocop: enable Metrics/PerceivedComplexity
|
80
74
|
end
|
81
75
|
end
|
82
76
|
end
|
@@ -21,8 +21,7 @@ module TTTLS13
|
|
21
21
|
private_constant :APPEARABLE_EE_EXTENSIONS
|
22
22
|
|
23
23
|
class EncryptedExtensions
|
24
|
-
attr_reader :msg_type
|
25
|
-
attr_reader :extensions
|
24
|
+
attr_reader :msg_type, :extensions
|
26
25
|
|
27
26
|
# @param extensions [TTTLS13::Message::Extensions]
|
28
27
|
def initialize(extensions = Extensions.new)
|
@@ -6,8 +6,7 @@ module TTTLS13
|
|
6
6
|
module Message
|
7
7
|
module Extension
|
8
8
|
class Alpn
|
9
|
-
attr_reader :extension_type
|
10
|
-
attr_reader :protocol_name_list
|
9
|
+
attr_reader :extension_type, :protocol_name_list
|
11
10
|
|
12
11
|
# @param protocol_name_list [Array] Array of String
|
13
12
|
#
|
@@ -39,8 +38,6 @@ module TTTLS13
|
|
39
38
|
# @raise [TTTLS13::Error::ErrorAlerts]
|
40
39
|
#
|
41
40
|
# @return [TTTLS13::Message::Extension::Alpn, nil]
|
42
|
-
# rubocop: disable Metrics/CyclomaticComplexity
|
43
|
-
# rubocop: disable Metrics/PerceivedComplexity
|
44
41
|
def self.deserialize(binary)
|
45
42
|
raise Error::ErrorAlerts, :internal_error if binary.nil?
|
46
43
|
|
@@ -64,8 +61,6 @@ module TTTLS13
|
|
64
61
|
|
65
62
|
Alpn.new(protocol_name_list)
|
66
63
|
end
|
67
|
-
# rubocop: enable Metrics/CyclomaticComplexity
|
68
|
-
# rubocop: enable Metrics/PerceivedComplexity
|
69
64
|
end
|
70
65
|
end
|
71
66
|
end
|
@@ -13,8 +13,7 @@ module TTTLS13
|
|
13
13
|
|
14
14
|
# https://datatracker.ietf.org/doc/html/rfc8879
|
15
15
|
class CompressCertificate
|
16
|
-
attr_reader :extension_type
|
17
|
-
attr_reader :algorithms
|
16
|
+
attr_reader :extension_type, :algorithms
|
18
17
|
|
19
18
|
# @param algorithms [Array of CertificateCompressionAlgorithm]
|
20
19
|
#
|
@@ -25,12 +25,7 @@ module TTTLS13
|
|
25
25
|
# };
|
26
26
|
# } ECHClientHello;
|
27
27
|
class ECHClientHello
|
28
|
-
attr_reader :extension_type
|
29
|
-
attr_reader :type
|
30
|
-
attr_reader :cipher_suite
|
31
|
-
attr_reader :config_id
|
32
|
-
attr_reader :enc
|
33
|
-
attr_reader :payload
|
28
|
+
attr_reader :extension_type, :type, :cipher_suite, :config_id, :enc, :payload
|
34
29
|
|
35
30
|
# @param type [TTTLS13::Message::Extension::ECHClientHelloType]
|
36
31
|
# @param cipher_suite [HpkeSymmetricCipherSuite]
|
@@ -125,8 +120,8 @@ module TTTLS13
|
|
125
120
|
type: ECHClientHelloType::OUTER,
|
126
121
|
cipher_suite: cs,
|
127
122
|
config_id: cid,
|
128
|
-
enc
|
129
|
-
payload:
|
123
|
+
enc:,
|
124
|
+
payload:
|
130
125
|
)
|
131
126
|
end
|
132
127
|
|
@@ -156,10 +151,10 @@ module TTTLS13
|
|
156
151
|
def self.new_outer(cipher_suite:, config_id:, enc:, payload:)
|
157
152
|
ECHClientHello.new(
|
158
153
|
type: ECHClientHelloType::OUTER,
|
159
|
-
cipher_suite
|
160
|
-
config_id
|
161
|
-
enc
|
162
|
-
payload:
|
154
|
+
cipher_suite:,
|
155
|
+
config_id:,
|
156
|
+
enc:,
|
157
|
+
payload:
|
163
158
|
)
|
164
159
|
end
|
165
160
|
end
|
@@ -168,8 +163,7 @@ module TTTLS13
|
|
168
163
|
# ECHConfigList retry_configs;
|
169
164
|
# } ECHEncryptedExtensions;
|
170
165
|
class ECHEncryptedExtensions
|
171
|
-
attr_reader :extension_type
|
172
|
-
attr_reader :retry_configs
|
166
|
+
attr_reader :extension_type, :retry_configs
|
173
167
|
|
174
168
|
# @param retry_configs [Array of ECHConfig]
|
175
169
|
def initialize(retry_configs)
|
@@ -204,8 +198,7 @@ module TTTLS13
|
|
204
198
|
# opaque confirmation[8];
|
205
199
|
# } ECHHelloRetryRequest;
|
206
200
|
class ECHHelloRetryRequest
|
207
|
-
attr_reader :extension_type
|
208
|
-
attr_reader :confirmation
|
201
|
+
attr_reader :extension_type, :confirmation
|
209
202
|
|
210
203
|
# @param confirmation [String]
|
211
204
|
def initialize(confirmation)
|
@@ -7,8 +7,7 @@ module TTTLS13
|
|
7
7
|
module Extension
|
8
8
|
# ExtensionType OuterExtensions<2..254>;
|
9
9
|
class ECHOuterExtensions
|
10
|
-
attr_reader :extension_type
|
11
|
-
attr_reader :outer_extensions
|
10
|
+
attr_reader :extension_type, :outer_extensions
|
12
11
|
|
13
12
|
# @param outer_extensions [Array of TTTLS13::Message::ExtensionType]
|
14
13
|
def initialize(outer_extensions)
|
@@ -7,16 +7,12 @@ module TTTLS13
|
|
7
7
|
module Extension
|
8
8
|
# rubocop: disable Metrics/ClassLength
|
9
9
|
class KeyShare
|
10
|
-
attr_reader :extension_type
|
11
|
-
attr_reader :msg_type
|
12
|
-
attr_reader :key_share_entry
|
10
|
+
attr_reader :extension_type, :msg_type, :key_share_entry
|
13
11
|
|
14
12
|
# @param msg_type [TTTLS13::Message::HandshakeType]
|
15
13
|
# @param key_share_entry [Array of KeyShareEntry]
|
16
14
|
#
|
17
15
|
# @raise [TTTLS13::Error::ErrorAlerts]
|
18
|
-
# rubocop: disable Metrics/CyclomaticComplexity
|
19
|
-
# rubocop: disable Metrics/PerceivedComplexity
|
20
16
|
def initialize(msg_type:, key_share_entry: [])
|
21
17
|
@extension_type = ExtensionType::KEY_SHARE
|
22
18
|
@msg_type = msg_type
|
@@ -32,8 +28,6 @@ module TTTLS13
|
|
32
28
|
@key_share_entry.length == 1 &&
|
33
29
|
@key_share_entry.first.valid_key_share_hello_retry_request?)
|
34
30
|
end
|
35
|
-
# rubocop: enable Metrics/CyclomaticComplexity
|
36
|
-
# rubocop: enable Metrics/PerceivedComplexity
|
37
31
|
|
38
32
|
# @raise [TTTLS13::Error::ErrorAlerts]
|
39
33
|
#
|
@@ -56,7 +50,6 @@ module TTTLS13
|
|
56
50
|
# @raise [TTTLS13::Error::ErrorAlerts]
|
57
51
|
#
|
58
52
|
# @return [TTTLS13::Message::Extensions::KeyShare, nil]
|
59
|
-
# rubocop: disable Metrics/CyclomaticComplexity
|
60
53
|
def self.deserialize(binary, msg_type)
|
61
54
|
raise Error::ErrorAlerts, :internal_error if binary.nil?
|
62
55
|
|
@@ -78,62 +71,44 @@ module TTTLS13
|
|
78
71
|
end
|
79
72
|
return nil if key_share_entry.nil?
|
80
73
|
|
81
|
-
KeyShare.new(msg_type
|
82
|
-
key_share_entry:
|
74
|
+
KeyShare.new(msg_type:,
|
75
|
+
key_share_entry:)
|
83
76
|
end
|
84
|
-
# rubocop: enable Metrics/CyclomaticComplexity
|
85
77
|
|
86
78
|
# @param groups [Array of TTTLS13::NamedGroup]
|
87
79
|
#
|
88
80
|
# @return [TTTLS13::Message::Extensions::KeyShare]
|
89
|
-
# @return [
|
81
|
+
# @return [TTTLS13::SharedSecret]
|
90
82
|
def self.gen_ch_key_share(groups)
|
91
|
-
|
92
|
-
kse = groups.map do |group|
|
93
|
-
curve = NamedGroup.curve_name(group)
|
94
|
-
ec = OpenSSL::PKey::EC.generate(curve)
|
95
|
-
# store private key to do the key-exchange
|
96
|
-
priv_keys.store(group, ec)
|
97
|
-
KeyShareEntry.new(
|
98
|
-
group: group,
|
99
|
-
key_exchange: ec.public_key.to_octet_string(:uncompressed)
|
100
|
-
)
|
101
|
-
end
|
102
|
-
|
83
|
+
shared_secret = SharedSecret.gen_from_named_groups(groups)
|
103
84
|
key_share = KeyShare.new(
|
104
85
|
msg_type: HandshakeType::CLIENT_HELLO,
|
105
|
-
key_share_entry:
|
86
|
+
key_share_entry: shared_secret.key_share_entries
|
106
87
|
)
|
107
88
|
|
108
|
-
[key_share,
|
89
|
+
[key_share, shared_secret]
|
109
90
|
end
|
110
91
|
|
111
92
|
# @param group [TTTLS13::NamedGroup]
|
112
93
|
#
|
113
94
|
# @return [TTTLS13::Message::Extensions::KeyShare]
|
114
|
-
# @return [
|
95
|
+
# @return [TTTLS13::SharedSecret]
|
115
96
|
def self.gen_sh_key_share(group)
|
116
|
-
|
117
|
-
ec = OpenSSL::PKey::EC.generate(curve)
|
97
|
+
shared_secret = SharedSecret.gen_from_named_groups([group])
|
118
98
|
|
119
99
|
key_share = KeyShare.new(
|
120
100
|
msg_type: HandshakeType::SERVER_HELLO,
|
121
|
-
key_share_entry:
|
122
|
-
KeyShareEntry.new(
|
123
|
-
group: group,
|
124
|
-
key_exchange: ec.public_key.to_octet_string(:uncompressed)
|
125
|
-
)
|
126
|
-
]
|
101
|
+
key_share_entry: shared_secret.key_share_entries
|
127
102
|
)
|
128
103
|
|
129
|
-
[key_share,
|
104
|
+
[key_share, shared_secret]
|
130
105
|
end
|
131
106
|
|
132
107
|
# @param group [TTTLS13::NamedGroup]
|
133
108
|
#
|
134
109
|
# @return [TTTLS13::Message::Extensions::KeyShare]
|
135
110
|
def self.gen_hrr_key_share(group)
|
136
|
-
kse = KeyShareEntry.new(group:
|
111
|
+
kse = KeyShareEntry.new(group:)
|
137
112
|
KeyShare.new(
|
138
113
|
msg_type: HandshakeType::HELLO_RETRY_REQUEST,
|
139
114
|
key_share_entry: [kse]
|
@@ -168,8 +143,8 @@ module TTTLS13
|
|
168
143
|
ke_len = Convert.bin2i(binary.slice(itr, 2))
|
169
144
|
itr += 2
|
170
145
|
key_exchange = binary.slice(itr, ke_len)
|
171
|
-
key_share_entry << KeyShareEntry.new(group
|
172
|
-
key_exchange:
|
146
|
+
key_share_entry << KeyShareEntry.new(group:,
|
147
|
+
key_exchange:)
|
173
148
|
itr += ke_len
|
174
149
|
end
|
175
150
|
return nil unless itr == binary.length
|
@@ -196,7 +171,7 @@ module TTTLS13
|
|
196
171
|
key_exchange = binary.slice(4, ke_len)
|
197
172
|
return nil unless ke_len + 4 == binary.length
|
198
173
|
|
199
|
-
[KeyShareEntry.new(group
|
174
|
+
[KeyShareEntry.new(group:, key_exchange:)]
|
200
175
|
end
|
201
176
|
|
202
177
|
# struct {
|
@@ -214,15 +189,14 @@ module TTTLS13
|
|
214
189
|
return nil unless binary.length == 2
|
215
190
|
|
216
191
|
group = binary.slice(0, 2)
|
217
|
-
[KeyShareEntry.new(group:
|
192
|
+
[KeyShareEntry.new(group:)]
|
218
193
|
end
|
219
194
|
end
|
220
195
|
end
|
221
196
|
# rubocop: enable Metrics/ClassLength
|
222
197
|
|
223
198
|
class KeyShareEntry
|
224
|
-
attr_reader :group
|
225
|
-
attr_reader :key_exchange
|
199
|
+
attr_reader :group, :key_exchange
|
226
200
|
|
227
201
|
# @param group [TTTLS13::NamedGroup]
|
228
202
|
# @param key_exchange [String]
|
@@ -12,10 +12,7 @@ module TTTLS13
|
|
12
12
|
# };
|
13
13
|
# } PreSharedKeyExtension;
|
14
14
|
class PreSharedKey
|
15
|
-
attr_reader :extension_type
|
16
|
-
attr_reader :msg_type
|
17
|
-
attr_reader :offered_psks
|
18
|
-
attr_reader :selected_identity
|
15
|
+
attr_reader :extension_type, :msg_type, :offered_psks, :selected_identity
|
19
16
|
|
20
17
|
# @param msg_type [TTTLS13::Message::ContentType]
|
21
18
|
# @param offered_psks [TTTLS13::Message::Extension::OfferedPsks]
|
@@ -69,13 +66,13 @@ module TTTLS13
|
|
69
66
|
return nil if offered_psks.nil?
|
70
67
|
|
71
68
|
PreSharedKey.new(msg_type: HandshakeType::CLIENT_HELLO,
|
72
|
-
offered_psks:
|
69
|
+
offered_psks:)
|
73
70
|
when HandshakeType::SERVER_HELLO
|
74
71
|
return nil unless binary.length == 2
|
75
72
|
|
76
73
|
selected_identity = binary
|
77
74
|
PreSharedKey.new(msg_type: HandshakeType::SERVER_HELLO,
|
78
|
-
selected_identity:
|
75
|
+
selected_identity:)
|
79
76
|
else
|
80
77
|
raise Error::ErrorAlerts, :internal_error
|
81
78
|
end
|
@@ -89,8 +86,7 @@ module TTTLS13
|
|
89
86
|
# PskBinderEntry binders<33..2^16-1>;
|
90
87
|
# } OfferedPsks;
|
91
88
|
class OfferedPsks
|
92
|
-
attr_reader :identities
|
93
|
-
attr_reader :binders
|
89
|
+
attr_reader :identities, :binders
|
94
90
|
|
95
91
|
# @param identities [Array of PskIdentity]
|
96
92
|
# @param binders [Array of String]
|
@@ -118,9 +114,7 @@ module TTTLS13
|
|
118
114
|
#
|
119
115
|
# @return [TTTLS13::Message::Extensions::OfferedPsks, nil]
|
120
116
|
# rubocop: disable Metrics/AbcSize
|
121
|
-
# rubocop: disable Metrics/CyclomaticComplexity
|
122
117
|
# rubocop: disable Metrics/MethodLength
|
123
|
-
# rubocop: disable Metrics/PerceivedComplexity
|
124
118
|
def self.deserialize(binary)
|
125
119
|
raise Error::ErrorAlerts, :internal_error if binary.nil?
|
126
120
|
return nil if binary.length < 2
|
@@ -143,8 +137,8 @@ module TTTLS13
|
|
143
137
|
obfuscated_ticket_age = Convert.bin2i(binary.slice(i, 4))
|
144
138
|
i += 4
|
145
139
|
identities << PskIdentity.new(
|
146
|
-
identity
|
147
|
-
obfuscated_ticket_age:
|
140
|
+
identity:,
|
141
|
+
obfuscated_ticket_age:
|
148
142
|
)
|
149
143
|
end
|
150
144
|
|
@@ -162,12 +156,10 @@ module TTTLS13
|
|
162
156
|
end
|
163
157
|
return nil unless i == binary.length
|
164
158
|
|
165
|
-
OfferedPsks.new(identities
|
159
|
+
OfferedPsks.new(identities:, binders:)
|
166
160
|
end
|
167
161
|
# rubocop: enable Metrics/AbcSize
|
168
|
-
# rubocop: enable Metrics/CyclomaticComplexity
|
169
162
|
# rubocop: enable Metrics/MethodLength
|
170
|
-
# rubocop: enable Metrics/PerceivedComplexity
|
171
163
|
end
|
172
164
|
|
173
165
|
# struct {
|
@@ -175,8 +167,7 @@ module TTTLS13
|
|
175
167
|
# uint32 obfuscated_ticket_age;
|
176
168
|
# } PskIdentity;
|
177
169
|
class PskIdentity
|
178
|
-
attr_reader :identity
|
179
|
-
attr_reader :obfuscated_ticket_age
|
170
|
+
attr_reader :identity, :obfuscated_ticket_age
|
180
171
|
|
181
172
|
# @param identity [String]
|
182
173
|
# @param obfuscated_ticket_age [Integer]
|
@@ -21,8 +21,7 @@ module TTTLS13
|
|
21
21
|
SignatureScheme::RSA_PKCS1_SHA512
|
22
22
|
].freeze
|
23
23
|
|
24
|
-
attr_reader :extension_type # for signature_algorithms_cert getter
|
25
|
-
attr_reader :supported_signature_algorithms
|
24
|
+
attr_reader :extension_type, :supported_signature_algorithms # for signature_algorithms_cert getter
|
26
25
|
|
27
26
|
# @param supported_signature_algorithms [Array of SignatureScheme]
|
28
27
|
def initialize(supported_signature_algorithms)
|