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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline CAUse  
#1 Оставлено : 7 октября 2012 г. 5:33:01(UTC)
CAUse

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

Группы: Участники
Зарегистрирован: 26.02.2012(UTC)
Сообщений: 45

Сказал(а) «Спасибо»: 2 раз
Поблагодарили: 4 раз в 1 постах
Приветствую всех заглянувших на огонек в ветку Встраиванья.

Столкнулся со следующей проблемой.
Очень сильно хочется закодировать версию операционной системы в запрос на сертификат.
Все получается, кроме одного момента.

В главных ролях снимались:
ОС версия строка (тип WideString): 6.1.7601.2
OSverName : CERT_NAME_VALUE
AttrBlobOs: CRYPT_ATTR_BLOB


Сюжет фильма такой:
OSverName.dwValueType := CERT_RDN_IA5_STRING;
OSverName.Value.cbData := 20; // для наглядности именно столько нужно, чтобы Целиком закодировать строку 6.1.7601.2
OSverName.Value.pbData := LPByte(GetOsVersion);

CryptEncodeObject(X509_ASN_ENCODING or PKCS_7_ASN_ENCODING, X509_UNICODE_ANY_STRING, @OSverName, 0, AttrBlobOs.cbData);
ShowMessage(SysErrorMessage(GetLastError));
GetMem(AttrBlobOs.pbData ,AttrBlobOs.cbData);
CryptEncodeObject(X509_ASN_ENCODING or PKCS_7_ASN_ENCODING, X509_UNICODE_ANY_STRING , @OSverName, AttrBlobOs.pbData, AttrBlobOs.cbData);

Собственно суть в следующем.
При «съемке» этого захватывающего фильма
OSverName.Value.cbData нельзя "сделать" больше или равным 18.

В итоге, максимум, что удается получить из строки «6.1.7601.2» в запросе это «6.1.7601».

Есть ли рабочий способ закодировать версию операционной системы целиком?

Отредактировано пользователем 7 октября 2012 г. 5:53:16(UTC)  | Причина: Не указана

Offline Андрей Писарев  
#2 Оставлено : 7 октября 2012 г. 18:15:11(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 14,190
Мужчина
Российская Федерация

Сказал «Спасибо»: 621 раз
Поблагодарили: 2397 раз в 1886 постах
Добрый день!

Цитата:
OSverName.Value.cbData нельзя "сделать" больше или равным 18.

а зачем? Можно!

IA5_STRING + в hex на картинке ... ( ASCII )


Цитата:
var
OSverName : CERT_NAME_VALUE;
AttrBlobOs: CRYPT_ATTR_BLOB;
OsVersion:widestring;
pStreamOut: TMemoryStream;



OsVersion:='6.1.7601.2.1234'; Anxious


Цитата:

OSverName.dwValueType := CERT_RDN_IA5_STRING;
OSverName.Value.cbData := length(OsVersion)*2; Anxious
OSverName.Value.pbData := PBYTE(OsVersion);

CryptEncodeObject(X509_ASN_ENCODING or PKCS_7_ASN_ENCODING, X509_UNICODE_ANY_STRING, @OSverName, 0, AttrBlobOs.cbData);
GetMem(AttrBlobOs.pbData ,AttrBlobOs.cbData);
CryptEncodeObject(X509_ASN_ENCODING or PKCS_7_ASN_ENCODING, X509_UNICODE_ANY_STRING , @OSverName, AttrBlobOs.pbData, AttrBlobOs.cbData);
pStreamOut:=TMemoryStream.Create;
pStreamOut.Write(AttrBlobOs.pbData^, AttrBlobOs.cbData) ;
pStreamOut.SaveToFile('c:\d.p7b');


или
Цитата:

OsVersion: string;
OSverName.Value.cbData :=length(OsVersion);
... X509_ANY_STRING ...



размер структуры (AttrBlobOs.cbData) с закодированной строкой 6.1.7601.2.1234 = 17 байт (1 байт на тип, 1 на размер, 15 - данные)

Отредактировано пользователем 7 октября 2012 г. 19:09:01(UTC)  | Причина: Не указана

