Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }