public Session ProcessChallenge(VerificationChallenge challenge) { _s = challenge.ServerKey; _B = challenge.PublicEphemeralKey.ToBigInteger(); if (_B % _parameter.PrimeNumber == 0) { throw new Exception("Mod B % PrimeNumber could not be 0"); } _u = _hashAlgorithm.ComputeHash(_A.Concat(_B.ToBytes()).ToArray()).ToBigInteger(); if (_u == 0) { throw new Exception("u could not be 0"); } _x = Compute_x(_s, _username, _password).ToBigInteger(); _v = BigInteger.ModPow(_parameter.Generator, _x, _parameter.PrimeNumber); _S = Compute_S(_B, _k, _u, _a, _x); _K = Compute_K(_S.ToBytes()); _M = Compute_M(_username, _s, _A, _B.ToBytes(), _K); _HMAK = Compute_HAMK(_A, _M, _K); var session = new Session() { Key = _M }; #if DEBUG Console.WriteLine("================ User Challenge =============="); Console.WriteLine("_s = {0}", _s.ToBigInteger()); Console.WriteLine("_B = {0}", _B); Console.WriteLine("_A = {0}", _A.ToBigInteger()); Console.WriteLine("_a = {0}", _a); Console.WriteLine("_u = {0}", _u); Console.WriteLine("_x = {0}", _x); Console.WriteLine("_k = {0}", _k); Console.WriteLine("_v = {0}", _v); Console.WriteLine("_S = {0}", _S); Console.WriteLine("_K = {0}", _K.ToBigInteger()); Console.WriteLine("_M = {0}", _M.ToBigInteger()); Console.WriteLine("============================================="); #endif return(session); }
public VerificationChallenge GetChallenge() { VerificationChallenge challenge = new VerificationChallenge(); if ((_A % _parameter.PrimeNumber) == BigInteger.Zero) { challenge.ServerKey = null; challenge.PublicEphemeralKey = null; } else { challenge.ServerKey = _s.ToBytes(); challenge.PublicEphemeralKey = _B.ToBytes(); } return(challenge); }