using System; using System.Security.Cryptography; using System.Text; namespace System.Net { // Token: 0x02000210 RID: 528 internal class DigestSession { // Token: 0x060011F2 RID: 4594 RVA: 0x000357A0 File Offset: 0x000339A0 public DigestSession() { this._nc = 1; this.lastUse = DateTime.Now; } // Token: 0x170005E1 RID: 1505 // (get) Token: 0x060011F4 RID: 4596 RVA: 0x000357C8 File Offset: 0x000339C8 public string Algorithm { get { return this.parser.Algorithm; } } // Token: 0x170005E2 RID: 1506 // (get) Token: 0x060011F5 RID: 4597 RVA: 0x000357D8 File Offset: 0x000339D8 public string Realm { get { return this.parser.Realm; } } // Token: 0x170005E3 RID: 1507 // (get) Token: 0x060011F6 RID: 4598 RVA: 0x000357E8 File Offset: 0x000339E8 public string Nonce { get { return this.parser.Nonce; } } // Token: 0x170005E4 RID: 1508 // (get) Token: 0x060011F7 RID: 4599 RVA: 0x000357F8 File Offset: 0x000339F8 public string Opaque { get { return this.parser.Opaque; } } // Token: 0x170005E5 RID: 1509 // (get) Token: 0x060011F8 RID: 4600 RVA: 0x00035808 File Offset: 0x00033A08 public string QOP { get { return this.parser.QOP; } } // Token: 0x170005E6 RID: 1510 // (get) Token: 0x060011F9 RID: 4601 RVA: 0x00035818 File Offset: 0x00033A18 public string CNonce { get { if (this._cnonce == null) { byte[] array = new byte[15]; DigestSession.rng.GetBytes(array); this._cnonce = Convert.ToBase64String(array); Array.Clear(array, 0, array.Length); } return this._cnonce; } } // Token: 0x060011FA RID: 4602 RVA: 0x00035860 File Offset: 0x00033A60 public bool Parse(string challenge) { this.parser = new DigestHeaderParser(challenge); if (!this.parser.Parse()) { return false; } if (this.parser.Algorithm == null || this.parser.Algorithm.ToUpper().StartsWith("MD5")) { this.hash = HashAlgorithm.Create("MD5"); } return true; } // Token: 0x060011FB RID: 4603 RVA: 0x000358CC File Offset: 0x00033ACC private string HashToHexString(string toBeHashed) { if (this.hash == null) { return null; } this.hash.Initialize(); byte[] array = this.hash.ComputeHash(Encoding.ASCII.GetBytes(toBeHashed)); StringBuilder stringBuilder = new StringBuilder(); foreach (byte b in array) { stringBuilder.Append(b.ToString("x2")); } return stringBuilder.ToString(); } // Token: 0x060011FC RID: 4604 RVA: 0x00035948 File Offset: 0x00033B48 private string HA1(string username, string password) { string text = string.Format("{0}:{1}:{2}", username, this.Realm, password); if (this.Algorithm != null && this.Algorithm.ToLower() == "md5-sess") { text = string.Format("{0}:{1}:{2}", this.HashToHexString(text), this.Nonce, this.CNonce); } return this.HashToHexString(text); } // Token: 0x060011FD RID: 4605 RVA: 0x000359B4 File Offset: 0x00033BB4 private string HA2(HttpWebRequest webRequest) { string text = string.Format("{0}:{1}", webRequest.Method, webRequest.RequestUri.PathAndQuery); if (this.QOP == "auth-int") { } return this.HashToHexString(text); } // Token: 0x060011FE RID: 4606 RVA: 0x000359FC File Offset: 0x00033BFC private string Response(string username, string password, HttpWebRequest webRequest) { string text = string.Format("{0}:{1}:", this.HA1(username, password), this.Nonce); if (this.QOP != null) { text += string.Format("{0}:{1}:{2}:", this._nc.ToString("X8"), this.CNonce, this.QOP); } text += this.HA2(webRequest); return this.HashToHexString(text); } // Token: 0x060011FF RID: 4607 RVA: 0x00035A70 File Offset: 0x00033C70 public Authorization Authenticate(WebRequest webRequest, ICredentials credentials) { if (this.parser == null) { throw new InvalidOperationException(); } HttpWebRequest httpWebRequest = webRequest as HttpWebRequest; if (httpWebRequest == null) { return null; } this.lastUse = DateTime.Now; NetworkCredential credential = credentials.GetCredential(httpWebRequest.RequestUri, "digest"); if (credential == null) { return null; } string userName = credential.UserName; if (userName == null || userName == string.Empty) { return null; } string password = credential.Password; StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendFormat("Digest username=\"{0}\", ", userName); stringBuilder.AppendFormat("realm=\"{0}\", ", this.Realm); stringBuilder.AppendFormat("nonce=\"{0}\", ", this.Nonce); stringBuilder.AppendFormat("uri=\"{0}\", ", httpWebRequest.Address.PathAndQuery); if (this.Algorithm != null) { stringBuilder.AppendFormat("algorithm=\"{0}\", ", this.Algorithm); } stringBuilder.AppendFormat("response=\"{0}\", ", this.Response(userName, password, httpWebRequest)); if (this.QOP != null) { stringBuilder.AppendFormat("qop=\"{0}\", ", this.QOP); } lock (this) { if (this.QOP != null) { stringBuilder.AppendFormat("nc={0:X8}, ", this._nc); this._nc++; } } if (this.CNonce != null) { stringBuilder.AppendFormat("cnonce=\"{0}\", ", this.CNonce); } if (this.Opaque != null) { stringBuilder.AppendFormat("opaque=\"{0}\", ", this.Opaque); } stringBuilder.Length -= 2; return new Authorization(stringBuilder.ToString()); } // Token: 0x170005E7 RID: 1511 // (get) Token: 0x06001200 RID: 4608 RVA: 0x00035C48 File Offset: 0x00033E48 public DateTime LastUse { get { return this.lastUse; } } // Token: 0x04000FA9 RID: 4009 private static RandomNumberGenerator rng = RandomNumberGenerator.Create(); // Token: 0x04000FAA RID: 4010 private DateTime lastUse; // Token: 0x04000FAB RID: 4011 private int _nc; // Token: 0x04000FAC RID: 4012 private HashAlgorithm hash; // Token: 0x04000FAD RID: 4013 private DigestHeaderParser parser; // Token: 0x04000FAE RID: 4014 private string _cnonce; } }