Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline miser  
#1 Оставлено : 21 июля 2015 г. 1:46:31(UTC)
miser

Статус: Активный участник

Группы: Участники
Зарегистрирован: 14.03.2011(UTC)
Сообщений: 152
Мужчина
Откуда: Санкт-Петербург

Сказал «Спасибо»: 1 раз
Поблагодарили: 7 раз в 5 постах
Просвятите, пожалуйста.

Рассмотрим документацию функции CryptFindOIDInfo.
Скажем так, пожадничали в описании. Есть ссылка на MSDN документацию к этой функции.

Читаем:
для dwKeyType = CRYPT_OID_INFO_OID_KEY
pvKey is the address of a null-terminated ANSI string that contains the OID string to find.

Но у нас ведь современная Linux, где для консоли выставлена UTF-8, а не какая то KOI-8R.
То есть, "ANSI string" надо читать как UTF-8 - C++11 u8"OID.XXX.XXX.XXX..." ?

Читаем дальше:
для dwKeyType = CRYPT_OID_INFO_NAME_KEY
pvKey is the address of a null-terminated Unicode string that contains the name to find.

Unicode? Какой такой Unicode
UTF-16 - C++11 u"OID.XXX.XXX.XXX..." ? (wchar_t for Windows, 2 bytes)
UTF-32 - C++11 U"OID.XXX.XXX.XXX..." ? (wchar_t for Linux, 4 bytes)

mbstowcs (#include <stdlib.h>) - это UTF-8 в wchar_t или UTF-16 в wchar_t ? (Linux wchar_t === UTF-32)
Offline cross  
#2 Оставлено : 21 июля 2015 г. 10:09:56(UTC)
Анатолий Беляев

Статус: Сотрудник

Группы: Администраторы, Участники
Зарегистрирован: 24.11.2009(UTC)
Сообщений: 965
Откуда: Crypto-Pro

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 174 раз в 152 постах
Это же ведь MS API, им на "современный Linux" как то все равно...
Поэтому ANSI это не UTF-8.

Насчет Unicode - это wchar_t. И для win и для Linux он разный. И разный ожидается в разных платформах. Для бинарной совместимости как либо блобов надо конвертировать их в платформозависимый вид.

насчет mbstowcs -
The behavior of mbstowcs() depends on the LC_CTYPE category of the current locale.
Техническую поддержку оказываем тут.
Наша база знаний.
Наша страничка в Instagram.
Offline miser  
#3 Оставлено : 22 июля 2015 г. 11:23:54(UTC)
miser

Статус: Активный участник

Группы: Участники
Зарегистрирован: 14.03.2011(UTC)
Сообщений: 152
Мужчина
Откуда: Санкт-Петербург

Сказал «Спасибо»: 1 раз
Поблагодарили: 7 раз в 5 постах
Хочу еще раз помучить. Think

Функция CertGetNameString. Точнее, это псевдоним для двух функций CertGetNameStringA и CertGetNameStringW.
В документации MSDN написано
Цитата:
Returns the number of characters converted, including the terminating zero character.


Для CertGetNameStringW все более менее ясно для wchar_t (char32_t).
Но совсем туманно становится для Windows wchar_t (char16_t).

Рассмотрим базовый пример из документации к функции mbstowcs
Код:

std::setlocale(LC_ALL, "en_US.utf8");
const char* mbstr = u8"z\u00df\u6c34\U0001d10b";


В строке 4 буквы, плюс NULL терминатор. Итого, 5 букв.

Я почему то ожидаю, что под Linux вернет 5, а под Windows 6.
Функцией CertGetNameStringA вообще, страшно пользоваться.

Что на самом деле вернет функция CertGetNameStringW ?
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.