| Artículos | 01 JUN 1997

Diseñar una llave de protección de software (y II)

Tags: Histórico
Aprenda a diseñar, construir y programar una llave de protección para sus programas
Alfredo Catalina.

El mes pasado publicábamos la primera parte de este artículo, donde se planteaban los factores que intervienen en el diseño y construcción de la llave. En esta segunda parte se aborda por fin la programación de la mochila.

La principal ventaja que se deriva de utilizar el modelo 24C02A de memoria es que se puede acceder a todo el contenido de la misma con sólo emplear dos líneas, SDA y SCL. Sin embargo, esta simplicidad en el número de líneas a utilizar supone, por contra, una mayor complejidad en el protocolo de comunicación, cuyo funcionamiento desgranaremos en las siguientes líneas.

Programación de la memoria 24C02A

El bus bidireccional de datos y direcciones está formado por la línea SDA. Las reglas que rigen las comunicaciones a través del bus son dos. En primer lugar, las transferencias de datos sólo se podrán iniciar cuando el bus no esté ocupado. En segundo lugar, durante las transferencias de datos la línea SDA debe permanecer estable mientras la línea de reloj SCL esté a nivel alto.

El bus puede encontrarse en una de estas cuatro situaciones. Libre: la líneas SDA y SCL se encuentran a nivel alto, y por tanto se puede iniciar una transferencia si se desea. Inicio de transferencia: se entra en este estado cuando se produce una transición de 1 a 0 de la línea SDA cuando SCL está a 1. Cualquier comando de los que se describirán a continuación comienza siempre de esta manera. Fin de transferencia: se produce cuando hay una transición de 0 a 1 de la línea SDA mientras SCL permanece a 1. Todos los comandos deben terminar siguiendo este proceso. Dato válido: se produce cuando después de un inicio de transferencia la línea SDA permanece estable mientras SCL está a 1. La línea de datos debe cambiar sólo cuando SCL esté a 0 (nivel bajo). El diagrama de la figura 1 ilustra estas cuatro situaciones.

Los datos se transfieren en serie desde el ordenador a la memoria (o desde la memoria al ordenador) siendo necesario un pulso de reloj por cada bit transmitido. Las transferencias de datos comienzan con una señal de inicio de transferencia (A) y terminan con una señal de fin de transferencia (C).

Además, se genera una señal de reconocimiento cada vez que se transfiere un byte. La lectura de esta señal requiere la utilización de un pulso de reloj adicional. La señal de reconocimiento se genera manteniendo SDA a nivel bajo mientras SCL está a 1 durante este periodo de reloj. Cuando la transferencia se realice hacia la memoria será ésta la que genere la señal de reconocimiento, mientras que si es al revés, será el ordenador quien genere esta señal.

Hay 5 comandos disponibles: grabación de un byte, grabación de una página (2 bytes), lectura desde la posición de memoria actual, lectura aleatoria y lectura secuencial.

Todos los comandos comienzan con una señal de inicio de transferencia a la que sigue un byte de control y terminan con una señal de fin de transferencia. Este byte de control consiste en 4 bits que forman el llamado "código de dispositivo" seguido por el valor lógico presente en las patillas A1 y A2 del circuito (véase la figura 2). Éstas deben conectarse a tierra o a la tensión de alimentación de +5 V, configurando así la "dirección" de la memoria. En nuestro caso han sido puestas a tierra, por lo que estos dos bits se convierten en dos ceros. A continuación le sigue otro 0 y por último un bit que determina si se va a realizar una lectura (1) o una escritura (0).

El campo de dirección permite que en un sistema con varias memorias conectadas al mismo bus (hasta un máximo de 4) sólo se active una de ellas.

Grabación de un byte: En primer lugar se genera un inicio de transferencia y se envía el byte de control. Entonces, la memoria envía la señal de reconocimiento durante el siguiente pulso de reloj. A continuación se envía un byte que indica la dirección (0 a 255) en la que se quiere escribir el byte. La memoria responde con otra señal de reconocimiento. Se envía el dato de 8 bits que se quiere grabar, la memoria genera el reconocimiento y por último se envía la señal de fin de transferencia. La figura 3 muestra gráficamente el proceso.

