public static TLString GetVBytes(TLString passwordBytes, TLPasswordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow algo) { if (!TLUtils.CheckPrime(algo.P.Data, algo.G.Value)) { return(null); } return(TLString.FromBigEndianData(GetBigIntegerBytes(GetV(passwordBytes, algo)))); }
private static BigInteger GetV(TLString passwordBytes, TLPasswordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow algo) { var g = BigInteger.ValueOf(algo.G.Value); var p = new BigInteger(1, algo.P.Data); var x_bytes = GetX(passwordBytes, algo); var x = new BigInteger(1, x_bytes.Data); return(g.ModPow(x, p)); }
public static TLString GetX(TLString password, TLPasswordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow algo) { var x_bytes = Telegram.Api.Helpers.Utils.ComputeSHA256(TLUtils.Combine(algo.Salt1.Data, password.Data, algo.Salt1.Data)); x_bytes = Telegram.Api.Helpers.Utils.ComputeSHA256(TLUtils.Combine(algo.Salt2.Data, x_bytes, algo.Salt2.Data)); x_bytes = PBKDF2.GetHash(x_bytes.AsBuffer(), algo.Salt1.Data.AsBuffer()).ToArray(); x_bytes = Telegram.Api.Helpers.Utils.ComputeSHA256(TLUtils.Combine(algo.Salt2.Data, x_bytes, algo.Salt2.Data)); return(TLString.FromBigEndianData(x_bytes)); }