четверг, 31 января 2019 г.

Криптография на эллипсе

Я много почитал статей по эллиптическим кривым, и теперь хочу описать свои впечатления.

Самое сильное из моих впечатлений - это часики. Это понятная аналогия, проясняет сознание.
Возьмем к примеру окружность, часики с круглым циферблатом, уравнение окружности:
x^2+y^2 = 1

Примем за начало отсчета точку O = (0,1) . 12часов 00 минут.
К чему мы клоним, чтобы сразу стало понятно. Мы вводим группу вращения стрелок на циферблате. Время складывается: минуты в часы...
Стараемся думать про одну стрелку. за минуту стрелка отклонилась на (x1, y1). Эту точку можно выразить через синусы и косинусы единичного перемещения 360/60 = 6 градусов. Координаты единичного перемещения обозначим точкой G=(x1,y1)

Утверждаем что это у нас Группа точек на кривой, Группа в математическом смысле.
Свойство Группы:
1) Существование нейтрального элемента, такого что P+O = P, O = (0,1)
2) Существование обратного элемента для каждого члена группы, -P= (-x,y). Перевели стрелки назад. P+(-P)=O
Вводим операцию удвоения точки, с ней можно будет ввести операцию умножения на скаляр через удвоение и сложение.
3) 2P = ... осторожно можно споткнуться... = (cos(2ф), sin(2ф)) = (x^2-y^2, yx+xy)
4) Закон сложения точек (x1, y1)+(x2, y2) = (cos(a+b), sin(a+b)) = (x1x2-y1y2, y1x2+x1y2)

А теперь можно заставить часики ходить...
Алгоритм №1 умножения на скаляр Q = kP, k-раз по минуте.

Q:=O;
for i=.. downto 0 begin
  Q := 2Q;
  if (k_i !=0) Q:= Q+P;
end

Минуты считаются по модулю 60. Число 60 не является простым, его можно на множители раскладывать. Число Р назовем генератором группы, обозначим буквой G чтобы всех запутать.

Алгоритм №2 умножение лесенкой Монтгомери.

Q:=O; P=G;
for i=.. downto 0 begin
  if (k_i !=0){
      Q:= Q+P, P=2P;
  } else {
      P: =P+Q, Q=2Q;
  }
end
return Q
Эти алгоритмы не зависят от того как выглядит операция удвоения и сложения. Алгоритмов умножения можно придумать великое множество: справа налево, слева направо, комбинированные, с окном, со сложением и вычитанием, с разложениями и окнами.
Оба алогоритма можно свести к одной или двум операциям: удвоение точки Q=2Q и Q=2Q+G
Или иными словами мы на каждом шаге алгоритма вычисляем либо удвоение Q_{2n} зная Q_{n}, или Q_{2n+1} зная Q_{n}, Q_{n+1} и Q_1


Я знаю сколько было времени на часах, когда я их запустил - это мой секрет, могу выразить его в минутах d (число минут). Могу рассказать всем, что если умножить Q = dG получится некоторая точка с координатами (Q.x, Q,y) - которая однозначно связана с моим секретом - это будет точка для проверки подписи. Я хочу подписать сообщение. Мне нужно представить сообщение в виде числа m. Тогда подписанное сообщение - это показание часиков R = (m*d)G. Которое можно проверить с использованием открытой точки: R = mQ.

Цифровая подпись, ее неподдельная сущность, держится на том, что никто не может вычислить обратное число d, зная R, m и Q. Или плохо старается.

Все известные алгоритмы нахождения обратного числа держаться на Алгоритм № 3 НОД наибольший общий делитель. На базе него можно получить алгоритм деления или нахождения обратного числа по отношению к операции умножения. Для изготовления понадобится число типа скаляр и операция над точками - уполовинивание. Уполовинивание связано с неопределенностью при операциях с нечетными числами, которую надо как-то разрешать на каждом шаге алгоритма.
...

И тут пришел Монтгомери со своими кривыми алгоритмами и решил все "упросить": проекция x в операции удвоения не зависит от координаты y!
2P = (2x^2-1, 2xy)
Это значит, что мы можем считать удвоение без использования второй координаты. После этого берем паузу и думаем, а как теперь считать сложение точек без использования y- координаты.
x = x_2 x_3 - y_2 y_3 =... надо выразить через X координаты точек P Q и G.
x = 2 x_2 x_3 - x_1
Утверждение такое:
x_{2n} = 2x_{n}^2 -1
x_{2n+1} = 2x_{n} x_{n+1} - x_1
Начальное состояние для вычисления умножения при n=0 (x_{n}, x_{n+1}) = (1, x1).

