Le source Pascal et celui assembleur 68000 ne font que le GOC, pas son initialisation ni utilisation, ni même la variante condensé. Ils n’apportent strictement rien de plus que mes versions C (ci-dessus avec état en 19 octets, et là avec 3 registres plus larges).
Le code 8051 fait a priori tout le Lecam, mais j’hésite à le publier sans l’accord des 3 autres auteurs et d’un ayant droit. Et il utilise un assembleur 8051 avec des caractéristiques uniques (tout le source s’assemble d’un coup sans linker, labels locaux introduits par le signe §…) et un assembleur du langage Lecam dont je ne retrouve que l’exécutable MPW. Au total le source fait 45k lignes, beaucoup sans rapport avec le minitel ou le Lecam. Je fais plutôt essayer de répondre aux questions que vous posez, en citant des extrait du code source 8051 ou Lecam.
Une facile:
Oui en mode « Videotex ». Petit extrait du code (relativement clair dans cette partie)
;————————————————————————————————————————————————————————————————————————————————————————————————————
;ILSkipVidIdle
; Si le caractère courant n'est pas un caractère de contrôle, on le déchiffre et on l'émet
; (à condition que la consigne CH soit d'accord), sinon on l'émet sans le déchiffrer.
ILSkipVidIdle
CALL ILGetdcfcByte ;ne revient pas si pas de déchiffrement
MOV R1,A
CJNE A,#$20,*+3
JC §testESC
MOV R7,A
IF DEBOG
CALL PRBYTE
ENDIF
;————————————————————————————————————————————————————————————————————————————————————————————————————
;Suivant la valeur de AC, CH & CM va:
; Si le bit b de AC est positionné, on va initialiser le tampon de saisie
; au cas où la saisie serait simple ***à définir***
MOV DPTR,#xILACParms
MOVX A,@DPTR
JNB Acc.kILACs,§11
MOV A,R1
JMP ILGocSign
§11 MOV DPTR,#xILCHParms
MOVX A,@DPTR
JNB Acc.kILCHc,§toScreen
SETB C ;on utilise le Goc de chiffrement.
CALL ILGetGocByte
IF DEBOG
CALL PRBYTE
PUSH Acc
MOV A,R7
CALL PRBYTE
POP Acc
ENDIF
ANL A,#$1F ;en mode videotex un octet Goc pour un octet Videotex
XRL A,R7
MOV R7,A
MOV DPTR,#xILACParms
MOVX A,@DPTR
JNB Acc.kILACb,§toScreen
MOV DPTR,#xILDefSSBlock
MOVX A,@DPTR
MOV DPH,A
MOV DPL,#6
MOVX A,@DPTR
INC A
MOVX @DPTR,A
ADD A,#6
XCH A,DPL
MOV A,R7
MOVX @DPTR,A
IF DEBOG
CALL PRSTRING
DB kCr,"--7- $",0
CALL PRBYTE
CALL PRSTRING
DB " '",0
CALL COUT
CALL PRSTRING
DB "' in Def",0
ENDIF
RET
§toScreen MOV DPTR,#xILACParms
MOVX A,@DPTR
JNB Acc.kILACa,§NoEcho
MOV DPTR,#xILCMParms
MOVX A,@DPTR
JNB Acc.kILCMd,§NoEcho
MOV A,R7
JMP ILSend2ScrOnly
§NoEcho RET
§testESC CJNE R1,#kESC,§testUS
MOV A,R1
CALL ILSend2ScrOnly
MOV DPTR,#ILSkipVidESC
JMP ILSetSkipVid
§testUS CJNE R1,#kUS,§testSEP
MOV A,R1
CALL ILSend2ScrOnly
MOV DPTR,#ILSkipVidUS
JMP ILSetSkipVid
§testSEP CJNE R1,#kSEP,§testSS2
MOV A,R1
CALL ILSend2ScrOnly
MOV DPTR,#ILSkipVidSEP
JMP ILSetSkipVid
§testSS2 CJNE R1,#kSS2,§testCipher
MOV A,R1
CALL ILSend2ScrOnly
MOV DPTR,#ILSkipVidSS2
JMP ILSetSkipVid
§testCipher ;actions <> suivant chiffr…t ou sign… sur 0/X et 1/X
§RET RET
;————————————————————————————————————————————————————————————————————————————————————————————————————
Cependant il y a d’autres cas où le GOC est utilisé 2 fois par octet, en groupant les 4 bits de poids faible des 2 résultats (poids fort pour le premier GOC) pour faire un masque de 8 bits.
De ce que je trouve dans le source, les STUCAM, et mes souvenirs, le Lecam ne fait jamais l’opération de dérivation de clé à partir du numéro de page etc comme spécifié dans Antiope et dans le brevet.
Avec une confiance de 80%; les 8 octets qui initialisent le GOC de chiffrement sont parfois entièrement produits par la carte à puce par une méthode cryptographique. Cela dépends de la carte, que le Lecam reconnais. Certaines cartes génèrent cette clé par l’algorithme Telepass (que j’aimerais bien trouver !) d’autres (ultérieures) DES. Quand DES est utilisé, la clé est 56-bit, et c’est sans doute le maillon faible pour une attaque par force brute. Mais la clé GOC est 64-bit et je conjecture qu’une attaque par cryptanalyse du GOC est plus efficace.
Merci pour les pointeurs sur les outils 8051. Je réserve ça pour quand/si j’ai du temps.