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.
Files changed (73) 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 +3 -3
  6. data/README.md +4 -4
  7. data/Rakefile +3 -3
  8. data/example/helper.rb +1 -1
  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 +86 -73
  22. data/lib/tttls1.3/connection.rb +6 -15
  23. data/lib/tttls1.3/cryptograph/aead.rb +26 -16
  24. data/lib/tttls1.3/ech.rb +11 -15
  25. data/lib/tttls1.3/endpoint.rb +4 -25
  26. data/lib/tttls1.3/key_schedule.rb +1 -1
  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/certificate.rb +4 -7
  30. data/lib/tttls1.3/message/certificate_verify.rb +3 -5
  31. data/lib/tttls1.3/message/client_hello.rb +9 -15
  32. data/lib/tttls1.3/message/compressed_certificate.rb +3 -9
  33. data/lib/tttls1.3/message/encrypted_extensions.rb +1 -2
  34. data/lib/tttls1.3/message/extension/alpn.rb +1 -6
  35. data/lib/tttls1.3/message/extension/compress_certificate.rb +1 -2
  36. data/lib/tttls1.3/message/extension/cookie.rb +1 -2
  37. data/lib/tttls1.3/message/extension/early_data_indication.rb +1 -2
  38. data/lib/tttls1.3/message/extension/ech.rb +9 -16
  39. data/lib/tttls1.3/message/extension/ech_outer_extensions.rb +1 -2
  40. data/lib/tttls1.3/message/extension/key_share.rb +17 -43
  41. data/lib/tttls1.3/message/extension/pre_shared_key.rb +8 -17
  42. data/lib/tttls1.3/message/extension/psk_key_exchange_modes.rb +1 -2
  43. data/lib/tttls1.3/message/extension/record_size_limit.rb +1 -2
  44. data/lib/tttls1.3/message/extension/server_name.rb +1 -2
  45. data/lib/tttls1.3/message/extension/signature_algorithms.rb +1 -2
  46. data/lib/tttls1.3/message/extension/status_request.rb +4 -12
  47. data/lib/tttls1.3/message/extension/supported_groups.rb +1 -4
  48. data/lib/tttls1.3/message/extension/supported_versions.rb +2 -8
  49. data/lib/tttls1.3/message/extension/unknown_extension.rb +2 -3
  50. data/lib/tttls1.3/message/extensions.rb +1 -7
  51. data/lib/tttls1.3/message/finished.rb +1 -2
  52. data/lib/tttls1.3/message/new_session_ticket.rb +6 -12
  53. data/lib/tttls1.3/message/record.rb +10 -23
  54. data/lib/tttls1.3/message/server_hello.rb +10 -21
  55. data/lib/tttls1.3/named_group.rb +12 -6
  56. data/lib/tttls1.3/server.rb +39 -34
  57. data/lib/tttls1.3/shared_secret.rb +118 -0
  58. data/lib/tttls1.3/utils.rb +0 -15
  59. data/lib/tttls1.3/version.rb +1 -1
  60. data/lib/tttls1.3.rb +1 -1
  61. data/spec/certificate_verify_spec.rb +1 -1
  62. data/spec/client_hello_spec.rb +4 -4
  63. data/spec/client_spec.rb +13 -13
  64. data/spec/endpoint_spec.rb +11 -11
  65. data/spec/key_schedule_spec.rb +4 -4
  66. data/spec/new_session_ticket_spec.rb +4 -4
  67. data/spec/pre_shared_key_spec.rb +8 -8
  68. data/spec/record_spec.rb +1 -1
  69. data/spec/server_hello_spec.rb +5 -5
  70. data/spec/server_spec.rb +8 -8
  71. data/tttls1.3.gemspec +2 -2
  72. metadata +7 -10
  73. data/example/https_client_using_grease_psk.rb +0 -58
@@ -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: cipher_suite,
30
- write_key: write_key,
31
- write_iv: 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: digest, finished_key: finished_key, hash: hash) \
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(psk: nil, shared_secret:, cipher_suite:, transcript:)
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)
@@ -8,7 +8,7 @@ module TTTLS13
8
8
  end
9
9
 
10
10
  def self.logger
11
- @logger ||= Logger.new(STDERR, Logger::WARN)
11
+ @logger ||= Logger.new($stderr, Logger::WARN)
12
12
  end
13
13
  end
14
14
  end
@@ -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, description:)
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: level, description: description)
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: certificate_request_context,
64
- certificate_list: 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: signature_scheme,
55
- signature: 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
- attr_reader :legacy_version
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: legacy_version,
122
- random: random,
123
- legacy_session_id: legacy_session_id,
124
- cipher_suites: cipher_suites,
125
- legacy_compression_methods: legacy_compression_methods,
126
- extensions: 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: certificate_message,
74
- algorithm: 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
  #
@@ -6,8 +6,7 @@ module TTTLS13
6
6
  module Message
7
7
  module Extension
8
8
  class Cookie
9
- attr_reader :extension_type
10
- attr_reader :cookie
9
+ attr_reader :extension_type, :cookie
11
10
 
12
11
  # @param cookie [String]
13
12
  #
@@ -6,8 +6,7 @@ module TTTLS13
6
6
  module Message
7
7
  module Extension
8
8
  class EarlyDataIndication
9
- attr_reader :extension_type
10
- attr_reader :max_early_data_size
9
+ attr_reader :extension_type, :max_early_data_size
11
10
 
12
11
  # @param max_early_data_size [Integer, nil]
13
12
  #
@@ -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: enc,
129
- payload: 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: cipher_suite,
160
- config_id: config_id,
161
- enc: enc,
162
- payload: 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: 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
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
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]
@@ -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: group,
172
- key_exchange: 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: group, key_exchange: key_exchange)]
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: 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: 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: 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: identity,
147
- obfuscated_ticket_age: 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: identities, binders: binders)
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]
@@ -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
  #
@@ -16,8 +16,7 @@ module TTTLS13
16
16
  #
17
17
  # https://datatracker.ietf.org/doc/html/rfc6066#section-3
18
18
  class ServerName
19
- attr_reader :extension_type
20
- attr_reader :server_name
19
+ attr_reader :extension_type, :server_name
21
20
 
22
21
  # @param server_name [String]
23
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)