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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Дмитрий Дв.  
#1 Оставлено : 18 октября 2021 г. 13:28:36(UTC)
Дмитрий Дв.

Статус: Участник

Группы: Участники
Зарегистрирован: 14.10.2021(UTC)
Сообщений: 12
Российская Федерация

Сказал(а) «Спасибо»: 9 раз
Время выпуска сертификата и его срок годности имеет формат FILETIME, которые можно перевести в SYSTEMTIME методом CSP_FileTimeToSystemTime, но вот как дальше получить время с учётом часового пояса, т.е. не в utc? Может быть есть какой нибудь аналог SystemTymeToTzSpetificLocalTime начинающийся с CSP_...? в хэдерах такого метода нет
Offline Андрей *  
#2 Оставлено : 18 октября 2021 г. 13:48:06(UTC)
Андрей *

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

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

Сказал «Спасибо»: 393 раз
Поблагодарили: 1613 раз в 1238 постах
ЯП\Задача какая?

1) c++ ?
2) utc to local time? В гугле?

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#3 Оставлено : 18 октября 2021 г. 13:50:32(UTC)
Андрей *

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

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

Сказал «Спасибо»: 393 раз
Поблагодарили: 1613 раз в 1238 постах
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#4 Оставлено : 18 октября 2021 г. 13:52:16(UTC)
Андрей *

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

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

Сказал «Спасибо»: 393 раз
Поблагодарили: 1613 раз в 1238 постах
Техническую поддержку оказываем тут
Наша база знаний
Offline Дмитрий Дв.  
#5 Оставлено : 18 октября 2021 г. 13:54:03(UTC)
Дмитрий Дв.

Статус: Участник

Группы: Участники
Зарегистрирован: 14.10.2021(UTC)
Сообщений: 12
Российская Федерация

Сказал(а) «Спасибо»: 9 раз
Автор: Андрей * Перейти к цитате
ЯП\Задача какая?

1) c++ ?
2) utc to local time? В гугле?




Это же под ios, тут предлагаемые варианты в гугле для win не подходят насколько понял...
Задача отобразить даты с учётом пояса, сейчас это выполняется так, без учёта часового пояса:
NSString* getNotBefore(PCCERT_CONTEXT *pCertContext) {
FILETIME fileTime = (*pCertContext)->pCertInfo->NotBefore;
SYSTEMTIME systemTime;
CSP_FileTimeToSystemTime(&fileTime, &systemTime);
return [NSString stringWithFormat:@"%d.%d.%d %d:%d",
systemTime.wDay,
systemTime.wMonth,
systemTime.wYear,
systemTime.wHour,
systemTime.wMinute];
}

Отредактировано пользователем 18 октября 2021 г. 13:54:34(UTC)  | Причина: Не указана

Offline Дмитрий Дв.  
#6 Оставлено : 18 октября 2021 г. 13:58:56(UTC)
Дмитрий Дв.

Статус: Участник

Группы: Участники
Зарегистрирован: 14.10.2021(UTC)
Сообщений: 12
Российская Федерация

Сказал(а) «Спасибо»: 9 раз
Автор: Андрей * Перейти к цитате


и на ios тоже должен такой быть? т.е. не нужен аналог начинающийся что то вроде с CSP_FileTimeToLocalFileTime?
Offline two_oceans  
#7 Оставлено : 19 октября 2021 г. 17:07:55(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,351
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 90 раз
Поблагодарили: 319 раз в 300 постах
Добрый день.
Проблема отображения поясного времени очень болезненна для любого программного окружения.
Дело в том, что смещение времени не постоянно (часы преводят, часовые пояса меняют границы), кроме того даже не кратно целому часу (в большинстве случаев кратно 5 минутам) и есть полугодовые поправки в 1 секунду в зависимости от вращения земного шара.
Другими словами, если нужна точность, то функция перевода времени должна это все учитывать. Либо, например, доверить ОС заботу об этом и запрашивать смещение от ОС.

