90

Super article, super boulot, merci !
Tu n'as pas parlé de la gestion des effets sonores par dessus la musique ? C'est géré ?
Si oui, avec un autre format ? Un autre bout de driver ?
Et aussi super des puces d'extensions audio type VRC6 ou autre ?

Je propose Bidon Audio Driver comme nom grin
(en plus ça fait BAD...)
avatar

91

Pour les effets, le principe est de prioriser les sons de l'effet en cours sur la musique, tout en continuant à progresser dans celle-ci.

Disons qu'on ai l'effet suivant, qui n'utilise que le canal noise et qu'on appellera intelligemment "PATCHAAaaamm":

4-# F V00 
B-# 8 ...
4-# F ...
8-# 8 ...
... 4 ...
... 6 ...
... 2 ...

Quand cet effet se lance, on va vouloir:
- Jouer la musique normalement sur les autres cannaux,
- jouer cet effet sur le canal noise à la place de la musique, et
- être prêt à reprendre la musique sur le canal noise là ou elle devrait-être, pas là où elle était avant l'effet ça décallerait ce canal

Pour ça la solution la plus répendue est de passer par des mirroirs des registres APU en RAM. Le code qui joue la musique n'écrit pas dans les registres directement, mais dans des variables. Si un effet doit être joué, le même code est executé, avec les données de l'effet, et écrit dans d'autres variables. Quand tout à été joué, on choisit d'écrire dans l'APU soit les registres de la musique, soit ceux de l'effet en fonction de ce que l'effet à utilisé. Dans Super Tilt Bro. je ne me sert que du canal noise pour les effets, la logique est donc : écrit les miroirs de la musique pour tous les cannaux, si un effet est actif écrase les valeurs du canal noise par les miroirs de l'effet.

N'utiliser que le noise n'est pas commun, et un reste dû aux limitations de l'ancien driver audio, mais l'idée reste la même avec plusieurs canaux d'effet.

Avoir plus de cannaux, comme le VRC6 ne change pas grand chose. La logique est la même. Au final il faut determiner quelles valeurs écrire dans les registres de l'extension audio.

BAD à recueillit un vote de plus, il est loin devant tous les autres ! (OK, il n'y a pas d'autres proposition.) En plus, ça pourait être un acronyme récursif si on l'appellait le "BAD Audio Driver" smile
avatar

92

Un vote de plus pour BAD ! ^^
Et merci Roger pour ces explications très intéressantes (comme toujours). smile
avatar
----- SNK Forever -----
Association Retro-gaming Connexion : http://www.retro-gc.fr/
http://www.consoles-portables.com

93

Je me sens obligé de l'écrire juste pour justifier une réputation certainement trop flatteuse...
BAD, c'est pour Bruits Atroces Distordus ?
Si oui, je vote pour aussi cheeky

Sinon, bravo pour le boulot et les explications claires.
avatar
De nouveaux jeux pour vos vieilles consoles ? En 2024 ?
https://yastuna-games.com

94

Merci RogerBidon pour ton post. Et surtout de mettre des schémas car ça aide bien mon cerveau de non-développeur à essayer de comprendre l'intégralité de tes articles ^^'

top
avatar
@originalfei
Homebrews Connexion
In pixels we trust.
ORE WO DARE DA TO OMOTTE YAGARU !

95

BAD est acté. Bon je n'ai jamais fait le taff de sortir le driver audio des entrailles de du jeu, mais dés que je le fait, promis il s'appelera BAD !

Aujourd'hui je viens poster quelque chose de pas technique du tout. Enfin, si mais pas le même genre de technique ! Un guide de jeu.

Super Tilt Bro.: le Guide Incroyablement Technique pour Gagner l'Ultime Domination (GITGUD)

Déplacer son personnage dans Super Tilt Bro. ? Pas de problème ! Battre un bot, même en difficile ? Il suffit de le connaître ! Mais pourquoi c'est si dur contre un humain qui a poncé le jeu ? Quelles sont les stratégies de base, et comment arracher une victoire ?

Ce guide vous donnera les concepts de base à travailler pour améliorer votre jeu.

Les règles du jeu

Si vous n'avez jamais entendu parler de platform-fighter, voici les bases.

