/// <summary>
        /// Create context
        /// </summary>
        /// <param name="domain">Domain name</param>
        /// <param name="cName">Principal name</param>
        /// <param name="password">Password of principal</param>
        /// <param name="accountType">Accoundtype, user or device</param>
        public KerberosContext(string domain, string cName, string password, KerberosAccountType accountType, string salt = null)
            : this()
        {
            if (domain == null)
            {
                throw new ArgumentNullException("domain");
            }
            if (cName == null)
            {
                throw new ArgumentNullException("cName");
            }
            if (password == null)
            {
                throw new ArgumentNullException("password");
            }

            this.Realm = new Realm(domain);
            PrincipalName name = new PrincipalName(new KerbInt32((int)PrincipalType.NT_PRINCIPAL), KerberosUtility.String2SeqKerbString(cName));

            if (null == salt)
            {
                if (accountType == KerberosAccountType.User)
                {
                    salt = KerberosUtility.GenerateSalt(domain, cName, accountType);
                }

                else if (accountType == KerberosAccountType.Device)
                {
                    salt = KerberosUtility.GenerateSalt(domain, cName, accountType);
                }

                else
                {
                    throw new ArgumentOutOfRangeException("Account type not support");
                }
            }

            this.CName = new Principal(accountType, this.Realm, name, password, salt);
        }