I've been working pretty hard in my free time to expand the range of platforms and architectures supported by my crypto library. I have quite a lot of work at uni (assignments and everything) so I can only work on it for short periods of time, but work is getting done (slowly). Currently the library works under:
- any Windows operating system, using MinGW (that's both 32-bit and 64-bit)
- any Linux and BSD flavour, under the following processor architectures:
* x86 (32-bit intel/amd)
* x86_64 (64-bit intel/amd)
* 32-bit PowerPC
* ARMv5 (or at least one model of it)
This was achieved through a lot of VM testing, mostly using QEMU. The goal is basically to get a variety of architectures working in order to finalize the design of the platform-selection preprocessor code (to make sure it is flexible enough to handle even very unusual hardware) before moving into the "inflationary stage" where more features (algorithms and everything) will be very quickly added into the framework.
I am considering setting up a permanent "testing box" hosting a large number of VM's and giving me SSH access to every platform I need, so that I can just write a script to let me test them all at once (and, if needed, debug remotely) which would certainly be a big help, but I haven't really thought of that more in detail just yet.
The PowerPC implementation in particular gave me pause. Until that point I had only been using little-endian architectures, so while I had done my best to make my code endian-neutral, I expected to have to fix some things. Overall it wasn't too bad at all, with only a couple mistakes, however one algorithm in particular (the Skein-256 hash function) had me reading its specification over again to work out precisely what endianness convention it was using. This took me a few hours, since my original implementation wasn't exactly very elegant, but in the end I finally got everything working!
As for Mac support, well, it's been dropped for the moment. I can't get an OS-X VM working (seems they've gone out of their way to make it hard to virtualize their hardware) and I am not willing to purchase any Apple hardware just to work on it for a few minutes, and of course there are no OS-X computers at uni that I could use, so it'll have to wait (if anyone using OS-X wants to give building the library a try, I'd be very grateful). But I don't suspect it would really be very hard, given that Mac is essentially an Unix-based operating system, and the only thing missing will be the preprocessor code necessary to detect the operating system. In other words, I expect it to work out of the box. But of course I can't test that assumption
In any case, I am pretty happy right now, the library is stable and I think my goal of making it flexible enough to easily support adding and removing entire modules has been satisfactorily met. To conclude, here's a comparison between an overview of the library about a month ago (top) and the library as of today (bottom). I've broken down some of the headers to make them more manageable, and now you can really start to see its modular nature, as well as any clear dependencies between each part of the library. Software design is kind of fun!
I might make a little video eventually showing the evolution of the library's architecture over time, should be quite interesting to watch actually.
So, yeah, that's what I've been working on and off for the past year or so, and I'm hoping I'll be able to release a finished product by the end of 2013. The library is more or less usable at the moment, but there aren't too many features available so far, due to work needing to be done on the framework (the "glue" holding every part of the library together) before. But as I mentioned previously, this refactoring that's been going on for over two months is almost finished, so the real fun can begin soon.
And on that note, good night