С другой стороны, если Вам каким-то образом уже известно смещение времени для пояса, то и FileTimeToLocalFileTime не нужно: просто трактуете FILETIME как 64-битное (без)знаковое целое число (ULONGLONG если не ошибаюсь) и прибавляете (или вычитаете) смещение в секундах умноженное на 10 миллионов (так как FILETIME считает 10-миллионные доли секунды). Выходит, что для получения московского времени надо прибавить 3 * 3600 * 10 млн = 108 миллиардов. Что-то вроде:
Код:
FILETIME fileTime = (*pCertContext)->pCertInfo->NotBefore;
LONG offset = 3 * 3600;  // здесь получить актуальное смещение для пояса (в секундах)
(ULONGLONG) fileTime += offset * 10000000;
SYSTEMTIME systemTime;
CSP_FileTimeToSystemTime(&fileTime, &systemTime);


Например, если у Вас какая-то ИС с аккаунтом пользователя, можно дать пользователю возможность выбора часового пояса и рассчитывать смещение оттуда. В простейшем варианте - выбор пояса на страничке где показываете данные о времени сертификата. По сути в iOS то же самое уже есть, остается только как-то получить информацию о часовом поясе и его смещении от iOS. Еще вариант - получать отметку времени по гринвичу с какого-нибудь сервера и сравнивать с датой на устройстве, разница с округлением до 5 минут обычно и будет смещением.

