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
@@ -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::ContentType]
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: msg_type,
82
- key_share_entry: 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 [Hash of NamedGroup => OpenSSL::PKey::EC.$Object]
81
+ # @return [TTTLS13::SharedSecret]
90
82
  def self.gen_ch_key_share(groups)
91
- priv_keys = {}
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: kse
86
+ key_share_entry: shared_secret.key_share_entries
106
87
  )
107
88
 
108
- [key_share, priv_keys]
89
+ [key_share, shared_secret]
109
90
  end
110
91
 
111
- # @param groups [TTTLS13::NamedGroup]
92
+ # @param group [TTTLS13::NamedGroup]
112
93
  #
113
94
  # @return [TTTLS13::Message::Extensions::KeyShare]
114
- # @return [OpenSSL::PKey::EC.$Object]
95
+ # @return [TTTLS13::SharedSecret]
115
96
  def self.gen_sh_key_share(group)
116
- curve = NamedGroup.curve_name(group)
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, ec]
104
+ [key_share, shared_secret]
130
105
  end
131
106
 
132
- # @param groups [TTTLS13::NamedGroup]
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: 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: group,
173
- key_exchange: 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: group, key_exchange: key_exchange)]
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: 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: 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: 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: identity,
149
- obfuscated_ticket_age: 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: identities, binders: binders)
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]
@@ -11,8 +11,7 @@ module TTTLS13
11
11
  end
12
12
 
13
13
  class PskKeyExchangeModes
14
- attr_reader :extension_type
15
- attr_reader :ke_modes
14
+ attr_reader :extension_type, :ke_modes
16
15
 
17
16
  # @param ke_modes [Array of PskKeyExchangeMode]
18
17
  def initialize(ke_modes = [])
@@ -6,8 +6,7 @@ module TTTLS13
6
6
  module Message
7
7
  module Extension
8
8
  class RecordSizeLimit
9
- attr_reader :extension_type
10
- attr_reader :record_size_limit
9
+ attr_reader :extension_type, :record_size_limit
11
10
 
12
11
  # @param record_size_limit [Integer]
13
12
  #
@@ -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 versions [Array of SignatureScheme]
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: responder_id_list,
75
- request_extensions: 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: msg_type, versions: versions)
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: 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: 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
@@ -5,8 +5,7 @@ module TTTLS13
5
5
  using Refinements
6
6
  module Message
7
7
  class Finished
8
- attr_reader :msg_type
9
- attr_reader :verify_data
8
+ attr_reader :msg_type, :verify_data
10
9
 
11
10
  # @param verify_data [String]
12
11
  def initialize(verify_data)
@@ -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: ticket_lifetime,
87
- ticket_age_add: ticket_age_add,
88
- ticket_nonce: ticket_nonce,
89
- ticket: ticket,
90
- extensions: 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: type,
100
- legacy_record_version: legacy_record_version,
101
- messages: messages,
102
- cipher: 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.class == ChangeCipherSpec
114
+ elsif m.instance_of?(ChangeCipherSpec)
128
115
  ContentType::CCS
129
- elsif m.class == Message::ApplicationData
116
+ elsif m.instance_of?(Message::ApplicationData)
130
117
  ContentType::APPLICATION_DATA
131
- elsif m.class == Message::Alert
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