internal byte[] Initialize(byte[] password)
        {
            // initialize the lanes
            var blake2     = new HMACBlake2B(512);
            var dataStream = new LittleEndianActiveStream();

            dataStream.Expose(DegreeOfParallelism);
            dataStream.Expose(_tagLine);
            dataStream.Expose(MemorySize);
            dataStream.Expose(Iterations);
            dataStream.Expose((uint)0x13);
            dataStream.Expose((uint)Type);
            dataStream.Expose(password.Length);
            dataStream.Expose(password);
            dataStream.Expose(Salt?.Length ?? 0);
            dataStream.Expose(Salt);
            dataStream.Expose(Secret?.Length ?? 0);
            dataStream.Expose(Secret);
            dataStream.Expose(AssociatedData?.Length ?? 0);
            dataStream.Expose(AssociatedData);

            blake2.Initialize();
            var blockhash = blake2.ComputeHash(dataStream);

            dataStream.ClearBuffer();
            return(blockhash);
        }
        public static void Blake2Prime(Memory <ulong> memory, LittleEndianActiveStream dataStream, int size = -1)
        {
            var hashStream = new LittleEndianActiveStream();

            if (size < 0 || size > (memory.Length * 8))
            {
                size = memory.Length * 8;
            }

            hashStream.Expose(size);
            hashStream.Expose(dataStream);


            if (size <= 64)
            {
                var blake2 = new HMACBlake2B(8 * size);
                blake2.Initialize();
                memory.Span.Blit(blake2.ComputeHash(hashStream).AsSpan().Slice(0, size), 0);
            }
            else
            {
                var blake2 = new HMACBlake2B(512);
                blake2.Initialize();

                int offset = 0;
                var chunk  = blake2.ComputeHash(hashStream);

                memory.Span.Blit(chunk.AsSpan().Slice(0, 32), offset); // copy half of the chunk
                offset += 4;
                size   -= 32;

                while (size > 64)
                {
                    blake2.Initialize();
                    chunk = blake2.ComputeHash(chunk);
                    memory.Span.Blit(chunk.AsSpan().Slice(0, 32), offset); // half again

                    offset += 4;
                    size   -= 32;
                }

                blake2 = new HMACBlake2B(size * 8);
                blake2.Initialize();
                memory.Span.Blit(blake2.ComputeHash(chunk).AsSpan().Slice(0, size), offset); // copy the rest
            }
        }
Ejemplo n.º 3
0
    //[Benchmark(Description = "Konscious"), BenchmarkCategory("Blake2b")]
    public static byte[] GetHashKSB2()
    {
        var b2 = new Konscious.Security.Cryptography.HMACBlake2B(BenchConfig.Key, BenchConfig.HashBytes * 8);

        return(b2.ComputeHash(BenchConfig.Data));
    }