Security chip WPC-S et WPC-95

Pinup
Security Chip

Etude de la protection

Fonctionnement et remplacement
du Security Chip.

Pour Williams/Bally
WPC-S et WPC-95.

Généralités

Sur les cartes WPC-S et WPC-95, un cicuit de protection a été installé entre le CPU et la matrice de contacts. Le rôle de ce circuit est de s'assurer que le jeu placé dans les EPROM correspond bien à celui prévu à l'origine. Ainsi, il n'est pas possible de substituer une carte CPU d'un autre flipper, à moins que ce ne soit celle d'un modèle identique (ayant le même numéro de modèle).

Outre la vérification du modèle, le Security Chip contient également le numéro de série de chaque flipper. C'est ce numéro qui est affiché lors du démarrage (par exemple 530 123456 12345 sur un Dirty Harry).

Le Security Chip est un microcontroler PIC 16C57, dénommé U22 sur WPC-S (G10 sur WPC-95), qui dialogue avec le CPU au travers du bus "colonnes" de la matrice de contacts.

Les commandes envoyées par le CPU sont lues par U14 (LS374/HC374), les données renvoyées sont stockées dans U24 (LS374/HC374). Les 10 colonnes (8 sur WPC-95) de la matrice de contacts sont accédées via U23 (HC4514/HC237), les lignes en retour sont lues par une paire de LS240, U13a/b (U15a/b sur WPC-95).

Remplacement

En cas de panne, le Security Chip est en principe difficilement remplaçable, car le code de ce composant programmable est protégé. On ne peut donc pas le copier dans un circuit vierge. En outre, le PIC 16C57 est un composant obsolète, remplacé désormais par le 16F57. A noter, qu'il s'agit du seul microcontroleur ayant un brochage 28 broches large chez Microchip, il n'existe donc pas d'alternative pour le changer.

Nous avons donc cherché à comprendre le fonctionnement du Security Chip et réalisé notre propre version. Nous avons également cherché comment remplacer le PIC 16F57 par un composant plus performant et plus pérenne.

Si vous avez besoin d'un SECURITY PIC de remplacement (U22 ou G10), reportez vous à ce projet. Cette réalisation à base de PIC 16F57, remplace le PIC original, broche à broche.

Algorithme

Tout repose sur le cryptage d'un numéro de série de la forme:

    AAA BBBBBB CCCCC DDD

