376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
|
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
|
-
+
+
+
|
port: (uint16_t)port
runLoopMode: (of_run_loop_mode_t)runLoopMode
block: (of_tcp_socket_async_connect_block_t)block
{
[super asyncConnectToHost: host
port: port
runLoopMode: runLoopMode
block: ^ (SSLSocket *sock, id exception) {
block: ^ (OFTCPSocket *sock_, id exception) {
SSLSocket *sock = (SSLSocket *)sock_;
if (exception == nil) {
@try {
[sock SSL_startTLSWithExpectedHost: host
port: port];
} @catch (id e) {
block(sock, e);
return;
|
444
445
446
447
448
449
450
451
452
453
454
455
456
457
|
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
|
+
+
+
+
+
+
+
+
+
+
|
}
- (size_t)lowlevelReadIntoBuffer: (void *)buffer
length: (size_t)length
{
ssize_t ret;
/*
* There is no SSL session yet. However, it might be necessary to read
* from and write to the socket before negotiating an SSL session: For
* example, the socket might be connected to a SOCKS5 proxy and needs
* to establish a SOCKS5 connection before negotiating an SSL session.
*/
if (_SSL == NULL)
return [super lowlevelReadIntoBuffer: buffer
length: length];
if (length > INT_MAX)
@throw [OFOutOfRangeException exception];
if (_socket == INVALID_SOCKET)
@throw [OFNotOpenException exceptionWithObject: self];
if (_atEndOfStream)
|
475
476
477
478
479
480
481
482
483
484
485
486
487
488
|
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
|
+
+
+
+
+
+
+
+
+
+
+
+
+
+
|
}
- (size_t)lowlevelWriteBuffer: (const void *)buffer
length: (size_t)length
{
int bytesWritten;
/*
* There is no SSL session yet. However, it might be necessary to read
* from and write to the socket before negotiating an SSL session: For
* example, the socket might be connected to a SOCKS5 proxy and needs
* to establish a SOCKS5 connection before negotiating an SSL session.
*
* TODO: Think of a way to make this safer, so that it's impossible to
* forget to establish an SSL session and then send unencrypted data by
* accident.
*/
if (_SSL == NULL)
return [super lowlevelWriteBuffer: buffer
length: length];
if (_socket == INVALID_SOCKET)
@throw [OFNotOpenException exceptionWithObject: self];
if (length > INT_MAX)
@throw [OFOutOfRangeException exception];
if ((bytesWritten = SSL_write(_SSL, buffer, (int)length)) < 0)
|