string consensus::download_from_random_authority( const string_ref path ) { net::ip_address ip; uint16_t port; auto authority = default_authority_list[ 3 // mini::crypto::random_device->get_random(default_authority_list.get_size()) ]; ip = authority.ip; port = authority.dir_port; mini_debug( "consensus::download_from_random_authority() [path: http://%s:%u%s]", ip.to_string().get_buffer(), port, path.get_buffer()); return net::http::client::get(ip.to_string(), port, path); }
SECURITY_STATUS ssl_socket::client_handshake( PCredHandle phCreds, const string_ref server_name, CtxtHandle* phContext, SecBuffer* pExtraData ) { SecBufferDesc OutBuffer; SecBuffer OutBuffers[1]; DWORD dwSSPIFlags; DWORD dwSSPIOutFlags; TimeStamp tsExpiry; SECURITY_STATUS scRet; DWORD cbData; dwSSPIFlags = ISC_REQ_SEQUENCE_DETECT | ISC_REQ_REPLAY_DETECT | ISC_REQ_CONFIDENTIALITY | ISC_RET_EXTENDED_ERROR | ISC_REQ_ALLOCATE_MEMORY | ISC_REQ_STREAM; OutBuffers[0].pvBuffer = NULL; OutBuffers[0].BufferType = SECBUFFER_TOKEN; OutBuffers[0].cbBuffer = 0; OutBuffer.cBuffers = 1; OutBuffer.pBuffers = OutBuffers; OutBuffer.ulVersion = SECBUFFER_VERSION; scRet = g_sspi->InitializeSecurityContext( phCreds, NULL, (TCHAR*)server_name.get_buffer(), dwSSPIFlags, 0, SECURITY_NATIVE_DREP, NULL, 0, phContext, &OutBuffer, &dwSSPIOutFlags, &tsExpiry); if (scRet != SEC_I_CONTINUE_NEEDED) { return scRet; } if (OutBuffers[0].cbBuffer != 0 && OutBuffers[0].pvBuffer != NULL) { m_bAllowPlainText = TRUE; cbData = static_cast<DWORD>(write_impl(OutBuffers[0].pvBuffer, static_cast<size_t>(OutBuffers[0].cbBuffer))); m_bAllowPlainText = FALSE; if (cbData == SOCKET_ERROR || cbData == 0) { g_sspi->FreeContextBuffer(OutBuffers[0].pvBuffer); g_sspi->DeleteSecurityContext(phContext); return SEC_E_INTERNAL_ERROR; } g_sspi->FreeContextBuffer(OutBuffers[0].pvBuffer); OutBuffers[0].pvBuffer = NULL; } SECURITY_STATUS rc = client_handshake_loop(phCreds, phContext, TRUE, pExtraData); if (pExtraData->pvBuffer) { delete[] pExtraData->pvBuffer; } return rc; }