Пользователь Андрей * прикрепил следующие файлы:
test.png (26kb) загружен 118 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#3 Оставлено : 7 октября 2012 г. 18:28:42(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 14,190
Мужчина
Российская Федерация

Сказал «Спасибо»: 621 раз
Поблагодарили: 2397 раз в 1886 постах
CAUse написал:

Собственно суть в следующем.
При «съемке» этого захватывающего фильма
OSverName.Value.cbData нельзя "сделать" больше или равным 18.

В итоге, максимум, что удается получить из строки «6.1.7601.2» в запросе это «6.1.7601».

Есть ли рабочий способ закодировать версию операционной системы целиком?



OsVersion:='6.1.7601.2.1234567890';

у меня получилось превысить Anxious


p.s. Пиши еще в том же стиле... Applause
p.s. почему widestring, а не ansistring ?

Отредактировано пользователем 7 октября 2012 г. 19:07:58(UTC)  | Причина: Не указана

Пользователь Андрей * прикрепил следующие файлы:
test2.png (28kb) загружен 113 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Техническую поддержку оказываем тут
Наша база знаний
Offline CAUse  
#4 Оставлено : 8 октября 2012 г. 0:23:06(UTC)
CAUse

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

Группы: Участники
Зарегистрирован: 26.02.2012(UTC)
Сообщений: 45

Сказал(а) «Спасибо»: 2 раз
Поблагодарили: 4 раз в 1 постах
Андрей * написал:
CAUse написал:

Собственно суть в следующем.
При «съемке» этого захватывающего фильма
OSverName.Value.cbData нельзя "сделать" больше или равным 18.

В итоге, максимум, что удается получить из строки «6.1.7601.2» в запросе это «6.1.7601».

Есть ли рабочий способ закодировать версию операционной системы целиком?



OsVersion:='6.1.7601.2.1234567890';

у меня получилось превысить Anxious


p.s. Пиши еще в том же стиле... Applause
p.s. почему widestring, а не ansistring ?

Спасибо за визуальный how to guide, Андрей.

Понял, что что-то не чисто когда закодировал строку в файл…

Если OSVer : AnsiString, то выходит ошибка в результате CryptEncodeObject:
The parameter is incorrect
The string contains a character not in 7 bit ASCII character set


Выкладываю также фотку актрисы:
Код:
function CryptEncodeObject(dwCertEncodingType: DWORD; lpszStructType: LPCSTR;
  pvStructInfo: Pointer; pbEncoded: LPBYTE; var pcbEncoded: DWORD): BOOL; stdcall;


При подборе показалось, что ее образ подходит для сценария фильма. Но сейчас уже и не знаю на что грешить.


Все очень странно, Андрей.

В итоге продолжения съемок фильма удалось вычислить, что вызов одних и тех же функций в разных версиях OS дает разный результат. В NT5 – не получается задать длинное e-mail адреса.
Вот такой запрос1 примерно еще можно сделать:

В NT6 можно использовать длинные имена адреса
Запрос2:

Если использовать тот же длинный адрес электронной почты в NT5, то запрос не формируется. Не получившийся запрос 3 с параметрами из запроса 2:

Причина не формирования запроса 3 – более длинная версия ОС + длинное имя электронной почты. Стоит их сделать по длине идентичным запросу 1, то все формируется.

Андрей, есть ли универсальные флаги для крипто функций, которые успешно работают для длинных строк на разных ОС? Хотя бы NT5х, NT6х…

Отредактировано пользователем 8 октября 2012 г. 0:27:44(UTC)  | Причина: Не указана

Вложение(я):
1 (1kb) загружен 5 раз(а).
2 (1kb) загружен 3 раз(а).
3 (1kb) загружен 4 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Offline Андрей Писарев  
#5 Оставлено : 8 октября 2012 г. 0:29:04(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 14,190
Мужчина
Российская Федерация

Сказал «Спасибо»: 621 раз
Поблагодарили: 2397 раз в 1886 постах
Съемки идут с помощью какой версии Delphi ?
И что используется в качестве обертки над CryptoAPI (хотя у меня описание функции один в один)

1 и 2 - проблема с кодировкой
Цитата:

