353 Socket::connect(_serv_addr, _addrlen);
360 __ssl = SSL_new(__ctx);
361 BIO* bio = BIO_new_socket(
__handle, BIO_NOCLOSE);
363 SSL_set_bio(__ssl, bio, bio);
365 if (SSL_connect(__ssl) < 0)
368#elif __DCL_USE_SCHANNEL
369 DWORD fContextReq = ISC_REQ_SEQUENCE_DETECT |
370 ISC_REQ_REPLAY_DETECT |
371 ISC_REQ_CONFIDENTIALITY |
372 ISC_RET_EXTENDED_ERROR |
373 ISC_REQ_ALLOCATE_MEMORY |
376 SecBufferDesc outBufferDesc;
377 SecBuffer outBuffers[1];
379 outBuffers[0].BufferType = SECBUFFER_TOKEN;
380 outBuffers[0].cbBuffer = 0;
381 outBuffers[0].pvBuffer =
NULL;
382 outBufferDesc.ulVersion = SECBUFFER_VERSION;
383 outBufferDesc.cBuffers = 1;
384 outBufferDesc.pBuffers = outBuffers;
390 SECURITY_STATUS ss = InitializeSecurityContextW(
410 if (outBuffers[0].cbBuffer != 0 && outBuffers[0].pvBuffer !=
NULL) {
412 outBuffers[0].BufferType,
413 outBuffers[0].cbBuffer,
414 String::tryString((
const char*) outBuffers[0].pvBuffer,
415 outBuffers[0].cbBuffer, 8).data()
418 (
const char*) outBuffers[0].pvBuffer, outBuffers[0].cbBuffer, 0);
419 if (
n == SOCKET_ERROR ||
n == 0) {
420 FreeContextBuffer(outBuffers[0].pvBuffer);
421 DeleteSecurityContext(&ctxt);
426 FreeContextBuffer(outBuffers[0].pvBuffer);
427 outBuffers[0].pvBuffer =
NULL;
432 SecBufferDesc inBufferDesc;
433 SecBuffer inBuffers[2];
436#define READ_BUFFER_SIZE 0x10000
437 char* readBuffer = (
char*) malloc(READ_BUFFER_SIZE);
439 unsigned int nRead = 0;
441 while (ss == SEC_I_CONTINUE_NEEDED ||
442 ss == SEC_E_INCOMPLETE_MESSAGE ||
443 ss == SEC_I_INCOMPLETE_CREDENTIALS) {
444 if (0 == nRead || ss == SEC_E_INCOMPLETE_MESSAGE) {
449 READ_BUFFER_SIZE - nRead,
452 if (
n == SOCKET_ERROR) {
453 WSAError = WSAGetLastError();
454 ss = SEC_E_INTERNAL_ERROR;
458 WSAError = WSAECONNRESET;
459 ss = SEC_E_INTERNAL_ERROR;
463 String::tryString((
const char*) readBuffer + nRead,
n, 8).data());
471 inBuffers[0].BufferType = SECBUFFER_TOKEN;
472 inBuffers[0].cbBuffer = nRead;
473 inBuffers[0].pvBuffer = readBuffer;
475 inBuffers[1].BufferType = SECBUFFER_EMPTY;
476 inBuffers[1].cbBuffer = 0;
477 inBuffers[1].pvBuffer =
NULL;
479 inBufferDesc.ulVersion = SECBUFFER_VERSION;
480 inBufferDesc.cBuffers = 2;
481 inBufferDesc.pBuffers = inBuffers;
483 outBuffers[0].BufferType = SECBUFFER_TOKEN;
484 outBuffers[0].cbBuffer = 0;
485 outBuffers[0].pvBuffer =
NULL;
487 outBufferDesc.ulVersion = SECBUFFER_VERSION;
488 outBufferDesc.cBuffers = 1;
489 outBufferDesc.pBuffers = outBuffers;
491 ss = InitializeSecurityContextW(
497 SECURITY_NATIVE_DREP,
506 if (ss == SEC_E_OK ||
507 ss == SEC_I_CONTINUE_NEEDED ||
508 FAILED(ss) && (ctxtAttr & ISC_RET_EXTENDED_ERROR)) {
509 if (outBuffers[0].cbBuffer != 0 && outBuffers[0].pvBuffer !=
NULL) {
512 (
const char*) outBuffers[0].pvBuffer,
513 outBuffers[0].cbBuffer,
516 if (
n == SOCKET_ERROR ||
n == 0) {
517 WSAError = WSAGetLastError();
518 FreeContextBuffer(outBuffers[0].pvBuffer);
519 DeleteSecurityContext(&ctxt);
520 ss = SEC_E_INTERNAL_ERROR;
525 FreeContextBuffer(outBuffers[0].pvBuffer);
526 outBuffers[0].pvBuffer =
NULL;
530 if (ss == SEC_E_INCOMPLETE_MESSAGE) {
531 __DCL_TRACE0(
__T(
"====================== SEC_E_INCOMPLETE_MESSAGE =====================\n"));
536 if (ss == SEC_E_OK) {
539 if (inBuffers[1].BufferType == SECBUFFER_EXTRA) {
548 if(ss == SEC_I_INCOMPLETE_CREDENTIALS) {
556 ss = SEC_I_CONTINUE_NEEDED;
560 if (inBuffers[1].BufferType == SECBUFFER_EXTRA) {
563 readBuffer + (nRead - inBuffers[1].cbBuffer),
564 inBuffers[1].cbBuffer
566 nRead = inBuffers[1].cbBuffer;
575 DeleteSecurityContext(&ctxt);