When we started work, I used this blog to identify and determine how sync was using expecting it's clients to implement cryptography.
However some issues come along with not understanding cryptography and having never had to use it before, Sync updated and simplified their model in 1.6 and only today with a lot of help from moznet's #sync channel I got a usable understanding of the implementation. Here goes it:
Decrypting the Sync JSON:
There are a few assumptions in you should expect to handle Sync's data.
All of the keys are symmetric which means, one key that can perform both encryption and decryption. These keys are 256 Bit AESKeys used in a mode that requires Initialization Vectors.
Additionally all of Sync's keys have a paired hmac and this is used to verify what you're decrypting is what was encrypted so you should verify each object before decrypting it.
And lastly all JSON received from the server is Base64 encoded and needs to be decoded to be used.
- Generate the decryption key's bytes and its hmac bytes from the account's sync key
- Create a 256 bit AES Key from the bytes in step 1, along with the Initialization Vector on the crypto/keys object
- Decrypt the crypto/keys cipher with the key made in step 2. This reveals a base64 encoded key and hmac pair
- Assuming you have a users tab collection object (from a previous post), use the key bytes from step 3. and the specific tab object's Initialization Vector to create another 256 bit AES Key
- Decrypt the tab objects payload with the key made in step 4.