0000 30 1BF: SEQUENCE {
0004 30 16E: . SEQUENCE {
0008 02 1: . . INTEGER 0
000B 30 BC: . . SEQUENCE {
000E 31 30: . . . SET {
0010 30 2E: . . . . SEQUENCE {
0012 06 9: . . . . . OBJECT IDENTIFIER emailAddress (1 2 840 113549 1 9 1)
001D 16 21: . . . . . IA5String '2auto11239999999999999999ail@m.ru'
: . . . . . }
: . . . . }
0040 31 B: . . . SET {
0042 30 9: . . . . SEQUENCE {
0044 06 3: . . . . . OBJECT IDENTIFIER countryName (2 5 4 6)
0049 13 2: . . . . . PrintableString 'RU'
: . . . . . }
: . . . . }
004D 31 11: . . . SET {
004F 30 F: . . . . SEQUENCE {
0051 06 3: . . . . . OBJECT IDENTIFIER stateOrProvinceName (2 5 4 8)
0056 13 8: . . . . . PrintableString '???????2'
: . . . . . }
: . . . . }



3 - вообще мусор... 5 ошибок
после:
0103 06 6: . . . . OBJECT IDENTIFIER '1 2 643 2 2 19'
Цитата:

Error: Invalid data encountered at position 269.
Error: Inconsistent object length, 20 bytes difference.
: . . . . }

Error: Invalid data encountered at position 271.
Error: Inconsistent object length, 87 bytes difference.
: . . . }
Error: Inconsistent object length, 156 bytes difference.
: . . }
Error: Inconsistent object length, 228 bytes difference.
: . }
Error: Inconsistent object length, 223 bytes difference.

