Class: TTTLS13::KeySchedule

Inherits:
Object
  • Object
show all
Defined in:
lib/tttls1.3/key_schedule.rb

Overview

rubocop: disable Metrics/ClassLength

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(psk: nil, shared_secret:, cipher_suite:, transcript:) ⇒ KeySchedule

Returns a new instance of KeySchedule.

Parameters:



12
13
14
15
16
17
18
19
20
# File 'lib/tttls1.3/key_schedule.rb', line 12

def initialize(psk: nil, shared_secret:, cipher_suite:, transcript:)
  @digest = CipherSuite.digest(cipher_suite)
  @hash_len = CipherSuite.hash_len(cipher_suite)
  @key_len = CipherSuite.key_len(cipher_suite)
  @iv_len = CipherSuite.iv_len(cipher_suite)
  @psk = psk || "\x00" * @hash_len
  @shared_secret = shared_secret
  @transcript = transcript
end

Class Method Details

.hkdf_expand(secret, info, length, digest) ⇒ Object

Parameters:

  • secret (String)
  • info (String)
  • length (Integer)
  • digest (String)

    name of digest algorithm

  • (String)

Raises:



254
255
256
257
258
259
260
261
262
263
264
265
266
# File 'lib/tttls1.3/key_schedule.rb', line 254

def self.hkdf_expand(secret, info, length, digest)
  hash_len = OpenSSL::Digest.new(digest).digest_length
  raise Error::ErrorAlerts, :internal_error if length > 255 * hash_len

  n = (length.to_f / hash_len).ceil
  okm = ''
  t = ''
  (1..n).each do |i|
    t = OpenSSL::HMAC.digest(digest, secret, t + info + i.chr)
    okm += t
  end
  okm[0...length]
end

.hkdf_expand_label(secret, label, context, length, digest) ⇒ String

Parameters:

  • secret (String)
  • label (String)
  • context (String)
  • length (Integer)
  • digest (String)

    name of digest algorithm

Returns:

  • (String)


239
240
241
242
243
244
# File 'lib/tttls1.3/key_schedule.rb', line 239

def self.hkdf_expand_label(secret, label, context, length, digest)
  binary = length.to_uint16
  binary += ('tls13 ' + label).prefix_uint8_length
  binary += context.prefix_uint8_length
  hkdf_expand(secret, binary, length, digest)
end

Instance Method Details

#binder_key_extString

Returns:

  • (String)


33
34
35
36
37
# File 'lib/tttls1.3/key_schedule.rb', line 33

def binder_key_ext
  hash = OpenSSL::Digest.digest(@digest, '')
  base_key = derive_secret(early_secret, 'ext binder', hash)
  self.class.hkdf_expand_label(base_key, 'finished', '', @hash_len, @digest)
end

#binder_key_resString

Returns:

  • (String)


40
41
42
43
44
# File 'lib/tttls1.3/key_schedule.rb', line 40

def binder_key_res
  hash = OpenSSL::Digest.digest(@digest, '')
  base_key = derive_secret(early_secret, 'res binder', hash)
  self.class.hkdf_expand_label(base_key, 'finished', '', @hash_len, @digest)
end

#client_application_traffic_secretString

Returns:

  • (String)


163
164
165
166
# File 'lib/tttls1.3/key_schedule.rb', line 163

def client_application_traffic_secret
  hash = @transcript.hash(@digest, SF)
  derive_secret(main_secret, 'c ap traffic', hash)
end

#client_application_write_ivString

Returns:

  • (String)


175
176
177
178
# File 'lib/tttls1.3/key_schedule.rb', line 175

def client_application_write_iv
  secret = client_application_traffic_secret
  self.class.hkdf_expand_label(secret, 'iv', '', @iv_len, @digest)
end

#client_application_write_keyString

Returns:

  • (String)


169
170
171
172
# File 'lib/tttls1.3/key_schedule.rb', line 169

def client_application_write_key
  secret = client_application_traffic_secret
  self.class.hkdf_expand_label(secret, 'key', '', @key_len, @digest)
end

#client_early_traffic_secretString

Returns:

  • (String)


