Protecció Actual (Sentinel)

S'utilitza una clau USB Sentinel SuperPro. La clau conté 64 cel·les, cada cel·la amagatzema 16bits. S'utilitzen de la següent manera:

Cel·la(Hex) Dades Exemple
0x00 Nº de clau 0x00d9
0x01 developer ID 0xd4e9
0x02
.
.
0x07
RESERVAT -
0x08 nº de execucions restants de la demo
Si és la versió completa conté 0xffff
0xffff
0x09
0x0a
0x0b
0x0c
0x0d
nº de serie de la clau codificat en ASCII
2 caracters per cel·la en BigEndian.
Ex:4628L00124
0x3436
0x3238
0x4c30
0x3031
0x3432
0x0e
.
.
0x3f
DISPONIBLE -

Procediment per validar la clau

Per poder treballar amb la clau primer s'ha de inicialitzar la lliberia amb els següents passos:

RNBOsproFormatPacket(packet, SPRO_APIPACKET_SIZE); // Inicialitzem el buffer que usarà la llibreria per comunicar-se amb la clau
RNBOsproInitialize(packet);                        // Inicialitzem la llibreria

Un cop inicialitzada, s'ha de buscar la clau amb les funcions RNBOsproFindFirstUnit(packet, dev_id) per trobar la primera clau, i RNBOsproFindNextUnit(packet) per passar a la següent clau.

Per validar la clau es procedeix de la següent manera:

  1. llegir la posició 0x08 (amb RNBOsproRead) i:
    1. si el valor llegit és 0 -> Error la demo s'ha acabat
    2. si el valor és diferent de 0xffff, decrementar-lo usant RNBOsproDecrement
  2. llegir les posicions 0x09 a 0x0d per obtenir el nº de serie de la clau
  3. verificar que clau_registre ^ password_secret == nº de serie de la clau Exemple:
Nom ASCII Hex
clau registre - 64 59 45 5d 3e 10 64 5e 14 66
Password Power To The Penguin 50 6f 77 65 72 20 54 6f 20 54
clau_registre ^ password - 34 36 32 38 4c 30 30 31 34 32
Nº serie 4628L00142 34 36 32 38 4c 30 30 31 34 32

Format sentinel v2

S'ha basat el nou format de dades de la clau en l'anterior, intentant aprofitar al màxim les dades ja existents. També s'ha decidit fer que les dues versions del programa puguin compartir una clau sense interferir-se. Així, els clients ja existents poden continuar usant la clau que ja tenen i només s'hauran de descarregar el programa nou.

Com que es desitja que els clients actuals puguin usar el programa nou en mode demo , i després , si ho desitgen, passar a la versió definitiva, ara ja no resulta pràctic tenir en la clau el tipus de llicencia que té el client. Per tan s'ha optat per que la clau de registre contingui la informació del tipus de llicència. Com a conseqüència d'aquest canvi ara ens interessa que la clau contingui un comptador del numero d'usos que s'han fet, que es pugui comprar amb el número màxim d'usos permesos de la llicència.

Per implementar el comptador de nº d'usos, no s'ha pogut usar directament el que proporciona la clau Sentinel, ja que només decrementa. Per tan s'ha optat per usar la formula:

Nº Usos=MaximComptadorSentinel - ValorActualComptadorSentinel

Així al decrementar el comptador de Sentinel incrementa el número d'usos.

Finalment, per comoditat dels clients, s'ha optat que el programa nou accepti la mateixa clau de registre que el programa vell, tot i que només l'activi en mode demo.

Cel·la(Hex) Dades Exemple
0x00 Nº de clau 0x00d9
0x01 developer ID 0xd4e9
0x02
.
.
0x07
RESERVAT -
0x08 nº de execucions restants de la demo
Si és la versió completa conté 0xffff
0xffff
0x09
0x0a
0x0b
0x0c
0x0d
nº de serie de la clau codificat en ASCII
2 caracters per cel·la en BigEndian.
Ex:4628L00124
0x3436
0x3238
0x4c30
0x3031
0x3432
0x0e Versió de la clau
0: Versió 1
1:Versió 2
>1: Reservat
0x0001
0x0f conté el valor de fer Max(0,0xffff-num_op_cinta_realitzades) 0xffff
0x10
.
.
0x3f
DISPONIBLE -

Clau Registre v2

