mirror of https://github.com/NekoX-Dev/NekoX.git
103 lines
3.6 KiB
Java
103 lines
3.6 KiB
Java
/*
|
|
* This is the source code of Telegram for Android v. 5.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-2018.
|
|
*/
|
|
|
|
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;
|
|
}
|
|
}
|