C'est ce numéro qui est affiché lors du démarrage du flipper, ses différents champs sont:

  • AAA
    Modèle du flipper (par exemple 530 pour le Dirty Harry)
  • BBBBBB
    Numéro de série (c'est celui qui est inscrit sur les étiquettes)
  • CCCCC
    Numéro de série n°2 (ce numéro n'a pas d'utilité connue)
  • DDD
    Clé de déblocage de la matrice de contacts (TOUJOURS à la valeur 123, elle sert à générer le code de déblocage correspondant)

Ce numéro n'est pas stocké tel quel dans le Security Chip, mais sous la forme encodée résultante. L'algorithme de codage particulièrement complexe tiendrait difficilement dans un 16C57 (qui ne possède que 2K x 12 bits de mémoire).

La PROM de jeu en revanche, contient l'algorithme inverse qui est executé par le CPU 68B09. Seul le modèle de flipper est vérifié au démarrage, le reste n'est qu'information.

Au final l'algorithme génére une séquence cryptée de 16 + 3 octets:

00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12

Les octets 02 et 0A sont la clé de cryptage utilisée (par défaut 0x34 et 0x12).
Les octets 05 et 0D sont initialisés à zéro et changent ensuite de valeur régulièrement (il s'agit d'un code tournant).
Les octets 10, 11 et 12 sont le code de dévérouillage de la matrice de contacts (lequel est généré uniquement à partir du n° de modèle et la clé fixe "123").

Nous avons étudié la possibilité d'implémenter cet algorithme dans un circuit de plus grande capacité. L'intérêt étant de pouvoir se passer d'un logiciel externe pour générer la séquence cryptée et de pouvoir travailler directement avec le numéro en clair. Un premier prototype à base de PIC 16F684 a été évalué avec succés (code écrit en langage C), l'algorithme utilise à lui seul 57% de la mémoire (2 Ko x 14 bits).

  • La programmation du PIC est en ICSP. L'alimentation est une simple pile 4,5 Volts.
  • On va générer avec le n° en clair 530 000000 00000 (Dirty Harry).
  • Les 16 octets sont générés, le code tournant également (testé ici 3 fois).
  • Le code de dévérouillage de la matrice des contacts est bien généré (03 E9 D8).

Protocole

Le système fonctionne en mode maitre-esclave, le CPU envoi une commande au PIC, lequel répond (éventuellement) en renvoyant une donnée. Les commandes reconnues sont les suivantes:

00 RESET C'est la première commande envoyée par le CPU. Elle réinitialise le PIC et fait progresser le code tournant. Aucune donnée n'est renvoyée par le PIC.
0D COUNTER Décremente un compteur interne et retourne une valeur au CPU. Celle-ci n'est lue que périodiquement, une fois sur quatre au début, puis une fois sur quatorze ensuite. Après un certain temps, si la valeur retournée est synchrone avec celle attendue par le CPU, ce dernier envoi alors au PIC une commande 20 (voir ci-dessous, déverouillage de la matrice de contacts).
20 UNLOCK Le CPU envoi cette commande suivie de trois octets pour déverouiller la matrice de contacts. Le PIC ne retourne aucune donnée, mais vérifie à la fin de la séquence, si les trois octets envoyés correspondent au code de dévérouillage (octets 10, 11 et 12). Le cas échéant, la matrice de contacts restera vérouillée.
1x SW MATRIX Le CPU demande la lecture d'une colonne x (16 pour la colonne 1) de la matrice de contacts. Si celle-ci n'est pas vérouillée, le PIC retourne un octet correspondant aux lignes lues. Si la matrice est vérouillée le PIC renvoi la valeur zéro.
7x READ CODE Le CPU demande la lecture d'un des 16 octets du code encrypté (70 pour l'octet 0, 7F pour le dernier). Le PIC retourne la valeur correspondante et fait progresser le code tournant.

La commande RESET (00) n'est envoyée qu'une seule fois au démarrage du flipper.

Les commandes READ CODE (7x) sont envoyées ensuite, mais dans un ordre aléatoire (ainsi le code tournant des octets 05 et 0D sera différent à chaque fois).

La commande COUNTER (0D) est envoyée périodiquement et déclenche l'envoi de la commande UNLOCK (20) + 3 octets, quand le compteur arrive à zéro.

Les commandes SW MATRIX (1x) sont envoyées régulièrement pour balayer la matrice de contacts, dont le nombre peut varier en fonction du flipper.

La commande UNLOCK (20) envoyée par le CPU est encodée avec le modèle interne du flipper (et non avec celui retourné par le PIC).

Comportement

En l'absence de Security Chip, ou si ce dernier retourne des informations incohérentes, le flipper affichera le message "U22 ERROR" (ou "G10 ERROR" sur WPC-95): U22 Error En revanche, si le Security Chip fonctionne, mais ne correspond pas au modèle de flipper attendu, le message sera alors le suivant: Incorrect U22 Dans ce cas, le CPU continue d'envoyer régulièrement des commandes UNLOCK (20) suivies de 3 octets, codés comme indiqué précédement, à partir du numéro interne du flipper. Cette caractéristique est intérressante, car elle pourrait permettre de concevoir un SECURITY CHIP universel, capable d'apprendre automatiquement le modèle de flipper (sa génération à partir de ce code est en effet possible).

Dans le premier cas, le CPU va également envoyer des commandes UNLOCK (20) suivies de 3 octets, mais de façon beaucoup plus anarchique (le compteur retournant une valeur erronée). Le CPU commence par attendre 25 commandes COUNTER avant d'envoyer la premiere commande UNLOCK, puis envoi ensuite systèmatiquement cette commande après chaque demande COUNTER. Les trois octets qui suivent le UNLOCK ne sont pas non plus ceux habituels. Ils correspondent au numéro de modèle, mais encodé avec une clé "000" (au lieu de "123").

Pinup
Dernière mise à jour de cette page: 7 Août 2018