summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/stdssl/src/netlibssl.cpp23
-rw-r--r--src/mir_app/src/mir_app.def1
-rw-r--r--src/mir_app/src/mir_app64.def1
-rw-r--r--src/mir_app/src/netlib_sock.cpp17
4 files changed, 40 insertions, 2 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;
}
diff --git a/src/mir_app/src/mir_app.def b/src/mir_app/src/mir_app.def
index 608dd1e07b..0bf07ba1cc 100644
--- a/src/mir_app/src/mir_app.def
+++ b/src/mir_app/src/mir_app.def
@@ -740,3 +740,4 @@ Chat_CreateMenu @824 NONAME
?OnEventEdited@PROTO_INTERFACE@@UAEXII@Z @828 NONAME
?GetChecker@MDatabaseCommon@@UAGPAUMIDatabaseChecker@@XZ @829 NONAME
?GetMenuItem@PROTO_INTERFACE@@QAEPAUTMO_IntMenuItem@@W4ProtoMenuItemType@@@Z @830 NONAME
+_Netlib_GetTlsUnique@8 @831 NONAME
diff --git a/src/mir_app/src/mir_app64.def b/src/mir_app/src/mir_app64.def
index 2e123cd123..945587d58a 100644
--- a/src/mir_app/src/mir_app64.def
+++ b/src/mir_app/src/mir_app64.def
@@ -740,3 +740,4 @@ Chat_CreateMenu @824 NONAME
?OnEventEdited@PROTO_INTERFACE@@UEAAXII@Z @828 NONAME
?GetChecker@MDatabaseCommon@@UEAAPEAUMIDatabaseChecker@@XZ @829 NONAME
?GetMenuItem@PROTO_INTERFACE@@QEAAPEAUTMO_IntMenuItem@@W4ProtoMenuItemType@@@Z @830 NONAME
+Netlib_GetTlsUnique @831 NONAME
diff --git a/src/mir_app/src/netlib_sock.cpp b/src/mir_app/src/netlib_sock.cpp
index 2c4bfdc82a..a5f03114d0 100644
--- a/src/mir_app/src/netlib_sock.cpp
+++ b/src/mir_app/src/netlib_sock.cpp
@@ -210,9 +210,8 @@ MIR_APP_DLL(char*) Netlib_AddressToString(sockaddr_in *addr)
/////////////////////////////////////////////////////////////////////////////////////////
-MIR_APP_DLL(int) Netlib_GetConnectionInfo(HNETLIBCONN hConnection, NETLIBCONNINFO *connInfo)
+MIR_APP_DLL(int) Netlib_GetConnectionInfo(HNETLIBCONN nlc, NETLIBCONNINFO *connInfo)
{
- NetlibConnection *nlc = (NetlibConnection*)hConnection;
if (!nlc || !connInfo)
return 1;
@@ -228,6 +227,20 @@ MIR_APP_DLL(int) Netlib_GetConnectionInfo(HNETLIBCONN hConnection, NETLIBCONNINF
/////////////////////////////////////////////////////////////////////////////////////////
+MIR_APP_DLL(void*) Netlib_GetTlsUnique(HNETLIBCONN nlc, int &cbLen)
+{
+ if (nlc == nullptr || nlc->hSsl == nullptr || sslApi.unique == nullptr)
+ return nullptr;
+
+ void *pBuf = sslApi.unique(nlc->hSsl, &cbLen);
+ if (pBuf == nullptr || !cbLen)
+ return nullptr;
+
+ return pBuf;
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+
inline bool IsAddrGlobal(const IN6_ADDR *a)
{
unsigned char High = a->s6_bytes[0] & 0xf0;