diff options
author | George Hazan <ghazan@miranda.im> | 2020-07-01 14:45:01 +0300 |
---|---|---|
committer | George Hazan <ghazan@miranda.im> | 2020-07-01 14:45:01 +0300 |
commit | f10699e580b3eead1cb9c250822abbbc626eb3e3 (patch) | |
tree | 732540d8c618787c4244fc9fb6d8d8ca8fdb7e80 /src/core | |
parent | 4ac1dc06f30c240089da5cdeba6cbf46cd598a1e (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.cpp | 23 |
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;
}
|