Re: Перенос всей логики в ключ

laby пишет:

То есть у нас известен вектор состояний и в коде и в программе. кодируем этим вектором как ключом и раскодируем в коде этим же ключом. Но это же все равно зависимость не случайная, так как зависимость от тех же величин, которые не случайны. К тому же можно понять что кодируется с помощью состояний и все раскодировать. Не знаю по сложности, но то что зависимость будет не случайная это точно.

Если в двух словах, основной смысл в том, чтобы сделать поток входных данных как можно более разнообразным и как можно менее предсказуемым, основываясь на результатах наблюдений. Действительно случайной зависимости достичь не удастся в любом случае, поскольку код в ключе должен делать нечто полезное, а не преобразовывать случайный входной поток в случайный выходной. При этом, чем больше разных данных будет на входе и на выходе, тем сложнее будет установить между ними взаимосвязь.

Re: Перенос всей логики в ключ

laby пишет:

Конечные автоматы выполняются где-то раз в 50-100 мс.

Правильно я понимаю, что предполагается обращаться к ключу через такие промежутки времени?
Если так, то это не самая хорошая идея с точки зрения производительности системы в целом - будет сильно трмозить.

(2012-03-21 15:07:04 отредактировано laby)

Re: Перенос всей логики в ключ

В общем так:

В защищенной ячейке вектор начальных состояний автоматов (20 чисел, каждое число - номер состояния соотв. автомата) Y0.
В Алгоритме типа код - несколько автоматов, скажем 3 из 20-ти.

В коде в постоянной памяти хранится текущее состояние автоматов вектор Y,
вектор новых состояний Y*, текущие входы вектор X и выходы вектор Z.

При инициализации кода Y = Y0

Сам Y можно передавать по изменению - только те, которые поменялись + вектор номеров


