github.com/lianghucheng/zrddz@v0.0.0-20200923083010-c71f680932e2/src/gopkg.in/mgo.v2/internal/sasl/sspi_windows.c (about) 1 // Code adapted from the NodeJS kerberos library: 2 // 3 // https://github.com/christkv/kerberos/tree/master/lib/win32/kerberos_sspi.c 4 // 5 // Under the terms of the Apache License, Version 2.0: 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 #include <stdlib.h> 10 11 #include "sspi_windows.h" 12 13 static HINSTANCE sspi_secur32_dll = NULL; 14 15 int load_secur32_dll() 16 { 17 sspi_secur32_dll = LoadLibrary("secur32.dll"); 18 if (sspi_secur32_dll == NULL) { 19 return GetLastError(); 20 } 21 return 0; 22 } 23 24 SECURITY_STATUS SEC_ENTRY call_sspi_encrypt_message(PCtxtHandle phContext, unsigned long fQOP, PSecBufferDesc pMessage, unsigned long MessageSeqNo) 25 { 26 if (sspi_secur32_dll == NULL) { 27 return -1; 28 } 29 encryptMessage_fn pfn_encryptMessage = (encryptMessage_fn) GetProcAddress(sspi_secur32_dll, "EncryptMessage"); 30 if (!pfn_encryptMessage) { 31 return -2; 32 } 33 return (*pfn_encryptMessage)(phContext, fQOP, pMessage, MessageSeqNo); 34 } 35 36 SECURITY_STATUS SEC_ENTRY call_sspi_acquire_credentials_handle( 37 LPSTR pszPrincipal, LPSTR pszPackage, unsigned long fCredentialUse, 38 void *pvLogonId, void *pAuthData, SEC_GET_KEY_FN pGetKeyFn, void *pvGetKeyArgument, 39 PCredHandle phCredential, PTimeStamp ptsExpiry) 40 { 41 if (sspi_secur32_dll == NULL) { 42 return -1; 43 } 44 acquireCredentialsHandle_fn pfn_acquireCredentialsHandle; 45 #ifdef _UNICODE 46 pfn_acquireCredentialsHandle = (acquireCredentialsHandle_fn) GetProcAddress(sspi_secur32_dll, "AcquireCredentialsHandleW"); 47 #else 48 pfn_acquireCredentialsHandle = (acquireCredentialsHandle_fn) GetProcAddress(sspi_secur32_dll, "AcquireCredentialsHandleA"); 49 #endif 50 if (!pfn_acquireCredentialsHandle) { 51 return -2; 52 } 53 return (*pfn_acquireCredentialsHandle)( 54 pszPrincipal, pszPackage, fCredentialUse, pvLogonId, pAuthData, 55 pGetKeyFn, pvGetKeyArgument, phCredential, ptsExpiry); 56 } 57 58 SECURITY_STATUS SEC_ENTRY call_sspi_initialize_security_context( 59 PCredHandle phCredential, PCtxtHandle phContext, LPSTR pszTargetName, 60 unsigned long fContextReq, unsigned long Reserved1, unsigned long TargetDataRep, 61 PSecBufferDesc pInput, unsigned long Reserved2, PCtxtHandle phNewContext, 62 PSecBufferDesc pOutput, unsigned long *pfContextAttr, PTimeStamp ptsExpiry) 63 { 64 if (sspi_secur32_dll == NULL) { 65 return -1; 66 } 67 initializeSecurityContext_fn pfn_initializeSecurityContext; 68 #ifdef _UNICODE 69 pfn_initializeSecurityContext = (initializeSecurityContext_fn) GetProcAddress(sspi_secur32_dll, "InitializeSecurityContextW"); 70 #else 71 pfn_initializeSecurityContext = (initializeSecurityContext_fn) GetProcAddress(sspi_secur32_dll, "InitializeSecurityContextA"); 72 #endif 73 if (!pfn_initializeSecurityContext) { 74 return -2; 75 } 76 return (*pfn_initializeSecurityContext)( 77 phCredential, phContext, pszTargetName, fContextReq, Reserved1, TargetDataRep, 78 pInput, Reserved2, phNewContext, pOutput, pfContextAttr, ptsExpiry); 79 } 80 81 SECURITY_STATUS SEC_ENTRY call_sspi_query_context_attributes(PCtxtHandle phContext, unsigned long ulAttribute, void *pBuffer) 82 { 83 if (sspi_secur32_dll == NULL) { 84 return -1; 85 } 86 queryContextAttributes_fn pfn_queryContextAttributes; 87 #ifdef _UNICODE 88 pfn_queryContextAttributes = (queryContextAttributes_fn) GetProcAddress(sspi_secur32_dll, "QueryContextAttributesW"); 89 #else 90 pfn_queryContextAttributes = (queryContextAttributes_fn) GetProcAddress(sspi_secur32_dll, "QueryContextAttributesA"); 91 #endif 92 if (!pfn_queryContextAttributes) { 93 return -2; 94 } 95 return (*pfn_queryContextAttributes)(phContext, ulAttribute, pBuffer); 96 }