По сути венец творения Монтгомери - это утверждение, что операцию вычисления x координаты при сложении точек на эллиптической кривой, можно представить в общем виде, как
x_{m+n} = f(x_m, x_n, x_{m-n}) вот и думай теперь над своим алгоритмом.


Откуда взяты идеи с часами и Алгоритмы Монтгомери:
https://eprint.iacr.org/2017/293.pdf -- оттуда

суббота, 17 марта 2018 г.

Черный список

У нас есть телефонная станция на базе Asterisk расположена в датацентре. Всякий кому не лень пытается "взломать" пароль SIP и подключится на халяву к нашей телефонной сети. Меня это беспокоит.
Статистика неумолима. до 80млн. запросов в год на подбор пароля. Это невероятно много запросов, которые захламляют лог. Такого чтобы кто-то подключился и получил телефонных услуг на халяву, не замечено.

понедельник, 5 марта 2018 г.

Виртуальная сеть для контроллера

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

Таймеры на Windows. Необходимым оказалось подкручивать параметр мультимедиа таймера
Использую функцию timeBeginPeriod(wTimerRes);
Я заметил, что на нескольких разных компьютерах под управлением Windows 7 по разному ведет себя процесс отладки. Он то бежит как угорелый, символы быстро пробегают по экрану, то тормозит. Даже на одном компьютере я получил результат, что  после перезагрузки, он стал медленнее обрабатывать протокол. Замерил параметр задержки, оказалось, что вместо usleep(1000)=1мс, квант времени равняется 15мс. А у меня протокол должен работать с разрешением времени минимум 5мс. При 15мс, виртуальная сеть тормозит и вызывает таймауты в работе виртуальных устройств.

Таймеры pthread. Моя сеть должна работать на Windows, Linux и на моей операционке. Основа виртуальной сети - очередь таймерных объектов -- блоков памяти, которые доставляются в строго определенное время.
Исследовал разрешение таймеров.
clock_getres(CLOCK_MONOTONIC) возвращает 370 микросекунд. На разных процессорах эта цифра разная, но меньше 1мс.
clock_getres(CLOCK_REALTIME) возвращает 15.6мс.
Измерять время надо монотонным, иначе цифры округляются до безобразных величин.

Монотонный таймер оказался не очень то монотонным, на этом потерял целый день на отладку работы виртуальной сети и планировщика.
Чтобы сделать из монотонного таймера действительно монотонный применил такой ход:
(uint64_t)(tv_nsec + tv_sec*1000000000); Иногда в tv_nsec встречаются любые числа, неожиданные. Монотонным таймер становится только после такой операции.

 timestamp = osKernelSysTick();
 while ((uint32_t)(timestamp - tr->wait.timestamp) < tr->wait.timeout) {
     interval.tv_nsec = (tr->wait.timeout - (uint32_t)(timestamp - tr->wait.timestamp));
     clock_nanosleep(CLOCK_MONOTONIC, 0, &interval, &diff);
     timestamp = osKernelSysTick();
 }

Применил такой вариант ожидания. Ожидание применяется перед получением пакета данных.

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

void osAsyncQueuePut(osAsyncQueue_t* queue, void* data)
{
    List_t* tr = g_slice_alloc(sizeof(List_t));
    tr->data = data;
    volatile void** ptr = (volatile void**)&queue->tail;
    do {
        tr->next = atomic_pointer_get(ptr);
        atomic_mb();
    } while(!atomic_pointer_compare_and_exchange(ptr, tr->next, tr));
}

Эта операция добавляет элемент в список - вместо верхнего элемента. Список снимается в одно движение со стороны планировщика:
queue->head = atomic_pointer_exchange(&queue->tail, NULL);
Перед разбором список надо перевернуть, чтобы получить нормальный хронологический порядок.

Вот и все искусство.

среда, 28 февраля 2018 г.

Модель описания протокола, часть 2

Потратил около недели чтобы реализовать один конечный автомат из стандарта BACnet/MSTP. Хочу поделиться идеями реализации, пожаловаться на сложности. Во первых, надо сказать я его раза три написал. При том что описание получается от 300+ до 600+ строк. Это такой громадный switch() со встроенными проверками и switch() по командам протокола и ветвлением по разным признакам.

вторник, 20 февраля 2018 г.

Модель описания протокола