Grabación de una página (2 bytes): Para la memoria 24C02A la página consta de sólo 2 bytes, aunque otros modelos tienen tamaños de página mayores. El proceso a realizar es el mismo que el comentado en el caso anterior, aunque en esta ocasión se envían dos bytes en lugar de uno solo (figura 4).

Hay que señalar que la grabación de los datos no se produce en el momento en que estos se envían, sino que se inicia en el instante en que se genera el final de transferencia. En este momento, la memoria entra en un ciclo de grabación propio auto-temporizado que invierte 1 milisegundo por cada byte a escribir. Durante este periodo no puede realizarse operación alguna con la memoria por lo que antes de enviar otro comando es necesario asegurarse de que la memoria ha terminado su ciclo propio de grabación. La forma de llevar todo esto a cabo consiste en enviar, en primer lugar, una señal de inicio y, a continuación, el byte de control indicando una escritura. Si la memoria responde generando la señal de reconocimiento es que ha terminado su ciclo de grabación de datos. En caso contrario se repite el proceso. El diagrama de flujo se muestra en la figura 5.

Los bytes enviados durante los comandos de grabación se almacenan en un memoria intermedia, que en el caso del circuito 24C02A tiene un tamaño de 2 bytes. Si durante la grabación se envían más bytes que el tamaño de la página los bytes siguientes sobreescibirán los bytes anteriores almacenados en el búfer. Además, debe tenerse en cuenta que la operación de grabación produce un autoincrementado del contador interno de direcciones.

Lectura de un byte desde la posición de memoria actual: Se envía la señal de inicio y el byte de control indicando una lectura (figura 6). La memoria responde con una señal de reconocimiento. A continuación, la memoria deposita en el bus durante los siguientes 8 pulsos de reloj los 8 bits del byte. Por último se envía la señal de terminación.

Lectura aleatoria: Se envía la señal de inicio y el byte de control indicando, ojo, una escritura (figura 7). La memoria responde con una señal de reconocimiento. Se envía un byte indicando la dirección que se quiere leer. De nuevo la memoria responde con un reconocimiento. Ahora se vuelve a enviar la señal de inicio de transferencia y un byte de control indicando una lectura. A continuación la memoria deposita en el bus durante los siguientes 8 pulsos de reloj los 8 bits del byte. Y por último se envía la señal de terminación.

Lectura secuencial: Se realiza enviando el comando 3 o el 4, con la particularidad de que en lugar de enviar la señal de terminación después de leer el primer byte se pueden seguir leyendo bytes de posiciones consecutivas de la memoria sin más que ir enviando una señal de reconocimiento a la memoria después de recibir cada byte (figura 8). Cuando se quiera finalizar la lectura se envía la señal de fin de transmisión.

Después de cada operación de lectura o grabación el puntero de direcciones interno se autoincrementa. Cuando éste sobrepasa el valor máximo (255) se inicializa a 0 de nuevo.

Consideraciones prácticas

Conocido el protocolo de comunicación de la memoria y con los detalles de funcionamiento del puerto paralelo que se han expuesto resulta sencillo leer y grabar datos de la memoria de la llave. La protección consiste en introducir en la memoria ciertos datos que serán leídos en el momento de la ejecución por el programa que se desea proteger. Si la mochila está presente se podrán leer estos datos. En caso contrario no podrá hacerse y se detendrá la ejecución pidiendo que se conecte la mochila al puerto.

Una vez que todo está montado y verificado puede procederse a la programación y lectura de la memori

Contenidos recomendados...

Comentar
Para comentar, es necesario iniciar sesión
Se muestran 0 comentarios
X

Uso de cookies

Esta web utiliza cookies técnicas, de personalización y análisis, propias y de terceros, para facilitarle la navegación de forma anónima y analizar estadísticas del uso de la web. Consideramos que si continúa navegando, acepta su uso. Obtener más información