CryptStringToBinary暗号化 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
0x0000000
API に渡される文字列の長さに問題があります。null で終了する char ( removed+1
) なしで長さを渡すと、API はtrue
常に戻ります。しかし、この場合、BYTE
返された長さは正しいですか?
この動作の背後にある理由を理解するのを手伝ってくれる人はいますか?
また、API での長さパラメーターの使用法は正しいですか?