Vous et un autre joueur apparaissez sur la même plateforme volante au milieu du vide. Mais c'est votre plateforme ! Dégagez-le de là. Pour arriver à votre fin, vous disposez de tout un arsenal d'attaques, chacune provoquant des dégâts et le repoussant. Plus votre adversaire aura subi de dégâts, plus il sera éjecté loin.

v0Gp8hW.gif
Le joueur vert attaque le joueur jaune pour cumuler des dégâts, puis termine par une puissante attaque sautée.

Ah oui, j'oubliai les contrôles !

QLACLez.gif

Petite note au passage: le saut est sur HAUT, tandis que A et B servent à exécuter des attaques et attaques spéciales. On s'y fait, promis !

Les techniques communes à tous les personnages

Les attaques

Les attaques sont à la base de ce jeu. Une attaque qui touche votre adversaire lui inflige des dégâts et l'éjecte. L'éjection peut lui faire perdre une vie, et si ce n'est pas le cas, les dégâts rendront la prochaine attaque plus puissante.

Chaque personnage dispose d'une grande variété d'attaques. Toutes affectées au bouton A, associé à une direction. Certaines attaques infligent beaucoup de dégâts, d'autres éjectent particulièrement loin, certaines sont très rapides,… Choisir la bonne attaque dans la bonne situation est primordial. Ce choix dépend énormément du personnage que vous jouez.

L'attaque la plus simple s'effectue simplement en appuyant sur A. Nous l'appelleront le "jab", c'est un coup rapide qui inflige peu de dégât, mais est souvent pratique pour vous sortir d'un mauvais pas en repoussant votre adversaire juste ce qu'il faut pour être en sécurité.

OVuqwWj.gif
Le jab de Kiki arrête Sinbad dans son élan

Des attaques plus puissantes sont disponibles en appuyant sur une direction en plus du bouton A. On les appelle les attaques tilt, comme dans le nom du jeu. AVANT + A provoque un tilt avant, qui est complètement différent d'un tilt haut ou d'un tilt bas.

8cRC5cZ.gif
Pepper nous montre son tilt avant, son tilt haut et son tilt bas

Et enfin, les attaques aériennes sont différentes de celles effectuées au sol. Elles suivent le même principe d'avoir une variante par direction.

Ym432Qw.gif
Pepper nous fait une démonstration de ses attaques aériennes avant, haut, neutre et basse.

Si vous vous y perdez, généralement il faut presser la direction dans laquelle vous voulez attaquer en plus du bouton A.

Les coups spéciaux

Les coups spéciaux ressemblent beaucoup aux attaques, ils sont effectués avec B plus une direction et il y en a tout un arsenal. Ils ont ceci de spécial qu'ils ne servent pas toujours qu'à attaquer, mais peuvent déplacer le personnage, impacter son mouvement ou avoir des effets uniques.

gU1r6ee.gif
Le spécial neutre de Pepper lui permet de placer son chat, Carrot, puis de se téléporter sur lui plus tard.

Les coups spéciaux varient énormément d'un personnage à l'autre. Les plus utiles seront décris dans les chapitres consacrés à leur personnage.

Le bouclier

"Je le prends pas le bouclier, ça fait trop nul !"
- Yvain, le chevalier au Lion

Si vous appuyez sur BAS, votre personnage se cachera derrière un bouclier d'énergie. Le bouclier peu encaisser deux coups, annihilant leurs effets sur votre personnage. Un troisième coup brisera votre bouclier, ce qui amplifiera grandement l'éjection. Évitez ça à tout prix.

1GzuSHB.gif
Un coup ça va, trois coups, bonjour les dégâts.

Le double saut

Bon, ça c'est un classique. Ça va à l'encontre de toutes les lois de la physique, mais les personnages peuvent sauter une deuxième foi quand ils sont en l'air. Pourquoi pas une troisième foi ? Parce que ça serait aberrant !

Le wall jump

Si vous êtes un habitué de Super Smash Bros, c'est le chapitre à ne pas manquer. Dans Super Tilt Bro. on ne peut pas s'accrocher aux bords des plateformes, mais on compense avec le wall jump.

