+#include "string.h"
+#include "util.h"
+
+#define SHA1_HASH_SIZE 20
+
+extern const u8 zero_hash[SHA1_HASH_SIZE];
+
+static inline void
+copy_hash(u8 dest[SHA1_HASH_SIZE], const u8 src[SHA1_HASH_SIZE])
+{
+ memcpy(dest, src, SHA1_HASH_SIZE);
+}
+
+static inline void
+random_hash(u8 hash[SHA1_HASH_SIZE])
+{
+ randomize_byte_array(hash, SHA1_HASH_SIZE);
+}
+
+static inline bool
+hashes_equal(const u8 h1[SHA1_HASH_SIZE], const u8 h2[SHA1_HASH_SIZE])
+{
+ return memcmp(h1, h2, SHA1_HASH_SIZE) == 0;
+}
+
+static inline int
+hashes_cmp(const u8 h1[SHA1_HASH_SIZE],
+ const u8 h2[SHA1_HASH_SIZE])
+{
+ return memcmp(h1, h2, SHA1_HASH_SIZE);
+}
+
+static inline void
+print_hash(const u8 hash[SHA1_HASH_SIZE])
+{
+ print_byte_field(hash, SHA1_HASH_SIZE);
+}
+
+static inline bool
+is_zero_hash(const u8 hash[SHA1_HASH_SIZE])
+{
+ if (hash)
+ for (u8 i = 0; i < SHA1_HASH_SIZE / 4; i++)
+ if (((u32*)hash)[i])
+ return false;
+ return true;
+}
+
+static inline void
+zero_out_hash(u8 hash[SHA1_HASH_SIZE])
+{
+ memset(hash, 0, SHA1_HASH_SIZE);
+}