Comme promis je poste ma solution développée en C99 pour ce défi, elle se limite au standard SHA-3 (w = 64), tout en gérant toutes les longueurs de hash autorisées (de 32 bits à 768 bits si j'ai bien compté).
La partie ou j'ai eu le plus de difficulté est le padding, je trouve il n'est pas évident en C de prévoir tous les cas.
Concernant l'optimisation, j'ai rangé dans des tableaux tous les résultats de calculs pouvant l'être particulièrement dans la fonction de permutation (indices de tableaux modulo 5, calcul du 2x+3y).
Le type uint64_t est utilisé afin d'être certain de travailler toujours avec le bon w quelque soit la plateforme.
La solution comprend un programme de test où j'ai laissé tous les cas que j'ai vérifié, notamment ceux du lien fourni par Berdes, que je remercie et félicite pour sa solution complète au passage
Concernant les performances, j'ai pu tester sur mon PC windows 32 bits et sur un serveur Linux 64 bits. Sans surprise le programme est plus rapide sur la machine 64 bits : 100,000 itérations de mon programme de test (ce qui correspond à 5,000,000 de condensats générés) prennent 100 secondes en 32 bits, 40 secondes en 64 bits (sans affichage). La machine 32 bits étant plus puissante on peut considérer que le programme s'exécute environ 3 fois plus rapidement en 64 bits.
Voilà si vous avez besoin d'éclaircissement n'hésitez pas, je ne sais pas si j'irai plus loin en implémentant le keccak complet, je trouve que commencer par le SHA-3 uniquement est un bon moyen de comprendre le fonctionnement de l'algorithme dans un 1er temps, sans trop s'embêter avec la "cuisine de bits" sans doute nécessaire pour gérer toutes les longueurs, au moins en C.
EDIT: le résultat de l'exécution du programme de test ci-dessous, le programme demande 2 paramètres sur l'entrée standard:
sha3_224(input, 0) = 0x6b4e03423667dbb73b6e15454f0eb1abd4597f9a1b078e3f5b5a6bc7
sha3_256(input, 0) = 0xa7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a
sha3_384(input, 0) = 0x0c63a75b845e4f7d01107d852e4c2485c51a50aaaa94fc61995e71bbee983a2ac3713831264adb47fb6bd1e058d5f004
sha3_512(input, 0) = 0xa69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26
sha3_224(input, 5) = 0xffbad5da96bad71789330206dc6768ecaeb1b32dca6b3301489674ab
sha3_256(input, 5) = 0x7b0047cf5a456882363cbf0fb05322cf65f4b7059a46365e830132e3b5d957af
sha3_384(input, 5) = 0x737c9b491885e9bf7428e792741a7bf8dca9653471c3e148473f2c236b6a0a6455eb1dce9f779b4b6b237fef171b1c64
sha3_512(input, 5) = 0xa13e01494114c09800622a70288c432121ce70039d753cadd2e006e4d961cb27544c1481e5814bdceb53be6733d5e099795e5e81918addb058e22a9f24883f37
sha3_224(input, 30) = 0xd666a514cc9dba25ac1ba69ed3930460deaac9851b5f0baab007df3b
sha3_256(input, 30) = 0xc8242fef409e5ae9d1f1c857ae4dc624b92b19809f62aa8c07411c54a078b1d0
sha3_384(input, 30) = 0x955b4dd1be03261bd76f807a7efd432435c417362811b8a50c564e7ee9585e1ac7626dde2fdc030f876196ea267f08c3
sha3_512(input, 30) = 0x9834c05a11e1c5d3da9c740e1c106d9e590a0e530b6f6aaa7830525d075ca5db1bd8a6aa981a28613ac334934a01823cd45f45e49b6d7e6917f2f16778067bab
sha3_224(input, 1600) = 0x9376816aba503f72f96ce7eb65ac095deee3be4bf9bbc2a1cb7e11e0
sha3_256(input, 1600) = 0x79f38adec5c20307a98ef76e8324afbfd46cfd81b22e3973c65fa1bd9de31787
sha3_384(input, 1600) = 0x1881de2ca7e41ef95dc4732b8f5f002b189cc1e42b74168ed1732649ce1dbcdd76197a31fd55ee989f2d7050dd473e8f
sha3_512(input, 1600) = 0xe76dfad22084a8b1467fcf2ffa58361bec7628edf5f3fdc0e4805dc48caeeca81b7c13c30adf52a3659584739a2df46be589c51ca1a4a8416df6545a1ce8ba00
sha3_224(input, 1605) = 0x22d2f7bb0b173fd8c19686f9173166e3ee62738047d7eadd69efb228
sha3_256(input, 1605) = 0x81ee769bed0950862b1ddded2e84aaa6ab7bfdd3ceaa471be31163d40336363c
sha3_384(input, 1605) = 0xa31fdbd8d576551c21fb1191b54bda65b6c5fe97f0f4a69103424b43f7fdb835979fdbeae8b3fe16cb82e587381eb624
sha3_512(input, 1605) = 0xfc4a167ccb31a937d698fde82b04348c9539b28f0c9d3b4505709c03812350e4990e9622974f6e575c47861c0d2e638ccfc2023c365bb60a93f528550698786b
sha3_224(input, 1630) = 0x4e907bb1057861f200a599e9d4f85b02d88453bf5b8ace9ac589134c
sha3_256(input, 1630) = 0x52860aa301214c610d922a6b6cab981ccd06012e54ef689d744021e738b9ed20
sha3_384(input, 1630) = 0x3485d3b280bd384cf4a777844e94678173055d1cbc40c7c2c3833d9ef12345172d6fcd31923bb8795ac81847d3d8855c
sha3_512(input, 1630) = 0xcf9a30ac1f1f6ac0916f9fef1919c595debe2ee80c85421210fdf05f1c6af73aa9cac881d0f91db6d034a2bbadc1cf7fbcb2ecfa9d191d3a5016fb3fad8709c9
sha3_224(input144bytes, 1148) = 0x0d25fb038b41fe5ded2a50fdc623b26361fba33752d49e0beab61df3
sha3_224(input144bytes, 1149) = 0x7f35642872c1cd78349cefa3586dc6fb879501b53498a3f4af87ddc6
sha3(input15bytes, 120, 32) = 0x03b2d62a
sha3(input15bytes, 120, 64) = 0xa832b05580742996
sha3(input15bytes, 120, 96) = 0xd13dfca55b13ea2ea2665bff
sha3(input15bytes, 120, 128) = 0x4468f971d0f8f5773ff120e8482975dd
sha3(input15bytes, 120, 160) = 0xc5cadd7bceaacaa8f321632f94852901e02dd62b
sha3(input15bytes, 120, 192) = 0x48d0ae3096d818d8c204a74718724ef30e1ca61197e8d02e
sha3(input15bytes, 120, 224) = 0x3c8cfdf64a7db27d94c6d10065a183adc6357cdeed44b5280257bf2a
sha3(input15bytes, 120, 256) = 0xc992f4822cb6f934a17332bfb4611d4ada61b918346fa3e36fe373c40267d88d
sha3(input15bytes, 120, 288) = 0x5dcbcf3a2cefa21b21ae737ad6aa60321f9e7aa176e3910706c28405440d97e96bf3082a
sha3(input15bytes, 120, 320) = 0x43c9a4d2e7dde13271de29090900a9c60f148492395711b52d80867b8f77223e3defb4db7e1b2557
sha3(input15bytes, 120, 352) =
0xabdaf7731527a720731a42fbdf45ff80efa102030e7ac5a0ab7b506b9a64b4b8ea1b5e58a2cb59ebc36432c5
sha3(input15bytes, 120, 384) = 0x88e0ae21aa176bcc5c368b7157ba3e414d9ab7498e3004d383eac02ab0532028cca3d65de1892fecde09825c22c2acd2
sha3(input15bytes, 120, 416) = 0x6f4c7be624393c505de40a5e950d3b76fb5c29ff1f9ebdff3d1b4b14daf60093cfdb3d0cfabcadbc35b9a9c44807e9ca55cb7199
sha3(input15bytes, 120, 448) = 0x3ee18af7628289c8ea26e7d295f895465672201e4953180419c65f3a89c606d642ec9f3f54d8a75e4357cf74a62bd7ba9080454ec121a971
sha3(input15bytes, 120, 480) = 0x0b11119ff41b9bb8fecb0df4b40527b4358209844ca04a79903291ce488ffaecc3fedca2a2d3c06d97eb6820c1386c4305835e9cc8bad9f34056feb0
sha3(input15bytes, 120, 512) = 0x05c93a31acc7eb849b99df7ea3d28fcfbe4e18b3b3ef32c83c17244467e5f74d75746ece424e6df0e9f27af3874a449f6321a39f99d7c2ac707870fca1f2bf4a
sha3(input15bytes, 120, 544) = 0x68e26d4edb8ce51e7da3a6b9d8d0efb7ca09009de7af8a870e7eaf5df6396709bac285c3a3fd210bdd3eeb3c15289f8c05a048d8a36c1c2c0c065c0363e5d6b61b1df851
sha3(input15bytes, 120, 576) = 0x7266f94c245c82391eea15c0a3664f450070cabf05eeb739da50d42e51da1d6236a727f33d4ac1311b9ee9cf7eb3a05ca82f183cc866db132d155f728cc948d25181e93aec9a15cc
sha3(input15bytes, 120, 608) = 0x6247b5f8c9b51c023ea1d87eb4dc3955b48cc0d579c1edd8b9eb946b803cee7544ab7f0e92165d6be84940d7b3cec5d3e80c9aa32934dc3f6df1685f79b9e50e4a653eee6d9a41a3848ce967
sha3(input15bytes, 120, 640) = 0x9b2f1c62834cb2233cc5797a2bc2a2e2f022e3333c7e0622c0ca02b0b6670f66a32af30a3c23b809a7cc2e09bdd2f4110e3f942764d7006c642fc0cca61b79ecf13dd28d6c3f6f6870397e7ecb6b7903
sha3(input15bytes, 120, 672) = 0xc4ff3f065edc3febb0775d3122df345390e220ffc9fb359d3d4071fa34613305e6a463bbf4561acab9e3abeef4c4c7ce3fa6eccc31d24bf5674f523a18e1125c47094fb3fab8d89b97a407d660ad214f3a55a20f
sha3(input15bytes, 120, 704) = 0xa4e634309c57582cc0b3b8d32f240f5217d693f4576bbd246da5ca461f1aec1211368f7fcaaf9c908344ac120b0ee7dca5f56960ce3d54c490643e95622f221a1a362113836848c25f5297069804e914a3b6d90239f3857c
sha3(input15bytes, 120, 736) = 0x25b7b2a599ea89788c2407ced05eef87edb0edd2645e390446c8ea21729d2d02f3543fe573227fc6e9615e081c0314d10b72e3dead9769ff2f2be1f703cd5a004c77c5f330716379ed041b5ecca50d6c86c69a93b36b76b6b2903bda
sha3(input15bytes, 120, 768) = 0xfa1c060700736e74a02b4a5c3bc8f2a10c3cf96e99f3532f828c217a63e4b98429ebe653665d6e7fa2b9aff7aed86e2d93795367be0acbb9d4de4744948371250c9867b34db43839745b9360ede95605b55f200b5e4ebfc3d744b2d200129d83