Votre personnage peut effectuer un wall jump, il suffit d'appuyer sur n'importe quel bouton lorsque vous vous tenez contre un mur. Voilà, ce n'était pas si compliqué !

En pratique, le wall jump ne saute pas bien haut et on ne peut en faire qu'un (on n'est pas dans Micro Mages ici.) Son utilité semble donc très limitée.

Parlons d'autre chose. Certains coups spéciaux vous permettent de regagner de la hauteur, c'est très pratique pour revenir sur la plateforme après s'être fait éjecté. Ces coups, une foi terminés plongent votre personnage dans un état spécial qui se nomme la chute inéluctable. Dans cet état, votre personnage ne peut rien faire ... à part un wall jump !

Le wall jump sert alors à se sortir de cet état de chute inéluctable, donc de continuer à gagner de la hauteur pour revenir sur la plateforme.

HllLFRX.gif
Sinbad qui utilise le wall jump pour escalader un mur trop haut.

Le petit saut

Relâchez le bouton de saut rapidement et vous sauterez particulièrement bas. C'est très utile pour exécuter rapidement une attaque aérienne au niveau du sol.

29bmthb.gif
Le petit saut et le GROOOOOS SAUUT !

Accélérer sa chute

Parfois, on veut juste retourner au sol le plus vite possible. En appuyant sur BAS, on peut accélérer sa chute.

EP03ny6.gif
La chute rapide et la chute normale côte à côte.

Le tech

Le tech, prononcé "tèk", est la technique avancée la plus utile. Elle procure tant d'avantage que sa maitrise est essentielle pour jouer "sérieusement."

Lorsque vous recevez un coup, vous vous crashez au sol brutalement. Si vous appuyez sur BAS juste avant l'impact vous allez effectuer le tech, c'est-à-dire que votre personnage ne s'explosera pas la figure lamentablement sur le pavé, il se rattrapera avec grâce. Ce qui est plus rapide.

La différence entre un tech et un crash

Ce n'est pas tout ! Avec BAS+GAUCHE ou BAS+DROITE, vous effectuerez un tech glissé. Votre personnage se rattrapera rapidement et glissera sur le sol dans la direction choisie. Le tech glissé vous permettra de mettre plus de distance entre vous et votre adversaire, limitant sa capacité à enchainer de gros combos.

gBQZJAH.gif
Et voilà le tech glissé. Quelle élégance !

Les Combos

Lorsque vous portez un coup à votre adversaire, celui-ci clignote pendant un court laps de temps. Ce clignotement indique que le personnage est sous hitstun, c'est-à-dire qu'il ne peut rien faire. Vous pourrez trouver des enchainements d'attaques qui abusent du hitstun pour garantir de toutes toucher. Une telle suite d'attaque est appelée un combo véritable, une foi que la première à touché, le reste est complètement inévitable.

Les combos véritables sont rares, doivent être exécutés à la perfection, et ne fonctionne que lorsque l'adversaire n'a subi que peu de dégâts. Vous pourrez cependant toujours tirer profit des crashs ou de mauvaises réactions de votre adversaire pour enchainer plusieurs attaques. Nous appellerons ça aussi des combos.

VBlpKLn.gif
Le combo emblématique de Pepper. Notez que son adversaire aurait pu s'en sortir avec un tech glissé.

La stratégie

Nous découpons généralement une partie en trois phases: la phase neutre, l'avantage et le désavantage.

La phase neutre, c'est ce moment pendant lequel on se regarde dans le blanc des yeux. Personne n'a pris l'avantage, chacun cherche le moyen de porter le premier coup. Prenez le temps d'évaluer vos différentes options, c'est le calme avant la tempête.

L'avantage, c'est quand vous avez pris le dessus, vous chercherez à maximiser cet avantage. Typiquement, vous avez poussé votre adversaire hors de la plateforme, il essaye alors de revenir. Ses options sont limitées, tandis que vous conservez toutes les vôtres. Évitez de vous laisser surprendre par un coup inhabituel et vous devriez lui prendre une vie, ou du moins causer un maximum de dégâts.