Отредактировано пользователем 19 октября 2021 г. 17:32:57(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил two_oceans за этот пост.
Дмитрий Дв. оставлено 19.10.2021(UTC)
Offline Дмитрий Дв.  
#8 Оставлено : 19 октября 2021 г. 18:29:35(UTC)
Дмитрий Дв.

Статус: Участник

Группы: Участники
Зарегистрирован: 14.10.2021(UTC)
Сообщений: 12
Российская Федерация

Сказал(а) «Спасибо»: 9 раз
Да, спасибо, смещения через offset будет достаточно
Offline Дмитрий Дв.  
#9 Оставлено : 20 октября 2021 г. 16:21:57(UTC)
Дмитрий Дв.

Статус: Участник

Группы: Участники
Зарегистрирован: 14.10.2021(UTC)
Сообщений: 12
Российская Федерация

Сказал(а) «Спасибо»: 9 раз
Но ведь формат FILETIME = {
DWORD dwLowDateTime;
DWORD dwHighDateTime;
}
Как тут учесть смещение? если смещение пытаться прибавить следующим образом (ULONGLONG) fileTime += offset * 10000000; топоявляется ошибка связанная с приведением типов(пробовал по разному, например unsigned_int)
Offline two_oceans  
#10 Оставлено : 20 октября 2021 г. 17:53:47(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,351
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 90 раз
Поблагодарили: 319 раз в 300 постах
Для удобства использования на 32-битных ОС Maйкрософт просто поделили 64-битное целое число на 2 части и объявили как структуру. Обратите внимание, что часть Low идет первой, что соответствует принципу x86 процессоров Intel - "младший байт по младшему адресу" Little Endian - поэтому в памяти представление двух 4-байтовых полей такое же как у 8-байтовой числовой целой переменной. Если у Вас другая целевая архитектура (какой-нибудь ARM с BigEndian), то возможны несоответствия, поэтому возможно компилятор и упирается.

На FreePascal / Delphi я просто привожу к типу int64 либо QWORD - проверял, работает в 32-разрядных Windows приложениях. Какой тип подходит для 64-разрядных операций на С++ наверно Вам виднее (так как я в основном читаю программы на С++ и переписываю на паскале). Знаю что есть разница в длине переменных на разных компиляторах C++.

Еще может быть проблема в самом выражении "offset * 10000000" связанная с переполнением типа, неявно выбранного компилятором для результата умножения, в этом случае offset можно указать подлиннее или присваивать "offset * 10000000" в длинную промежуточную переменную, это даст компилятору "подсказку", что надо ждать большое число.

Отредактировано пользователем 20 октября 2021 г. 19:52:03(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил two_oceans за этот пост.
Дмитрий Дв. оставлено 21.10.2021(UTC)
Offline KDA  
#11 Оставлено : 20 октября 2021 г. 18:54:44(UTC)
KDA

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

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

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 6 раз в 6 постах
Какая жесть. Такие касты - это UB в чистом виде.
Ведь можно же поприличнее структуру заполнить, без привязок к платформе:

Код:

fileTime.dwLowDateTime = (DWORD)offset_ft;
fileTime.dwHighDateTime = (DWORD)(offset_ft >> 32);

Отредактировано пользователем 20 октября 2021 г. 18:59:13(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил KDA за этот пост.
Дмитрий Дв. оставлено 21.10.2021(UTC)
Offline two_oceans  
#12 Оставлено : 20 октября 2021 г. 18:56:53(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,351
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 90 раз
Поблагодарили: 319 раз в 300 постах
Заполнить не вопрос. Нужно сложение. А его в данном случае удобно делать только на ассемблере иначе намучаетесь с переносом. Cложение FILETIME тоже вряд ли определено. Хотя, если перенести поля FILETIME в offset_ft, сложить и перенести обратно, то может пойти.

Отредактировано пользователем 20 октября 2021 г. 19:06:44(UTC)  | Причина: Не указана

Offline KDA  
#13 Оставлено : 20 октября 2021 г. 19:03:20(UTC)
KDA

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

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

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 6 раз в 6 постах
Обратно из двух 32-битных собрать одно в 64 бита и сложить с третьим,
даже с контролем переноса - для этого нужен ассемблер?

Стесняюсь спросить, это в промышленном ПО так?
Не могли бы Вы его обозначить, чтобы избегать его при эксплуатации? :)
Offline two_oceans  
#14 Оставлено : 20 октября 2021 г. 19:08:26(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,351
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 90 раз
Поблагодарили: 319 раз в 300 постах
Там это проще всего, без разборов/сборов, напрямую, благо есть MMX даже на 32-разрядных процессорах уже много лет. Собственно, при чем тут промышленное ПО, если это просто тупо ограничения компилятора. Все эти извращения появляются когда компилятор считает что-то невозможным (не переносимым на другие платформы). А я лучше напишу под каждую архитектуру отдельный код и разделю ifdef - не люблю доверять тому что наколбасит компилятор в машинном коде, пытаясь найти универсальность под разными платформами.

Уже то что компилятор автоматом вставляет вызовы небезопасных функций работы со строками без ограничения длины много стоит. Майкрософт такие - нет Вам эту функцию использовать низя, она устаревшая и т.п. Но наш компилятор ее Вам вставит, хотите или нет, потому что мы такие офигенные и предусмотрели вообще все случаи когда компилятор ее может вставить и проанализировали их. Потом они же: обновление нашего продукта исправляет ошибку переполнения буфера.

Отредактировано пользователем 20 октября 2021 г. 19:18:25(UTC)  | Причина: Не указана

Offline KDA  
#15 Оставлено : 20 октября 2021 г. 19:22:31(UTC)
KDA

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

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

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 6 раз в 6 постах
А потом еще делать разные реализации под разные платформы.
И писать простыни про особенности представления чисел на Intel и борьбу с компиляторами :)

Впрочем, как я уже поправил выше, Ваш пример на С++ демонстрирует неопределенное поведение,
и никакой ассемблер этому не поможет.

Кстати, хорошо, что Microsoft вспомнили:
В Visual Studio при сборке под 64 бита встроенного ассемблера все равно не предусмотрено, нужно колхозить с раздельной компиляцией :)

Отредактировано пользователем 20 октября 2021 г. 19:24:12(UTC)  | Причина: Не указана

