349 Socket::connect(_serv_addr, _addrlen);
356 __ssl = SSL_new(__ctx);
357 BIO* bio = BIO_new_socket(
__handle, BIO_NOCLOSE);
359 SSL_set_bio(__ssl, bio, bio);
361 if (SSL_connect(__ssl) < 0)
365 DWORD fContextReq = ISC_REQ_SEQUENCE_DETECT
366 | ISC_REQ_REPLAY_DETECT
367 | ISC_REQ_CONFIDENTIALITY
368 | ISC_RET_EXTENDED_ERROR
369 | ISC_REQ_ALLOCATE_MEMORY
372 SecBufferDesc outBufferDesc;
373 SecBuffer outBuffers[1];
375 outBuffers[0].BufferType = SECBUFFER_TOKEN;
376 outBuffers[0].cbBuffer = 0;
377 outBuffers[0].pvBuffer =
NULL;
378 outBufferDesc.ulVersion = SECBUFFER_VERSION;
379 outBufferDesc.cBuffers = 1;
380 outBufferDesc.pBuffers = outBuffers;
386 SECURITY_STATUS ss = InitializeSecurityContextW(
406 if (outBuffers[0].cbBuffer != 0 && outBuffers[0].pvBuffer !=
NULL) {
408 outBuffers[0].BufferType,
409 outBuffers[0].cbBuffer,
410 String::tryString((
const char*) outBuffers[0].pvBuffer,
411 outBuffers[0].cbBuffer, 8).data()
414 (
const char*) outBuffers[0].pvBuffer, outBuffers[0].cbBuffer, 0);
415 if (n == SOCKET_ERROR || n == 0) {
416 FreeContextBuffer(outBuffers[0].pvBuffer);
417 DeleteSecurityContext(&ctxt);
422 FreeContextBuffer(outBuffers[0].pvBuffer);
423 outBuffers[0].pvBuffer =
NULL;
427 SecBufferDesc inBufferDesc;
428 SecBuffer inBuffers[2];
431#define READ_BUFFER_SIZE 0x10000
432 char* readBuffer = (
char*) malloc(READ_BUFFER_SIZE);
434 unsigned int nRead = 0;
436 while (ss == SEC_I_CONTINUE_NEEDED
437 || ss == SEC_E_INCOMPLETE_MESSAGE
438 || ss == SEC_I_INCOMPLETE_CREDENTIALS
440 if (0 == nRead || ss == SEC_E_INCOMPLETE_MESSAGE) {
445 READ_BUFFER_SIZE - nRead,
448 if (n == SOCKET_ERROR) {
449 WSAError = WSAGetLastError();
450 ss = SEC_E_INTERNAL_ERROR;
454 WSAError = WSAECONNRESET;
455 ss = SEC_E_INTERNAL_ERROR;
459 String::tryString((
const char*) readBuffer + nRead, n, 8).data());
467 inBuffers[0].BufferType = SECBUFFER_TOKEN;
468 inBuffers[0].cbBuffer = nRead;
469 inBuffers[0].pvBuffer = readBuffer;
471 inBuffers[1].BufferType = SECBUFFER_EMPTY;
472 inBuffers[1].cbBuffer = 0;
473 inBuffers[1].pvBuffer =
NULL;
475 inBufferDesc.ulVersion = SECBUFFER_VERSION;
476 inBufferDesc.cBuffers = 2;
477 inBufferDesc.pBuffers = inBuffers;
479 outBuffers[0].BufferType = SECBUFFER_TOKEN;
480 outBuffers[0].cbBuffer = 0;
481 outBuffers[0].pvBuffer =
NULL;
483 outBufferDesc.ulVersion = SECBUFFER_VERSION;
484 outBufferDesc.cBuffers = 1;
485 outBufferDesc.pBuffers = outBuffers;
487 ss = InitializeSecurityContextW(
493 SECURITY_NATIVE_DREP,
503 || ss == SEC_I_CONTINUE_NEEDED
504 || (FAILED(ss) && (ctxtAttr & ISC_RET_EXTENDED_ERROR))
506 if (outBuffers[0].cbBuffer != 0 && outBuffers[0].pvBuffer !=
NULL) {
509 (
const char*) outBuffers[0].pvBuffer,
510 outBuffers[0].cbBuffer,
513 if (n == SOCKET_ERROR || n == 0) {
514 WSAError = WSAGetLastError();
515 FreeContextBuffer(outBuffers[0].pvBuffer);
516 DeleteSecurityContext(&ctxt);
517 ss = SEC_E_INTERNAL_ERROR;
522 FreeContextBuffer(outBuffers[0].pvBuffer);
523 outBuffers[0].pvBuffer =
NULL;
527 if (ss == SEC_E_INCOMPLETE_MESSAGE) {
528 __DCL_TRACE0(
__T(
"====================== SEC_E_INCOMPLETE_MESSAGE =====================\n"));
533 if (ss == SEC_E_OK) {
535 if (inBuffers[1].BufferType == SECBUFFER_EXTRA) {
542 if(ss == SEC_I_INCOMPLETE_CREDENTIALS) {
550 ss = SEC_I_CONTINUE_NEEDED;
554 if (inBuffers[1].BufferType == SECBUFFER_EXTRA) {
557 readBuffer + (nRead - inBuffers[1].cbBuffer),
558 inBuffers[1].cbBuffer
560 nRead = inBuffers[1].cbBuffer;
568 DeleteSecurityContext(&ctxt);