Le désavantage, c'est l'inverse. Vous cherchez un moyen de revenir sur la plateforme mais votre adversaire fait barrage. Vos options dépendent énormément du personnage que vous êtes en train de jouer. L'idée générale sera d'agir vite et d'être le plus imprévisible possible. Ceci-dit, tous les personnages ont un coup dédié à cette situation, le spécial haut (HAUT+B), dans le doute c'est souvent votre meilleure option.

Jouer Sinbad

Stratégie générale

Sinbad se déplace rapidement, frappe en un éclair, bondit comme une fusée,... C'est un personnage agressif.

Avec lui, vous chercher toujours le contact. Il faut courir droit vers votre adversaire et le submerger d'attaques avant même qu'il est le temps de comprendre ce qui se passe. Bien sûr, il faudra varier vos approches pour ne pas être trop prévisible, heureusement vous avez toute une panoplie de mouvements pour ça.

Le moindre coup porté peu généralement ouvrir la porte à de grands combos, vous donnant un avantage incroyable. Cependant, ça requiert une grande précision manette en main, un débutant aura du mal à exploiter tout le potentiel de Sinbad.

L'avantage

Vous avez deux coups puissants qui couvre une large zone : votre tilt avant, et votre spécial neutre. Quand votre adversaire est hors de la plateforme, attendez-le sur le bord prêt à infliger le coup fatal. Vous pouvez aussi sauter dans la vide à sa poursuite, vous avez la mobilité qu'il faut pour aller lui porter une attaque aérienne et revenir sur la plateforme,... Et puis c'est tellement classe !

Le désavantage

Sinbad est le plus apte à revenir sur le terrain. Votre spécial haut vous propulse en l'air et frappe quiconque essaierait de vous bloquer la route. Vous pouvez aussi utiliser votre spécial avant, qui vous projette horizontalement pour revenir de très loin.

Le saviez-vous ? Votre spécial avant annule toute votre inertie. Donc si vous êtes éjectés très fort, il peut vous sauver la vie en vous stoppant net à la limite de l'écran. Tous les persos ont un coup avec cette propriété, il est utile de le connaitre pour ne pas perdre de vie prématurément.

Quelques combos

Facil : tilt bas -> special haut

LkusrOU.gif
Un petit combo en sortie de bouclier. La base pour punir un opposant qui aurait tapé dans votre bouclier.

Plus coriace : tilt avant -> courrir -> petit saut -> aerienne avant -> jab -> jab -> jab -> tilt avant

r73h0iy.gif
L'attaque aérienne avant frappe de loin et éjecte vers le bas. Associée au petit saut, c'est excellent pour les combos.

Playing Kiki

Stratégie générale

Kiki peut dessiner ses propres murs et plateformes. Elle est aussi un personnage puissant avec une grande portée, mais est particulièrement lente.

Elle excelle à jouer un jeu défensif. Vous cherchez sans cesse une faille dans le jeu de votre adversaire pour l'exploiter. Maintenir la bonne distance entre votre adversaire et vous est la clé du succès, vous voulez profiter de votre portée pour être en mesure de frapper sans vous mettre en danger. Le bouclier et les murs défensifs sont vos meilleurs alliés. Enfin, il y a aussi vos tilts, ils sont vraiment puissants.

Kiki est le personnage qui exploite le mieux la mécanique d'attaque glissée. C'est une mécanique propre à certaines attaques aériennes qui ne s'interrompent pas quand on touche le sol, mais provoque une glissade du personnage. Ça permet d'avancer tout en attaque, bien utilisé ça permet de couvrir beaucoup de terrain.

Rp3NKiq.gif
L'attaque aérienne bas de Kiki continue même après l'atterrissage.

Kiki est simple à comprendre, mais l'affronter peut nécessiter une certaine expérience. C'est souvent le personnage favori des débutants.

L'avantage

Vous pouvez abattre des adversaires qui n'ont subis que très peu de dégâts en plaçant vos plateformes pour leur bloquer le chemin. S'ils essayent de revenir par le bas, c'est particulièrement dévastateur comme technique.

ZvkbJjY.gif

Le désavantage

Vous voudrez toujours revenir en passant le plus haut possible. Votre faible mobilité vous handicap gravement si vous êtes en dessous de votre adversaire. Utilisez votre double saut très tôt, dessinez une plateforme sous vos pieds et vous récupérerez la possibilité de faire un double saut. Profitez-en pour passer loin au-dessus de votre adversaire.

