public static void GetSessionVerifier(ReadOnlySpan <byte> A, ReadOnlySpan <byte> clientM, ReadOnlySpan <byte> K, Span <byte> result) { // A len 32 // clientM len 20 // K len 40 Span <byte> data = stackalloc byte[32 + 20 + 40]; A.CopyTo(data); clientM.CopyTo(data.Slice(32)); K.CopyTo(data.Slice(52)); SHA1Hash.HashData(data, result, out _); }
static SRP6() { Span <byte> NHash = stackalloc byte[SHA1Hash.SHA1_DIGEST_LENGTH]; Span <byte> gHash = stackalloc byte[SHA1Hash.SHA1_DIGEST_LENGTH]; SHA1Hash.HashData(N, NHash, out var byteCount1); SHA1Hash.HashData(g, gHash, out var byteCount2); // NgHash = H(N) xor H(g) for (var i = 0; i < SHA1Hash.SHA1_DIGEST_LENGTH; i++) { NgHash[i] = (byte)(NHash[i] ^ gHash[i]); } }
static void CalculateVerifier(string username, string password, ReadOnlySpan <byte> salt, Span <byte> verifier) { // v = g ^ H(s || H(u || ':' || p)) mod N Span <byte> data = stackalloc byte[salt.Length + SHA1Hash.SHA1_DIGEST_LENGTH]; for (var i = 0; i < salt.Length; i++) { data[i] = salt[i]; } SHA1Hash.HashData($"{username}:{password}", data.Slice(salt.Length), out var byteCount); Span <byte> hash = stackalloc byte[SHA1Hash.SHA1_DIGEST_LENGTH]; SHA1Hash.HashData(data, hash, out byteCount); _g.ModPow(new BigInteger(hash, true), _N).TryWriteBytes(verifier, out var bytesWritten, true); }
public static void DigestSHA1(ReadOnlySpan <byte> data, Span <byte> hash, out int byteCount) { SHA1Hash.HashData(data, hash, out byteCount); }
public static void DigestSHA1(string str, Span <byte> hash, out int byteCount) { SHA1Hash.HashData(str, hash, out byteCount); }