diff options
author | George Hazan <george.hazan@gmail.com> | 2013-06-04 07:55:00 +0000 |
---|---|---|
committer | George Hazan <george.hazan@gmail.com> | 2013-06-04 07:55:00 +0000 |
commit | 8751885ea79df4b666b65bb2b6900617785e0da7 (patch) | |
tree | 676db28129ece760d7ad354b2d39ba371453db8c /src/modules/netlib | |
parent | 09476981eccbcae37ef4526f3fbcb18fca686ffa (diff) |
end of base64* zoo
git-svn-id: http://svn.miranda-ng.org/main/trunk@4879 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'src/modules/netlib')
-rw-r--r-- | src/modules/netlib/netlib.cpp | 92 | ||||
-rw-r--r-- | src/modules/netlib/netlibsecurity.cpp | 60 |
2 files changed, 23 insertions, 129 deletions
diff --git a/src/modules/netlib/netlib.cpp b/src/modules/netlib/netlib.cpp index f3ba8e0e12..b7a3bc3c2d 100644 --- a/src/modules/netlib/netlib.cpp +++ b/src/modules/netlib/netlib.cpp @@ -424,96 +424,6 @@ INT_PTR NetlibHttpUrlEncode(WPARAM, LPARAM lParam) return (INT_PTR)p;
}
-static const char base64chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-INT_PTR NetlibBase64Encode(WPARAM, LPARAM lParam)
-{
- NETLIBBASE64 *nlb64 = (NETLIBBASE64*)lParam;
- int iIn;
- char *pszOut;
- PBYTE pbIn;
-
- if (nlb64 == NULL || nlb64->pszEncoded == NULL || nlb64->pbDecoded == NULL) {
- SetLastError(ERROR_INVALID_PARAMETER);
- return 0;
- }
- if (nlb64->cchEncoded<Netlib_GetBase64EncodedBufferSize(nlb64->cbDecoded)) {
- SetLastError(ERROR_BUFFER_OVERFLOW);
- return 0;
- }
- nlb64->cchEncoded = Netlib_GetBase64EncodedBufferSize(nlb64->cbDecoded);
- for (iIn = 0, pbIn = nlb64->pbDecoded, pszOut = nlb64->pszEncoded;iIn<nlb64->cbDecoded;iIn+=3, pbIn+=3, pszOut+=4) {
- pszOut[0] = base64chars[pbIn[0]>>2];
- if (nlb64->cbDecoded-iIn == 1) {
- pszOut[1] = base64chars[(pbIn[0]&3)<<4];
- pszOut[2] = '=';
- pszOut[3] = '=';
- pszOut+=4;
- break;
- }
- pszOut[1] = base64chars[((pbIn[0]&3)<<4)|(pbIn[1]>>4)];
- if (nlb64->cbDecoded-iIn == 2) {
- pszOut[2] = base64chars[(pbIn[1]&0xF)<<2];
- pszOut[3] = '=';
- pszOut+=4;
- break;
- }
- pszOut[2] = base64chars[((pbIn[1]&0xF)<<2)|(pbIn[2]>>6)];
- pszOut[3] = base64chars[pbIn[2]&0x3F];
- }
- pszOut[0] = '\0';
- return 1;
-}
-
-static BYTE Base64CharToInt(char c)
-{
- if (c>='A' && c <= 'Z') return c-'A';
- if (c>='a' && c <= 'z') return c-'a'+26;
- if (c>='0' && c <= '9') return c-'0'+52;
- if (c == '+') return 62;
- if (c == '/') return 63;
- if (c == '=') return 64;
- return 255;
-}
-
-INT_PTR NetlibBase64Decode(WPARAM, LPARAM lParam)
-{
- NETLIBBASE64 *nlb64 = (NETLIBBASE64*)lParam;
- char *pszIn;
- PBYTE pbOut;
- BYTE b1, b2, b3, b4;
- int iIn;
-
- if (nlb64 == NULL || nlb64->pszEncoded == NULL || nlb64->pbDecoded == NULL) {
- SetLastError(ERROR_INVALID_PARAMETER);
- return 0;
- }
- if (nlb64->cchEncoded&3) {
- SetLastError(ERROR_INVALID_DATA);
- return 0;
- }
- if (nlb64->cbDecoded<Netlib_GetBase64DecodedBufferSize(nlb64->cchEncoded)) {
- SetLastError(ERROR_BUFFER_OVERFLOW);
- return 0;
- }
- nlb64->cbDecoded = Netlib_GetBase64DecodedBufferSize(nlb64->cchEncoded);
- for (iIn = 0, pszIn = nlb64->pszEncoded, pbOut = nlb64->pbDecoded;iIn<nlb64->cchEncoded;iIn+=4, pszIn+=4, pbOut+=3) {
- b1 = Base64CharToInt(pszIn[0]);
- b2 = Base64CharToInt(pszIn[1]);
- b3 = Base64CharToInt(pszIn[2]);
- b4 = Base64CharToInt(pszIn[3]);
- if (b1 == 255 || b1 == 64 || b2 == 255 || b2 == 64 || b3 == 255 || b4 == 255) {
- SetLastError(ERROR_INVALID_DATA);
- return 0;
- }
- pbOut[0] = (b1<<2)|(b2>>4);
- if (b3 == 64) {nlb64->cbDecoded-=2; break;}
- pbOut[1] = (b2<<4)|(b3>>2);
- if (b4 == 64) {nlb64->cbDecoded--; break;}
- pbOut[2] = b4|(b3<<6);
- }
- return 1;
-}
-
void UnloadNetlibModule(void)
{
if ( !bModuleInitialized) return;
@@ -619,8 +529,6 @@ int LoadNetlibModule(void) CreateServiceFunction(MS_NETLIB_SETSTICKYHEADERS, NetlibHttpSetSticky);
CreateServiceFunction(MS_NETLIB_GETSOCKET, NetlibGetSocket);
CreateServiceFunction(MS_NETLIB_URLENCODE, NetlibHttpUrlEncode);
- CreateServiceFunction(MS_NETLIB_BASE64ENCODE, NetlibBase64Encode);
- CreateServiceFunction(MS_NETLIB_BASE64DECODE, NetlibBase64Decode);
CreateServiceFunction(MS_NETLIB_SENDHTTPREQUEST, NetlibHttpSendRequest);
CreateServiceFunction(MS_NETLIB_RECVHTTPHEADERS, NetlibHttpRecvHeaders);
CreateServiceFunction(MS_NETLIB_FREEHTTPREQUESTSTRUCT, NetlibHttpFreeRequestStruct);
diff --git a/src/modules/netlib/netlibsecurity.cpp b/src/modules/netlib/netlibsecurity.cpp index 33656dc868..2f538a06fd 100644 --- a/src/modules/netlib/netlibsecurity.cpp +++ b/src/modules/netlib/netlibsecurity.cpp @@ -252,14 +252,7 @@ char* CompleteGssapi(HANDLE hSecurity, unsigned char *szChallenge, unsigned chls p += outBuffersDesc.pBuffers[i].cbBuffer;
}
- NETLIBBASE64 nlb64;
- nlb64.cbDecoded = ressz;
- nlb64.pbDecoded = response;
- nlb64.cchEncoded = Netlib_GetBase64EncodedBufferSize(nlb64.cbDecoded);
- nlb64.pszEncoded = (char*)alloca(nlb64.cchEncoded);
- if ( !NetlibBase64Encode(0, (LPARAM)&nlb64)) return NULL;
-
- return mir_strdup(nlb64.pszEncoded);
+ return mir_base64_encode(response, ressz);
}
char* NtlmCreateResponseFromChallenge(HANDLE hSecurity, const char *szChallenge, const TCHAR* login, const TCHAR* psw, bool http, unsigned& complete)
@@ -269,7 +262,7 @@ char* NtlmCreateResponseFromChallenge(HANDLE hSecurity, const char *szChallenge, SecBuffer outputSecurityToken, inputSecurityToken;
TimeStamp tokenExpiration;
ULONG contextAttributes;
- NETLIBBASE64 nlb64 = { 0 };
+ char *szOutputToken;
NtlmHandleType* hNtlm = (NtlmHandleType*)hSecurity;
@@ -282,30 +275,29 @@ char* NtlmCreateResponseFromChallenge(HANDLE hSecurity, const char *szChallenge, bool hasChallenge = szChallenge != NULL && szChallenge[0] != '\0';
if (hasChallenge)
{
- nlb64.cchEncoded = lstrlenA(szChallenge);
- nlb64.pszEncoded = (char*)szChallenge;
- nlb64.cbDecoded = Netlib_GetBase64DecodedBufferSize(nlb64.cchEncoded);
- nlb64.pbDecoded = (PBYTE)alloca(nlb64.cbDecoded);
- if ( !NetlibBase64Decode(0, (LPARAM)&nlb64)) return NULL;
+ unsigned tokenLen;
+ BYTE *token = (BYTE*)mir_base64_decode(szChallenge, &tokenLen);
+ if (token == NULL)
+ return NULL;
if (isGSSAPI && complete)
- return CompleteGssapi(hSecurity, nlb64.pbDecoded, nlb64.cbDecoded);
+ return CompleteGssapi(hSecurity, token, tokenLen);
inputBufferDescriptor.cBuffers = 1;
inputBufferDescriptor.pBuffers = &inputSecurityToken;
inputBufferDescriptor.ulVersion = SECBUFFER_VERSION;
inputSecurityToken.BufferType = SECBUFFER_TOKEN;
- inputSecurityToken.cbBuffer = nlb64.cbDecoded;
- inputSecurityToken.pvBuffer = nlb64.pbDecoded;
+ inputSecurityToken.cbBuffer = tokenLen;
+ inputSecurityToken.pvBuffer = token;
// try to decode the domain name from the NTLM challenge
if (login != NULL && login[0] != '\0' && !hNtlm->hasDomain)
{
- NtlmType2packet* pkt = (NtlmType2packet*)nlb64.pbDecoded;
+ NtlmType2packet* pkt = (NtlmType2packet*)token;
if ( !strncmp(pkt->sign, "NTLMSSP", 8) && pkt->type == 2)
{
- wchar_t* domainName = (wchar_t*)&nlb64.pbDecoded[pkt->targetName.offset];
+ wchar_t* domainName = (wchar_t*)&token[pkt->targetName.offset];
int domainLen = pkt->targetName.len;
// Negotiate ANSI? if yes, convert the ANSI name to unicode
@@ -412,8 +404,7 @@ char* NtlmCreateResponseFromChallenge(HANDLE hSecurity, const char *szChallenge, return NULL;
}
- nlb64.cbDecoded = outputSecurityToken.cbBuffer;
- nlb64.pbDecoded = (PBYTE)outputSecurityToken.pvBuffer;
+ szOutputToken = mir_base64_encode((PBYTE)outputSecurityToken.pvBuffer, outputSecurityToken.cbBuffer);
}
else
{
@@ -425,30 +416,25 @@ char* NtlmCreateResponseFromChallenge(HANDLE hSecurity, const char *szChallenge, size_t authLen = strlen(szLogin) + strlen(szPassw) + 5;
char *szAuth = (char*)alloca(authLen);
- nlb64.cbDecoded = mir_snprintf(szAuth, authLen, "%s:%s", szLogin, szPassw);
- nlb64.pbDecoded = (PBYTE)szAuth;
+ mir_snprintf(szAuth, authLen, "%s:%s", szLogin, szPassw);
+ szOutputToken = mir_strdup(szAuth);
complete = true;
mir_free(szPassw);
mir_free(szLogin);
}
- nlb64.cchEncoded = Netlib_GetBase64EncodedBufferSize(nlb64.cbDecoded);
- nlb64.pszEncoded = (char*)alloca(nlb64.cchEncoded);
- if ( !NetlibBase64Encode(0, (LPARAM)&nlb64)) return NULL;
+ if (szOutputToken == NULL)
+ return NULL;
- char* result;
- if (http)
- {
- char* szProvider = mir_t2a(hNtlm->szProvider);
- nlb64.cchEncoded += (int)strlen(szProvider) + 10;
- result = (char*)mir_alloc(nlb64.cchEncoded);
- mir_snprintf(result, nlb64.cchEncoded, "%s %s", szProvider, nlb64.pszEncoded);
- mir_free(szProvider);
- }
- else
- result = mir_strdup(nlb64.pszEncoded);
+ if (!http)
+ return mir_strdup(szOutputToken);
+ ptrA szProvider( mir_t2a(hNtlm->szProvider));
+ size_t resLen = strlen(szOutputToken) + strlen(szProvider) + 10;
+ char *result = (char*)mir_alloc(resLen);
+ mir_snprintf(result, resLen, "%s %s", szProvider, szOutputToken);
+ mir_free(szOutputToken);
return result;
}
|