@@ -26,13 +26,19 @@ UNIFEX_TERM handle_regular_read(State *state, char data[], int ret);
26
26
UNIFEX_TERM handle_read_error (State * state , int ret );
27
27
UNIFEX_TERM handle_handshake_in_progress (State * state , int ret );
28
28
UNIFEX_TERM handle_handshake_finished (State * state );
29
- static UnifexPayload * * to_payload_array (struct Datagram * dgram_list , int len );
29
+ static UnifexPayload * * dgram_to_payload_array (struct Datagram * dgram_list ,
30
+ int len );
30
31
static void free_payload_array (UnifexPayload * * payloads , int len );
31
32
32
33
int handle_load (UnifexEnv * env , void * * priv_data ) {
33
34
UNIFEX_UNUSED (env );
34
35
UNIFEX_UNUSED (priv_data );
35
36
37
+ if (OPENSSL_VERSION_NUMBER < 0x30000000L ) {
38
+ DEBUG ("ExDTLS requires OpenSSL 3" );
39
+ return -1 ;
40
+ }
41
+
36
42
FILE * urandom = fopen ("/dev/urandom" , "r" );
37
43
if (urandom == NULL ) {
38
44
DEBUG ("Cannot open /dev/urandom" );
@@ -245,11 +251,11 @@ UNIFEX_TERM get_cert_fingerprint(UnifexEnv *env, UnifexPayload *cert) {
245
251
UNIFEX_TERM do_handshake (UnifexEnv * env , State * state ) {
246
252
SSL_do_handshake (state -> ssl );
247
253
248
- UnifexPayload * * gen_packets ;
249
- int gen_packets_size ;
254
+ UnifexPayload * * gen_packets = NULL ;
255
+ int gen_packets_size = 0 ;
250
256
int ret = read_pending_data (& gen_packets , & gen_packets_size , state );
251
257
252
- if (ret == 0 && ( gen_packets == NULL || gen_packets_size == 0 ) ) {
258
+ if (ret == 0 && gen_packets == NULL ) {
253
259
return unifex_raise (state -> env , "Handshake failed: no packets generated" );
254
260
} else if (ret < 0 ) {
255
261
return unifex_raise (state -> env ,
@@ -276,6 +282,8 @@ UNIFEX_TERM write_data(UnifexEnv *env, State *state, UnifexPayload *payload) {
276
282
return unifex_raise (env , "Unable to write data" );
277
283
}
278
284
285
+ DEBUG ("Wrote %d bytes of data" , ret );
286
+
279
287
BIO * wbio = SSL_get_wbio (state -> ssl );
280
288
size_t pending_data_len = BIO_ctrl_pending (wbio );
281
289
if (pending_data_len == 0 ) {
@@ -286,9 +294,9 @@ UNIFEX_TERM write_data(UnifexEnv *env, State *state, UnifexPayload *payload) {
286
294
UnifexPayload * * gen_packets = NULL ;
287
295
int gen_packets_size = 0 ;
288
296
read_pending_data (& gen_packets , & gen_packets_size , state );
289
- if (gen_packets == NULL || gen_packets_size == 0 ) {
290
- DEBUG ("Unable to read data from BIO after writing" );
291
- return unifex_raise (env , "Unable to read data from BIO after writing" );
297
+ if (gen_packets == NULL ) {
298
+ DEBUG ("Couldn't read pending data after writing" );
299
+ return unifex_raise (env , "Couldn't read pending data after writing" );
292
300
}
293
301
294
302
UNIFEX_TERM res_term =
@@ -391,7 +399,8 @@ UNIFEX_TERM handle_handshake_finished(State *state) {
391
399
392
400
int ret = read_pending_data (& gen_packets , & gen_packets_size , state );
393
401
if (ret < 0 ) {
394
- res_term = unifex_raise (state -> env , "Handshake failed: write BIO error" );
402
+ res_term = unifex_raise (state -> env ,
403
+ "Handshake failed: couldn't read pending data." );
395
404
goto cleanup ;
396
405
}
397
406
@@ -429,8 +438,9 @@ UNIFEX_TERM handle_handshake_in_progress(State *state, int ret) {
429
438
int read_err = read_pending_data (& gen_packets , & gen_packets_size , state );
430
439
431
440
if (read_err < 0 ) {
432
- return unifex_raise (state -> env , "Handshake failed: write BIO error" );
433
- } else if (read_err == 0 && gen_packets_size == 0 ) {
441
+ return unifex_raise (state -> env ,
442
+ "Handshake failed: couldn't read pending data" );
443
+ } else if (read_err == 0 && gen_packets == NULL ) {
434
444
return handle_data_result_handshake_want_read (state -> env );
435
445
} else {
436
446
int timeout = get_timeout (state -> ssl );
@@ -455,9 +465,9 @@ UNIFEX_TERM handle_timeout(UnifexEnv *env, State *state) {
455
465
int gen_packets_size = 0 ;
456
466
read_pending_data (& gen_packets , & gen_packets_size , state );
457
467
458
- if (gen_packets == NULL || gen_packets_size == 0 ) {
459
- return unifex_raise (state -> env ,
460
- "Retransmit handshake failed: write BIO error " );
468
+ if (gen_packets == NULL ) {
469
+ return unifex_raise (
470
+ state -> env , "Retransmit handshake failed: couldn't read pending data " );
461
471
} else {
462
472
int timeout = get_timeout (state -> ssl );
463
473
UNIFEX_TERM res_term = handle_timeout_result_retransmit (
@@ -502,36 +512,6 @@ static int verify_cb(int preverify_ok, X509_STORE_CTX *ctx) {
502
512
}
503
513
}
504
514
505
- static UnifexPayload * * to_payload_array (struct Datagram * dgram_list , int len ) {
506
- if (len == 0 ) {
507
- return NULL ;
508
- }
509
-
510
- UnifexPayload * * payloads = calloc (len , sizeof (UnifexPayload * ));
511
-
512
- struct Datagram * itr = dgram_list ;
513
-
514
- for (int i = 0 ; i < len ; i ++ ) {
515
- payloads [i ] = itr -> packet ;
516
- itr = itr -> next ;
517
- }
518
-
519
- itr = dgram_list ;
520
- struct Datagram * next = dgram_list -> next ;
521
-
522
- if (next == NULL ) {
523
- free (itr );
524
- } else {
525
- while (next != NULL ) {
526
- free (itr );
527
- itr = next ;
528
- next = itr -> next ;
529
- }
530
- }
531
-
532
- return payloads ;
533
- }
534
-
535
515
static int read_pending_data (UnifexPayload * * * payloads , int * size ,
536
516
State * state ) {
537
517
@@ -595,10 +575,53 @@ static int read_pending_data(UnifexPayload ***payloads, int *size,
595
575
(* size )++ ;
596
576
}
597
577
598
- * payloads = to_payload_array (dgram_list , * size );
578
+ * payloads = dgram_to_payload_array (dgram_list , * size );
599
579
return 0 ;
600
580
}
601
581
582
+ static UnifexPayload * * dgram_to_payload_array (struct Datagram * dgram_list ,
583
+ int len ) {
584
+ if (len == 0 ) {
585
+ return NULL ;
586
+ }
587
+
588
+ UnifexPayload * * payloads = calloc (len , sizeof (UnifexPayload * ));
589
+
590
+ struct Datagram * itr = dgram_list ;
591
+
592
+ for (int i = 0 ; i < len ; i ++ ) {
593
+ payloads [i ] = itr -> packet ;
594
+ itr = itr -> next ;
595
+ }
596
+
597
+ itr = dgram_list ;
598
+ struct Datagram * next = dgram_list -> next ;
599
+
600
+ if (next == NULL ) {
601
+ free (itr );
602
+ } else {
603
+ while (next != NULL ) {
604
+ free (itr );
605
+ itr = next ;
606
+ next = itr -> next ;
607
+ }
608
+ }
609
+
610
+ return payloads ;
611
+ }
612
+
613
+ static void free_payload_array (UnifexPayload * * payloads , int len ) {
614
+ if (payloads == NULL ) {
615
+ return ;
616
+ }
617
+
618
+ for (int i = 0 ; i < len ; i ++ ) {
619
+ unifex_payload_release (payloads [i ]);
620
+ free (payloads [i ]);
621
+ }
622
+ free (payloads );
623
+ }
624
+
602
625
static void cert_to_payload (UnifexEnv * env , X509 * x509 ,
603
626
UnifexPayload * payload ) {
604
627
int len = i2d_X509 (x509 , NULL );
@@ -617,18 +640,6 @@ static void pkey_to_payload(UnifexEnv *env, EVP_PKEY *pkey,
617
640
payload -> size = len ;
618
641
}
619
642
620
- static void free_payload_array (UnifexPayload * * payloads , int len ) {
621
- if (payloads == NULL ) {
622
- return ;
623
- }
624
-
625
- for (int i = 0 ; i < len ; i ++ ) {
626
- unifex_payload_release (payloads [i ]);
627
- free (payloads [i ]);
628
- }
629
- free (payloads );
630
- }
631
-
632
643
void handle_destroy_state (UnifexEnv * env , State * state ) {
633
644
UNIFEX_UNUSED (env );
634
645
DEBUG ("Destroying state" );
0 commit comments