J'ai finalement implémenté l'algorithme keccak complet toujours en C99, le code se trouve ici.
Le principe général est de toujours travailler avec des entiers 64 bits pour la matrice contenant l'état interne et pour le découpage des données en entrée et en sortie.
Dans la fonction de permutation, il est donc nécessaire d'appliquer un masque binaire dépendant du nombre de bits significatifs (2^l) sur le résultat des calculs, notamment lors des rotations afin que les calculs ne soient pas faussés.
Pour la fonction éponge, la difficulté principale a été de gérer les cas ou la vitesse de production (r) n'est pas alignée sur 64 bits. C'est là qu'il a fallu un peu "cuisiner" les données à coup de décalages à gauche ou à droite, le remplissage d'un mot de l'état interne en entrée, ou du condensat en sortie se faisant alors en 2 étapes.
Le module spécifique sha3 a été conservé afin de pouvoir comparer les performances avec le module keccak sur les fonctions communes de génération de condensat au standard SHA-3, le code spécifique est environ 25% plus rapide.
Il y a un programme de tests pour chaque module: keccac_test et sha3_test. Comme dans la version précédente, il y a 2 paramètres à saisir sur l'entrée standard: le nombre de cycles de test et le flag d'affichage des résultats (0/1).
Ils intègrent tous les différents cas que j'ai testé, dont ceux fournis par Dominus Carnufex, ouf tous les résultats concordent j'étais loin d'en être certain jusqu'à mon test complet hier
Le code peut être compilé sous Linux ou Windows indifféremment, les makefiles et solutions Visual C++ 2010 sont incluses dans le dépôt github.