Offline two_oceans  
#16 Оставлено : 20 октября 2021 г. 19:36:23(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,351
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 90 раз
Поблагодарили: 319 раз в 300 постах
Цитата:
Ваш пример на С++ демонстрирует неопределенное поведение,
Тогда выдохните, на С++ я не пишу, о чем тоже сказано выше.

Сама терминология UB и подразумевает, что подстраиваетесь под компилятор и его закидоны. Не спорю, что это правильно и удобно в большинстве случаев, однако так же есть и раздражающие моменты когда знаешь что типы одинаковы, а компилятор считает что у них разное формальное описание, которое на какой-то из кучи поддерживаемых платформ отличается в поведении. Мне просто та платформа не нужна. Пока еще. Но ведь нет, все равно надо еще 33 раза переменную по частям скопировать, чтобы соответствовала формальностям.

Ассемблер поможет. Как не на ассемблере увидите перенос? Потому и вспомнил, что не предусмотрели и потому решение на ассемблере не в кассу в вопросе про С++. Но для полноты (ничего делить не надо и так по 4 байта поделено):
Код:
// на самом деле маленькие локальные переменные располагаются в стеке, вместо ecx/edx используется esp
push ebx
push edx
lea ecx, fileTime
lea edx, offset_ft
// на всякий переместим в регистр
push ebx
mov ebx, [ecx]
add ebx, [edx]
mov [ecx], ebx
mov ebx, [ecx+4]
adc ebx, [edx+4]
mov [ecx+4], ebx
pop ebx
pop ecx
pop edx

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

Offline KDA  
#17 Оставлено : 20 октября 2021 г. 22:05:16(UTC)
KDA

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

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

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 6 раз в 6 постах
Наверное, пример на С++ и советы совладать с компилятором давал второй владелец аккаунта :)

Ну и зачем писать про закидоны, если не владеете предметом?
Все это прописано в стандарте языка, на уровнях undefined, unspecified and implementation-defined.

Цитата:
Мне просто та платформа не нужна.

А вот автору нужна другая плаформа. Что, в принципе, было ясно по самому первому посту.

С приведенным куском не понял, чем он лучше (ну, кроме желания блеснуть знаниями):
- некомпилябельный.
- неясный ABI
- ошибок переполнения не ловит
- offset из секунд надо считать отдельно.
- нормальный С/C++ компилятор под эту платформу соберет практически как же или лучше.

Собственно, демо к последнему. Обработка переполнения так же опущена, как и в остальных примерах
Код:
void __declspec(noinline) adjust_filetime(FILETIME& ft, int offset_secs)
{
    ULONGLONG u_ft = (ULONGLONG(ft.dwHighDateTime) << 32) + ft.dwLowDateTime;
    LONGLONG i_off = (LONGLONG)offset_secs * 10000000;
    u_ft += i_off;
    ft.dwLowDateTime = (DWORD)u_ft;
    ft.dwHighDateTime = (DWORD)(u_ft >> 32);
}


Выхлоп с MSVC 14.29.30133. И это без встраивания и с умножением
Код:

mov         eax,edx  
mov         edx,989680h  
imul        edx  
add         eax,0  
adc         edx,dword ptr [ecx+4]  
add         dword ptr [ecx],eax  
adc         edx,0  
mov         dword ptr [ecx+4],edx  
ret

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

thanks 1 пользователь поблагодарил KDA за этот пост.
Дмитрий Дв. оставлено 21.10.2021(UTC)
Offline Дмитрий Дв.  
#18 Оставлено : 21 октября 2021 г. 12:54:45(UTC)
Дмитрий Дв.

Статус: Участник

Группы: Участники
Зарегистрирован: 14.10.2021(UTC)
Сообщений: 12
Российская Федерация

Сказал(а) «Спасибо»: 9 раз
Теперь уж точно разобрался, спасибо)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.