14
14
*/
15
15
#include "tls/s2n_async_pkey.h"
16
16
17
+ #include "api/s2n.h"
17
18
#include "crypto/s2n_hash.h"
18
19
#include "crypto/s2n_signature.h"
19
20
#include "error/s2n_errno.h"
20
- #include "api/s2n.h"
21
21
#include "tls/s2n_connection.h"
22
22
#include "tls/s2n_handshake.h"
23
23
#include "utils/s2n_blob.h"
27
27
28
28
struct s2n_async_pkey_decrypt_data {
29
29
s2n_async_pkey_decrypt_complete on_complete ;
30
- struct s2n_blob encrypted ;
31
- struct s2n_blob decrypted ;
32
- unsigned rsa_failed : 1 ;
30
+ struct s2n_blob encrypted ;
31
+ struct s2n_blob decrypted ;
32
+ unsigned rsa_failed : 1 ;
33
33
};
34
34
35
35
struct s2n_async_pkey_sign_data {
36
36
s2n_async_pkey_sign_complete on_complete ;
37
- struct s2n_hash_state digest ;
38
- s2n_signature_algorithm sig_alg ;
39
- struct s2n_blob signature ;
37
+ struct s2n_hash_state digest ;
38
+ s2n_signature_algorithm sig_alg ;
39
+ struct s2n_blob signature ;
40
40
};
41
41
42
42
struct s2n_async_pkey_op {
43
43
s2n_async_pkey_op_type type ;
44
44
struct s2n_connection * conn ;
45
45
s2n_async_pkey_validation_mode validation_mode ;
46
- unsigned complete : 1 ;
47
- unsigned applied : 1 ;
46
+ unsigned complete : 1 ;
47
+ unsigned applied : 1 ;
48
48
union {
49
49
struct s2n_async_pkey_decrypt_data decrypt ;
50
- struct s2n_async_pkey_sign_data sign ;
50
+ struct s2n_async_pkey_sign_data sign ;
51
51
} op ;
52
52
};
53
53
@@ -65,16 +65,16 @@ static S2N_RESULT s2n_async_get_actions(s2n_async_pkey_op_type type, const struc
65
65
static S2N_RESULT s2n_async_pkey_op_allocate (struct s2n_async_pkey_op * * op );
66
66
67
67
static S2N_RESULT s2n_async_pkey_sign_async (struct s2n_connection * conn , s2n_signature_algorithm sig_alg ,
68
- struct s2n_hash_state * digest , s2n_async_pkey_sign_complete on_complete );
68
+ struct s2n_hash_state * digest , s2n_async_pkey_sign_complete on_complete );
69
69
static S2N_RESULT s2n_async_pkey_sign_sync (struct s2n_connection * conn , s2n_signature_algorithm sig_alg ,
70
- struct s2n_hash_state * digest , s2n_async_pkey_sign_complete on_complete );
70
+ struct s2n_hash_state * digest , s2n_async_pkey_sign_complete on_complete );
71
71
72
72
static S2N_RESULT s2n_async_pkey_decrypt_async (struct s2n_connection * conn , struct s2n_blob * encrypted ,
73
- struct s2n_blob * init_decrypted ,
74
- s2n_async_pkey_decrypt_complete on_complete );
73
+ struct s2n_blob * init_decrypted ,
74
+ s2n_async_pkey_decrypt_complete on_complete );
75
75
static S2N_RESULT s2n_async_pkey_decrypt_sync (struct s2n_connection * conn , struct s2n_blob * encrypted ,
76
- struct s2n_blob * init_decrypted ,
77
- s2n_async_pkey_decrypt_complete on_complete );
76
+ struct s2n_blob * init_decrypted ,
77
+ s2n_async_pkey_decrypt_complete on_complete );
78
78
79
79
static S2N_RESULT s2n_async_pkey_decrypt_perform (struct s2n_async_pkey_op * op , s2n_cert_private_key * pkey );
80
80
static S2N_RESULT s2n_async_pkey_decrypt_apply (struct s2n_async_pkey_op * op , struct s2n_connection * conn );
@@ -90,19 +90,23 @@ static S2N_RESULT s2n_async_pkey_get_input_sign(struct s2n_async_pkey_op *op, ui
90
90
static S2N_RESULT s2n_async_pkey_op_set_output_sign (struct s2n_async_pkey_op * op , const uint8_t * data , uint32_t data_len );
91
91
static S2N_RESULT s2n_async_pkey_sign_free (struct s2n_async_pkey_op * op );
92
92
93
- static const struct s2n_async_pkey_op_actions s2n_async_pkey_decrypt_op = { .perform = & s2n_async_pkey_decrypt_perform ,
94
- .apply = & s2n_async_pkey_decrypt_apply ,
95
- .get_input_size = & s2n_async_pkey_get_input_size_decrypt ,
96
- .get_input = & s2n_async_pkey_get_input_decrypt ,
97
- .set_output = & s2n_async_pkey_op_set_output_decrypt ,
98
- .free = & s2n_async_pkey_decrypt_free };
93
+ static const struct s2n_async_pkey_op_actions s2n_async_pkey_decrypt_op = {
94
+ .perform = & s2n_async_pkey_decrypt_perform ,
95
+ .apply = & s2n_async_pkey_decrypt_apply ,
96
+ .get_input_size = & s2n_async_pkey_get_input_size_decrypt ,
97
+ .get_input = & s2n_async_pkey_get_input_decrypt ,
98
+ .set_output = & s2n_async_pkey_op_set_output_decrypt ,
99
+ .free = & s2n_async_pkey_decrypt_free
100
+ };
99
101
100
- static const struct s2n_async_pkey_op_actions s2n_async_pkey_sign_op = { .perform = & s2n_async_pkey_sign_perform ,
101
- .apply = & s2n_async_pkey_sign_apply ,
102
- .get_input_size = & s2n_async_pkey_get_input_size_sign ,
103
- .get_input = & s2n_async_pkey_get_input_sign ,
104
- .set_output = & s2n_async_pkey_op_set_output_sign ,
105
- .free = & s2n_async_pkey_sign_free };
102
+ static const struct s2n_async_pkey_op_actions s2n_async_pkey_sign_op = {
103
+ .perform = & s2n_async_pkey_sign_perform ,
104
+ .apply = & s2n_async_pkey_sign_apply ,
105
+ .get_input_size = & s2n_async_pkey_get_input_size_sign ,
106
+ .get_input = & s2n_async_pkey_get_input_sign ,
107
+ .set_output = & s2n_async_pkey_op_set_output_sign ,
108
+ .free = & s2n_async_pkey_sign_free
109
+ };
106
110
107
111
DEFINE_POINTER_CLEANUP_FUNC (struct s2n_async_pkey_op * , s2n_async_pkey_op_free );
108
112
@@ -129,7 +133,7 @@ static S2N_RESULT s2n_async_pkey_op_allocate(struct s2n_async_pkey_op **op)
129
133
RESULT_ENSURE (* op == NULL , S2N_ERR_SAFETY );
130
134
131
135
/* allocate memory */
132
- DEFER_CLEANUP (struct s2n_blob mem = {0 }, s2n_free );
136
+ DEFER_CLEANUP (struct s2n_blob mem = { 0 }, s2n_free );
133
137
RESULT_GUARD_POSIX (s2n_alloc (& mem , sizeof (struct s2n_async_pkey_op )));
134
138
RESULT_GUARD_POSIX (s2n_blob_zero (& mem ));
135
139
@@ -142,7 +146,7 @@ static S2N_RESULT s2n_async_pkey_op_allocate(struct s2n_async_pkey_op **op)
142
146
}
143
147
144
148
S2N_RESULT s2n_async_pkey_decrypt (struct s2n_connection * conn , struct s2n_blob * encrypted ,
145
- struct s2n_blob * init_decrypted , s2n_async_pkey_decrypt_complete on_complete )
149
+ struct s2n_blob * init_decrypted , s2n_async_pkey_decrypt_complete on_complete )
146
150
{
147
151
RESULT_ENSURE_REF (conn );
148
152
RESULT_ENSURE_REF (encrypted );
@@ -184,7 +188,7 @@ S2N_RESULT s2n_async_cb_execute(struct s2n_connection *conn, struct s2n_async_pk
184
188
}
185
189
186
190
S2N_RESULT s2n_async_pkey_decrypt_async (struct s2n_connection * conn , struct s2n_blob * encrypted ,
187
- struct s2n_blob * init_decrypted , s2n_async_pkey_decrypt_complete on_complete )
191
+ struct s2n_blob * init_decrypted , s2n_async_pkey_decrypt_complete on_complete )
188
192
{
189
193
RESULT_ENSURE_REF (conn );
190
194
RESULT_ENSURE_REF (encrypted );
@@ -199,7 +203,7 @@ S2N_RESULT s2n_async_pkey_decrypt_async(struct s2n_connection *conn, struct s2n_
199
203
op -> validation_mode = conn -> config -> async_pkey_validation_mode ;
200
204
201
205
struct s2n_async_pkey_decrypt_data * decrypt = & op -> op .decrypt ;
202
- decrypt -> on_complete = on_complete ;
206
+ decrypt -> on_complete = on_complete ;
203
207
204
208
RESULT_GUARD_POSIX (s2n_dup (encrypted , & decrypt -> encrypted ));
205
209
RESULT_GUARD_POSIX (s2n_dup (init_decrypted , & decrypt -> decrypted ));
@@ -209,7 +213,7 @@ S2N_RESULT s2n_async_pkey_decrypt_async(struct s2n_connection *conn, struct s2n_
209
213
}
210
214
211
215
S2N_RESULT s2n_async_pkey_decrypt_sync (struct s2n_connection * conn , struct s2n_blob * encrypted ,
212
- struct s2n_blob * init_decrypted , s2n_async_pkey_decrypt_complete on_complete )
216
+ struct s2n_blob * init_decrypted , s2n_async_pkey_decrypt_complete on_complete )
213
217
{
214
218
RESULT_ENSURE_REF (conn );
215
219
RESULT_ENSURE_REF (encrypted );
@@ -225,7 +229,7 @@ S2N_RESULT s2n_async_pkey_decrypt_sync(struct s2n_connection *conn, struct s2n_b
225
229
}
226
230
227
231
S2N_RESULT s2n_async_pkey_sign (struct s2n_connection * conn , s2n_signature_algorithm sig_alg ,
228
- struct s2n_hash_state * digest , s2n_async_pkey_sign_complete on_complete )
232
+ struct s2n_hash_state * digest , s2n_async_pkey_sign_complete on_complete )
229
233
{
230
234
RESULT_ENSURE_REF (conn );
231
235
RESULT_ENSURE_REF (digest );
@@ -241,7 +245,7 @@ S2N_RESULT s2n_async_pkey_sign(struct s2n_connection *conn, s2n_signature_algori
241
245
}
242
246
243
247
S2N_RESULT s2n_async_pkey_sign_async (struct s2n_connection * conn , s2n_signature_algorithm sig_alg ,
244
- struct s2n_hash_state * digest , s2n_async_pkey_sign_complete on_complete )
248
+ struct s2n_hash_state * digest , s2n_async_pkey_sign_complete on_complete )
245
249
{
246
250
RESULT_ENSURE_REF (conn );
247
251
RESULT_ENSURE_REF (digest );
@@ -258,8 +262,8 @@ S2N_RESULT s2n_async_pkey_sign_async(struct s2n_connection *conn, s2n_signature_
258
262
}
259
263
260
264
struct s2n_async_pkey_sign_data * sign = & op -> op .sign ;
261
- sign -> on_complete = on_complete ;
262
- sign -> sig_alg = sig_alg ;
265
+ sign -> on_complete = on_complete ;
266
+ sign -> sig_alg = sig_alg ;
263
267
264
268
RESULT_GUARD_POSIX (s2n_hash_new (& sign -> digest ));
265
269
RESULT_GUARD_POSIX (s2n_hash_copy (& sign -> digest , digest ));
@@ -269,7 +273,7 @@ S2N_RESULT s2n_async_pkey_sign_async(struct s2n_connection *conn, s2n_signature_
269
273
}
270
274
271
275
S2N_RESULT s2n_async_pkey_sign_sync (struct s2n_connection * conn , s2n_signature_algorithm sig_alg ,
272
- struct s2n_hash_state * digest , s2n_async_pkey_sign_complete on_complete )
276
+ struct s2n_hash_state * digest , s2n_async_pkey_sign_complete on_complete )
273
277
{
274
278
RESULT_ENSURE_REF (conn );
275
279
RESULT_ENSURE_REF (digest );
@@ -334,7 +338,7 @@ int s2n_async_pkey_op_apply(struct s2n_async_pkey_op *op, struct s2n_connection
334
338
335
339
POSIX_GUARD_RESULT (actions -> apply (op , conn ));
336
340
337
- op -> applied = true;
341
+ op -> applied = true;
338
342
conn -> handshake .async_state = S2N_ASYNC_COMPLETE ;
339
343
340
344
/* Free up the decrypt/sign structs to avoid storing secrets for too long */
@@ -351,9 +355,11 @@ int s2n_async_pkey_op_free(struct s2n_async_pkey_op *op)
351
355
POSIX_ENSURE_REF (actions );
352
356
353
357
/* If applied the decrypt/sign structs were released in apply call */
354
- if (!op -> applied ) { POSIX_GUARD_RESULT (actions -> free (op )); }
358
+ if (!op -> applied ) {
359
+ POSIX_GUARD_RESULT (actions -> free (op ));
360
+ }
355
361
356
- POSIX_GUARD (s2n_free_object (( uint8_t * * ) & op , sizeof (struct s2n_async_pkey_op )));
362
+ POSIX_GUARD (s2n_free_object ((uint8_t * * ) & op , sizeof (struct s2n_async_pkey_op )));
357
363
358
364
return S2N_SUCCESS ;
359
365
}
@@ -442,17 +448,18 @@ S2N_RESULT s2n_async_pkey_sign_apply(struct s2n_async_pkey_op *op, struct s2n_co
442
448
}
443
449
444
450
S2N_RESULT s2n_async_pkey_verify_signature (struct s2n_connection * conn , s2n_signature_algorithm sig_alg ,
445
- struct s2n_hash_state * digest , struct s2n_blob * signature ) {
451
+ struct s2n_hash_state * digest , struct s2n_blob * signature )
452
+ {
446
453
RESULT_ENSURE_REF (conn );
447
454
RESULT_ENSURE_REF (conn -> handshake_params .our_chain_and_key );
448
455
RESULT_ENSURE_REF (digest );
449
456
RESULT_ENSURE_REF (signature );
450
457
451
458
/* Parse public key for the cert */
452
- DEFER_CLEANUP (struct s2n_pkey public_key = {0 }, s2n_pkey_free );
459
+ DEFER_CLEANUP (struct s2n_pkey public_key = { 0 }, s2n_pkey_free );
453
460
s2n_pkey_type pkey_type = S2N_PKEY_TYPE_UNKNOWN ;
454
461
RESULT_GUARD_POSIX (s2n_asn1der_to_public_key_and_type (& public_key , & pkey_type ,
455
- & conn -> handshake_params .our_chain_and_key -> cert_chain -> head -> raw ));
462
+ & conn -> handshake_params .our_chain_and_key -> cert_chain -> head -> raw ));
456
463
RESULT_ENSURE (s2n_pkey_verify (& public_key , sig_alg , digest , signature ) == S2N_SUCCESS , S2N_ERR_VERIFY_SIGNATURE );
457
464
458
465
return S2N_RESULT_OK ;
@@ -474,7 +481,7 @@ int s2n_async_pkey_op_set_validation_mode(struct s2n_async_pkey_op *op, s2n_asyn
474
481
{
475
482
POSIX_ENSURE_REF (op );
476
483
477
- switch (mode ) {
484
+ switch (mode ) {
478
485
case S2N_ASYNC_PKEY_VALIDATION_FAST :
479
486
case S2N_ASYNC_PKEY_VALIDATION_STRICT :
480
487
op -> validation_mode = mode ;
0 commit comments