Tog mig lige lidt længere tid end jeg tør indrømme, men det var os det jeg kom frem til. dette blev den kode jeg endte op med. :)
public string GenerateResponse(string user, string realm, string password, string nonce, string cnonce, string authzid, string digesturi, string qop, string nc)
{
byte[] A2 = (qop.Equals("auth") ? Encoder.GetBytes($"AUTHENTICATE:{digesturi}"): Encoder.GetBytes($"AUTHENTICATE:{digesturi}:00000000000000000000000000000000"));
byte[] h1 = H(Encoder.GetBytes($"{user}:{realm}:{password}"));
byte[] h2 = Encoder.GetBytes($":{nonce}:{cnonce}");
byte[] A1 = Merge(h1,h2);
byte[] response_value = HEX(KD(HEX(H(A1)),
Merge(Encoder.GetBytes($"{nonce}:{nc}:{cnonce}:{qop}:"), HEX(H(A2)))
));
byte[] h3 = Merge(h1, h2);
return Encoder.GetString(response_value);
}
public string GenerateHash(string user, string realm, string password, string nonce, string cnonce, string authzid, string digesturi, string qop, string nc)
{
byte[] A2 = (qop.Equals("auth") ? Encoder.GetBytes($":{digesturi}") : Encoder.GetBytes($":{digesturi}:00000000000000000000000000000000"));
byte[] h1 = H(Encoder.GetBytes($"{user}:{realm}:{password}"));
byte[] h2 = Encoder.GetBytes($":{nonce}:{cnonce}");
byte[] A1 = Merge(h1, h2);
byte[] response_value = HEX(KD(HEX(H(A1)),
Merge(Encoder.GetBytes($"{nonce}:{nc}:{cnonce}:{qop}:"), HEX(H(A2)))
));
byte[] h3 = Merge(h1, h2);
return Encoder.GetString(response_value);
}
/// <summary>
/// Let H(s) be the 16 octet MD5 hash [RFC 1321] of the octet string s.
/// </summary>
/// <param name="s">Byte Array Af streng for at sikre encodning</param>
/// <returns>s -> Base16(s) = s16 -> MD5Hash(s16)</returns>
public byte[] H(byte[] s)
{
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
return md5.ComputeHash(s);
}
/// <summary>
/// Let KD(k, s) be H({k, ":", s}), i.e., the 16 octet hash of the string k, a colon and the string s.
/// </summary>
/// <param name="k">Byte Array Af streng for at sikre encodning</param>
/// <param name="s">Byte Array Af streng for at sikre encodning</param>
/// <returns>k + ":" + s = ks -> H(ks)</returns>
public byte[] KD(byte[] k, byte[] s)
{
byte[] colon = Encoder.GetBytes(":");
byte[] ks = Merge(k, colon, s);
return H(ks);
}
/// <summary>
/// Let HEX(n) be the representation of the 16 octet MD5 hash n as a string of 32 hex digits(with alphabetic characters always in lower case, since MD5 is case sensitive).
/// </summary>
/// <param name="n">Byte Array Af streng for at sikre encodning</param>
/// <returns>lowercase of n</returns>
public byte[] HEX(byte[] n)
{
byte[] b = Encoder.GetBytes(toBase16(n).ToLower());
return b;
}
/// <summary>
/// Merge byte arrays, Hurtig Merge af de mange byte arrays denne classe arbejder med
/// </summary>
/// <param name="ns">Array med Arrays af byte samlinger der kan oversættes med en Encoder til tekst</param>
/// <returns></returns>
public byte[] Merge(params byte[][] ns)
{
int index = 0;
int length = 0;
byte[] merged_n;
foreach(byte[] n in ns)
{
length += n.Length;
}
merged_n = new byte[length];
for(int arri = 0; arri < ns.Length; arri++)
{
Array.Copy(ns[arri], 0, merged_n, index, ns[arri].Length);
index += ns[arri].Length;
}
return merged_n;
}