Tom's Data Onion
tomdalling.com
tomdalling.com
The trickiest part was the AES layer. I had to reach for the C FFI to use OpenSSL for decoding. And it took longer than expected to search instructions for key unwrapping.
Full solution[2] runs in under 20ms on two decade old Intel Xeon, which says more about Nim's performance than my coding skills.