Кодировки в функциях "КриптоПро CSP 4.0"
Особенности кодировки в функциях
При передаче текстовых строк в различные интерфейсы провайдера и при их получении может возникать вопрос об используемой кодировке. Рекомендации по встраиванию:
-
использовать только интерфейсы CAPI 1.0 (Crypt) и CAPI 2.0 (последний предпочтительней из-за "белого списка" функций)
-
на Windows собирать в режиме Unicode, а не MultiByte
-
по возможности пользоваться только widechar-вариантами функций (например, CryptAcquireContextW)
-
разработчики кроссплатформенных приложений должны помнить, что wchar_t - это int и имеет разную длину на разных платформах
-
widechar-строки имеют кодировку UTF-16LE, UTF-16BE, UTF-32LE, UTF-32BE в зависимости от платформы
-
для конвертации строк multibyte / widechar надо пользоваться функциями WideCharToMultiByte / MultiByteToWideChar
-
рекомендуется использовать только ASCII-символы в именах контейнеров и паролях, то есть не использовать русские буквы
-
в остальных случаях надо использовать кодировки по описаниям ниже
Для ядра провайдера (Crypt/CP/CPC) используется кодировка CP_ACP.
Для функций CAPI 2.0 и библиотек cpsuprt.dll / librdrsup.so соглашения в API могут измениться, некоторые детали в таблице ниже.
Функция | Кодировка Windows | Кодировка *nix |
CryptAcquireContextA
CryptAcquireContextW | CP_ACP | подразумевается CP_ACP |
CertOpenSystemStore*
CertOpenSystemStoreA
CertOpenSystemStoreW | CP_ACP
CP_ACP | CP_ACP
CP_ACP |
CertOpenStore
CertSaveStore | CP_ACP
CP_ACP | CP_UTF8
CP_UTF8 |
FormatMessage**
FormatMessageA
FormatMessageW | CP_ACP
CP_ACP | CP_ACP
CP_ACP |
CertNameToStrA
CertNameToStrW | CP_ACP | CP_UTF8 |
CryptGetProvParam | CP_ACP | CP_ACP |
CertRDNValueToStrA
CertRDNValueToStrW | CP_ACP | CP_ACP |
CryptVerifySignatureA
CryptVerifySignatureW | CP_ACP | CP_ACP |
CryptSignHashA
CryptSignHashW | CP_ACP | CP_ACP |
CryptBinaryToStringA
CryptBinaryToStringW | CP_ACP | подразумевается CP_ACP |
CryptGetDefaultProviderA
CryptGetDefaultProviderW | CP_ACP | подразумевается CP_ACP |
CryptStringToBinaryA
CryptStringToBinaryW | CP_ACP | подразумевается CP_ACP |
CertGetNameStringA
CertGetNameStringW | CP_ACP | CP_ACP |
*CertOpenSystemStore устаревший символ - только для временной обратной совместимости
**FormatMessage будет объявлен устаревшим и сохранится только для временной обратной совместимости
Согласно документации Microsoft на Windows CP_ACP подразумевает использование текущей установленной по умолчанию кодировки ANSI, для *nix - CP1251.