/*
 * This is the source code of Telegram for Android v. 3.x.x.
 * It is licensed under GNU GPL v. 2 or later.
 * You should have received a copy of the license in this archive (see LICENSE).
 *
 * Copyright Nikolai Kudashov, 2013-2017.
 */

package org.telegram.messenger;

import org.telegram.tgnet.SerializedData;

public class MessageKeyData {

    public byte[] aesKey;
    public byte[] aesIv;

    public static MessageKeyData generateMessageKeyData(byte[] authKey, byte[] messageKey, boolean incoming, int version) {
        MessageKeyData keyData = new MessageKeyData();
        if (authKey == null || authKey.length == 0) {
            keyData.aesIv = null;
            keyData.aesKey = null;
            return keyData;
        }

        int x = incoming ? 8 : 0;

        switch (version) {
            case 2: {
                SerializedData data = new SerializedData();
                data.writeBytes(messageKey, 0, 16);
                data.writeBytes(authKey, x, 36);
                byte[] sha256_a = Utilities.computeSHA256(data.toByteArray());
                data.cleanup();

                data = new SerializedData();
                data.writeBytes(authKey, 40 + x, 36);
                data.writeBytes(messageKey, 0, 16);
                byte[] sha256_b = Utilities.computeSHA256(data.toByteArray());
                data.cleanup();

                data = new SerializedData();
                data.writeBytes(sha256_a, 0, 8);
                data.writeBytes(sha256_b, 8, 16);
                data.writeBytes(sha256_a, 24, 8);
                keyData.aesKey = data.toByteArray();
                data.cleanup();

                data = new SerializedData();
                data.writeBytes(sha256_b, 0, 8);
                data.writeBytes(sha256_a, 8, 16);
                data.writeBytes(sha256_b, 24, 8);
                keyData.aesIv = data.toByteArray();
                data.cleanup();
                break;
            }
            case 1: {
                SerializedData data = new SerializedData();
                data.writeBytes(messageKey);
                data.writeBytes(authKey, x, 32);
                byte[] sha1_a = Utilities.computeSHA1(data.toByteArray());
                data.cleanup();

                data = new SerializedData();
                data.writeBytes(authKey, 32 + x, 16);
                data.writeBytes(messageKey);
                data.writeBytes(authKey, 48 + x, 16);
                byte[] sha1_b = Utilities.computeSHA1(data.toByteArray());
                data.cleanup();

                data = new SerializedData();
                data.writeBytes(authKey, 64 + x, 32);
                data.writeBytes(messageKey);
                byte[] sha1_c = Utilities.computeSHA1(data.toByteArray());
                data.cleanup();

                data = new SerializedData();
                data.writeBytes(messageKey);
                data.writeBytes(authKey, 96 + x, 32);
                byte[] sha1_d = Utilities.computeSHA1(data.toByteArray());
                data.cleanup();

                data = new SerializedData();
                data.writeBytes(sha1_a, 0, 8);
                data.writeBytes(sha1_b, 8, 12);
                data.writeBytes(sha1_c, 4, 12);
                keyData.aesKey = data.toByteArray();
                data.cleanup();

                data = new SerializedData();
                data.writeBytes(sha1_a, 8, 12);
                data.writeBytes(sha1_b, 0, 8);
                data.writeBytes(sha1_c, 16, 4);
                data.writeBytes(sha1_d, 0, 8);
                keyData.aesIv = data.toByteArray();
                data.cleanup();
                break;
            }
        }
        return keyData;
    }
}
