diff --git a/lib/libtpm/sha.c b/lib/libtpm/sha.c
index 43de658..6e8b19b 100644
--- a/lib/libtpm/sha.c
+++ b/lib/libtpm/sha.c
@@ -203,3 +203,29 @@ void sha1(const uint8_t *data, uint32_t length, uint8_t *hash)
 	sha1_do(&ctx, data, length);
 	memcpy(hash, &ctx.h[0], 20);
 }
+
+#ifdef MAIN
+
+#include "sha_test.h"
+
+int main(void)
+{
+	TESTVECTORS(data);
+	uint8_t hash[20];
+	char input[64];
+	int err = 0;
+	size_t i;
+
+	for (i = 0; data[i]; i++)
+		err |= test_hash(sha1, hash, sizeof(hash),
+				 data[i], strlen(data[i]),
+				 SHA1);
+
+	memset(input, 'a', sizeof(input));
+	for (i = 50; i < sizeof(input); i++)
+		err |= test_hash(sha1, hash, sizeof(hash),
+				 input, i, SHA1);
+
+	return err;
+}
+#endif
diff --git a/lib/libtpm/sha256.c b/lib/libtpm/sha256.c
index 1a0aa9a..c921ff5 100644
--- a/lib/libtpm/sha256.c
+++ b/lib/libtpm/sha256.c
@@ -218,3 +218,28 @@ void sha256(const uint8_t *data, uint32_t length, uint8_t *hash)
 	sha256_do(&ctx, data, length);
 	memcpy(hash, ctx.h, sizeof(ctx.h));
 }
+
+#ifdef MAIN
+
+#include "sha_test.h"
+
+int main(void)
+{
+	TESTVECTORS(data);
+	uint8_t hash[32];
+	char input[64];
+	int err = 0;
+	size_t i;
+
+	for (i = 0; data[i]; i++)
+		err |= test_hash(sha256, hash, sizeof(hash),
+				 data[i], strlen(data[i]),
+				 SHA256);
+
+	memset(input, 'a', sizeof(input));
+	for (i = 50; i < sizeof(input); i++)
+		err |= test_hash(sha256, hash, sizeof(hash), input, i, SHA256);
+
+	return err;
+}
+#endif
diff --git a/lib/libtpm/sha512.c b/lib/libtpm/sha512.c
index f9267ef..9e856ea 100644
--- a/lib/libtpm/sha512.c
+++ b/lib/libtpm/sha512.c
@@ -247,3 +247,35 @@ void sha512(const uint8_t *data, uint32_t length, uint8_t *hash)
 	sha512_do(&ctx, data, length);
 	memcpy(hash, ctx.h, sizeof(ctx.h));
 }
+
+
+#ifdef MAIN
+
+#include "sha_test.h"
+
+int main(void)
+{
+	TESTVECTORS(data);
+	uint8_t hash[64];
+	char input[128];
+	int err = 0;
+	size_t i;
+
+	for (i = 0; data[i]; i++) {
+		err |= test_hash(sha384, hash, 48,
+				 data[i], strlen(data[i]),
+				 SHA384);
+		err |= test_hash(sha512, hash, sizeof(hash),
+				 data[i], strlen(data[i]),
+				 SHA512);
+	}
+
+	memset(input, 'a', sizeof(input));
+	for (i = 110; i < sizeof(input); i++) {
+		err |= test_hash(sha384, hash, 48, input, i, SHA384);
+		err |= test_hash(sha512, hash, sizeof(hash), input, i, SHA512);
+	}
+
+	return err;
+}
+#endif
diff --git a/lib/libtpm/sha_test.h b/lib/libtpm/sha_test.h
new file mode 100644
index 0000000..e1358f9
--- /dev/null
+++ b/lib/libtpm/sha_test.h
@@ -0,0 +1,58 @@
+/*****************************************************************************
+ * Copyright (c) 2021 IBM Corporation
+ * All rights reserved.
+ * This program and the accompanying materials
+ * are made available under the terms of the BSD License
+ * which accompanies this distribution, and is available at
+ * http://www.opensource.org/licenses/bsd-license.php
+ *
+ * Contributors:
+ *     IBM Corporation - initial implementation
+ *****************************************************************************/
+
+#ifndef SHA_TEST_H
+#define SHA_TEST_H
+
+#include <stdio.h>
+
+/* to avoid compilation issues do not include openssl/sha.h */
+unsigned char *SHA1(const unsigned char *, size_t, unsigned char *);
+unsigned char *SHA256(const unsigned char *, size_t, unsigned char *);
+unsigned char *SHA384(const unsigned char *, size_t, unsigned char *);
+unsigned char *SHA512(const unsigned char *, size_t, unsigned char *);
+
+typedef void (*hashfunc)(const uint8_t *data, uint32_t length, uint8_t *hash);
+typedef unsigned char *(*osslhashfunc)(const unsigned char *, size_t,
+				       unsigned char *);
+
+#define TESTVECTORS(NAME) \
+char *NAME[] = {	\
+	"",		\
+	"abc",		\
+	"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", \
+	"abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu", \
+	NULL		\
+};
+
+static inline int
+test_hash(hashfunc hf, uint8_t *hash, size_t hashlen,
+	   const char *data, uint32_t length,
+	   osslhashfunc osslhf)
+{
+	unsigned char expected[hashlen];
+	int ret = 0;
+
+	osslhf((const unsigned char *)data, length, expected);
+
+	hf((uint8_t *)data, length, hash);
+	if (!memcmp(hash, expected, hashlen)) {
+		printf("PASS\n");
+	} else {
+		printf("FAIL data: %s\n", data);
+		ret = 1;
+	}
+
+	return ret;
+}
+
+#endif /* SHA_TEST_H */
diff --git a/lib/libtpm/test.sh b/lib/libtpm/test.sh
new file mode 100755
index 0000000..f375fbc
--- /dev/null
+++ b/lib/libtpm/test.sh
@@ -0,0 +1,29 @@
+#!/usr/bin/env bash
+cd $(dirname "$0")
+
+function fail() {
+	echo "Test failed"
+	exit 1
+}
+
+CC=${HOSTCC:-gcc}
+CFLAGS="-Wall -Wextra -Werror -I../../include -I../../slof -I../../lib/libc/include -DMAIN"
+LDFLAGS="-lcrypto"
+
+echo "SHA-1 test:"
+${CC} ${CFLAGS} sha.c -o sha-test ${LDFLAGS} || exit 1
+./sha-test || fail
+rm -f sha-test
+
+echo "SHA-256 test:"
+${CC} ${CFLAGS} sha256.c -o sha256-test ${LDFLAGS} || exit 1
+./sha256-test || fail
+rm -f sha256-test
+
+echo "SHA-384 & 512 test:"
+${CC} ${CFLAGS} sha512.c -o sha512-test ${LDFLAGS} || exit 1
+./sha512-test || fail
+rm -f sha512-test
+
+echo "All tests passed"
+exit 0
