HashMatch: do return values more strict.
[skeinsum.git] / skein_cli.c
index f2bc2e27caeec23d8e638d239ae83161d20e8c86..0ab840835690951179942431663d506041ab4fba 100644 (file)
@@ -210,6 +210,7 @@ void HashStdin(int tag)
        }
 }
 
+/* Return: -1 = Error, 0 = Mismatch, 1 = Match */
 int HashMatch(const char StoredDigest[], const char *filename, int quiet)
 {
        char mode = 't';
@@ -220,20 +221,23 @@ int HashMatch(const char StoredDigest[], const char *filename, int quiet)
        
        char MsgDigest[hashbitlen/2];
        if (HashWithMode(filename, MsgDigest, mode) < 0)
-               return 0;
+               return -1;
 
        if (strcmp(MsgDigest, StoredDigest)) {
                printf("%s: FAILED\n", filename);
                return 0;
        }
+
        if (quiet > 0)
                printf("%s: OK\n", filename);
        return 1;
 }
 
+/* Return: -1 = some errors/mismatches, 1 = all ok */
 int VerifyHashesFromFile(FILE *fp, int status, int warn, int quiet)
 {
-       char hash[500], MsgDigest_tmp[hashbitlen/2];
+       char hash[PATH_MAX + hashbitlen/4 + 4];
+       char MsgDigest_tmp[hashbitlen/2];
        int NoMatch = 0, NotProper = 0, Computed = 0;
        int line = 0;
 
@@ -242,7 +246,7 @@ int VerifyHashesFromFile(FILE *fp, int status, int warn, int quiet)
                char file_tmp[PATH_MAX];
                line ++;
                Computed++;
-               unsigned int hashVersion = decomposeHashLine(hash,MsgDigest_tmp,file_tmp);
+               int hashVersion = decomposeHashLine(hash,MsgDigest_tmp,file_tmp);
                if (hashVersion == -1)
                {
                        fprintf(stderr, "skein%d: %s is using newer version of skein%d algorithm\n",hashbitlen,file_tmp,hashbitlen);
@@ -262,7 +266,7 @@ int VerifyHashesFromFile(FILE *fp, int status, int warn, int quiet)
                        NotProper ++;
                        NoMatch ++;
                }
-               else if (!HashMatch(MsgDigest_tmp, file_tmp, quiet))
+               else if (HashMatch(MsgDigest_tmp, file_tmp, quiet) <= 0)
                {
                        NoMatch++;
                }
@@ -419,7 +423,7 @@ void print_usage(void)
        exit(1);
 }
 
-int is_goodfile(const char filename[], int verbose)
+int is_goodfile(const char filename[])
 {
        if (!strcmp(filename, "-"))
                return 1;
@@ -427,7 +431,7 @@ int is_goodfile(const char filename[], int verbose)
        struct stat s;
 
        if (stat(filename, &s) < 0) {
-               if (verbose) fprintf(stderr, "skein%dsum: %s: no such file or directory\n", hashbitlen, filename);
+               fprintf(stderr, "skein%dsum: %s: no such file or directory\n", hashbitlen, filename);
                return 0;
        }
 
@@ -435,7 +439,7 @@ int is_goodfile(const char filename[], int verbose)
                return 1;
 
        if (s.st_mode & S_IFDIR) {
-               if (verbose) fprintf(stderr, "skein%dsum: %s: is a directory\n", hashbitlen, filename);
+               fprintf(stderr, "skein%dsum: %s: is a directory\n", hashbitlen, filename);
                return 0;
        }
 
@@ -503,7 +507,7 @@ int main(int argc, char** argv)
                for (file_index = first_file; file_index < argc; file_index++)
                {
                        const char *filename = argv[file_index];
-                       if (!is_goodfile(filename, 1)) {
+                       if (!is_goodfile(filename)) {
                                errorFound++;
                                continue;
                        }
@@ -540,7 +544,7 @@ int main(int argc, char** argv)
                for (file_index = first_file; file_index < argc; file_index++)
                {
                        const char *filename = argv[file_index];
-                       if (!is_goodfile(filename, 1)) {
+                       if (!is_goodfile(filename)) {
                                errorFound++;
                                continue;
                        }