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 } }
//[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)); }