canmove, Confirmed users
725
edits
Line 249: | Line 249: | ||
= Payload: crypto/keys = | = Payload: crypto/keys = | ||
In storage | In storage Version 4, the public/private key layer has been dropped. All bulk keys are now stored in this one WBO. Encryption and HMAC keys are separate keys and kept in key pairs. | ||
The '''keys''' WBO is encrypted and verified just like any other WBO, except a different key bundle is used. The key bundle for the '''keys''' WBO is derived from the Sync Key using an HKDF with HMAC-SHA256 as the HMAC function (see [http://tools.ietf.org/html/rfc5869 RFC 5869]): | |||
Pseudo-code: | |||
HMAC_INPUT = "Sync-AES_256_CBC-HMAC256" | |||
encryption_key = HMAC-SHA256(sync_key, "" + HMAC_INPUT + username + "\x01") | |||
hmac_key = HMAC-SHA256(sync_key, encryption_key + HMAC_INPUT + username + "\x02") | |||
Here '''sync_key''' is the 16 byte representation of the Sync Key. To translate between the byte and user-readable translation, base32 is used, although with a slightly different alphabet than what [http://tools.ietf.org/html/rfc4648 RFC 4648] uses. For readability reasons, 'l' has been replaced with '8' and 'o' with '9': | |||
sync_key = decodeBase32(sync_key_ui.replace('8', 'l').replace('9', 'o')) | |||
sync_key_ui = encodeBase32(sync_key).replace('l', '8').replace('o', '8)) | |||
== Version 4 == | == Version 4 == | ||
Line 266: | Line 280: | ||
| Currently defaulting to "crypto" | | Currently defaulting to "crypto" | ||
|} | |} | ||
=== Example === | |||
{"id":"keys", | |||
"collection":"crypto", | |||
"collections":{}, | |||
"default:['dGhlc2UtYXJlLWV4YWN0bHktMzItY2hhcmFjdGVycy4=', | |||
'eWV0LWFub3RoZXItc2V0LW9mLTMyLWNoYXJhY3RlcnM=']} | |||
= Payload: keys/pubkey = | = Payload: keys/pubkey = |