示例#1
0
        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 _);
        }
示例#2
0
        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]);
            }
        }
示例#3
0
        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);
        }
示例#4
0
 public static void DigestSHA1(ReadOnlySpan <byte> data, Span <byte> hash, out int byteCount)
 {
     SHA1Hash.HashData(data, hash, out byteCount);
 }
示例#5
0
 public static void DigestSHA1(string str, Span <byte> hash, out int byteCount)
 {
     SHA1Hash.HashData(str, hash, out byteCount);
 }