tttls1.3 0.2.6 → 0.2.7
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/lib/tttls1.3/client.rb +7 -8
- data/lib/tttls1.3/connection.rb +38 -0
- data/lib/tttls1.3/key_schedule.rb +18 -17
- data/lib/tttls1.3/server.rb +1 -0
- data/lib/tttls1.3/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c4d612bec845851394778f851e83cd26a402c28b28282eadf1630684781dbfad
|
4
|
+
data.tar.gz: 2b2ac159212b899dfd2f0281b756469033ab58ac57276a2c834166e9e1c1a659
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 902358ead54f4e37bcb6921f8ac26cb0d365ff90c96f8b1d148286a08a057af719989ed0b24d34e99e646965ca7dbfbcdf2b07d9f28b84d3e00e62d904d8ff3f
|
7
|
+
data.tar.gz: 33781ec8908342d9aa0670c1ce82516bd7a0fafbed7f49f470765b0d053883cee66b913fc14c060c83abe82dca863653ec7632efcbbcbc4b84dce577eef21764
|
data/lib/tttls1.3/client.rb
CHANGED
@@ -294,7 +294,7 @@ module TTTLS13
|
|
294
294
|
@state = ClientState::WAIT_CERT_CR
|
295
295
|
@state = ClientState::WAIT_FINISHED unless psk.nil?
|
296
296
|
when ClientState::WAIT_CERT_CR
|
297
|
-
logger.debug('ClientState::
|
297
|
+
logger.debug('ClientState::WAIT_CERT_CR')
|
298
298
|
|
299
299
|
message = recv_message(receivable_ccs: true, cipher: hs_rcipher)
|
300
300
|
if message.msg_type == Message::HandshakeType::CERTIFICATE
|
@@ -310,14 +310,14 @@ module TTTLS13
|
|
310
310
|
terminate(:unexpected_message)
|
311
311
|
end
|
312
312
|
when ClientState::WAIT_CERT
|
313
|
-
logger.debug('ClientState::
|
313
|
+
logger.debug('ClientState::WAIT_CERT')
|
314
314
|
|
315
315
|
ct = transcript[CT] = recv_certificate(hs_rcipher)
|
316
316
|
terminate_invalid_certificate(ct, transcript[CH])
|
317
317
|
|
318
318
|
@state = ClientState::WAIT_CV
|
319
319
|
when ClientState::WAIT_CV
|
320
|
-
logger.debug('ClientState::
|
320
|
+
logger.debug('ClientState::WAIT_CV')
|
321
321
|
|
322
322
|
cv = transcript[CV] = recv_certificate_verify(hs_rcipher)
|
323
323
|
digest = CipherSuite.digest(@cipher_suite)
|
@@ -329,7 +329,7 @@ module TTTLS13
|
|
329
329
|
|
330
330
|
@state = ClientState::WAIT_FINISHED
|
331
331
|
when ClientState::WAIT_FINISHED
|
332
|
-
logger.debug('ClientState::
|
332
|
+
logger.debug('ClientState::WAIT_FINISHED')
|
333
333
|
|
334
334
|
sf = transcript[SF] = recv_finished(hs_rcipher)
|
335
335
|
digest = CipherSuite.digest(@cipher_suite)
|
@@ -361,6 +361,7 @@ module TTTLS13
|
|
361
361
|
key_schedule.server_application_write_key,
|
362
362
|
key_schedule.server_application_write_iv
|
363
363
|
)
|
364
|
+
@exporter_master_secret = key_schedule.exporter_master_secret
|
364
365
|
@resumption_master_secret = key_schedule.resumption_master_secret
|
365
366
|
@state = ClientState::CONNECTED
|
366
367
|
when ClientState::CONNECTED
|
@@ -456,10 +457,8 @@ module TTTLS13
|
|
456
457
|
# @return [String]
|
457
458
|
def gen_psk_from_nst(resumption_master_secret, ticket_nonce, digest)
|
458
459
|
hash_len = OpenSSL::Digest.new(digest).digest_length
|
459
|
-
|
460
|
-
|
461
|
-
info += ticket_nonce.prefix_uint8_length
|
462
|
-
KeySchedule.hkdf_expand(resumption_master_secret, info, hash_len, digest)
|
460
|
+
KeySchedule.hkdf_expand_label(resumption_master_secret, 'resumption',
|
461
|
+
ticket_nonce, hash_len, digest)
|
463
462
|
end
|
464
463
|
|
465
464
|
# @return [TTTLS13::Message::Extensions]
|
data/lib/tttls1.3/connection.rb
CHANGED
@@ -24,6 +24,7 @@ module TTTLS13
|
|
24
24
|
@state = 0 # ClientState or ServerState
|
25
25
|
@send_record_size = Message::DEFAULT_RECORD_SIZE_LIMIT
|
26
26
|
@alpn = nil # String
|
27
|
+
@exporter_master_secret = nil # String
|
27
28
|
end
|
28
29
|
|
29
30
|
# @raise [TTTLS13::Error::ConfigError]
|
@@ -101,8 +102,45 @@ module TTTLS13
|
|
101
102
|
@alpn
|
102
103
|
end
|
103
104
|
|
105
|
+
# @param label [String]
|
106
|
+
# @param context [String]
|
107
|
+
# @param key_length [Integer]
|
108
|
+
#
|
109
|
+
# @return [String, nil]
|
110
|
+
def exporter(label, context, key_length)
|
111
|
+
return nil if @exporter_master_secret.nil? || @cipher_suite.nil?
|
112
|
+
|
113
|
+
digest = CipherSuite.digest(@cipher_suite)
|
114
|
+
do_exporter(@exporter_master_secret, digest, label, context, key_length)
|
115
|
+
end
|
116
|
+
|
104
117
|
private
|
105
118
|
|
119
|
+
# @param secret [String] (early_)exporter_master_secret
|
120
|
+
# @param digest [String] name of digest algorithm
|
121
|
+
# @param label [String]
|
122
|
+
# @param context [String]
|
123
|
+
# @param key_length [Integer]
|
124
|
+
#
|
125
|
+
# @return [String]
|
126
|
+
def do_exporter(secret, digest, label, context, key_length)
|
127
|
+
derived_secret = KeySchedule.hkdf_expand_label(
|
128
|
+
secret,
|
129
|
+
label,
|
130
|
+
OpenSSL::Digest.digest(digest, ''),
|
131
|
+
OpenSSL::Digest.new(digest).digest_length,
|
132
|
+
digest
|
133
|
+
)
|
134
|
+
|
135
|
+
KeySchedule.hkdf_expand_label(
|
136
|
+
derived_secret,
|
137
|
+
'exporter',
|
138
|
+
OpenSSL::Digest.digest(digest, context),
|
139
|
+
key_length,
|
140
|
+
digest
|
141
|
+
)
|
142
|
+
end
|
143
|
+
|
106
144
|
# @param cipher_suite [TTTLS13::CipherSuite]
|
107
145
|
# @param write_key [String]
|
108
146
|
# @param write_iv [String]
|
@@ -33,14 +33,14 @@ module TTTLS13
|
|
33
33
|
def binder_key_ext
|
34
34
|
hash = OpenSSL::Digest.digest(@digest, '')
|
35
35
|
base_key = derive_secret(early_secret, 'ext binder', hash)
|
36
|
-
hkdf_expand_label(base_key, 'finished', '', @hash_len)
|
36
|
+
self.class.hkdf_expand_label(base_key, 'finished', '', @hash_len, @digest)
|
37
37
|
end
|
38
38
|
|
39
39
|
# @return [String]
|
40
40
|
def binder_key_res
|
41
41
|
hash = OpenSSL::Digest.digest(@digest, '')
|
42
42
|
base_key = derive_secret(early_secret, 'res binder', hash)
|
43
|
-
hkdf_expand_label(base_key, 'finished', '', @hash_len)
|
43
|
+
self.class.hkdf_expand_label(base_key, 'finished', '', @hash_len, @digest)
|
44
44
|
end
|
45
45
|
|
46
46
|
# @return [String]
|
@@ -52,13 +52,13 @@ module TTTLS13
|
|
52
52
|
# @return [String]
|
53
53
|
def early_data_write_key
|
54
54
|
secret = client_early_traffic_secret
|
55
|
-
hkdf_expand_label(secret, 'key', '', @key_len)
|
55
|
+
self.class.hkdf_expand_label(secret, 'key', '', @key_len, @digest)
|
56
56
|
end
|
57
57
|
|
58
58
|
# @return [String]
|
59
59
|
def early_data_write_iv
|
60
60
|
secret = client_early_traffic_secret
|
61
|
-
hkdf_expand_label(secret, 'iv', '', @iv_len)
|
61
|
+
self.class.hkdf_expand_label(secret, 'iv', '', @iv_len, @digest)
|
62
62
|
end
|
63
63
|
|
64
64
|
# @return [String]
|
@@ -87,19 +87,19 @@ module TTTLS13
|
|
87
87
|
# @return [String]
|
88
88
|
def client_finished_key
|
89
89
|
secret = client_handshake_traffic_secret
|
90
|
-
hkdf_expand_label(secret, 'finished', '', @hash_len)
|
90
|
+
self.class.hkdf_expand_label(secret, 'finished', '', @hash_len, @digest)
|
91
91
|
end
|
92
92
|
|
93
93
|
# @return [String]
|
94
94
|
def client_handshake_write_key
|
95
95
|
secret = client_handshake_traffic_secret
|
96
|
-
hkdf_expand_label(secret, 'key', '', @key_len)
|
96
|
+
self.class.hkdf_expand_label(secret, 'key', '', @key_len, @digest)
|
97
97
|
end
|
98
98
|
|
99
99
|
# @return [String]
|
100
100
|
def client_handshake_write_iv
|
101
101
|
secret = client_handshake_traffic_secret
|
102
|
-
hkdf_expand_label(secret, 'iv', '', @iv_len)
|
102
|
+
self.class.hkdf_expand_label(secret, 'iv', '', @iv_len, @digest)
|
103
103
|
end
|
104
104
|
|
105
105
|
# @return [String]
|
@@ -111,19 +111,19 @@ module TTTLS13
|
|
111
111
|
# @return [String]
|
112
112
|
def server_finished_key
|
113
113
|
secret = server_handshake_traffic_secret
|
114
|
-
hkdf_expand_label(secret, 'finished', '', @hash_len)
|
114
|
+
self.class.hkdf_expand_label(secret, 'finished', '', @hash_len, @digest)
|
115
115
|
end
|
116
116
|
|
117
117
|
# @return [String]
|
118
118
|
def server_handshake_write_key
|
119
119
|
secret = server_handshake_traffic_secret
|
120
|
-
hkdf_expand_label(secret, 'key', '', @key_len)
|
120
|
+
self.class.hkdf_expand_label(secret, 'key', '', @key_len, @digest)
|
121
121
|
end
|
122
122
|
|
123
123
|
# @return [String]
|
124
124
|
def server_handshake_write_iv
|
125
125
|
secret = server_handshake_traffic_secret
|
126
|
-
hkdf_expand_label(secret, 'iv', '', @iv_len)
|
126
|
+
self.class.hkdf_expand_label(secret, 'iv', '', @iv_len, @digest)
|
127
127
|
end
|
128
128
|
|
129
129
|
# @return [String]
|
@@ -147,13 +147,13 @@ module TTTLS13
|
|
147
147
|
# @return [String]
|
148
148
|
def client_application_write_key
|
149
149
|
secret = client_application_traffic_secret
|
150
|
-
hkdf_expand_label(secret, 'key', '', @key_len)
|
150
|
+
self.class.hkdf_expand_label(secret, 'key', '', @key_len, @digest)
|
151
151
|
end
|
152
152
|
|
153
153
|
# @return [String]
|
154
154
|
def client_application_write_iv
|
155
155
|
secret = client_application_traffic_secret
|
156
|
-
hkdf_expand_label(secret, 'iv', '', @iv_len)
|
156
|
+
self.class.hkdf_expand_label(secret, 'iv', '', @iv_len, @digest)
|
157
157
|
end
|
158
158
|
|
159
159
|
# @return [String]
|
@@ -165,13 +165,13 @@ module TTTLS13
|
|
165
165
|
# @return [String]
|
166
166
|
def server_application_write_key
|
167
167
|
secret = server_application_traffic_secret
|
168
|
-
hkdf_expand_label(secret, 'key', '', @key_len)
|
168
|
+
self.class.hkdf_expand_label(secret, 'key', '', @key_len, @digest)
|
169
169
|
end
|
170
170
|
|
171
171
|
# @return [String]
|
172
172
|
def server_application_write_iv
|
173
173
|
secret = server_application_traffic_secret
|
174
|
-
hkdf_expand_label(secret, 'iv', '', @iv_len)
|
174
|
+
self.class.hkdf_expand_label(secret, 'iv', '', @iv_len, @digest)
|
175
175
|
end
|
176
176
|
|
177
177
|
# @return [String]
|
@@ -198,13 +198,14 @@ module TTTLS13
|
|
198
198
|
# @param label [String]
|
199
199
|
# @param context [String]
|
200
200
|
# @param length [Integer]
|
201
|
+
# @param digest [String] name of digest algorithm
|
201
202
|
#
|
202
203
|
# @return [String]
|
203
|
-
def hkdf_expand_label(secret, label, context, length)
|
204
|
+
def self.hkdf_expand_label(secret, label, context, length, digest)
|
204
205
|
binary = length.to_uint16
|
205
206
|
binary += ('tls13 ' + label).prefix_uint8_length
|
206
207
|
binary += context.prefix_uint8_length
|
207
|
-
|
208
|
+
hkdf_expand(secret, binary, length, digest)
|
208
209
|
end
|
209
210
|
|
210
211
|
# @param secret [String]
|
@@ -235,7 +236,7 @@ module TTTLS13
|
|
235
236
|
#
|
236
237
|
# @return [String]
|
237
238
|
def derive_secret(secret, label, context)
|
238
|
-
hkdf_expand_label(secret, label, context, @hash_len)
|
239
|
+
self.class.hkdf_expand_label(secret, label, context, @hash_len, @digest)
|
239
240
|
end
|
240
241
|
end
|
241
242
|
# rubocop: enable Metrics/ClassLength
|
data/lib/tttls1.3/server.rb
CHANGED
@@ -266,6 +266,7 @@ module TTTLS13
|
|
266
266
|
key_schedule.client_application_write_key,
|
267
267
|
key_schedule.client_application_write_iv
|
268
268
|
)
|
269
|
+
@exporter_master_secret = key_schedule.exporter_master_secret
|
269
270
|
@state = ServerState::CONNECTED
|
270
271
|
when ServerState::CONNECTED
|
271
272
|
logger.debug('ServerState::CONNECTED')
|
data/lib/tttls1.3/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tttls1.3
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- thekuwayama
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-07-
|
11
|
+
date: 2019-07-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|