Собственно задача такова:
Нужно иметь возможность обновлять прошивки процесора у клиентов самими клиентами. То-есть при исправлении ошибок или внесении новой функциональности нужно выслать прошивку клиенту и он сам должен её залить в кристал. Но, при этом, нужно сделать так, чтобы клиент не смог склонировать устройство и зашивать в него полученую прошивку.
Сталкивался ли кто-то с такими задачами?
Пока-что у меня только общие идеи, поскольку до реализации этой части я пока не добрался. Поэтому эти идеи могут быть и неправильными. Но сами идеи следующие:
1. Написать свой загрузчик с возможностью расшифровки данных. В загрузчике заложен ключ и ID устройства. Соответсвенно клиенту сбрасывается зашыфрованая прошивка. Загрузчик расшифровывает её, получает из неё ID для которого она предназначена, сравнивает и при совпаденни прошивает флеш.
2. Чуть попроще. Часть кода, которая не будет никогда изменяться, прошивается сразу. В этой части зашивается ID и код сравнения. Прошивка не шифруется. Основная программа в какой-то момент передает управление на процедуру сравнения ID, которая в зависимости от результатов сравнения переходит в нужноё место основной программы. Как в таком случае защитить ID в прошивке, чтобы его нелегко было найти?
3. Модификация второго. Во многих местах кода открытой прошивки поставить загрузку данных из закрытой области, и выполнять с ними какие-то операции вычисляя по этим данным и данным открытой области несколько констант, которые используются закрытой частью. Этот набор операций должен изменить константы таким образом, чтобы при правильном ID получить нужные значения. При неверных значениях закрытая часть программы будет неправильно работать.
Ещё такой вопрос - можно ли пошагово проанализировать работу процесора (скажем с помощью JTAG) и посмотреть какие инструкции исполняются на каждом шаге и что находиться в регистрах процесора не зная что прошито в самом процесоре?
Возможно есть варианты получше?
Спасибо