Le coup spécial qui annule votre inertie est le spécial haut. Spammez-le si vous venez de prendre un coup puissant qui pourrait vous faire sortir de l'écran.

xV1RFzl.gif

Quelques combos

Kiki n'est pas orientée combos. Un coup bien placé est largement suffisant. Cependant, pour repousser un adversaire trop collant, il y a toujours jab -> jab -> tilt avant.

Jouer Pepper

Stratégie générale

Les coups de Peppers ont généralement plusieurs fonctions et récompensent la créativité. Capable de se téléporter et d'envoyer son adversaire dans toutes les directions, elle est une machine à combos, à condition d'avoir provoqué la bonne situation au bon moment.

Il faut prendre le temps de bien connaître Pepper avant de la maîtriser, mais dans les mains d'un joueur inventif, elle surprendra toujours.

L'avantage

Si vous avez placé votre chat, Carrot, en dehors de la plateforme, vous pouvez vous téléporter sur lui pour mettre la pression à votre adversaire. Quand vous vous téléportez directement sur l'autre joueur, vous l'éjectez vers le bas ce qui vous assure une victoire.

Votre spécial avant peut aussi rendre la vie difficile à votre rival, et ce que vous preniez le moindre risque.

Le désavantage

Si vous avez placé Carrot sur la plateforme, téléportez-vous dessus. C'est si simple.

Sinon, il vous reste votre spécial haut, qui peut être dirigé. HAUT+GAUCHE+B ira toujours vers la gauche. Si votre adversaire vous attend au bord, votre spécial avant pourra le déloger.

StRJ5JZ.gif
Rien de tel qu'un "giga laser" pour nettoyer, le balai ça sert à voler.

Quelques combos

Slam dunk : tilt bas -> saut -> aérienne avant -> chute rapide -> tilt bas -> spécial avant

OLfI5Wa.gif
La première partie du combo peut être refaite en boucle pour gagner du terrain.

Derrière toi ! : spéciale bas -> tilt avant -> téléportation

DjEHBHx.gif
Une utilisation audacieuse de la téléportation.

Un dernier mot

Ce guide effleure la surface de beaucoup d'aspects du jeu. Le lire ne suffira pas à faire de vous un champion, mais maintenant vous savez quoi regarder dans votre jeu et celui de vos adversaires pour trouver où vous améliorer.

S'améliorer requière de la pratique. Si vous manquez de joueurs pour vous entrainer, venez donc faire un tour sur le Discord de Super Tilt Bro. : https://discord.gg/qkxHkfx wink
avatar

96

JWOL

Salut !

J'ai fait peu d'updates ces temps-ci, car je préparais un gros coup… Faire éditer ce jeu !

Donc voilà, un platform-fighter sur NES, avec une puce Wi-Fi dans la cartouche et plein de détails faits à la main alors que des solutions éprouvées existent (cf le blog dans ce même topic), fait par des gens que vous connaissez : Antoine de Broke Studio au hardware, Julien (de Broke Studio aussi du coup maintenant) au support moral et a la communication, Margarita (dite Madame Dragon) aux illustrations et moi-même pour porter un béret et me prétendre Auteur de l'œuvre smile

Sans plus attendre, le lien que vous réclamez tous :


Et puis le trailer aussi, au cas où vous ne connaissiez pas le jeu que j'apporte à toutes vos conventions depuis 2018 (... si vous ne connaissez pas, il faudra qu'on parle ... *tapote du pied frénétiquement et croise les bras*)



tq0sfld-kickstarter-logo-green.png?ixlib=rb-2.1.0&s=0cce952d7b55823ff451a58887a0c578
avatar

97

La cryptographie moderne et la NES... Ça passe !

Ça faisait un bail que je n'avais pas écrit de devlog. Mais me revoilà, avec une sujet de crypto : La sécurité des comptes de jeu.

Super Tilt Bro., cest un jeu en ligne. On peut créer un compte pour participer au classement en ligne, c'est simple, il suffit d'entrer un login et mot de passe, puis... les défis techniques débarquent !

