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