Перейти к содержанию
    

Gigadevice как ставите защиту от чтения?

Портировал программу под GD32F303 из STM32L151.

Прошивал прямо из кейл, вроде все отлично работает.

Дошли до производства, возник вопрос с защитой от чтения. Для STM использовали ST-Link и ставили там ROP Level 1.

На производстве попробовали зашить через ST-Link говорят получилось, но плата не подает признаков жизни и сейчас ее не удается стереть, хотя JTAG соединяется.

Далее попробовали зашить через JFlash с выбором процессора GD32F303 в таком режиме не активен пункт Target->Manual Programming->Secure chip. 

Соответственно защиты от чтения нет, плата работает, проц можем снова стереть и записать.

Затем попробовал в JFlash выбрать STM32F303, зашил и установил защиту от чтения Target->Manual Programming->Secure chip.

Плата не работает, стереть чип больше не могу, но JTAG соединяется.

Сейчас имею три процессора, через jlink commander могу считать регистре 0x1FFF F800 две платы выдают значение 0xFFFFFFFF, а одна выдает 0x FFFF55AA.

Видел вот это https://wiki.segger.com/STM32#cite_note-1, пробовал без изменений. Сравнил биты вроде все логично по командам exit steps, но защита от чтения не появляется.

Поэтому вопрос чем шьете гигадевайсы и как ставите защиту от чтения?

 

Кстати в GD32F303 судя по ref man нет аналога ROP Level 2 приводящего к невозвратной блокировке чтения. Поэтому надеюсь эти процы тоже можно вернуть к жизни.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Использовал GD32F100, защиту выставляю своим загрузчиком по команде в зашифрованном образе прошивки (программа одна и та же, что для STM, что для GD32, единственное - пришлось вставить __DSB() между записью ключей в OPTKEYR и проверкой OPTWRE). После выставления защиты у меня отправка подтверждения и бесконечный цикл со сбросом по сторожевой собаке. Наблюдал проблему, что при подключенном отладчике (SWD, ST-link + OpenOCD) после выставления защиты и сброса по собаке программа не выполняется, куда его уносит непонятно (защита-то включена). И вывести его из этого состояния можно было только передергиванием питания - после передергивания питания программа работала штатно, отладчиком можно подключиться и снять защиту. Если отладчик не подключать - тоже все работает штатно (устанавливается защита, собака сбрасывает, программа начинает работать с начала). Потратил часа два, пока догадался отключить отладчик, глубже копать не стал - изделие старое, доработок не планируется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Странные дела. Тоже попробовал сделать защиту от чтения внутри исходников. Работает! Как вы писали сразу добавил __DSB() .

Но я бы эту процедуру лучше вынес из исходников. Уверен что при отладке закомментирую и забуду.

Пободаюсь еще с JLink.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Засунул такой код в бут, использовал SPL с сайта гигадевайса, внутри функций все кажется логичным.

fmc_unlock();
	fmc_flag_clear(FMC_INT_FLAG_BANK0_PGERR);
    fmc_flag_clear(FMC_INT_FLAG_BANK0_WPERR);
	fmc_flag_clear(FMC_INT_FLAG_BANK0_END);
	fmc_flag_clear(FMC_INT_FLAG_BANK1_PGERR);
	fmc_flag_clear(FMC_INT_FLAG_BANK1_WPERR);
	fmc_flag_clear(FMC_INT_FLAG_BANK1_END);

	if((OB_SPC & 0xFF) == FMC_NSPC)
	{
		fmc_state_enum state;
		WARNING("OB_SPC = 0x%04X no read protection!", OB_SPC);

		ob_unlock();
		__DSB();

		state = ob_security_protection_config(FMC_USPC);		
		if(state == FMC_READY)
			INFO("Must be protected on next reboot");
		else
			ERROR("Read protect error!");		
		ob_lock();
	}
	else
	{
		INFO("OB_SPC = 0x%04X read protected", OB_SPC);
	}	
	
	fmc_lock();	

По логам отрабатывает как надо, но оказывается стереть после этого флешку тоже не удается. 

И при подключении лоченной STM JFlash сразу выдает сообщение о том что видит залоченную флешку.

С гигадевайсом нет такого сообщения. Он просто не может считать данные.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

49 минут назад, uriy сказал:

По логам отрабатывает как надо, но оказывается стереть после этого флешку тоже не удается.

Reset на SWD подключен ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет RESET не подключен. Не думаю что в это дело, у меня же соединение устанавливается. Но попробовал соединить, изменений нет. Осцилом проверил что ресет формируется.

Вот такие логи JFlash после нажатия F7 (Production programming). Это рабочий процессор, залоченный исходниками в буте. Средствами бута прошить могу, JTAGом не могу.