vZH6NoT.png
Toute la puissance du 8 bits sera nécessaire pour protéger ces identifiants !

Nous sommes en 2024, les hackers n'opèrent plus sur des Commodore 64 depuis longtemp, Super Tilt Bro. doit faire face aux menaces d'aujourd'hui. Dans cet article, nous allons plonger dans les profondeurs de la cyber-guerre en vous présentant comment vos mots de passe sont typiquement protégés, et les compromis fait dans Super Tilt Bro. Spoiler, SHA-256 est au cœur de tout cela, et son implémentation sur le CPU 6502 sera détaillée.

Comment protéger de votre mot de passe

Il existe de nombreuses façons de protéger les mots de passe. Le minimum de nos jours est de ne jamais laisser le mot de passe en clair sur le réseau et ne pas le stocker sur le serveur. Un site Web typique l'envoie via HTTPS, qui est un protocole crypté, et stocke un hash sur le serveur. Le hash, c'est de la magie noire : lorsque vous envoyez votre mot de passe, le serveur peut vérifier s'il est bon en le comparant au hash, mais avec juste le hash, personne ne peut retrouver votre mot de passe. En fin de compte, le mot de passe est protégé contre un hacker qui voit votre connexion internet grâce à HTTPS et aussi d'un hacker qui accède au serveur grâce aux hash.

lgs2EiD.png
C'est ainsi que les petits sites Web protègent vos données. Les gros peuvent utiliser des schémas plus complexes.

C'est cool, maintenant avec un CPU 8 bits et deux kilo-octets de RAM, peut-on vraiment faire tout ça ? Oui, et non. HTTPS en lui-même est assez intensif en CPU et plutôt tordu car il a évolué pendant 30 ans à s'adapter à différentes générations de chiffrement. Ce serait un mauvais choix pour notre chère NES. D'un autre côté, les algorithmes de hash modernes sont conçus pour les CPUs 32 bits mais sont très compacts et définitivement implémentables sur la console de Nintendo.

Mais avant de choisir une solution technique, nous devons comprendre ce que nous voulons protéger, et contre qui. Il n'y a pas de sécurité ultime, on doit choisir nos combats. Empêcher un joueur de se connecter au compte d'un autre est la première considération, mais Super Tilt Bro. est un petit jeu avec une communauté amicale, une sécurité simple devrait suffire. Notez que la communauté peut évoluer dans le futur, et les mesures anti vol de compte doivent avoir un moyen d'évoluer si nécessaire. Le deuxième point, et le plus important, est de protéger les mots de passe des joueurs contre le vol. Les gens réutilisent leurs mots de passe, c'est nul mais c'est comme ça. Si un hacker de 2024, avec son gros ordinateur qui a de Giga Hertz de puissance, regarde votre connexion internet ou accède au serveur, il ne doit pas pouvoir trouver votre mot de passe. Vous pourriez perdre plus que votre compte de jeu car je vous vois, je sais que vous utilisez le même mot de passe que sur yaronet et votre banque en ligne !

OK, le vol de compte et plus important, le vol de mot de passe sont nos priorités. En considérant que les joueurs ne vont pas jusqu'à écouter les connexions internet des autres ou pirater le serveur pour voler des comptes, la partie la plus importante est le hash. Protéger le mot de passe d'un hacker ne voyant que le hash, même s'il à accès à une puissance de calcul moderne. Pour atteindre ce niveau de protection, le jeu calcule lui-même le hash du mot de passe, salé par le login, puis il envoie ce hash au serveur pour obtenir un jeton de connexion. Le mot de passe lui-même ne quitte jamais la NES. Le jeton de connexion est un simple nombre qui peut être placé dans n'importe quel message et identifie la session connectée, évitant d'envoyer le hash dans chaque message, et simplifiant l'authentification du côté du serveur. L'algorithme de hash est notre principale défense contre les sombres armées du web, un algorithme de pointe est nécessaire, Super Tilt Bro. utilise SHA-256 qui est une référence et peut tourner correctement sur le CPU 6502.

FFTvXxs.png
Le protocole de connexion pour Super Tilt Bro.

