Я вижу странное поведение с CryptStringToBinary Cryptography API. См. Ниже код (config: x64 Debug):
#include "stdafx.h"
#include <windows.h>
#include <strsafe.h>
#include <iostream>
#include <exception>
void main()
{
DWORD dwSkip;
DWORD dwFlags;
DWORD dwDataLen;
//LPCWSTR pszInput = L"jAAAAAECAAADZgAAAKQAAGdnNL1l56BWGFjDGR3RpxTQqqn6DAw3USv2eMkJYm4t"; //this works fine
LPCWSTR pszInput = L"MyTest"; //doesnt work, API returns false,error code 0x0000000d
// Determine the size of the BYTE array and allocate memory.
if(! CryptStringToBinary(
pszInput,
_tcslen( pszInput ) + 1,
CRYPT_STRING_BASE64,
NULL,
&dwDataLen,
&dwSkip,
&dwFlags ) )
{
DWORD dw = GetLastError(); //0x0000000d: The data is invalid
throw std::exception( "Error computing Byte length." );
}
BYTE *pbyteByte = NULL;
try
{
pbyteByte = new BYTE[ dwDataLen ];
if( !pbyteByte )
{
DWORD m_dwError = ERROR_INVALID_DATA;
throw std::exception( "Wrong array size." );
}
}
catch( std::exception &ex )
{
throw ex;
}
catch(...)
{
throw std::exception( "Out of memory." );
}
return ;
}
С первой строкой pszInput (прокомментированная строка выше) CryptStringToBinary возвращает true, но если я использую L "MyTest" в качестве строки pszInput, она возвращает false с кодом ошибки 0x0000000d. Я вижу, есть некоторая проблема с длиной строки, переданной API. Когда я передаю длину без символа с нулевым завершающим символом (удаляется +1), API всегда возвращает true. Но в этом случае верна ли длина BYTE?
Может ли кто-нибудь помочь мне понять причину такого поведения? Кроме того, правильно ли используется параметр длины в API?
Заранее спасибо!
Вы должны иметь в качестве входных данных строку base64, как определено флагом CRYPT_STRING_BASE64, а L "MyTest" не является базовым64, а первая строка.
Примеры входных форматов: http://pkix2.sysadmins.lv/library/html/T_PKI_ManagedAPI_CryptEncoding.htm