Ja que la clau de registre de la versió nova ha de contenir informació (Demo/Versió completa, nº d'usos, nº de serie de la clau associada.....), s'ha optat per usar un sistema criptogràfic de clau pública. El principal inconvenient és que com que no li podem exigir a l'usuari que introdueixi una clau gaire llarga, no es pot usar una longitud segura (>2048bits) , com a compromis s'ha decidit usar una clau de 32 caracters que es tradueix a 128bits (amb aquestes longituds el temps necessari per trencar la clau és de l'ordre de segons usant un PC actual).

Posició(Hex) Dades Exemple
0x00
0x01
0x02
0x03
0x04
0x05
0x06
0x07
0x08
0x09
Número de serie de la clau
Ex:4628L00142
0x0a
0x0b
demo count
Ex:20 Execucions
0x00
0x14
0x0c
0x0d
Nº de client
Ex:1234
0x00
0x14
0x0e soroll 0x00
0x0f Checksum tal que:
(msg[0x00]+...+msg[0x0f]) & 0xff==0

Alternatives

Opció Descripció Requeriments HW Pros Contres
A Usar nº de serie + dades en la EEPROM del FT2232H
  • Cap
  • Barat
  • Es pot usar el FT2232H_miniModule
  • Fàcil de piratejar (FTProg permet modificar la EEPROM des de una bonica GUI)
  • Probable que la versió de demo acabi durant eternament (usar FTProg per salvar l'estat de la EEPROM i restaurar-lo cada cop que la demo s'acabi)
B FT2232H + sentinel
  • clau Sentinel
  • Es pot usar el FT2232H_miniModule
  • Compatiblitat total amb versions anteriors del programa
  • Relativament segur
  • La clau Sentinel pot convertir-se a mitjà plaç en un producte descatalogat
  • Més car que altres alternatives
C FT2232H + PIC18F88 emulant EEPROM
  • PIC18F88
  • Requereix usar directament el xip FT2232H (més complexitat al PCB)
  • Control precís de la memòria de la EEPROM
  • Possibilitat de implementar un sistema relativament difícil de piratejar (Ex:Challange/Response)
  • Complexitat extra del PCB
  • Pas extra de programació inicial de HW
  • Requereix implementar el codi de control del PIC18F88
  • Pot causar problemes d'inicialització del FT2232H
D FT2232H + PIC connectat a linies lliures del port serie
(Ex:PortB.RTS,PortB.CD,PortB.DSR)
  • Es pot usar el FT2232H_miniModule
  • Requereix un PIC
  • Relativament senzill d'implementar
  • Requereix implementar el codi de control del PIC
  • Lent
  • Pot interferir amb les comunicacions del port
  • Pas extra de programació inicial de HW (pot ser fet de manera automàtica)

Finalment l'opció que s'està explorant és la D. Ja que té pinta que es pot usar el propi FT2232H per programar el PIC en aquesta opció. Malgrat que usem el FT2232H com a port RS232, auqest xip soporta molts altres modes de treball (RS485, MPSSE, Bit-Bang, FT245, Bus Emulation, ...). Sembla factible usar un d'aquests modes ( segurament Bit-Bang o MPSSE ) per programar el PIC , sense necessitat de components extres.

S'ha optat per usar el PIC12F1840, ja que ens ofereix:

  • Programació a baix voltatge, que ens estalvia el generador de voltatge de programació i la seva lògica de control
  • Memòria de dades EEPROM integrada. Ens permet guardar dadedes que canvien al llarg del temps Ex:nº execucions restants de la demo,...
  • 256 Bytes de RAM i 4K(Instruccions) de ROM. Que ens donen espai suficient per implementar els algoritmes criptogràfics necessaris.
  • Protecció de la memòria EEPROM i la ROM de codi.
  • Requereix poc espai. Hi ha versió SOIC-8.

Implementació protecció FT2232H + PIC conectat a les lines no usades del port serie

S'ha decidit usar el port B del FT2232H per connectar-hi el PIC, ja que és el que té més linies disponibles i connectar-lo a als 2 ports és en el millor dels casos problemàtic.

El PIC12F1840 disposa de 6 pins usables, dels quals un d'ells (RA3/MCLR) s'ha de sacrificar si es vol usar el LVP(Low Voltage Programming). Si es vol poder programar el PIC usant el FT2232H i sense circuiteria extra, la única alternativa és usar el LVP, cosa que ens deixa amb 5 pins usables. El MCLR s'ha connectat al pin RI del port B del FT2232H, ja que així garantim que mentre es treballi en mode port serie, serà impossible programar el PIC.

Dels 5 pins restants (RA0,RA1,RA2,RA4,RA5), RA0 i RA1 s'utilitzen durant la programació per tan, convé que no estiguin connectats a un pin de sortida del FT2232H ja que es podrien interferir. Finalment conve que els pins de programació (RA0,RA1,RA3/MCLR) estiguin connectats de manera que sigui fàcil programar des del FT2232H. Per això s'ha connectat RA0 i RA1 a DSR i DCD respectivament.

Finalment per que el PC es pugui communicar amb el PIC de manera senzilla s'ha decidit usar les línies DTR i RTS, malgrat que la linia DTR s'utilitza. S'ha descartat usar una sola linia (RTS) ja que la amplada dels pulsos que es poden generar des del PC és molt imprecisa (l'USB afegeix una imprecisió de 10mS com a mínim, cosa que força uns 20mS com a puls mínim i a 2 pulsos per bit queda una velocitat màxima és de 25bits/s sense tenir en compte el que es pugui menjar el protocol...).

Ja que s'ha de connectar , igualment , la linia DTR al PIC, s'ha aprofitat per afegir una mesura de seguretat extra: La línia DTR s'ha connectat només al PIC i el PIC té connectat l'últim pin lliure al driver que hauria de rebre la línia DTR. D'aquesta manera només es transmetran els canvis de la línia DTR si es té una llicència vàlida. Això fara que en cas que no hi hagi llicència, el PIC desactivi la línia DTR que això es traduirà com a que la unitat de cinta no està llesta i per tan serà impossible transferir patrons entre la màquina i el PC. A més a més aquesta mesura continuarà sent efectiva encara que algú aconsegueixi crackejar el programa.

Per tan la assignació dels pins de programació és la següent:

PIC12F1840 FT2232H
Pin Mode Pin Mode
Normal Programació RS232 Bit-Bang MPSSE
4 - MCLR 46 RI D7 GPIOL3
7 RA0 ICSPDAT 45 DSR D6 GPIOL2
6 RA1 ICSPCLK 44 DCD D5 GPIOL1
5 RA2 - MAX232 Driver DTR
3 RA4 - 40 RTS D2 TDO/DI
2 RA5 - 43 DTR D4 GPIOL0

Protocol

Codificació

Degut a la imprecisió en el temps i la relativa lentitud en fer canvis en les línies, es requereix una codificació que minimitzi el número de transcisions que s'han de fer per transmetre 1 bit. Per aquest motiu s'ha decidit usar un codi Gray ja que per passar d'un estat a un altre només requereix canviar un bit Ex :

S'ha produït un error en crear la miniatura: Fitxer inexistent
Transcisions dels estats
Decimal Binari Gray
B1 B0 B1 B0
0 0 0 0 0
1 0 1 0 1
2 1 0 1 1
3 1 1 1 0

Com es pot veure també només hi ha un bit de diferència entre la última posició i la primera, cosa que permet tancar circularment el codi i considerar els canvis d'estat com a rotacions sobre un cercle. Per tan podem codificar els bits a transmetre com a rotacions cap a la dreta o l'esquerra en funció de si volem transmetre un 0 o un 1, respectivament.

En aquest cas ens va bé usar un codi gray de 2 bits ja que només tenim 2 linies de transmissió en cada direcció. Per evitar problemes amb altres equips, s'ha decidit que les linies que van del PC al PIC treballin negades. Per tan les senyals queden conectades de la següent manera:

Bit PC->PIC PIC->PC
B1 DTR CD
B0 RTS DSR

Trama

Per facilitar la transmissió de dades s'ha decidit seguir les següents regles:

  • usar l'estat 0 com a delimitador de trama.
  • una estada superior a 200mS en l'estat 0 indica final de trama.
  • una trama només pot començar en l'estat 0
  • les dades enviades són sempre un número exacte de bytes

Per aconseguir que sempre s'acabi una trama en l'estat 00, és requereix que el número de bits a 1 del missatge sigui parell. Per evitar haver de transmetre bits que no pertanyin a cap byte al final de la trama, i com que igalment és aconsellable usar un codi de detecció d'errors, s'ha decidit que el propi codi de detecció d'errors s'encarregui de assegurar-se que el número de bits a 1 del missatge sigui parell.

Per calcular el codi de detecció d'errors s'acumulen tots els bytes del misstage usant una XOR seguida d'una rotació cap a l'esquerra. S'utilitza aquest algoritme ja que és molt fàcil de calcular, compleix amb els requisits, és raonablement robust i el resultat de aplicar-lo a tota la trama (dades+codi) és 0. En cas que es volgués un algoritme de detecció d'errors més robust, es pot usar un CRC estàndard amb un polinomi de grau 8 i número parell de termes (garanteix la paritat de la trama).

Missatges

Cada missatge s'envia en una sola trama. Cada missatge consta d'un byte de capçalera/OpCode que indica el tipus de missatge i la longitud seguit de 0 a 32 bytes de dades.

PC->PIC12F1840
Nom Opcode DataLen Descripció
InitComms 0xE1 0 Inicialitza les comunicacions. Si no s'envia, el PIC ignorarà qualsevol altre comandament
GetNonce 0x21 0 Obté el repte d'autentificació.
SetKey 0x50 16 Envia al PIC clau_llicència XOR nonce. Si és correcte i vàlida posa el xip en estat activat.
DecrementCounter 0x00 1 Obté l'estat del PIC i la llicència
GetStatus 0x00 0 Obté el número de serie del dispositiu i l'estat
ResetKeyData 0x00 32 Esborra tota la informació de la llicencia i la reescriu amb les dades subministrades.
EndComms 0x00 0 Finalitza les comunicacions. Si el xip està en estat activat, a partir d'aquest moment deixarà passar la linia DTR
PIC12F1840->PC
Nom Opcode DataLen Descripció
SetNonce 0x21 16 Retorna un número aleatori de 128bits en resposta a GetNonce
SetStatus 0x00 3
SetSerial 0x00 16
CommError 0x00 0