--- /dev/null
+#include "silcincludes.h"
+
+/* Test vectors from NIST secure hashing definition for SHA-1 */
+
+/* First test vector */
+const unsigned char data1[] = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
+const unsigned char data1_digest[] = "\x84\x98\x3e\x44\x1c\x3b\xd2\x6e\xba\xae\x4a\xa1\xf9\x51\x29\xe5\xe5\x46\x70\xf1";
+
+/* Second test vector. This will be allocated with 1000000 'a' characters
+ and hashed */
+char *data2 = NULL;
+const unsigned char data2_digest[] = "\x34\xaa\x97\x3c\xd4\xc4\xda\xa4\xf6\x1e\xeb\x2b\xdb\xad\x27\x31\x65\x34\x01\x6f";
+
+int main(int argc, char **argv)
+{
+ bool success = FALSE;
+ unsigned char digest[20];
+ SilcHash sha1;
+
+ if (argc > 1 && !strcmp(argv[1], "-d")) {
+ silc_debug = 1;
+ silc_debug_hexdump = 1;
+ silc_log_set_debug_string("*crypt*,*hash*,*sha1*");
+ }
+
+ SILC_LOG_DEBUG(("Registering builtin hash functions"));
+ silc_hash_register_default();
+
+ SILC_LOG_DEBUG(("Allocating sha1 hash function"));
+ if (!silc_hash_alloc("sha1", &sha1)) {
+ SILC_LOG_DEBUG(("Allocating sha1 hash function failed"));
+ goto err;
+ }
+
+ /* First test vector */
+ SILC_LOG_DEBUG(("First test vector"));
+ silc_hash_init(sha1);
+ silc_hash_update(sha1, data1, strlen(data1));
+ silc_hash_final(sha1, digest);
+ SILC_LOG_HEXDUMP(("Message"), (unsigned char *)data1, strlen(data1));
+ SILC_LOG_HEXDUMP(("Digest"), digest, sizeof(digest));
+ SILC_LOG_HEXDUMP(("Expected digest"), (unsigned char *)data1_digest,
+ sizeof(digest));
+ if (memcmp(digest, data1_digest, sizeof(digest))) {
+ SILC_LOG_DEBUG(("Hash failed"));
+ goto err;
+ }
+ SILC_LOG_DEBUG(("Hash is successful"));
+
+ /* First test vector */
+ SILC_LOG_DEBUG(("Second test vector"));
+ data2 = silc_malloc(1000000);
+ memset(data2, 'a', 1000000);
+ silc_hash_init(sha1);
+ silc_hash_update(sha1, data2, 1000000);
+ silc_hash_final(sha1, digest);
+ SILC_LOG_HEXDUMP(("Digest"), digest, sizeof(digest));
+ SILC_LOG_HEXDUMP(("Expected digest"), (unsigned char *)data2_digest,
+ sizeof(digest));
+ if (memcmp(digest, data2_digest, sizeof(digest))) {
+ SILC_LOG_DEBUG(("Hash failed"));
+ goto err;
+ }
+ SILC_LOG_DEBUG(("Hash is successful"));
+
+ success = TRUE;
+
+ err:
+ SILC_LOG_DEBUG(("Testing was %s", success ? "SUCCESS" : "FAILURE"));
+ fprintf(stderr, "Testing was %s\n", success ? "SUCCESS" : "FAILURE");
+
+ silc_free(data2);
+ silc_hash_free(sha1);
+ silc_hash_unregister_all();
+ return success;
+}