Use sha512 to calculate the versionID for images.

- We needed a hash algorithm that can be replicated on
  multiple platforms and across multiple programming languages.
- This would allow the user to calculate the versionID by
  executing the following command to obtain correct versionID.
  echo -n "<versionID>" | sha512sum | cut -b 1-8
- This is part of the change required for openbmc/openbmc#2323

Change-Id: Ibc96a2871f07cb549c482c06dec7090e6ba3a766
Signed-off-by: Saqib Khan <khansa@us.ibm.com>
diff --git a/test/Makefile.am b/test/Makefile.am
index ab98534..6923088 100755
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -12,7 +12,7 @@
 	$(PHOSPHOR_DBUS_INTERFACES_CFLAGS)
 utest_LDFLAGS = -lgtest_main -lgtest $(PTHREAD_LIBS) \
 	$(PHOSPHOR_DBUS_INTERFACES_LIBS) $(OESDK_TESTCASE_FLAGS) \
-	$(PHOSPHOR_LOGGING_LIBS) -lstdc++fs
+	$(PHOSPHOR_LOGGING_LIBS) -lstdc++fs -lssl -lcrypto
 
 utest_SOURCES = utest.cpp
 utest_LDADD = $(top_builddir)/phosphor_version_software_manager-version.o
diff --git a/test/utest.cpp b/test/utest.cpp
index 3195a2f..f777742 100755
--- a/test/utest.cpp
+++ b/test/utest.cpp
@@ -6,6 +6,7 @@
 #include <iostream>
 #include <sstream>
 #include <string>
+#include <openssl/sha.h>
 
 using namespace phosphor::software::manager;
 namespace fs = std::experimental::filesystem;
@@ -56,12 +57,18 @@
 /** @brief Make sure we correctly get the Id from getId()*/
 TEST_F(VersionTest, TestGetId)
 {
-    std::stringstream hexId;
     auto version = "test-id";
-
-    hexId << std::hex << ((std::hash<std::string> {}(
-                               version)) & 0xFFFFFFFF);
-
-    EXPECT_EQ(Version::getId(version), hexId.str());
-
+    unsigned char digest[SHA512_DIGEST_LENGTH];
+    SHA512_CTX ctx;
+    SHA512_Init(&ctx);
+    SHA512_Update(&ctx, version, strlen(version));
+    SHA512_Final(digest, &ctx);
+    char mdString[SHA512_DIGEST_LENGTH*2+1];
+    for (int i = 0; i < SHA512_DIGEST_LENGTH; i++)
+    {
+        snprintf(&mdString[i*2], 3, "%02x", (unsigned int)digest[i]);
+    }
+    std::string hexId = std::string(mdString);
+    hexId = hexId.substr(0, 8);
+    EXPECT_EQ(Version::getId(version), hexId);
 }