┌──► passwordResetToken ──────────┐ ┌──────┐ │ │ password email─────►SHA512│ ┌────┐ │ │ │ └──┬───┘ │HKDF├──┤ ┌───────────────────────┼───────────────┬────────┐ │ │ └──▲─┘ │ │ │ │ │ ┌┴────────┐(salt) │ │ └──► indexKey───────────────┐ │ │ │PBKDF2 ◄───────┘ │ │ │ │ └─┬───────┘ │ ┌──────────────┐ │ │ │ │ mainKey ◄──────┤ SecureRandom │ └─────┼───────────────────┐ │ │ │ └──────────────┘ │ │ │ │ │ ┌──▼───┐ │ │ │ ┌───▼────┐ ┌──────────────────────│BCRYPT│ │ │ │ ┌► encryptionKey──►│AES-GCM ├──────┼──► wrappedMainKey └──┬───┘ │ │ ▼ ┌────┐ │ (secret) └────────┘ │ │ │ │ │ passwordKey ─►│HKDF├─┤ │ hashedResetToken◄────┘ │ │ │ └────┘ │ ┌──────┐ │ │ │ └► authToken──────────────────►│BCRYPT├─►hashedAuthToken │ │ │ (password) └──────┘ │ │ │ ┌──┼──► *wrappedCollectionKeys │ │ │ ┌─────────┘ │ │ │ │ │ │ ┌► *wrappedMediaKey │ │ │ ┌─────────┼────────────┼─┘ │ │ │ │ │ │ *wrappedSearchLabelKeys│ │ │ │ │ │ │ │ │ │ │ └───zeitkapsl-server────────┘ │ │ │ │ ┌─────────────────────┐ │ │ │ │ │ Collection │ │ │ │ ┌───┴───┐ │ │ ┌─────────────┐ │ │ │ │AES-GCM│◄───┼────collectionKey◄───┼─────┤SecureRandom │ │ │ │ └───▲───┘ │ │ │ └───┬─────────┘ │ │ │ │ │ │ │ │ │ │ │ │(secret)└──────────┼──────────┘ │ │ │ │ │ │ │ │ │ │ └───────────────────┼────────────────────┼─────────────────┘ │ │ (secret)│ │ │ │ ┌───▼───┐ ▼ │ └─────────────────────────┤AES-GCM│◄───────────*mediaKey ◄────────────────┘ └───────┘ │ │ ┌────────────────────┐ │ │Image │ │ │ │ ┌─────────┐ (secret) │ │ |\__/,| (`\ │◄──────────┤ AES-GCM │◄──────────────┘ │ |_ _ |.--.) ) │ └─────▲───┘ │ ( T ) / │ │ │ (((^_(((/(((_/ │ │ encrypted Image └────────────────────┘ ┌───┴─────────────┐ │01010110010010101│ │11110101010100100│ │11110010101010001│ │10100001000100011│ │11111110000000000│ └─────────────────┘