Меня беспокоит проблема описания протоколов. Мне приходится сталкиваться с протоколами обмена для электронного документа оборота. Диаграмма состоит из десятка состояний и переходы между состояниями обусловлены получением документа определенного типа. Диаграмма не учитывает ошибки и обработку ошибок. С другой стороны я пытаюсь осилить стандарт BACnet, там все описание стандарта пропитано статусными моделями. Только переходы и условия весьма сложны, их не описать таблицей. Если добавлять в статусную модель обработку ошибок -- она перестает быть наглядной и пугает, такое описание только путает.

CMSIS RTOS osThread vs C11 threads.h vs pthread

Какой стандарт лучше выбрать. Выбор сделать не могу, однако хочу писать программки для контроллеров и для ПК на одном языке.

SVG: типовые ошибки векторной графики

Изучал исходники сairographics нашел интересные места.

Векторные операции и векторная графика

В этой статье суммирую опыт перевода графического приложения на векторные операции SSE/AVX. Приложение двумерное, плоская графика. Для обработки используется упакованный double. Цель статьи обобщить опыт работы с векторными типами данных приментельно к плоской графике и показать, как можно оптимизировать операции над векторами.

Некоторые операции не могут быть эффективно описаны на языке Си, привожу примеры описания базовых операций с использованием встроенных функций и векторных расширений языка.

понедельник, 19 февраля 2018 г.

Развитие концепции CMSIS RTOS

Зачем? Я пишу операционную систему. Надо. Для автоматики здания надо, для управления огромными боевыми человекоподобными роботами надо.

Чего не хватает? CMSIS RTOS -- хороше API для встроенных приложений. Но мне пришлось пересмотреть ее чуть ли не полностью, перетрясти. Я стараюсь ничего не менять. Но надо.

понедельник, 29 августа 2016 г.

HTTP сервис, что скрывается в облаках

Как правильно сказать: "Добро пожаловать в облачные технологии"?! Наверное в современной терминологии Облаком называется граница знаний, куда вас не пустили, где технологии недоступные для вашего понимая, вам даже не рассказали что это.
Моя глобальная задача -- множество устройств, которые обладают коллективным разумом.  Частная задача -- эффективное взаимодействие множества серверов в пределах видимости, в одной серверной и в одной локальной сети, в демилитаризованной зоне, где важно быстро и четко.

вторник, 9 августа 2016 г.

Обработка SVG без cairographics

Хочу поделиться идеями, почему на линуксах с Cairographics так медленно открываются окошки.
У меня есть своя библиотека обработки SVG, в которую я пытаюсь встроить SVG анимацию. В процессе работы обнаружил возможность оптимизации по скорости.

понедельник, 8 августа 2016 г.

Мои страхи. Будущее программирования.

Иногда я скатываюсь до прогнозов.

Мои навыки программирования меняются и дополняются со временем. Основные идеи, которые со временем я добавил в свой багаж и широко использую в разработке программ.

суббота, 16 июля 2016 г.

пятница, 1 июля 2016 г.

RTOS: как сделать мир лучше

Слова бы правильные подобрать. Изучал код TNKernel, смотрел FreeRTOS, изучал код TNeo. И тут меня пробило - надо одному единственному человеку объяснить, может остальные повторять не будут. Час пытался сформулировать, что надо объяснить. Час пытался написать письмо, что указать человеку, как не надо писать программы.

воскресенье, 10 апреля 2016 г.

CMSIS RTOS - Модель работы приложения с аппаратным ресурсом

Я проснулся с мыслью, что если никто в ближайшее время не отсканирует и не выложит в свободный доступ тонны книг по физике, физику просто забудут. Мне кажется последние 20 лет  физика умирает, двадцать лет назад казалось, что физика умирает уже 10 лет. За это время уже умерли физики, которые хоть что-то могли донести из своих знаний. Страшный сон.
Мне кажется современные физики не способны понять, что температура в степени 3/2 в уравнениях появляется только в случае, если одно уравнение подставлять в другое уравнение.


Модель работы приложения с аппаратным ресурсом.
Это не относится напрямую к RTOS. Я пытаюсь осмыслить, как работать из приложения с ресурсами контроллера, чтобы оставаться в рамках API.

среда, 16 марта 2016 г.

CMSIS RTOS - операционная система для контроллеров Cortex

Пишу операционную систему со всеми объектами типа: задач, тредов, мьютексов, семафоров и очередей. В качестве основы выбрал спецификацию CMSIS RTOS 1.02 и при необходимости расширяю ее стандартными вызовами POSIX. Уже написал рабочую версию. Работает. Хочу немного описать или попробовать описать ее достоинства.