diff Resources/sha1/sha.cpp @ 177:81b6f3013738

sha1
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 09 Nov 2012 10:42:00 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Resources/sha1/sha.cpp	Fri Nov 09 10:42:00 2012 +0100
@@ -0,0 +1,176 @@
+/*
+ *  sha.cpp
+ *
+ *  Copyright (C) 1998, 2009
+ *  Paul E. Jones <paulej@packetizer.com>
+ *  All Rights Reserved
+ *
+ *****************************************************************************
+ *  $Id: sha.cpp 13 2009-06-22 20:20:32Z paulej $
+ *****************************************************************************
+ *
+ *  Description:
+ *      This utility will display the message digest (fingerprint) for
+ *      the specified file(s).
+ *
+ *  Portability Issues:
+ *      None.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#ifdef WIN32
+#include <io.h>
+#endif
+#include <fcntl.h>
+#include "sha1.h"
+
+/*
+ *  Function prototype
+ */
+void usage();
+
+
+/*  
+ *  main
+ *
+ *  Description:
+ *      This is the entry point for the program
+ *
+ *  Parameters:
+ *      argc: [in]
+ *          This is the count of arguments in the argv array
+ *      argv: [in]
+ *          This is an array of filenames for which to compute message digests
+ *
+ *  Returns:
+ *      Nothing.
+ *
+ *  Comments:
+ *
+ */
+int main(int argc, char *argv[])
+{
+    SHA1        sha;                        // SHA-1 class
+    FILE        *fp;                        // File pointer for reading files
+    char        c;                          // Character read from file
+    unsigned    message_digest[5];          // Message digest from "sha"
+    int         i;                          // Counter
+    bool        reading_stdin;              // Are we reading standard in?
+    bool        read_stdin = false;         // Have we read stdin?
+
+    /*
+     *  Check the program arguments and print usage information if -?
+     *  or --help is passed as the first argument.
+     */
+    if (argc > 1 && (!strcmp(argv[1],"-?") || !strcmp(argv[1],"--help")))
+    {
+        usage();
+        return 1;
+    }
+
+    /*
+     *  For each filename passed in on the command line, calculate the
+     *  SHA-1 value and display it.
+     */
+    for(i = 0; i < argc; i++)
+    {
+        /*
+         *  We start the counter at 0 to guarantee entry into the for loop.
+         *  So if 'i' is zero, we will increment it now.  If there is no
+         *  argv[1], we will use STDIN below.
+         */
+        if (i == 0)
+        {
+            i++;
+        }
+
+        if (argc == 1 || !strcmp(argv[i],"-"))
+        {
+#ifdef WIN32
+            _setmode(_fileno(stdin), _O_BINARY);
+#endif
+            fp = stdin;
+            reading_stdin = true;
+        }
+        else
+        {
+            if (!(fp = fopen(argv[i],"rb")))
+            {
+                fprintf(stderr, "sha: unable to open file %s\n", argv[i]);
+                return 2;
+            }
+            reading_stdin = false;
+        }
+
+        /*
+         *  We do not want to read STDIN multiple times
+         */
+        if (reading_stdin)
+        {
+            if (read_stdin)
+            {
+                continue;
+            }
+
+            read_stdin = true;
+        }
+
+        /*
+         *  Reset the SHA1 object and process input
+         */
+        sha.Reset();
+
+        c = fgetc(fp);
+        while(!feof(fp))
+        {
+            sha.Input(c);
+            c = fgetc(fp);
+        }
+
+        if (!reading_stdin)
+        {
+            fclose(fp);
+        }
+
+        if (!sha.Result(message_digest))
+        {
+            fprintf(stderr,"sha: could not compute message digest for %s\n",
+                    reading_stdin?"STDIN":argv[i]);
+        }
+        else
+        {
+            printf( "%08X %08X %08X %08X %08X - %s\n",
+                    message_digest[0],
+                    message_digest[1],
+                    message_digest[2],
+                    message_digest[3],
+                    message_digest[4],
+                    reading_stdin?"STDIN":argv[i]);
+        }
+    }
+
+    return 0;
+}
+
+/*  
+ *  usage
+ *
+ *  Description:
+ *      This function will display program usage information to the user.
+ *
+ *  Parameters:
+ *      None.
+ *
+ *  Returns:
+ *      Nothing.
+ *
+ *  Comments:
+ *
+ */
+void usage()
+{
+    printf("usage: sha <file> [<file> ...]\n");
+    printf("\tThis program will display the message digest (fingerprint)\n");
+    printf("\tfor files using the Secure Hashing Algorithm (SHA-1).\n");
+}