1/*
2 * Written by Daniel Richards <kyhwana@world-net.co.nz> 6/7/2002
3 * hash.c: This app uses libtomcrypt to hash either stdin or a file
4 * This file is Public Domain. No rights are reserved.
5 * Compile with 'gcc hashsum.c -o hashsum -ltomcrypt'
6 * This example isn't really big enough to warrent splitting into
7 * more functions ;)
8*/
9
10#include <tomcrypt.h>
11
12int errno;
13
14void register_algs();
15
16int main(int argc, char **argv)
17{
18   int idx, x, z;
19   unsigned long w;
20   unsigned char hash_buffer[MAXBLOCKSIZE];
21   hash_state md;
22
23   /* You need to register algorithms before using them */
24   register_algs();
25   if (argc < 2) {
26      printf("usage: ./hash algorithm file [file ...]\n");
27      printf("Algorithms:\n");
28      for (x = 0; hash_descriptor[x].name != NULL; x++) {
29         printf(" %s (%d)\n", hash_descriptor[x].name, hash_descriptor[x].ID);
30      }
31      exit(EXIT_SUCCESS);
32   }
33
34   idx = find_hash(argv[1]);
35   if (idx == -1) {
36      fprintf(stderr, "\nInvalid hash specified on command line.\n");
37      return -1;
38   }
39
40   if (argc == 2) {
41      hash_descriptor[idx].init(&md);
42      do {
43         x = fread(hash_buffer, 1, sizeof(hash_buffer), stdin);
44         hash_descriptor[idx].process(&md, hash_buffer, x);
45      } while (x == sizeof(hash_buffer));
46      hash_descriptor[idx].done(&md, hash_buffer);
47      for (x = 0; x < (int)hash_descriptor[idx].hashsize; x++) {
48          printf("%02x",hash_buffer[x]);
49      }
50      printf("  (stdin)\n");
51   } else {
52      for (z = 2; z < argc; z++) {
53         w = sizeof(hash_buffer);
54         if ((errno = hash_file(idx,argv[z],hash_buffer,&w)) != CRYPT_OK) {
55            printf("File hash error: %s\n", error_to_string(errno));
56         } else {
57             for (x = 0; x < (int)hash_descriptor[idx].hashsize; x++) {
58                 printf("%02x",hash_buffer[x]);
59             }
60             printf("  %s\n", argv[z]);
61         }
62      }
63   }
64   return EXIT_SUCCESS;
65}
66
67void register_algs(void)
68{
69  int err;
70
71#ifdef TIGER
72  register_hash (&tiger_desc);
73#endif
74#ifdef MD2
75  register_hash (&md2_desc);
76#endif
77#ifdef MD4
78  register_hash (&md4_desc);
79#endif
80#ifdef MD5
81  register_hash (&md5_desc);
82#endif
83#ifdef SHA1
84  register_hash (&sha1_desc);
85#endif
86#ifdef SHA224
87  register_hash (&sha224_desc);
88#endif
89#ifdef SHA256
90  register_hash (&sha256_desc);
91#endif
92#ifdef SHA384
93  register_hash (&sha384_desc);
94#endif
95#ifdef SHA512
96  register_hash (&sha512_desc);
97#endif
98#ifdef RIPEMD128
99  register_hash (&rmd128_desc);
100#endif
101#ifdef RIPEMD160
102  register_hash (&rmd160_desc);
103#endif
104#ifdef WHIRLPOOL
105  register_hash (&whirlpool_desc);
106#endif
107#ifdef CHC_HASH
108  register_hash(&chc_desc);
109  if ((err = chc_register(register_cipher(&aes_enc_desc))) != CRYPT_OK) {
110     printf("chc_register error: %s\n", error_to_string(err));
111     exit(EXIT_FAILURE);
112  }
113#endif
114
115}
116
117/* $Source: /cvs/libtom/libtomcrypt/demos/hashsum.c,v $ */
118/* $Revision: 1.2 $ */
119/* $Date: 2005/05/05 14:35:56 $ */
120