47
48
49
50
# File 'lib/tttls1.3/key_schedule.rb', line 47

def client_early_traffic_secret
  hash = @transcript.hash(@digest, CH)
  derive_secret(early_secret, 'c e traffic', hash)
end

#client_finished_keyString

Returns:

  • (String)


95
96
97
98
# File 'lib/tttls1.3/key_schedule.rb', line 95

def client_finished_key
  secret = client_handshake_traffic_secret
  self.class.hkdf_expand_label(secret, 'finished', '', @hash_len, @digest)
end

#client_handshake_traffic_secretString

Returns:

  • (String)


89
90
91
92
# File 'lib/tttls1.3/key_schedule.rb', line 89

def client_handshake_traffic_secret
  hash = @transcript.hash(@digest, SH)
  derive_secret(handshake_secret, 'c hs traffic', hash)
end

#client_handshake_write_ivString

Returns:

  • (String)


107
108
109
110
# File 'lib/tttls1.3/key_schedule.rb', line 107

def client_handshake_write_iv
  secret = client_handshake_traffic_secret
  self.class.hkdf_expand_label(secret, 'iv', '', @iv_len, @digest)
end

#client_handshake_write_keyString

Returns:

  • (String)


101
102
103
104
# File 'lib/tttls1.3/key_schedule.rb', line 101

def client_handshake_write_key
  secret = client_handshake_traffic_secret
  self.class.hkdf_expand_label(secret, 'key', '', @key_len, @digest)
end

#derive_secret(secret, label, context) ⇒ String

Parameters:

  • secret (String)
  • label (String)
  • context (String)

Returns:

  • (String)


273
274
275
# File 'lib/tttls1.3/key_schedule.rb', line 273

def derive_secret(secret, label, context)
  self.class.hkdf_expand_label(secret, label, context, @hash_len, @digest)
end

#early_data_write_ivString

Returns:

  • (String)


59
60
61
62
# File 'lib/tttls1.3/key_schedule.rb', line 59

def early_data_write_iv
  secret = client_early_traffic_secret
  self.class.hkdf_expand_label(secret, 'iv', '', @iv_len, @digest)
end

#early_data_write_keyString

Returns:

  • (String)


53
54
55
56
# File 'lib/tttls1.3/key_schedule.rb', line 53

def early_data_write_key
  secret = client_early_traffic_secret
  self.class.hkdf_expand_label(secret, 'key', '', @key_len, @digest)
end

#early_exporter_master_secretString

Deprecated.

Please use 'early_exporter_secret` instead

Returns:

  • (String)


67
68
69
# File 'lib/tttls1.3/key_schedule.rb', line 67

def early_exporter_master_secret
  early_exporter_secret
end

#early_exporter_secretString

Returns:

  • (String)


72
73
74
75
# File 'lib/tttls1.3/key_schedule.rb', line 72

def early_exporter_secret
  hash = OpenSSL::Digest.digest(@digest, '')
  derive_secret(early_secret, 'e exp master', hash)
end

#early_saltString

Returns:

  • (String)


23
24
25
# File 'lib/tttls1.3/key_schedule.rb', line 23

def early_salt
  "\x00" * @hash_len
end

#early_secretString

Returns:

  • (String)


28
29
30
# File 'lib/tttls1.3/key_schedule.rb', line 28

def early_secret
  hkdf_extract(@psk, early_salt)
end

#exporter_master_secretString

Deprecated.

Please use 'exporter_secret` instead

Returns:

  • (String)


201
202
203
# File 'lib/tttls1.3/key_schedule.rb', line 201

def exporter_master_secret
  exporter_secret
end

#exporter_secretString

Returns:

  • (String)


206
207
208
209
# File 'lib/tttls1.3/key_schedule.rb', line 206

def exporter_secret
  hash = @transcript.hash(@digest, SF)
  derive_secret(main_secret, 'exp master', hash)
end

#handshake_saltString

Returns:

  • (String)


78
79
80
81
# File 'lib/tttls1.3/key_schedule.rb', line 78

def handshake_salt
  hash = OpenSSL::Digest.digest(@digest, '')
  derive_secret(early_secret, 'derived', hash)
end