Далее
- формирую входной буфер в ПК, состоящий из (X,Y)
- кодирую его с помощью ключа, получаемого из X или Y ? (X,Y)->(XY)'
- вызываю код C(XY')
- в ключе расшифровывается (X,Y)'->(X,Y) с помощью того же алгоритма и того же ключа (X или Y)
- Выполняются автоматы (Y*,Z)=A(X,Y)
- таким же (ключом X или Y или туда Y назад X) образом кодирую выходной буфер (Z,Y*)->(Z,Y*)'
- возвращаю управление на ПК
- расшифровываю с помощью X или Y (Z,Y*)'->(Z,Y*)
- Y=Y*
- выполняю Z

Остальные автоматы выполняются как обычно.

Может сюда еще как-то цифровую подпись прилепить?

(2012-03-21 15:14:09 отредактировано laby)

Re: Перенос всей логики в ключ

Vladimir Ivanov пишет:
laby пишет:

Конечные автоматы выполняются где-то раз в 50-100 мс.

Правильно я понимаю, что предполагается обращаться к ключу через такие промежутки времени?
Если так, то это не самая хорошая идея с точки зрения производительности системы в целом - будет сильно трмозить.

Ну максимум это 200 мс можно позволить, а что, сколько код будет выполняться то?

Re: Перенос всей логики в ключ

laby пишет:
Vladimir Ivanov пишет:
laby пишет:

Конечные автоматы выполняются где-то раз в 50-100 мс.

Правильно я понимаю, что предполагается обращаться к ключу через такие промежутки времени?
Если так, то это не самая хорошая идея с точки зрения производительности системы в целом - будет сильно трмозить.

Ну максимум это 200 мс можно позволить, а что, сколько код будет выполняться то?

Сам код, если в нем не используются криптографические функции, не очень большие циклы и т.п., выполнится довольно быстро. Можно
даже примерно посчитать, исходя из производительности контроллера ключа. Большие накладные расходы дают операции ввода-вывода и шифрование/подпись трафика, то есть сам вызов кода в ключе и получение от него результатов. Эти операции могут занимать десятки (а может и сотни) миллисекунд.

Re: Перенос всей логики в ключ

Vladimir Ivanov пишет:
laby пишет:
Vladimir Ivanov пишет:

Правильно я понимаю, что предполагается обращаться к ключу через такие промежутки времени?
Если так, то это не самая хорошая идея с точки зрения производительности системы в целом - будет сильно трмозить.

Ну максимум это 200 мс можно позволить, а что, сколько код будет выполняться то?

Сам код, если в нем не используются криптографические функции, не очень большие циклы и т.п., выполнится довольно быстро. Можно
даже примерно посчитать, исходя из производительности контроллера ключа. Большие накладные расходы дают операции ввода-вывода и шифрование/подпись трафика, то есть сам вызов кода в ключе и получение от него результатов. Эти операции могут занимать десятки (а может и сотни) миллисекунд.

ёси баси, сотни миллисекунд это ....

Re: Перенос всей логики в ключ

Neekeetos пишет:

Да, меняется. Но не кардинально из за того что остаются вещи вроде TRU

TRU в Guardant Code реализован на AES и SHA256

Neekeetos пишет:

ключей доступа к брелку длиной по 4 байта

Знание кодов доступа в принципе никакой пользы существенной злоумышленнику не дает. Считать чувствительные данные нельзя, даже зная все коды доступа. Хорошую защиту можно сделать даже на демо-кодах. Коды доступа нужны в основном для того, чтобы разработчик мог отличать "свои" ключи от "чужих".

Neekeetos пишет:

По поводу ключей доступа - их также невозможно сменить.

В самостоятельной смене кодов доступа нет никакого смысла.

Neekeetos пишет:

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

Чувствительными данными в ключе являются ключи шифрования (которые задает разработчик без нашего участия) и загружаемый код (который тоже пишет разработчик). Так что этими данными мы не обладаем (и получить доступ к ним не можем) и украсть их у нас нельзя.
Реальная угроза - это злонамеренный инсайдер, которому доступны прошивки ключей, находящийся с Вашей стороны.

Re: Перенос всей логики в ключ

laby пишет:

ёси баси, сотни миллисекунд это ....

Ну надо померить на реальном коде, на реальной системе, где будет приложение развернуто. Скорость зависит и от ее производительности тоже.

Re: Перенос всей логики в ключ

вобщем тогда програмлю по схеме приведеной выше ...

Re: Перенос всей логики в ключ

Vladimir Ivanov пишет:

TRU в Guardant Code реализован на AES и SHA256

А где про это поподробнее можно почитать?

Vladimir Ivanov пишет:

Знание кодов доступа в принципе никакой пользы существенной злоумышленнику не дает. Считать чувствительные данные нельзя, даже зная все коды доступа. Хорошую защиту можно сделать даже на демо-кодах. Коды доступа нужны в основном для того, чтобы разработчик мог отличать "свои" ключи от "чужих".

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

Vladimir Ivanov пишет:

Чувствительными данными в ключе являются ключи шифрования (которые задает разработчик без нашего участия) и загружаемый код (который тоже пишет разработчик). Так что этими данными мы не обладаем (и получить доступ к ним не можем) и украсть их у нас нельзя.
Реальная угроза - это злонамеренный инсайдер, которому доступны прошивки ключей, находящийся с Вашей стороны.

Прошивки в смысле образ или прошивки - код функций пользователя?

Re: Перенос всей логики в ключ

Neekeetos пишет:
romik пишет:

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

Да , я всегда говорю, блажен кто верует. В соседнем форуме подменили длл апи гварданта на свой эмулятор. Ничего что часть "в дополнение шифрует обмен..."  при этом отсутствует? А как вам возможность смотреть непосредственно вызовы апи просто отладчиком, где там ваше шифрование?

Да. на здоровье, пусть смотрят вызовы! Чем это поможет в анализе алгоритмов работы кода в ключе? Если ещё предусмотреть во встроенном коде защиту от брутфорса, построить общение программы с кодом не по принципу "запрос-ответ", а, например, "последовательность запросов-ответ", и использовать для выбора последовательности вероятностные события, то перебирать все варианты для написания эмулятора прийдётся очень долго.

Re: Перенос всей логики в ключ

Neekeetos пишет:
Vladimir Ivanov пишет:

Знание кодов доступа в принципе никакой пользы существенной злоумышленнику не дает. Считать чувствительные данные нельзя, даже зная все коды доступа. Хорошую защиту можно сделать даже на демо-кодах. Коды доступа нужны в основном для того, чтобы разработчик мог отличать "свои" ключи от "чужих".

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

Можно уточнить, в каком примере показана дозапись в ячейку с загружаемым кодом, и передача управления дописаному коду?

Re: Перенос всей логики в ключ

romik пишет:

Можно уточнить, в каком примере показана дозапись в ячейку с загружаемым кодом, и передача управления дописаному коду?

Samples\ARM\05 - LED Control\

Re: Перенос всей логики в ключ

Neekeetos пишет:

А где про это поподробнее можно почитать?

Стр. 11 https://www.guardant.ru/download/manual … e_Code.pdf

Neekeetos пишет:

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

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

Neekeetos пишет:

Прошивки в смысле образ или прошивки - код функций пользователя?

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

Re: Перенос всей логики в ключ

Neekeetos пишет:
romik пишет:

Можно уточнить, в каком примере показана дозапись в ячейку с загружаемым кодом, и передача управления дописаному коду?

Samples\ARM\05 - LED Control\

Там кроме мигания светодиодом ничего нет.

Re: Перенос всей логики в ключ

Vladimir Ivanov пишет:

Там кроме мигания светодиодом ничего нет.

Там загружается код, замените его на нечто читающее ячейки и все что после него в области кода и все дела.

Re: Перенос всей логики в ключ

Neekeetos пишет:
Vladimir Ivanov пишет:

Там кроме мигания светодиодом ничего нет.

Там загружается код, замените его на нечто читающее ячейки и все что после него в области кода и все дела.

Так там загружается зашифрованный и подписанный код, а не какой угодно. Как я уже писал, без знания ключей шифрования и подписи нельзя подготовить gcexe-файл, который корректно загрузится. Это может сделать только разработчик. Кроме того, загружаемому коду не позволяется делать в ключе все, что угодно - существуют ограничения.

Re: Перенос всей логики в ключ

Vladimir Ivanov пишет:

Так там загружается зашифрованный и подписанный код, а не какой угодно. Как я уже писал, без знания ключей шифрования и подписи нельзя подготовить gcexe-файл

Ну да, это я как то упустил из виду. Тогда действительно, единственное что имеет смысл беречь это образ ключа :)