D'autres alternatives existent, en voici quelques-unes, et la raison pour laquelle elles n'ont pas été choisies. La puce Wi-Fi aurait pu gérer HTTPS, partiellement, elle effectue le chiffrement mais pas l'authentification du serveur. Un défi aurait pu être utilisé au lieu d'envoyer le hash, cela aurait empêché un attaquant de se connecter en ne connaissant que le hash au prix d'un protocole de connexion un peu plus complexe, c'est certainement une amélioration à envisager si le vol de comptes devient un problème. L'authentification à deux facteurs, elle doit être ajoutée en parallèle du protocole de connexion, donc l'ajouter ne change rien aux choix faits ci-dessus.

L'algorithme de hash : SHA-256 et la NES

Les algorithmes de hash ont de nombreuses propriétés fascinantes. Celle qui nous intéresse dans notre cas est qu'il peut prendre des données quelconques et les transformer d'une manière telle qu'il n'est pas possible de revenir en arrière. En termes mathématiques, c'est une fonction `h` telle que `h(m) -> x` et aucun moyen de découvrir `m` en ne connaissant que `x`. Super Tilt Bro. place le login et le mot de passe en tant que `m` et ne transmet que `x` pour l'authentification.

SHA-256 opère sur des mots de 32 bits en big endian. Il a besoin de 8 variables stockant la valeur de hash finale, 64 constantes mathématiquement importantes, et un tableau de 64 mots variables dans lequel la plupart des opérations sont effectuées. Cela fait 136 mots, soit 544 octets, dont presque la moitié sont des constantes et peuvent être stockées en ROM. C'est une empreinte mémoire très faible selon les normes d'aujourd'hui, et cela s'intègre sans dificulté dans la petite RAM de la NES.

On commence par ajoutter du padding au message pour avoir au moins 64 octets de long, puis on le traite par chunks successifs de 64 octets. Chaque chunk subit 64 tours d'opérations pseudo-aléatoires, pour au final se retrouver avec une valeur ressemblant à du hasard dans les 8 variables qui compose le hash. Cela fait beaucoup d'itérations et plein d'opérations sur 32 bits, c'est une grosse tâche pour le CPU 6502. Heureusement, nous pouvons exploiter les spécificités de notre cas particulier pour alléger tout ça.

rHhFhWL.png
La manière dont SHA réduit votre message en bouillie.

D'abord, c'est OK d'être lent pour calculer le hash. Le calcul peut être réparti sur plusieurs frames car il est fait une seule fois, dans le menu de connexion. Ceci dit, on ne peut pas se permetre de prendre plusieurs secondes non plus. Le joueur ne doit pas remarquer que la connexion est lente juste à cause du calcul du hash. Une autre particularité permet quelques raccourcis : la taille du message est connue. Le login et le mot de passe ensemble font 32 octets, c'est moins qu'un chunk : nous connaissons donc à l'avance le padding et pouvons ne gérer qu'un seul chunk. Enfin, en utilisant un CPU 8 bits, nous ne sommes pas toujours dépendants de la nature big endian de SHA-256 et ... *Sourir maléfique*... nous pouvons apporter le chaos aux tables de variables et de constantes ! Je vous présente le "shuffle endian", c'est quand l'ordre des octets est l'oeuvre d'un esprit dérrangé.

Donc les tables qui font 64 mots de 32 bits en big endian, Super Tilt Bro. les réarrange en 4 tables de 64 octets. Chacune de ces tables contient un octet de chaque mot. Ça permet d'y accéder plus naturellement avec le mode d'adressage indexé absolu :

