/// <summary>Hashes a message, with an optional key, using the BLAKE2b primitive.</summary> /// <param name="message">The message to be hashed.</param> /// <param name="key">The key; may be null, otherwise between 16 and 64 bytes.</param> /// <param name="bytes">The size (in bytes) of the desired result.</param> /// <returns>Returns a byte array.</returns> /// <exception cref="KeyOutOfRangeException"></exception> /// <exception cref="BytesOutOfRangeException"></exception> public static byte[] Hash(byte[] message, byte[] key, int bytes) { //validate the length of the key int keyLength; if (key != null) { if (key.Length > KEY_BYTES_MAX || key.Length < KEY_BYTES_MIN) { throw new KeyOutOfRangeException(string.Format("key must be between {0} and {1} bytes in length.", KEY_BYTES_MIN, KEY_BYTES_MAX)); } keyLength = key.Length; } else { key = new byte[0]; keyLength = 0; } //validate output length if (bytes > BYTES_MAX || bytes < BYTES_MIN) { throw new BytesOutOfRangeException("bytes", bytes, string.Format("bytes must be between {0} and {1} bytes in length.", BYTES_MIN, BYTES_MAX)); } var buffer = new byte[bytes]; SodiumLibrary.crypto_generichash(buffer, buffer.Length, message, message.Length, key, keyLength); return(buffer); }