The reason for rolling our own is simply because we could, it also keeps the coding skills fresh. Once side potentially beneficial side effect is that it does remove the dependency for OpenSSL. However that being said as the code base increases, it will most likely be the first to go
The AES keys are obfuscated through additional encryption. The database entry structure has two components
1. a hash for the username, a hash for the Public UID (ie. fixed) portion of the Yubikey, a hash for second factor password (not yet implemented but still catered for)
2. an encrypted substructure including
a.the AES key
b. a hash of the Private UID
c variables to store the last seen counters and timestamps
The key is formed from a SHA256 hash from concatenation of the public UID, second factor password and the username, which is used to AES CBC encrypt the structure. Obviously we didn't want to be storing the Yubikey AES keys in the clear and this was the strongest and simplest method we came up with. It is not unbreakable but is highly improbably given that you will have to reverse all the lookup hashes in order to decrypt the substructure containing the AES key.
Hopefully that makes sense. Let me know if you need more information. Later releases will include some more detailed documentation on the database structure.
Alternatively if you see any glaring holes in this method I am very keen to know and fix