Auto programming target (20460 bytes, 1 range) ...
 - Connecting ...
  - Connecting via USB to probe/ programmer device 0
  - Probe/ Programmer firmware: J-Link V9 compiled Jan 11 2038 11:06:30
  - Device "GD32F303RC" selected.
  - Target interface speed: 4000 kHz (Fixed)
  - VTarget = 3.303V
  - Found SW-DP with ID 0x2BA01477
  - Unknown DP version. Assuming DPv0
  - Scanning AP map to find all available APs
  - AP[1]: Stopped AP scan as end of AP map has been reached
  - AP[0]: AHB-AP (IDR: 0x24770011)
  - Iterating through AP map to find AHB-AP to use
  - AP[0]: Core found
  - AP[0]: AHB-AP ROM base: 0xE00FF000
  - CPUID register: 0x410FC241. Implementer code: 0x41 (ARM)
  - Found Cortex-M4 r0p1, Little endian.
  - FPUnit: 6 code (BP) slots and 2 literal slots
  - CoreSight components:
  - ROMTbl[0] @ E00FF000
  - ROMTbl[0][0]: E000E000, CID: B105E00D, PID: 000BB00C SCS-M7
  - ROMTbl[0][1]: E0001000, CID: B105E00D, PID: 003BB002 DWT
  - ROMTbl[0][2]: E0002000, CID: B105E00D, PID: 002BB003 FPB
  - ROMTbl[0][3]: E0000000, CID: B105E00D, PID: 003BB001 ITM
  - ROMTbl[0][4]: E0040000, CID: B105900D, PID: 000BB9A1 TPIU
  - ROMTbl[0][5]: E0041000, CID: 00000000, PID: 00000000 ???
  - Executing init sequence ...
   - Executing Reset (0, 0 ms)
    - Reset: Halt core after reset via DEMCR.VC_CORERESET.
    - Reset: Reset device via AIRCR.SYSRESETREQ.
   - Initialized successfully
  - Target interface speed: 4000 kHz (Fixed)
  - Found 1 JTAG device. Core ID: 0x2BA01477 (None)
  - Connected successfully
 - Checking if selected data fits into selected flash sectors.
 - Start of preparing flash programming
 - End of preparing flash programming
 - Start of determining dirty areas in flash cache
 - End of determining dirty areas
 - CPU speed could not be measured.
 - Start of erasing sectors
 - Blank checking 0x08000000 - 0x08004FFF
 - ERROR: Timeout while blank checking, RAMCode did not respond in time. (PC = 0xF3229AA3, CPSR = 0x40006C04, LR = 0x01000000)!
 - ERROR: Failed to blank checking.
Failed to execute RAMCode for blank check!
 - ERROR: Error while blank checking.
 - Erasing range 0x08000000 - 0x08004FFF ( 10 Sectors, 20 KB)
 - ERROR: Failed to erase sectors 0 @ address 0x08000000 ((erase error))
 - ERROR: Failed to erase sectors.
 - End of erasing sectors
 - ERROR: Erase failed
 - Start of restoring
 - End of restoring
 - ERROR: Failed to auto program target
Disconnecting ...
 - Disconnected

И вот эти адреса читаются через командер

J-Link>mem32 0x1ffff800,4
1FFFF800 = FFFF44BB FFFFFFFF FFFFFFFF FFFFFFFF
J-Link>mem32 0x40022000, 32
40022000 = 00000030 00000000 00000000 00000000
40022010 = 00000000 00000000 00000000 03FFFFFE
40022020 = FFFFFFFF 00000000 00000000 00000000
40022030 = 00000000 00000000 00000000 00000000
40022040 = 00000000 00000000 00000000 00000000
40022050 = 00000080 00000000 00000000 00000000
40022060 = 00000000 00000000 00000000 00000000
40022070 = 00000000 00000000 00000000 00000000
40022080 = 00000000 00000100 00000000 00000000
40022090 = 00000000 00000000 00000000 00000000
400220A0 = 00000000 00000000 00000000 00000000
400220B0 = 00000000 00000000 00000000 00000000
400220C0 = 00000000 00000000
J-Link>mem32 0x08000000, 32
Could not read memory.
J-Link>

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Смог стереть процессоры где программа не выполнялась и JTAG не мог стереть.

Использовал UART с программой GigaDevice MCU ISP Programmer

Она увидела что процессор залочен, но сказала что защиту снять не может.

Однако после передергивания питания защиты нет и JTAG работает.

001.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Оказывается у гигадевайс есть еще свой JTAG программатор GDLink. Софтина судя по всему работает через CMSIS-DAP.

У segger есть в новостях что они тоже поддерживают https://www.segger.com/news/segger-j-link-now-supports-cmsis-dap/

Значит их софтина должна работать с JLink в том числе. У  меня только китайские JLink V8 и V9. При выборе в KEIL для них CMSIS-DAP отладчик не виден.

Попался еще CMSIS-DAP для BluePill https://github.com/xjtuecho/CMSIS-DAP

Может кто-то уже пробовал?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Привет! А подскажите как стереть залоченый GD32E230 имея на руках старый китайский J-LINK или CMSIS-DAP для BlackPill ?
Проц виден, пока не залочишь шьётся и отлаживается, но вот EraseAll не работает. Может я залочил его через чур?

if(OB_OBSTAT_PLEVEL_NO == ob_obstat_plevel_get())
{
    fmc_unlock();
    ob_unlock();
    __DSB();
    ob_erase();
    ob_security_protection_config(FMC_LSPC);
    ob_lock();
    fmc_lock();
    ob_reset();
}

Вроде как FMC_LSPC - Low Security Protection Code, я так понимаю стирабельный....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Использую GD32E103 и ST-Link/v2.

Защиту устанавливает загрузчик.

Снимаю защиту так [$(PG)=ST-LINK_CLI.exe]:

unlock:
	$(PG) -c -w32 0x40022004 0x45670123 -w32 0x40022004 0xCDEF89AB -w32 0x40022008 0x45670123 -w32 0x40022008 0xCDEF89AB -w32 0x40022010 0x00000220 \
	-w32 0x40022010 0x00000260 -w32 0x40022010 0x00000200 -w32 0x40022010 0x00000210 -w32 0x1ffff800 0xFFFF00A5 -w32 0x40022010 0x00000200

Программа местами поругивается, но снятию защиты это не мешает.

Правда, если ноги SWD переопределены, то предварительно нужно зайти в заводской загрузчик (BOOT+RESET).

PS. От GD-Link отказался, т.к. не знаю как на нем обновить прошивку и включить управление выходом RESET.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за наводку. Я так понял инициализация переферии и в последствии запись в Option Bytes

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...