Отредактировано пользователем 8 октября 2012 г. 0:35:31(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#6 Оставлено : 8 октября 2012 г. 0:37:24(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 14,190
Мужчина
Российская Федерация

Сказал «Спасибо»: 621 раз
Поблагодарили: 2397 раз в 1886 постах
Создал сертификаты по указанным запросам (1,2), Владелец1, как и ожидалось, получился не читаемым:
Цитата:
T = ?????????2
CN = ????2
OU = ?????????????2
O = ???????????????2
L = ?????2
S = ???????2
C = RU
E = 2auto1123ail@m.ru


Второй - те же симптомы (только более затянутые), ну а третий, как и ожидалось, фатальный :
Ошибка при обработке запроса В ASN1 встречен неожиданный конец данных. 0x80093102 (ASN: 258)

Отредактировано пользователем 8 октября 2012 г. 0:40:56(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline CAUse  
#7 Оставлено : 8 октября 2012 г. 0:48:54(UTC)
CAUse

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

Группы: Участники
Зарегистрирован: 26.02.2012(UTC)
Сообщений: 45

Сказал(а) «Спасибо»: 2 раз
Поблагодарили: 4 раз в 1 постах
Андрей * написал:
Съемки идут с помощью какой версии Delphi ?
И что используется в качестве обертки над CryptoAPI (хотя у меня описание функции один в один)

1 и 2 - проблема с кодировкой
Цитата:

0000 30 1BF: SEQUENCE {
0004 30 16E: . SEQUENCE {
0008 02 1: . . INTEGER 0
000B 30 BC: . . SEQUENCE {
000E 31 30: . . . SET {
0010 30 2E: . . . . SEQUENCE {
0012 06 9: . . . . . OBJECT IDENTIFIER emailAddress (1 2 840 113549 1 9 1)
001D 16 21: . . . . . IA5String '2auto11239999999999999999ail@m.ru'
: . . . . . }
: . . . . }
0040 31 B: . . . SET {
0042 30 9: . . . . SEQUENCE {
0044 06 3: . . . . . OBJECT IDENTIFIER countryName (2 5 4 6)
0049 13 2: . . . . . PrintableString 'RU'
: . . . . . }
: . . . . }
004D 31 11: . . . SET {
004F 30 F: . . . . SEQUENCE {
0051 06 3: . . . . . OBJECT IDENTIFIER stateOrProvinceName (2 5 4 8)
0056 13 8: . . . . . PrintableString '???????2'
: . . . . . }
: . . . . }



3 - вообще мусор... 5 ошибок
после:
0103 06 6: . . . . OBJECT IDENTIFIER '1 2 643 2 2 19'
Цитата:

Error: Invalid data encountered at position 269.
Error: Inconsistent object length, 20 bytes difference.
: . . . . }

Error: Invalid data encountered at position 271.
Error: Inconsistent object length, 87 bytes difference.
: . . . }
Error: Inconsistent object length, 156 bytes difference.
: . . }
Error: Inconsistent object length, 228 bytes difference.
: . }
Error: Inconsistent object length, 223 bytes difference.

Версия Delphi XE2.

За основу взят: JwaWinCrypt (JEDI) + добавляется или правится при необходимости содержимым WinCrypt.h.

Проблема с кодировкой имеет место быть. Запрос сделан на EN версии винды, но с русскими региональными настройками. В subject WideString’s.

Отредактировано пользователем 8 октября 2012 г. 0:49:49(UTC)  | Причина: Не указана

Offline CAUse  
#8 Оставлено : 8 октября 2012 г. 1:28:47(UTC)
CAUse

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

Группы: Участники
Зарегистрирован: 26.02.2012(UTC)
Сообщений: 45

Сказал(а) «Спасибо»: 2 раз
Поблагодарили: 4 раз в 1 постах
Андрей * написал:
Создал сертификаты по указанным запросам (1,2), Владелец1, как и ожидалось, получился не читаемым:
Цитата:
T = ?????????2
CN = ????2
OU = ?????????????2
O = ???????????????2
L = ?????2
S = ???????2
C = RU
E = 2auto1123ail@m.ru


Второй - те же симптомы (только более затянутые), ну а третий, как и ожидалось, фатальный :
Ошибка при обработке запроса В ASN1 встречен неожиданный конец данных. 0x80093102 (ASN: 258)

Андрей, винду заморскую поднастроил. Запрос с руссукими буквами идет теперь на ОК.

Но адрес электронной почты не получается задать длиннее.

Код:
function CertStrToNameW(dwCertEncodingType: DWORD; pszX500: LPCWSTR;
  dwStrType: DWORD; pvReserved: Pointer; pbEncoded: LPBYTE; var pcbEncoded: DWORD;
  ppszError: LPLPCWSTR): BOOL; stdcall;


Subject : widestring
encNameLen: DWORD;
encName: LPBYTE;

Subject := 'E=2mailail999999999999999999999999999999999999999999999@m.ru, S=Область2, L=Город2, O=Организация2, OU=Подразделение2, CN=Юзер2', T=Должность143342;

Вызов:
CertStrToNameW(
X509_ASN_ENCODING or PKCS_7_ASN_ENCODING,
PWideChar(Subject),
CERT_X500_NAME_STR
+ CERT_NAME_STR_NO_QUOTING_FLAG + CERT_NAME_STR_COMMA_FLAG
,0,
encName,
encNameLen,
0);

Если Subject сделать коротким съемка опять завершается успехом.
Если оставить, как в посте с 9999..., то дубль неудачен.

Андрей, если сделать даунгрейд средства съемки на версию скажем XE фильму поможет?

Отредактировано пользователем 8 октября 2012 г. 2:21:59(UTC)  | Причина: Не указана

Вложение(я):
6 (1kb) загружен 2 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Offline Андрей Писарев  
#9 Оставлено : 8 октября 2012 г. 1:41:08(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 14,190
Мужчина
Российская Федерация

Сказал «Спасибо»: 621 раз
Поблагодарили: 2397 раз в 1886 постах
Да, съемка успешно завершилась...


Цитата:

T = Должность2
CN = Юзер2
OU = Подразделение2
O = Организация2
L = Город2
S = Область2
C = RU
E = 2mail112ail@m.ru
Техническую поддержку оказываем тут
Наша база знаний
Offline CAUse  
#10 Оставлено : 9 октября 2012 г. 0:02:21(UTC)
CAUse

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

Группы: Участники
Зарегистрирован: 26.02.2012(UTC)
Сообщений: 45

Сказал(а) «Спасибо»: 2 раз
Поблагодарили: 4 раз в 1 постах
Андрей * написал:
Да, съемка успешно завершилась...


Цитата:

T = Должность2
CN = Юзер2
OU = Подразделение2
O = Организация2
L = Город2
S = Область2
C = RU
E = 2mail112ail@m.ru

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