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.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +4 -2
- data/.rubocop.yml +16 -11
- data/.ruby-version +1 -1
- data/Gemfile +5 -4
- data/README.md +4 -4
- data/Rakefile +3 -3
- data/example/helper.rb +14 -5
- 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 +89 -78
- data/lib/tttls1.3/connection.rb +6 -15
- data/lib/tttls1.3/cryptograph/aead.rb +26 -21
- data/lib/tttls1.3/ech.rb +13 -17
- data/lib/tttls1.3/endpoint.rb +4 -25
- data/lib/tttls1.3/key_schedule.rb +2 -2
- data/lib/tttls1.3/logging.rb +1 -1
- data/lib/tttls1.3/message/alert.rb +3 -4
- data/lib/tttls1.3/message/application_data.rb +1 -1
- 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 +17 -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 +2 -7
- 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 -19
- data/lib/tttls1.3/message/extension/ech_outer_extensions.rb +1 -3
- data/lib/tttls1.3/message/extension/key_share.rb +20 -49
- data/lib/tttls1.3/message/extension/pre_shared_key.rb +8 -20
- 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 -3
- data/lib/tttls1.3/message/extension/signature_algorithms.rb +1 -2
- data/lib/tttls1.3/message/extension/signature_algorithms_cert.rb +1 -1
- 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 -4
- data/lib/tttls1.3/message/extensions.rb +1 -9
- 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 -25
- data/lib/tttls1.3/message/server_hello.rb +10 -21
- data/lib/tttls1.3/named_group.rb +13 -9
- data/lib/tttls1.3/server.rb +39 -35
- 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 +22 -3
- 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
@@ -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
|
-
# @param msg_type [TTTLS13::Message::
|
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
|
-
# @param
|
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
|
-
# @param
|
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]
|
@@ -143,7 +118,6 @@ module TTTLS13
|
|
143
118
|
class << self
|
144
119
|
private
|
145
120
|
|
146
|
-
# NOTE:
|
147
121
|
# struct {
|
148
122
|
# KeyShareEntry client_shares<0..2^16-1>;
|
149
123
|
# } KeyShareClientHello;
|
@@ -169,8 +143,8 @@ module TTTLS13
|
|
169
143
|
ke_len = Convert.bin2i(binary.slice(itr, 2))
|
170
144
|
itr += 2
|
171
145
|
key_exchange = binary.slice(itr, ke_len)
|
172
|
-
key_share_entry << KeyShareEntry.new(group
|
173
|
-
key_exchange:
|
146
|
+
key_share_entry << KeyShareEntry.new(group:,
|
147
|
+
key_exchange:)
|
174
148
|
itr += ke_len
|
175
149
|
end
|
176
150
|
return nil unless itr == binary.length
|
@@ -178,7 +152,6 @@ module TTTLS13
|
|
178
152
|
key_share_entry
|
179
153
|
end
|
180
154
|
|
181
|
-
# NOTE:
|
182
155
|
# struct {
|
183
156
|
# KeyShareEntry server_share;
|
184
157
|
# } KeyShareServerHello;
|
@@ -198,10 +171,9 @@ module TTTLS13
|
|
198
171
|
key_exchange = binary.slice(4, ke_len)
|
199
172
|
return nil unless ke_len + 4 == binary.length
|
200
173
|
|
201
|
-
[KeyShareEntry.new(group
|
174
|
+
[KeyShareEntry.new(group:, key_exchange:)]
|
202
175
|
end
|
203
176
|
|
204
|
-
# NOTE:
|
205
177
|
# struct {
|
206
178
|
# NamedGroup selected_group;
|
207
179
|
# } KeyShareHelloRetryRequest;
|
@@ -217,15 +189,14 @@ module TTTLS13
|
|
217
189
|
return nil unless binary.length == 2
|
218
190
|
|
219
191
|
group = binary.slice(0, 2)
|
220
|
-
[KeyShareEntry.new(group:
|
192
|
+
[KeyShareEntry.new(group:)]
|
221
193
|
end
|
222
194
|
end
|
223
195
|
end
|
224
196
|
# rubocop: enable Metrics/ClassLength
|
225
197
|
|
226
198
|
class KeyShareEntry
|
227
|
-
attr_reader :group
|
228
|
-
attr_reader :key_exchange
|
199
|
+
attr_reader :group, :key_exchange
|
229
200
|
|
230
201
|
# @param group [TTTLS13::NamedGroup]
|
231
202
|
# @param key_exchange [String]
|
@@ -5,7 +5,6 @@ module TTTLS13
|
|
5
5
|
using Refinements
|
6
6
|
module Message
|
7
7
|
module Extension
|
8
|
-
# NOTE:
|
9
8
|
# struct {
|
10
9
|
# select (Handshake.msg_type) {
|
11
10
|
# case client_hello: OfferedPsks;
|
@@ -13,10 +12,7 @@ module TTTLS13
|
|
13
12
|
# };
|
14
13
|
# } PreSharedKeyExtension;
|
15
14
|
class PreSharedKey
|
16
|
-
attr_reader :extension_type
|
17
|
-
attr_reader :msg_type
|
18
|
-
attr_reader :offered_psks
|
19
|
-
attr_reader :selected_identity
|
15
|
+
attr_reader :extension_type, :msg_type, :offered_psks, :selected_identity
|
20
16
|
|
21
17
|
# @param msg_type [TTTLS13::Message::ContentType]
|
22
18
|
# @param offered_psks [TTTLS13::Message::Extension::OfferedPsks]
|
@@ -70,20 +66,19 @@ module TTTLS13
|
|
70
66
|
return nil if offered_psks.nil?
|
71
67
|
|
72
68
|
PreSharedKey.new(msg_type: HandshakeType::CLIENT_HELLO,
|
73
|
-
offered_psks:
|
69
|
+
offered_psks:)
|
74
70
|
when HandshakeType::SERVER_HELLO
|
75
71
|
return nil unless binary.length == 2
|
76
72
|
|
77
73
|
selected_identity = binary
|
78
74
|
PreSharedKey.new(msg_type: HandshakeType::SERVER_HELLO,
|
79
|
-
selected_identity:
|
75
|
+
selected_identity:)
|
80
76
|
else
|
81
77
|
raise Error::ErrorAlerts, :internal_error
|
82
78
|
end
|
83
79
|
end
|
84
80
|
end
|
85
81
|
|
86
|
-
# NOTE:
|
87
82
|
# opaque PskBinderEntry<32..255>;
|
88
83
|
#
|
89
84
|
# struct {
|
@@ -91,8 +86,7 @@ module TTTLS13
|
|
91
86
|
# PskBinderEntry binders<33..2^16-1>;
|
92
87
|
# } OfferedPsks;
|
93
88
|
class OfferedPsks
|
94
|
-
attr_reader :identities
|
95
|
-
attr_reader :binders
|
89
|
+
attr_reader :identities, :binders
|
96
90
|
|
97
91
|
# @param identities [Array of PskIdentity]
|
98
92
|
# @param binders [Array of String]
|
@@ -120,9 +114,7 @@ module TTTLS13
|
|
120
114
|
#
|
121
115
|
# @return [TTTLS13::Message::Extensions::OfferedPsks, nil]
|
122
116
|
# rubocop: disable Metrics/AbcSize
|
123
|
-
# rubocop: disable Metrics/CyclomaticComplexity
|
124
117
|
# rubocop: disable Metrics/MethodLength
|
125
|
-
# rubocop: disable Metrics/PerceivedComplexity
|
126
118
|
def self.deserialize(binary)
|
127
119
|
raise Error::ErrorAlerts, :internal_error if binary.nil?
|
128
120
|
return nil if binary.length < 2
|
@@ -145,8 +137,8 @@ module TTTLS13
|
|
145
137
|
obfuscated_ticket_age = Convert.bin2i(binary.slice(i, 4))
|
146
138
|
i += 4
|
147
139
|
identities << PskIdentity.new(
|
148
|
-
identity
|
149
|
-
obfuscated_ticket_age:
|
140
|
+
identity:,
|
141
|
+
obfuscated_ticket_age:
|
150
142
|
)
|
151
143
|
end
|
152
144
|
|
@@ -164,22 +156,18 @@ module TTTLS13
|
|
164
156
|
end
|
165
157
|
return nil unless i == binary.length
|
166
158
|
|
167
|
-
OfferedPsks.new(identities
|
159
|
+
OfferedPsks.new(identities:, binders:)
|
168
160
|
end
|
169
161
|
# rubocop: enable Metrics/AbcSize
|
170
|
-
# rubocop: enable Metrics/CyclomaticComplexity
|
171
162
|
# rubocop: enable Metrics/MethodLength
|
172
|
-
# rubocop: enable Metrics/PerceivedComplexity
|
173
163
|
end
|
174
164
|
|
175
|
-
# NOTE:
|
176
165
|
# struct {
|
177
166
|
# opaque identity<1..2^16-1>;
|
178
167
|
# uint32 obfuscated_ticket_age;
|
179
168
|
# } PskIdentity;
|
180
169
|
class PskIdentity
|
181
|
-
attr_reader :identity
|
182
|
-
attr_reader :obfuscated_ticket_age
|
170
|
+
attr_reader :identity, :obfuscated_ticket_age
|
183
171
|
|
184
172
|
# @param identity [String]
|
185
173
|
# @param obfuscated_ticket_age [Integer]
|
@@ -9,7 +9,6 @@ module TTTLS13
|
|
9
9
|
HOST_NAME = "\x00"
|
10
10
|
end
|
11
11
|
|
12
|
-
# NOTE:
|
13
12
|
# The extension_data field SHALL be empty when @server_name is empty.
|
14
13
|
# Then, serialized extension_data is
|
15
14
|
#
|
@@ -17,8 +16,7 @@ module TTTLS13
|
|
17
16
|
#
|
18
17
|
# https://datatracker.ietf.org/doc/html/rfc6066#section-3
|
19
18
|
class ServerName
|
20
|
-
attr_reader :extension_type
|
21
|
-
attr_reader :server_name
|
19
|
+
attr_reader :extension_type, :server_name
|
22
20
|
|
23
21
|
# @param server_name [String]
|
24
22
|
#
|
@@ -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)
|
@@ -5,7 +5,7 @@ module TTTLS13
|
|
5
5
|
module Message
|
6
6
|
module Extension
|
7
7
|
class SignatureAlgorithmsCert < SignatureAlgorithms
|
8
|
-
# @param
|
8
|
+
# @param supported_signature_algorithms [Array] Array of SignatureScheme
|
9
9
|
def initialize(supported_signature_algorithms)
|
10
10
|
super(supported_signature_algorithms)
|
11
11
|
@extension_type = ExtensionType::SIGNATURE_ALGORITHMS_CERT
|
@@ -10,9 +10,7 @@ module TTTLS13
|
|
10
10
|
end
|
11
11
|
|
12
12
|
class OCSPStatusRequest
|
13
|
-
attr_reader :extension_type
|
14
|
-
attr_reader :responder_id_list
|
15
|
-
attr_reader :request_extensions
|
13
|
+
attr_reader :extension_type, :responder_id_list, :request_extensions
|
16
14
|
|
17
15
|
# @param responder_id_list [Array of OpenSSL::ASN1::ASN1Data]
|
18
16
|
# @param request_extensions [Array of OpenSSL::ASN1::ASN1Data]
|
@@ -43,8 +41,6 @@ module TTTLS13
|
|
43
41
|
# @raise [TTTLS13::Error::ErrorAlerts]
|
44
42
|
#
|
45
43
|
# @return [TTTLS13::Message::Extension::OCSPStatusRequest, nil]
|
46
|
-
# rubocop: disable Metrics/CyclomaticComplexity
|
47
|
-
# rubocop: disable Metrics/PerceivedComplexity
|
48
44
|
def self.deserialize(binary)
|
49
45
|
raise Error::ErrorAlerts, :internal_error if binary.nil?
|
50
46
|
return nil if binary.length < 5 ||
|
@@ -71,12 +67,9 @@ module TTTLS13
|
|
71
67
|
i += re_len
|
72
68
|
return nil unless i == binary.length
|
73
69
|
|
74
|
-
OCSPStatusRequest.new(responder_id_list
|
75
|
-
request_extensions:
|
70
|
+
OCSPStatusRequest.new(responder_id_list:,
|
71
|
+
request_extensions:)
|
76
72
|
end
|
77
|
-
# rubocop: enable Metrics/CyclomaticComplexity
|
78
|
-
# rubocop: enable Metrics/PerceivedComplexity
|
79
|
-
|
80
73
|
class << self
|
81
74
|
private
|
82
75
|
|
@@ -111,8 +104,7 @@ module TTTLS13
|
|
111
104
|
end
|
112
105
|
|
113
106
|
class OCSPResponse
|
114
|
-
attr_reader :extension_type
|
115
|
-
attr_reader :ocsp_response
|
107
|
+
attr_reader :extension_type, :ocsp_response
|
116
108
|
|
117
109
|
# @param ocsp_response [OpenSSL::OCSP::Response]
|
118
110
|
#
|
@@ -6,8 +6,7 @@ module TTTLS13
|
|
6
6
|
module Message
|
7
7
|
module Extension
|
8
8
|
class SupportedGroups
|
9
|
-
attr_reader :extension_type
|
10
|
-
attr_reader :named_group_list
|
9
|
+
attr_reader :extension_type, :named_group_list
|
11
10
|
|
12
11
|
# @param named_group_list [Array of NamedGroup]
|
13
12
|
#
|
@@ -31,7 +30,6 @@ module TTTLS13
|
|
31
30
|
# @raise [TTTLS13::Error::ErrorAlerts]
|
32
31
|
#
|
33
32
|
# @return [TTTLS13::Message::Extension::SupportedGroups, nil]
|
34
|
-
# rubocop: disable Metrics/CyclomaticComplexity
|
35
33
|
def self.deserialize(binary)
|
36
34
|
raise Error::ErrorAlerts, :internal_error if binary.nil?
|
37
35
|
|
@@ -51,7 +49,6 @@ module TTTLS13
|
|
51
49
|
|
52
50
|
SupportedGroups.new(named_group_list)
|
53
51
|
end
|
54
|
-
# rubocop: enable Metrics/CyclomaticComplexity
|
55
52
|
end
|
56
53
|
end
|
57
54
|
end
|
@@ -6,15 +6,12 @@ module TTTLS13
|
|
6
6
|
module Message
|
7
7
|
module Extension
|
8
8
|
class SupportedVersions
|
9
|
-
attr_reader :extension_type
|
10
|
-
attr_reader :msg_type
|
11
|
-
attr_reader :versions
|
9
|
+
attr_reader :extension_type, :msg_type, :versions
|
12
10
|
|
13
11
|
# @param msg_type [TTTLS13::Message::ContentType]
|
14
12
|
# @param versions [Array of ProtocolVersion]
|
15
13
|
#
|
16
14
|
# @raise [TTTLS13::Error::ErrorAlerts]
|
17
|
-
# rubocop: disable Metrics/CyclomaticComplexity
|
18
15
|
def initialize(msg_type:, versions: DEFAULT_VERSIONS)
|
19
16
|
@extension_type = ExtensionType::SUPPORTED_VERSIONS
|
20
17
|
@msg_type = msg_type
|
@@ -30,7 +27,6 @@ module TTTLS13
|
|
30
27
|
raise Error::ErrorAlerts, :internal_error
|
31
28
|
end
|
32
29
|
end
|
33
|
-
# rubocop: enable Metrics/CyclomaticComplexity
|
34
30
|
|
35
31
|
# @return [String]
|
36
32
|
def serialize
|
@@ -64,7 +60,7 @@ module TTTLS13
|
|
64
60
|
else
|
65
61
|
return nil
|
66
62
|
end
|
67
|
-
SupportedVersions.new(msg_type
|
63
|
+
SupportedVersions.new(msg_type:, versions:)
|
68
64
|
end
|
69
65
|
|
70
66
|
# @param binary [String]
|
@@ -72,7 +68,6 @@ module TTTLS13
|
|
72
68
|
# @raise [TTTLS13::Error::ErrorAlerts]
|
73
69
|
#
|
74
70
|
# @return [Array of String, nil]
|
75
|
-
# rubocop: disable Metrics/CyclomaticComplexity
|
76
71
|
def self.deserialize_versions(binary)
|
77
72
|
raise Error::ErrorAlerts, :internal_error if binary.nil?
|
78
73
|
|
@@ -91,7 +86,6 @@ module TTTLS13
|
|
91
86
|
|
92
87
|
versions
|
93
88
|
end
|
94
|
-
# rubocop: enable Metrics/CyclomaticComplexity
|
95
89
|
end
|
96
90
|
end
|
97
91
|
end
|
@@ -5,12 +5,10 @@ module TTTLS13
|
|
5
5
|
using Refinements
|
6
6
|
module Message
|
7
7
|
module Extension
|
8
|
-
# NOTE:
|
9
8
|
# Client/Server MUST ignore unrecognized extensions,
|
10
9
|
# but transcript MUST include unrecognized extensions.
|
11
10
|
class UnknownExtension
|
12
|
-
attr_reader :extension_type
|
13
|
-
attr_reader :extension_data
|
11
|
+
attr_reader :extension_type, :extension_data
|
14
12
|
|
15
13
|
# @param extension_type [String]
|
16
14
|
# @param extension_data [String]
|
@@ -29,7 +27,7 @@ module TTTLS13
|
|
29
27
|
#
|
30
28
|
# @return [TTTLS13::Message::Extension::UnknownExtension]
|
31
29
|
def self.deserialize(binary, extension_type)
|
32
|
-
UnknownExtension.new(extension_type
|
30
|
+
UnknownExtension.new(extension_type:,
|
33
31
|
extension_data: binary)
|
34
32
|
end
|
35
33
|
end
|
@@ -21,7 +21,6 @@ module TTTLS13
|
|
21
21
|
|
22
22
|
alias super_fetch fetch
|
23
23
|
|
24
|
-
# NOTE:
|
25
24
|
# "pre_shared_key" MUST be the last extension in the ClientHello
|
26
25
|
#
|
27
26
|
# @return [String]
|
@@ -44,8 +43,6 @@ module TTTLS13
|
|
44
43
|
# @raise [TTTLS13::Error::ErrorAlerts]
|
45
44
|
#
|
46
45
|
# @return [TTTLS13::Message::Extensions]
|
47
|
-
# rubocop: disable Metrics/CyclomaticComplexity
|
48
|
-
# rubocop: disable Metrics/PerceivedComplexity
|
49
46
|
def self.deserialize(binary, msg_type)
|
50
47
|
raise Error::ErrorAlerts, :internal_error if binary.nil?
|
51
48
|
|
@@ -65,7 +62,7 @@ module TTTLS13
|
|
65
62
|
ex = deserialize_extension(ex_bin, extension_type, msg_type)
|
66
63
|
if ex.nil?
|
67
64
|
# ignore unparsable binary, but only transcript
|
68
|
-
ex = Extension::UnknownExtension.new(extension_type
|
65
|
+
ex = Extension::UnknownExtension.new(extension_type:,
|
69
66
|
extension_data: ex_bin)
|
70
67
|
end
|
71
68
|
|
@@ -81,8 +78,6 @@ module TTTLS13
|
|
81
78
|
|
82
79
|
exs
|
83
80
|
end
|
84
|
-
# rubocop: enable Metrics/CyclomaticComplexity
|
85
|
-
# rubocop: enable Metrics/PerceivedComplexity
|
86
81
|
|
87
82
|
# @param key [TTTLS13::Message::ExtensionType]
|
88
83
|
# @param default
|
@@ -136,7 +131,6 @@ module TTTLS13
|
|
136
131
|
class << self
|
137
132
|
private
|
138
133
|
|
139
|
-
# NOTE:
|
140
134
|
# deserialize_extension ignores unparsable extension.
|
141
135
|
# Received unparsable binary, returns nil, doesn't raise
|
142
136
|
# ErrorAlerts :decode_error.
|
@@ -151,7 +145,6 @@ module TTTLS13
|
|
151
145
|
# rubocop: disable Metrics/AbcSize
|
152
146
|
# rubocop: disable Metrics/CyclomaticComplexity
|
153
147
|
# rubocop: disable Metrics/MethodLength
|
154
|
-
# rubocop: disable Metrics/PerceivedComplexity
|
155
148
|
def deserialize_extension(binary, extension_type, msg_type)
|
156
149
|
raise Error::ErrorAlerts, :internal_error if binary.nil?
|
157
150
|
|
@@ -210,7 +203,6 @@ module TTTLS13
|
|
210
203
|
# rubocop: enable Metrics/AbcSize
|
211
204
|
# rubocop: enable Metrics/CyclomaticComplexity
|
212
205
|
# rubocop: enable Metrics/MethodLength
|
213
|
-
# rubocop: enable Metrics/PerceivedComplexity
|
214
206
|
end
|
215
207
|
end
|
216
208
|
# rubocop: enable Metrics/ClassLength
|
@@ -11,13 +11,7 @@ module TTTLS13
|
|
11
11
|
private_constant :APPEARABLE_NST_EXTENSIONS
|
12
12
|
|
13
13
|
class NewSessionTicket
|
14
|
-
attr_reader :msg_type
|
15
|
-
attr_reader :ticket_lifetime
|
16
|
-
attr_reader :ticket_age_add
|
17
|
-
attr_reader :ticket_nonce
|
18
|
-
attr_reader :ticket
|
19
|
-
attr_reader :extensions
|
20
|
-
attr_reader :timestamp
|
14
|
+
attr_reader :msg_type, :ticket_lifetime, :ticket_age_add, :ticket_nonce, :ticket, :extensions, :timestamp
|
21
15
|
|
22
16
|
# @param ticket_lifetime [Integer]
|
23
17
|
# @param ticket_age_add [String]
|
@@ -83,11 +77,11 @@ module TTTLS13
|
|
83
77
|
raise Error::ErrorAlerts, :decode_error unless i == msg_len + 4 &&
|
84
78
|
i == binary.length
|
85
79
|
|
86
|
-
NewSessionTicket.new(ticket_lifetime
|
87
|
-
ticket_age_add
|
88
|
-
ticket_nonce
|
89
|
-
ticket
|
90
|
-
extensions:
|
80
|
+
NewSessionTicket.new(ticket_lifetime:,
|
81
|
+
ticket_age_add:,
|
82
|
+
ticket_nonce:,
|
83
|
+
ticket:,
|
84
|
+
extensions:)
|
91
85
|
end
|
92
86
|
# rubocop: enable Metrics/AbcSize
|
93
87
|
|
@@ -8,26 +8,20 @@ module TTTLS13
|
|
8
8
|
|
9
9
|
# rubocop: disable Metrics/ClassLength
|
10
10
|
class Record
|
11
|
-
attr_reader :type
|
12
|
-
attr_reader :legacy_record_version
|
13
|
-
attr_reader :messages
|
14
|
-
attr_reader :cipher
|
11
|
+
attr_reader :type, :legacy_record_version, :messages, :cipher
|
15
12
|
|
16
13
|
# @param type [TTTLS13::Message::ContentType]
|
17
14
|
# @param legacy_record_version [TTTLS13::Message::ProtocolVersion]
|
18
15
|
# @param messages [Array of TTTLS13::Message::$Object]
|
19
16
|
# @param cipher [TTTLS13::Cryptograph::$Object]
|
20
17
|
def initialize(type:,
|
21
|
-
legacy_record_version: ProtocolVersion::TLS_1_2
|
22
|
-
messages:,
|
23
|
-
cipher:)
|
18
|
+
messages:, cipher:, legacy_record_version: ProtocolVersion::TLS_1_2)
|
24
19
|
@type = type
|
25
20
|
@legacy_record_version = legacy_record_version
|
26
21
|
@messages = messages
|
27
22
|
@cipher = cipher
|
28
23
|
end
|
29
24
|
|
30
|
-
# NOTE:
|
31
25
|
# serialize joins messages.
|
32
26
|
# If serialize is received Server Parameters(EE, CT, CV),
|
33
27
|
# it returns one binary.
|
@@ -50,7 +44,6 @@ module TTTLS13
|
|
50
44
|
end.join
|
51
45
|
end
|
52
46
|
|
53
|
-
# NOTE:
|
54
47
|
# If previous Record has surplus_binary,
|
55
48
|
# surplus_binary should is given to Record.deserialize as buffered.
|
56
49
|
#
|
@@ -65,8 +58,6 @@ module TTTLS13
|
|
65
58
|
# @return [Array of String]
|
66
59
|
# @return [String]
|
67
60
|
# rubocop: disable Metrics/AbcSize
|
68
|
-
# rubocop: disable Metrics/CyclomaticComplexity
|
69
|
-
# rubocop: disable Metrics/PerceivedComplexity
|
70
61
|
def self.deserialize(binary, cipher, buffered = '',
|
71
62
|
record_size_limit = DEFAULT_RECORD_SIZE_LIMIT)
|
72
63
|
raise Error::ErrorAlerts, :internal_error if binary.nil?
|
@@ -84,9 +75,7 @@ module TTTLS13
|
|
84
75
|
unless binary.length == 5 + fragment_len
|
85
76
|
|
86
77
|
if type == ContentType::APPLICATION_DATA
|
87
|
-
if fragment.length - cipher.auth_tag_len > record_size_limit
|
88
|
-
raise Error::ErrorAlerts, :record_overflow
|
89
|
-
end
|
78
|
+
raise Error::ErrorAlerts, :record_overflow if fragment.length - cipher.auth_tag_len > record_size_limit
|
90
79
|
|
91
80
|
fragment, inner_type = cipher.decrypt(fragment, binary.slice(0, 5))
|
92
81
|
end
|
@@ -96,16 +85,14 @@ module TTTLS13
|
|
96
85
|
inner_type || type
|
97
86
|
)
|
98
87
|
record = Record.new(
|
99
|
-
type
|
100
|
-
legacy_record_version
|
101
|
-
messages
|
102
|
-
cipher:
|
88
|
+
type:,
|
89
|
+
legacy_record_version:,
|
90
|
+
messages:,
|
91
|
+
cipher:
|
103
92
|
)
|
104
93
|
[record, orig_msgs, surplus_binary]
|
105
94
|
end
|
106
95
|
# rubocop: enable Metrics/AbcSize
|
107
|
-
# rubocop: enable Metrics/CyclomaticComplexity
|
108
|
-
# rubocop: enable Metrics/PerceivedComplexity
|
109
96
|
|
110
97
|
private
|
111
98
|
|
@@ -124,11 +111,11 @@ module TTTLS13
|
|
124
111
|
Message::EndOfEarlyData,
|
125
112
|
Message::NewSessionTicket].include?(m.class)
|
126
113
|
ContentType::HANDSHAKE
|
127
|
-
elsif m.
|
114
|
+
elsif m.instance_of?(ChangeCipherSpec)
|
128
115
|
ContentType::CCS
|
129
|
-
elsif m.
|
116
|
+
elsif m.instance_of?(Message::ApplicationData)
|
130
117
|
ContentType::APPLICATION_DATA
|
131
|
-
elsif m.
|
118
|
+
elsif m.instance_of?(Message::Alert)
|
132
119
|
ContentType::ALERT
|
133
120
|
else
|
134
121
|
raise Error::ErrorAlerts, :internal_error
|
@@ -214,7 +201,6 @@ module TTTLS13
|
|
214
201
|
# @raise [TTTLS13::Error::ErrorAlerts]
|
215
202
|
#
|
216
203
|
# @return [Array of TTTLS13::Message::$Object]
|
217
|
-
# rubocop: disable Metrics/CyclomaticComplexity
|
218
204
|
def do_deserialize_handshake(binary)
|
219
205
|
raise Error::ErrorAlerts, :internal_error if binary.nil?
|
220
206
|
raise Error::ErrorAlerts, :decode_error if binary.empty?
|
@@ -242,7 +228,6 @@ module TTTLS13
|
|
242
228
|
raise Error::ErrorAlerts, :unexpected_message
|
243
229
|
end
|
244
230
|
end
|
245
|
-
# rubocop: enable Metrics/CyclomaticComplexity
|
246
231
|
end
|
247
232
|
end
|
248
233
|
# rubocop: enable Metrics/ClassLength
|