(2012-03-21 18:00:37 отредактировано Denis)

Re: Перенос всей логики в ключ

laby пишет:

ёси баси, сотни миллисекунд это ....

Известные мне этапы работы функции GrdCodeRun:
1. Шифрование входного буфера (выполняется в коде API на PC)
2. Передача по USB
3. Расшифровка входного буфера (выполняется в ключе)
4. Вызов пользовательского кода (выполняется в ключе)
5. Шифрование выходного буфера (выполняется в ключе)
6. Передача по USB
7. Расшифровка выходного буфера (выполняется в коде API на PC)

1 и 7 пункты замедляются ещё и тем, что они защищены от дизассемблирования и отладки виртуальной машиной. Скорость их работы напрямую зависит от производительности процессора, на котором выполняется защищенное приложение.

Я делал замеры на ключах Code первого поколения.
1. Сделал 5 версий загружаемого кода, в которых выполнялась простая мат.операция, в первом 1 раз, во втором 10 раз, в третьем 100 раз и т.д.
2. Далее выполнил каждый из них 100 раз, откинул одно самое долгое выполнение для каждой прошивки, чтобы хоть как-то уменьшить погрешность в многопоточной среде.
3. Вычислил для каждой прошивки среднее время выполнения.
4. Составил систему уравнений, где Y - время выполнения моего кода в ключе (этап 4), X - накладные расходы на вызов этого кода (этапы 1-3,5-7):
    X + 1*Y = t1
    X + 10*Y = t2
    X + 100*Y = t3
    и т.д.

На моей машине X получился около 20 мс, а Y был настолько мал, что терялся в погрешности измерений, оказывая влияние только в 100 и более итерациях.

Нынешнее второе поколение ключей должно работать быстрее, т.к. ускоряются шаги 3 – 5.
Но мне вполне хватало и тогдашних показателей.

PS. OMG! 38 новых сообщений из них 4 по теме :)

Пейте сладкий чай!

(2012-03-21 18:18:31 отредактировано laby)

Re: Перенос всей логики в ключ

Денис, всё так здорово по полочкам разложил, спасибо. Только я так и не понял сколько в моем случае будет выполняться с буфером 30 байт, автомат - без циклов тупое сравнение если-то штук 10 выполнится и присвоить, добавить в выходной буфер и всё. Никаких математических и прочих операций.

Re: Перенос всей логики в ключ

Denis пишет:

PS. OMG! 38 новых сообщений из них 4 по теме :)

Это чтоб я не расслаблялся :)

Re: Перенос всей логики в ключ

laby пишет:

Только я так и не понял сколько в моем случае будет выполняться с буфером 30 байт, автомат - без циклов тупое сравнение если-то штук 10 выполнится и присвоить, добавить в выходной буфер и всё. Никаких математических и прочих операций.

Я думаю, в этом случае основное время уйдёт на накладные расходы вызова, т.е. 20мс. Но тут надо учитывать, что моё защищенное приложение работало на Core3i, а ключ был более медленный. Как изменится время на более медленном процессоре PC (я так понимаю, что в embedded-системы Corei3 не ставят:), но при этом на более быстром ключе, сказать сложно, лучше сделать пример.

Пейте сладкий чай!

Re: Перенос всей логики в ключ

Denis пишет:

на более быстром ключе, сказать сложно, лучше сделать пример.

Вот собственно этим я и займусь. Продумал сегодня всю защиту в деталях, думаю что будет супер. А главное, что экзешник можно распространять и не бояться - вся логика то в ключе!!! Без ключа вообще непонятно как ломать прогу, проще новую написать :)

Re: Перенос всей логики в ключ

А кроме yagarto кто что использовал? Например IAR Embedded Workbench for ARM ?
Есть вариант чтоб make и make template не набирать, а из среды?
Или как-то можно связать Eclipse с Yagarto. Проект в Eclipse открывается, а вот как его сбилдить, получить  bin-файл - непонятно

Re: Перенос всей логики в ключ

laby пишет:

А кроме yagarto кто что использовал? Например IAR Embedded Workbench for ARM?

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

ЗЫ. Первое правило радиолюбителя: Не крути две ручки одновременно :)

Пейте сладкий чай!