summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2020-07-01 14:45:01 +0300
committerGeorge Hazan <ghazan@miranda.im>2020-07-01 14:45:01 +0300
commitf10699e580b3eead1cb9c250822abbbc626eb3e3 (patch)
tree732540d8c618787c4244fc9fb6d8d8ca8fdb7e80 /src/core
parent4ac1dc06f30c240089da5cdeba6cbf46cd598a1e (diff)
TLS 1.3 support:
Netlib_GetTlsUnique - new function to retrieve TLS binding data for an opened socket
Diffstat (limited to 'src/core')
-rw-r--r--src/core/stdssl/src/netlibssl.cpp23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/core/stdssl/src/netlibssl.cpp b/src/core/stdssl/src/netlibssl.cpp
index b8f3975a55..8e7b834646 100644
--- a/src/core/stdssl/src/netlibssl.cpp
+++ b/src/core/stdssl/src/netlibssl.cpp
@@ -751,6 +751,28 @@ int NetlibSslWrite(SslHandle *ssl, const char *buf, int num)
return scRet == SEC_E_OK ? num : SOCKET_ERROR;
}
+static void* NetlibSslUnique(SslHandle *ssl, int *cbLen)
+{
+ *cbLen = 0;
+
+ SEC_CHANNEL_BINDINGS bindings;
+ SECURITY_STATUS scRet = g_pSSPI->QueryContextAttributesW(&ssl->hContext, SECPKG_ATTR_UNIQUE_BINDINGS, &bindings);
+ if (scRet != SEC_E_OK)
+ return nullptr;
+
+ LPBYTE pBuf = LPBYTE(bindings.dwInitiatorOffset);
+ bindings = *(SEC_CHANNEL_BINDINGS *)bindings.dwInitiatorOffset;
+ pBuf += bindings.dwApplicationDataOffset;
+ if (memcmp(pBuf, "tls-unique:", 11))
+ return nullptr;
+
+ pBuf += 11; bindings.cbApplicationDataLength -= 11;
+ *cbLen = bindings.cbApplicationDataLength;
+ void *res = mir_alloc(bindings.cbApplicationDataLength);
+ memcpy(res, pBuf, bindings.cbApplicationDataLength);
+ return res;
+}
+
static INT_PTR GetSslApi(WPARAM, LPARAM lParam)
{
SSL_API *si = (SSL_API*)lParam;
@@ -766,6 +788,7 @@ static INT_PTR GetSslApi(WPARAM, LPARAM lParam)
si->write = NetlibSslWrite;
si->shutdown = NetlibSslShutdown;
si->sfree = NetlibSslFree;
+ si->unique = NetlibSslUnique;
return TRUE;
}