El año pasado me planteé disponer de un bootloader encriptado para PIC32, imprescindible para comercializar productos que precisan actualizaciones, para mejorar prestaciones, cambiar o añadir nuevas opciones, corregir bugs, etc... Primero busqué por si había código fuente disponible, para mi sorpresa nada de nada, salvo un engendro de una empresa llamada Diolan, para PIC18, con un código fuente mezcla de C y ensamblador, además con los programas para PC, ejecutables desde una ventana DOS escribiéndolos a mano.
Luego busqué algún producto comercial, si no hubieran sido caros, lo hubiera comprado, para no perder el tiempo. Encontré dos, uno bastante caro, y el otro aunque con un precio asequible, con un problema importante, necesita un código de activación para su instalación, con lo cual si un día te casca el disco duro y ese chiringuito ha cerrado, te quedas totalmente colgado, sin poder dar actualizaciones, ni programar nuevas placas.
Así que tocaba programar mi propio Bootloader encriptado, no he partido de cero, he utilizado el AN1388 de Microchip, al que he añadido el algoritmo XTEA, para la desencriptación (clave de 128 bit y 64 iteraciones), y he creado un par de programas para el PC, con Visual Studio en C++, uno para encriptar el HEX del firmware, y otro para que el cliente cargue las actualizaciones en la placa. Creé dos bootloader, uno para USB y otro para tarjetas SD, que son los que necesito por ahora, una vez hecho el trabajo gordo, se puede extrapolar con facilidad para Pendrives USB, Ethernet o RS232.
De, bootloader para USB, tengo dos versiones, una básica y otra para uso profesional. La versión básica, la podeis descargar del siguiente link, es totalmente funcional, incluye el programa para encriptar el firmware, el HEX con el bootloader y el programa para transferir el firmware a la placa por USB:
http://www.pinballsp.com/PinballSP_Encrypted_Bootloader_Solution_Basic_Version.zipTambién hice una modificación del AN1388 (sin encriptación), quitando el pulsador y los LED, con esta modificación se entra automáticamente en modo bootloader, sin necesidad de apretar ningún pulsador, lo que simplifica el hardware. Al dar tensión a la placa, el bootloader espera durante 5 segundos la comunicación con el PC por USB, si se establece comunicación se queda en modo bootloader, de lo contrario salta automáticamente a la aplicación del usuario (firmware), si existe.
http://www.pinballsp.com/PINBALLSP_Bootloader_USB_PIC32_AN1338_Modified.zipLas versiones profesionales del bootloader, las voy a utilizar para los productos comerciales que estoy diseñando y también las he vendido a algunas empresas.
Las diferenciass entre la versión básica y la profesional son las siguientes:
1.- La versión básica utiliza una clave de encriptación/desencriptaciçon única, no se puede cambiar, aunque el producto es 100% funcional, todo el mundo trabaja con la misma clave. La versión profesional está personalizada, yo utilizo una clave diferente para mis aplicaciones y las que he vendido también reciben una clave única y distinta para cada cliente.
2.- La versión básica entra en modo bootloader pulsando un switch, en la versión profesional se entra en modo bootloader automáticamente sin necesidad de pulsadores, en cuanto le das tensión, espera 5 segundos la comunicacion con el PC, de lo contrario salta automaticamente a ejecutar el firmware.
3.- La versión profesional añade 4 campos en flash, para personalizar el bootloader, de esta manera se puede tracear cada placa por nº de serie, comprobar que producto y firmware tienen instaladas, detectar producto pirata, etc..
Nº de serie: Cada placa se puede personalizar con un nº de serie único, para tracearla, proporcionar firmware personalizado, chequear producto pirata, etc..
Código de producto: Permite identificar el producto instalado, para por ejemplo evitar que se cargue en una placa, firmware de otro producto, por error.
Versión de firmware: Lo que su propio nombre indica, identifica la versión de firmware instalada, en mi caso, lo utilizo también para evitar que se carguen versiones antiguas de firmware.
Seguridad: Sirve para bloquear placas pirateadas, tras chequear el nº de serie. Se puede utilizar como contador de usos, para no bloquear la placa de inmediato, sino tras 15 ó 20 usos, por ejemplo.
Os dejo unas imágenes de los programas para PC del bootloader encriptado para USB, en la versión básica está el encriptador (con clave de encriptación fija), y el programa para volcar el firmware a la placa. En la versión profesional, hay además otro programa para inicializar el bootloader con un nº de serie único, código de producto y versión de firmware.
Programa para encriptar el firmware con el algoritmo XTEA, clave de 128 bits, 64 iteraciones, desarrollado en C++ con Visual Studio 2010
Programa para transferir el firmware a la placa, por USB. En la versión profesional, permite también leer el nº de serie, código de producto y versión de firmware instalado.
Este programa solo está en la versión profesional, permite personalizar el bootloader, con un nº de serie único por placa, código de producto y versión de firmware, además permite cargar el firmware, todo del tirón.