; Table K, les constantes ; Stocke 64 mots de 32 bits, ; k0 est une table du MSB de chaque mot ; k3 est une table du LSB de chaque mot k0: .byt $42, $71, $b5, $e9, $39, $59, $92, $ab .byt $d8, $12, $24, $55, $72, $80, $9b, $c1 .byt $e4, $ef, $0f, $24, $2d, $4a, $5c, $76 .byt $98, $a8, $b0, $bf, $c6, $d5, $06, $14 .byt $27, $2e, $4d, $53, $65, $76, $81, $92 .byt $a2, $a8, $c2, $c7, $d1, $d6, $f4, $10 .byt $19, $1e, $27, $34, $39, $4e, $5b, $68 .byt $74, $78, $84, $8c, $90, $a4, $be, $c6 k1: .byt $8a, $37, $c0, $b5, $56, $f1, $3f, $1c .byt $07, $83, $31, $0c, $be, $de, $dc, $9b .byt $9b, $be, $c1, $0c, $e9, $74, $b0, $f9 .byt $3e, $31, $03, $59, $e0, $a7, $ca, $29 .byt $b7, $1b, $2c, $38, $0a, $6a, $c2, $72 .byt $bf, $1a, $4b, $6c, $92, $99, $0e, $6a .byt $a4, $37, $48, $b0, $1c, $d8, $9c, $2e .byt $8f, $a5, $c8, $c7, $be, $50, $f9, $71 k2: [...] ; 64 autres octets k3: [...] ; 64 autres octets ; Maintenant, nous pouvons facilement accéder à tous les octets de n'importe quel mot avec un adressage indexé absolu ldx #5 lda k0, x ; Équivalent en C : k[5] >> 24 lda k1, x ; Équivalent en C : (k[5] >> 16) & 0xff lda k2, x ; Équivalent en C : (k[5] >> 8) & 0xff lda k3, x ; Équivalent en C : k[5] & 0xff ; En soi, ça n'a pas un grand impact sur les performances, avec une organisation plus traditionelle ; une fois que X est correctement positionné, les octets du mot peuvent être accédées grâce à une addition sur l'adresse ; "lda k+0, x", "lda k+1, x", ... ; Mais SHA-256 nécessite beaucoup de bouclages et de calculs d'index, avoir une valeur naturelle dans le registre simplifie ; l'indexation d'un algorithme par ailleurs complexe.
Cette implémentation de SHA-256 n'a pas été benchmarkée, mais la connexion semble instantanée donc pas besoin d'optimiser davantage. Si les performances ont été bonnes dés le premier essai, ce n'était pas le cas du résultat obtenu. Le problème quand le resultat du hash n'est pas correct c'est qu'on a peu d'idée sur où on s'est trompé. Pour investiguer étape par étape, j'ai ré-implémenté le même code en C et comparé le résultat de chaque itération avec l'équivalent en assembleur. Un peu fastidieu mais efficace. Comme on ne veut absolument pas de régression, un test unitaire et un test du fuzzing ont étés ajoutés, exerçant la routine SHA-256 grâce à un interpreteur maison.

Conclusion

Super Tilt Bro. utilise de la cryptographie moderne pour protéger votre mot de passe. [b]Ne croyez pas que ça suffise ![/b] Des erreurs peuvent s'être glissées et ce n'est qu'un jeu, ne lui faites pas confiance pour protéger un mot de passe précieux. Quoi qu'il en soit, [b]c'était amusant d'implémenter le SHA-256 sur la NES ![/b]

Si vous voulez vous enfoncer plus loin au pays des hash, vous pouvez suivre ces liens :

L'article de Wikipédia sur SHA-2 propose un excellent pseudocode pour l'implémentation de SHA-256 :
SHA-2 - Wikipediaen.wikipedia.org

Un autre homme à pavé le chemin avant moi, cet article a été mon point de départ : https://bumbershootsoft.wordpress.com/2019/04/24/implementing-sha-256-on-the-6502/
L'implémentation de SHA-256 de Super Tilt Bro., elle est réutilisable et même extensible pour gérer plusieurs chunks : https://github.com/sgadrat/super-tilt-bro/blob/713cae919834535b0c756973c33e2ea2e56bb64a/game/logic/sha.asm
avatar

98

Je suis admiratif par la qualité d'écriture et tu travail fourni : respect ! (bon ok, je n'ai pas tout compris, mais cela m’éclaire sur certains points).

Conclusion : B R A V O ! smile

99

Merci calin

J'ai essayé de rester raisonable dans la première partie, par contre la seconde je me suis lâché sur les détails techniques grin

Et je viens d'ajouter le gras sur quelques phrases pour aider la lecture de travers.
avatar

100

Et merci de mettre des schémas aussi haha
Ça aide pas mal à suivre smile
avatar
@originalfei
Homebrews Connexion
In pixels we trust.
ORE WO DARE DA TO OMOTTE YAGARU !