TLSharp/TLSharp.Core/Utils/Helpers.cs
2017-04-13 13:38:01 +07:00

96 lines
3.3 KiB
C#

using System;
using System.Security.Cryptography;
using TLSharp.Core.MTProto.Crypto;
namespace TLSharp.Core.Utils
{
public class Helpers
{
private static readonly Random random = new Random();
public static ulong GenerateRandomUlong()
{
var rand = ((ulong) random.Next() << 32) | (ulong) random.Next();
return rand;
}
public static long GenerateRandomLong()
{
var rand = ((long) random.Next() << 32) | random.Next();
return rand;
}
public static byte[] GenerateRandomBytes(int num)
{
var data = new byte[num];
random.NextBytes(data);
return data;
}
public static AESKeyData CalcKey(byte[] sharedKey, byte[] msgKey, bool client)
{
var x = client ? 0 : 8;
var buffer = new byte[48];
Array.Copy(msgKey, 0, buffer, 0, 16); // buffer[0:16] = msgKey
Array.Copy(sharedKey, x, buffer, 16, 32); // buffer[16:48] = authKey[x:x+32]
var sha1a = sha1(buffer); // sha1a = sha1(buffer)
Array.Copy(sharedKey, 32 + x, buffer, 0, 16); // buffer[0:16] = authKey[x+32:x+48]
Array.Copy(msgKey, 0, buffer, 16, 16); // buffer[16:32] = msgKey
Array.Copy(sharedKey, 48 + x, buffer, 32, 16); // buffer[32:48] = authKey[x+48:x+64]
var sha1b = sha1(buffer); // sha1b = sha1(buffer)
Array.Copy(sharedKey, 64 + x, buffer, 0, 32); // buffer[0:32] = authKey[x+64:x+96]
Array.Copy(msgKey, 0, buffer, 32, 16); // buffer[32:48] = msgKey
var sha1c = sha1(buffer); // sha1c = sha1(buffer)
Array.Copy(msgKey, 0, buffer, 0, 16); // buffer[0:16] = msgKey
Array.Copy(sharedKey, 96 + x, buffer, 16, 32); // buffer[16:48] = authKey[x+96:x+128]
var sha1d = sha1(buffer); // sha1d = sha1(buffer)
var key = new byte[32]; // key = sha1a[0:8] + sha1b[8:20] + sha1c[4:16]
Array.Copy(sha1a, 0, key, 0, 8);
Array.Copy(sha1b, 8, key, 8, 12);
Array.Copy(sha1c, 4, key, 20, 12);
var iv = new byte[32]; // iv = sha1a[8:20] + sha1b[0:8] + sha1c[16:20] + sha1d[0:8]
Array.Copy(sha1a, 8, iv, 0, 12);
Array.Copy(sha1b, 0, iv, 12, 8);
Array.Copy(sha1c, 16, iv, 20, 4);
Array.Copy(sha1d, 0, iv, 24, 8);
return new AESKeyData(key, iv);
}
public static byte[] CalcMsgKey(byte[] data)
{
var msgKey = new byte[16];
Array.Copy(sha1(data), 4, msgKey, 0, 16);
return msgKey;
}
public static byte[] CalcMsgKey(byte[] data, int offset, int limit)
{
var msgKey = new byte[16];
Array.Copy(sha1(data, offset, limit), 4, msgKey, 0, 16);
return msgKey;
}
public static byte[] sha1(byte[] data)
{
using (SHA1 sha1 = new SHA1Managed())
{
return sha1.ComputeHash(data);
}
}
public static byte[] sha1(byte[] data, int offset, int limit)
{
using (SHA1 sha1 = new SHA1Managed())
{
return sha1.ComputeHash(data, offset, limit);
}
}
}
}