#handshake_secretString

Returns:

  • (String)


84
85
86
# File 'lib/tttls1.3/key_schedule.rb', line 84

def handshake_secret
  hkdf_extract(@shared_secret, handshake_salt)
end

#hkdf_extract(ikm, salt) ⇒ String

Parameters:

  • ikm (String)
  • salt (String)

Returns:

  • (String)


228
229
230
# File 'lib/tttls1.3/key_schedule.rb', line 228

def hkdf_extract(ikm, salt)
  OpenSSL::HMAC.digest(@digest, salt, ikm)
end

#main_saltString

Returns:

  • (String)


144
145
146
147
# File 'lib/tttls1.3/key_schedule.rb', line 144

def main_salt
  hash = OpenSSL::Digest.digest(@digest, '')
  derive_secret(handshake_secret, 'derived', hash)
end

#main_secretString

Returns:

  • (String)


157
158
159
160
# File 'lib/tttls1.3/key_schedule.rb', line 157

def main_secret
  ikm = "\x00" * @hash_len
  hkdf_extract(ikm, main_salt)
end

#master_saltString

Deprecated.

Please use 'main_salt` instead

Returns:

  • (String)


139
140
141
# File 'lib/tttls1.3/key_schedule.rb', line 139

def master_salt
  main_salt
end

#master_secretString

Deprecated.

Please use 'main_secret` instead

Returns:

  • (String)


152
153
154
# File 'lib/tttls1.3/key_schedule.rb', line 152

def master_secret
  main_secret
end

#resumption_master_secretString

Deprecated.

Please use 'resumption_secret` instead

Returns:

  • (String)


214
215
216
# File 'lib/tttls1.3/key_schedule.rb', line 214

def resumption_master_secret
  resumption_secret
end

#resumption_secretString

Returns:

  • (String)


219
220
221
222
# File 'lib/tttls1.3/key_schedule.rb', line 219

def resumption_secret
  hash = @transcript.hash(@digest, CF)
  derive_secret(main_secret, 'res master', hash)
end

#server_application_traffic_secretString

Returns:

  • (String)


181
182
183
184
# File 'lib/tttls1.3/key_schedule.rb', line 181

def server_application_traffic_secret
  hash = @transcript.hash(@digest, SF)
  derive_secret(main_secret, 's ap traffic', hash)
end

#server_application_write_ivString

Returns:

  • (String)


193
194
195
196
# File 'lib/tttls1.3/key_schedule.rb', line 193

def server_application_write_iv
  secret = server_application_traffic_secret
  self.class.hkdf_expand_label(secret, 'iv', '', @iv_len, @digest)
end

#server_application_write_keyString

Returns:

  • (String)


187
188
189
190
# File 'lib/tttls1.3/key_schedule.rb', line 187

def server_application_write_key
  secret = server_application_traffic_secret
  self.class.hkdf_expand_label(secret, 'key', '', @key_len, @digest)
end

#server_finished_keyString

Returns:

  • (String)


119
120
121
122
# File 'lib/tttls1.3/key_schedule.rb', line 119

def server_finished_key
  secret = server_handshake_traffic_secret
  self.class.hkdf_expand_label(secret, 'finished', '', @hash_len, @digest)
end

#server_handshake_traffic_secretString

Returns:

  • (String)


113
114
115
116
# File 'lib/tttls1.3/key_schedule.rb', line 113

def server_handshake_traffic_secret
  hash = @transcript.hash(@digest, SH)
  derive_secret(handshake_secret, 's hs traffic', hash)
end

#server_handshake_write_ivString

Returns:

  • (String)


131
132
133
134
# File 'lib/tttls1.3/key_schedule.rb', line 131

def server_handshake_write_iv
  secret = server_handshake_traffic_secret
  self.class.hkdf_expand_label(secret, 'iv', '', @iv_len, @digest)
end

#server_handshake_write_keyString

Returns:

  • (String)


125
126
127
128
# File 'lib/tttls1.3/key_schedule.rb', line 125

def server_handshake_write_key
  secret = server_handshake_traffic_secret
  self.class.hkdf_expand_label(secret, 'key', '', @key_len, @digest)
end