Eric Biggers writes: > I've also written a scalar ChaCha20 implementation (no NEON instructions!) that > is 12.2 cpb on one block at a time on Cortex-A7, taking advantage of the free > rotates; that would be useful for the single permutation used to compute > XChaCha's subkey, and also for the ends of messages. This is also how ends of messages are handled in the 2012 implementation crypto_stream/salsa20/armneon6 (see "mainloop1") inside the SUPERCOP benchmarking framework: https://bench.cr.yp.to/supercop.html This code is marginally different from Eric's new code because the occasional loads and stores are scheduled for the Cortex-A8 rather than the Cortex-A7, and because it's Salsa20 rather than ChaCha20. The bigger picture is that there are 63 implementations of Salsa20 and ChaCha20 in SUPERCOP from 10 authors showing various implementation techniques, including all the techniques that have been mentioned in this thread; and centralized benchmarks on (e.g.) https://bench.cr.yp.to/results-stream.html#amd64-kizomba https://bench.cr.yp.to/web-impl/amd64-kizomba-crypto_stream-salsa20.html showing what's fastest on various platforms, using well-developed benchmarking tools that produce repeatable, meaningful measurements. There are also various papers explaining the main techniques. Of course it's possible that new code will do better, especially on platforms with different performance characteristics from the platforms previously targeted. Contributing new implementations to SUPERCOP is easy---which is why SUPERCOP already has thousands of implementations of hundreds of cryptographic functions---and is a more effective way to advertise speedups than adding code merely to (e.g.) the Linux kernel. Infrastructure is centralized in SUPERCOP to minimize per-implementation work. There's no risk of being rejected on the basis of cryptographic concerns (MD5, Speck, and RSA-512 are included in the benchmarks) or code-style concerns. Users can then decide which implementations best meet their requirements. "Do better" seems to be what's happened for the Cortex-A7. The best SUPERCOP speeds (from code targeting the Cortex-A8 etc.) are 13.42 cycles/byte for 4096 bytes for ChaCha20; 12.2, 11.9, and 11.3 sound noticeably better. The Cortex-A7 is an interesting case because it's simultaneously (1) widely deployed---more than a billion units sold--- but (2) poorly documented. If you want to know, e.g., which instructions can dual-issue with loads/FPU moves/..., then you won't be able to find anything from ARM giving the answer. I've started building an automated tool to compute the full CPU pipeline structure from benchmarks, but this isn't ready yet. ---Dan