1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Tweaked in various ways for Google/Android:
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  - Changed from .cpp to .c.
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  - Made argument to SHA1Update a const pointer, and enabled
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *    SHA1HANDSOFF.  This incurs a speed penalty but prevents us from
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *    trashing the input.
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  - Include <endian.h> to get endian info.
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  - Split a small piece into a header file.
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectsha1sum: inspired by md5sum.
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSHA-1 in C
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectBy Steve Reid <steve@edmweb.com>
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project100% Public Domain
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project-----------------
19de75089fb7216d19e9c22cce4dc62a49513477d3Carl ShapiroModified 7/98
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectBy James H. Brown <jbrown@burgoyne.com>
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectStill 100% Public Domain
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbit machines
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectRoutine SHA1Update changed from
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    void SHA1Update(SHA1_CTX* context, unsigned char* data,
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      unsigned int len)
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectto
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    void SHA1Update(SHA1_CTX* context, unsigned char* data,
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      unsigned long len)
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectThe 'len' parameter was declared an int which works fine on 32
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbit machines. However, on 16 bit machines an int is too small
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectfor the shifts being done against it.  This caused the hash
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectfunction to generate incorrect values if len was greater than
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project8191 (8K - 1) due to the 'len << 3' on line 3 of SHA1Update().
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectSince the file IO in main() reads 16K at a time, any file 8K or
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectlarger would be guaranteed to generate the wrong hash (e.g.
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectTest Vector #3, a million "a"s).
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectI also changed the declaration of variables i & j in SHA1Update
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectto unsigned long from unsigned int for the same reason.
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectThese changes should make no difference to any 32 bit
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimplementations since an int and a long are the same size in
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectthose environments.
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project--
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectI also corrected a few compiler warnings generated by Borland
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectC.
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1. Added #include <process.h> for exit() prototype
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2. Removed unused variable 'j' in SHA1Final
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project3. Changed exit(0) to return(0) at end of main.
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectALL changes I made can be located by searching for comments
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcontaining 'JHB'
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project-----------------
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectModified 13 August 2000
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectBy Michael Paul Johnson <mpj@cryptography.org>
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectStill 100% Public Domain
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectChanged command line syntax, added feature to automatically
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcheck files against their previous SHA-1 check values, kind of
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectlike md5sum does. Added functions hexval, verifyfile,
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectand sha1file. Rewrote main().
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project-----------------
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectTest Vectors (from FIPS PUB 180-1)
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project"abc"
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectA million repetitions of "a"
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*/
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define SHA1HANDSOFF    /*Copies data before messing with it.*/
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*#define CMDLINE        * include main() and file processing */
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "sha1.h"
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include <stdio.h>
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include <string.h>
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef __BORLANDC__
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include <dir.h>
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include <dos.h>
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include <process.h>   /*  prototype for exit() - JHB
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project               needed for Win32, but chokes Linux - MPJ */
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define X_LITTLE_ENDIAN /* This should be #define'd if true.*/
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#else
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# include <unistd.h>
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# include <stdlib.h>
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project//# include <endian.h>
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "DexFile.h"    // want common byte ordering def
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# if __BYTE_ORDER == __LITTLE_ENDIAN
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#  define X_LITTLE_ENDIAN
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# endif
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include <ctype.h>
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define LINESIZE 2048
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void SHA1Transform(unsigned long state[5],
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const unsigned char buffer[64]);
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define rol(value,bits) \
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project (((value)<<(bits))|((value)>>(32-(bits))))
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* blk0() and blk() perform the initial expand. */
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* I got the idea of expanding during the round function from
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   SSLeay */
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef X_LITTLE_ENDIAN
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define blk0(i) (block->l[i]=(rol(block->l[i],24)&0xFF00FF00) \
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    |(rol(block->l[i],8)&0x00FF00FF))
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#else
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define blk0(i) block->l[i]
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ^block->l[(i+2)&15]^block->l[i&15],1))
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30);
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30);
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30);
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30);
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30);
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* Hash a single 512-bit block. This is the core of the algorithm. */
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void SHA1Transform(unsigned long state[5],
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const unsigned char buffer[64])
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectunsigned long a, b, c, d, e;
139bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirounion CHAR64LONG16 {
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    unsigned char c[64];
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    unsigned long l[16];
142bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro};
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectCHAR64LONG16* block;
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef SHA1HANDSOFF
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic unsigned char workspace[64];
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    block = (CHAR64LONG16*)workspace;
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    memcpy(block, buffer, 64);
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#else
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    block = (CHAR64LONG16*)buffer;
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Copy context->state[] to working vars */
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    a = state[0];
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b = state[1];
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    c = state[2];
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    d = state[3];
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    e = state[4];
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 4 rounds of 20 operations each. Loop unrolled. */
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2);
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    R0(c,d,e,a,b, 3); R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5);
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7); R0(c,d,e,a,b, 8);
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11);
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14);
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    R0(a,b,c,d,e,15); R1(e,a,b,c,d,16); R1(d,e,a,b,c,17);
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    R1(c,d,e,a,b,18); R1(b,c,d,e,a,19); R2(a,b,c,d,e,20);
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23);
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26);
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    R2(d,e,a,b,c,27); R2(c,d,e,a,b,28); R2(b,c,d,e,a,29);
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    R2(a,b,c,d,e,30); R2(e,a,b,c,d,31); R2(d,e,a,b,c,32);
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35);
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38);
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    R2(b,c,d,e,a,39); R3(a,b,c,d,e,40); R3(e,a,b,c,d,41);
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    R3(d,e,a,b,c,42); R3(c,d,e,a,b,43); R3(b,c,d,e,a,44);
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47);
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50);
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    R3(e,a,b,c,d,51); R3(d,e,a,b,c,52); R3(c,d,e,a,b,53);
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    R3(b,c,d,e,a,54); R3(a,b,c,d,e,55); R3(e,a,b,c,d,56);
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59);
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62);
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    R4(c,d,e,a,b,63); R4(b,c,d,e,a,64); R4(a,b,c,d,e,65);
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    R4(e,a,b,c,d,66); R4(d,e,a,b,c,67); R4(c,d,e,a,b,68);
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71);
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74);
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    R4(a,b,c,d,e,75); R4(e,a,b,c,d,76); R4(d,e,a,b,c,77);
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    R4(c,d,e,a,b,78); R4(b,c,d,e,a,79);
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Add the working vars back into context.state[] */
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    state[0] += a;
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    state[1] += b;
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    state[2] += c;
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    state[3] += d;
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    state[4] += e;
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Wipe variables */
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*    a = b = c = d = e = 0; Nice try, but the compiler
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectoptimizes this out, anyway, and it produces an annoying
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectwarning. */
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* SHA1Init - Initialize new context */
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid SHA1Init(SHA1_CTX* context)
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* SHA1 initialization constants */
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    context->state[0] = 0x67452301;
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    context->state[1] = 0xEFCDAB89;
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    context->state[2] = 0x98BADCFE;
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    context->state[3] = 0x10325476;
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    context->state[4] = 0xC3D2E1F0;
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    context->count[0] = context->count[1] = 0;
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* Run your data through this. */
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid SHA1Update(SHA1_CTX* context, const unsigned char* data,
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    unsigned long len)  /* JHB */
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    unsigned long i, j; /* JHB */
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    j = (context->count[0] >> 3) & 63;
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if ((context->count[0] += len << 3) < (len << 3))
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        context->count[1]++;
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    context->count[1] += (len >> 29);
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if ((j + len) > 63)
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        memcpy(&context->buffer[j], data, (i = 64-j));
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SHA1Transform(context->state, context->buffer);
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for ( ; i + 63 < len; i += 64) {
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            SHA1Transform(context->state, &data[i]);
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        j = 0;
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    else
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        i = 0;
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    memcpy(&context->buffer[j], &data[i], len - i);
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* Add padding and return the message digest. */
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid SHA1Final(unsigned char digest[HASHSIZE], SHA1_CTX*
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcontext)
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectunsigned long i;    /* JHB */
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectunsigned char finalcount[8];
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    for (i = 0; i < 8; i++)
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        finalcount[i] = (unsigned char)((context->count[(i>=4?
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            0:1)]>>((3-(i&3))*8))&255);
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /* Endian independent */
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SHA1Update(context, (unsigned char *)"\200", 1);
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    while ((context->count[0] & 504) != 448) {
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SHA1Update(context, (unsigned char *)"\0", 1);
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SHA1Update(context, finalcount, 8);
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Should cause a SHA1Transform() */
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    for (i = 0; i < HASHSIZE; i++) {
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        digest[i] = (unsigned char)
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         ((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255);
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Wipe variables */
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    memset(context->buffer, 0, 64);
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    memset(context->state, 0, HASHSIZE);
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    memset(context->count, 0, 8);
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    memset(&finalcount, 0, 8);
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef SHA1HANDSOFF
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* make SHA1Transform overwrite it's own static vars */
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SHA1Transform(context->state, context->buffer);
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef CMDLINE
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* sha1file computes the SHA-1 hash of the named file and puts
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   it in the 20-byte array digest. If fname is NULL, stdin is
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   assumed.
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*/
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid sha1file(char *fname, unsigned char* digest)
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int bytesread;
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SHA1_CTX context;
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    unsigned char buffer[16384];
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FILE* f;
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (fname)
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        f = fopen(fname, "rb");
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!f)
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fprintf(stderr, "Can't open %s\n", fname);
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            memset(digest, 0, HASHSIZE);
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return;
297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    else
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        f = stdin;
302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SHA1Init(&context);
304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    while (!feof(f))
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        bytesread = fread(buffer, 1, 16384, f);
307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SHA1Update(&context, buffer, bytesread);
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SHA1Final(digest, &context);
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (fname)
311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        fclose(f);
312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* Convert ASCII hexidecimal digit to 4-bit value. */
315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectunsigned char hexval(char c)
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    unsigned char h;
318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    c = toupper(c);
320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (c >= 'A')
321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        h = c - 'A' + 10;
322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    else
323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        h = c - '0';
324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return h;
325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* Verify a file created with sha1sum by redirecting output
328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project   to a file. */
329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectint verifyfile(char *fname)
330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int j, k;
332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int found = 0;
333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    unsigned char digest[HASHSIZE];
334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    unsigned char expected_digest[HASHSIZE];
335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FILE *checkfile;
336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    char checkline[LINESIZE];
337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    char *s;
338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    unsigned char err;
339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    checkfile = fopen(fname, "rt");
341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (!checkfile)
342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        fprintf(stderr, "Can't open %s\n", fname);
344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return(0);
345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    do
347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        s = fgets(checkline, LINESIZE, checkfile);
349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (s)
350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if ((strlen(checkline)>26)&&
352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                1 /*(!strncmp(checkline,"SHA1=", 5))*/)
353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            {
354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                /* Overwrite newline. */
355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                checkline[strlen(checkline)-1]=0;
356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                found = 1;
357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                /* Read expected check value. */
359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                for (k=0, j=5; k < HASHSIZE; k++)
360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                {
361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    expected_digest[k]=hexval(checkline[j++]);
362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    expected_digest[k]=(expected_digest[k]<<4)
363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        +hexval(checkline[j++]);
364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                /* Compute fingerprints */
367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                s = checkline+46;
368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                sha1file(s, digest);
369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                /* Compare fingerprints */
371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                err = 0;
372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                for (k=0; k<HASHSIZE; k++)
373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    err |= digest[k]-
374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        expected_digest[k];
375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (err)
376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                {
377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    fprintf(stderr, "FAILED: %s\n"
378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        " EXPECTED: ", s);
379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    for (k=0; k<HASHSIZE; k++)
380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        fprintf(stderr, "%02X",
381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            expected_digest[k]);
382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    fprintf(stderr,"\n    FOUND: ");
383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    for (k=0; k<HASHSIZE; k++)
384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        fprintf(stderr, "%02X", digest[k]);
385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    fprintf(stderr, "\n");
386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                else
388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                {
389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    printf("OK: %s\n", s);
390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    } while (s);
394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return found;
395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid syntax(char *progname)
400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    printf("\nsyntax:\n"
402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     "%s [-c|-h][-q] file name[s]\n"
403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     "    -c = check files against previous check values\n"
404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     "    -g = generate SHA-1 check values (default action)\n"
405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     "    -h = display this help\n"
406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     "For example,\n"
407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     "sha1sum test.txt > check.txt\n"
408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     "generates check value for test.txt in check.txt, and\n"
409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     "sha1sum -c check.txt\n"
410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     "checks test.txt against the check value in check.txt\n",
411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     progname);
412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    exit(1);
413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**********************************************************/
417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectint main(int argc, char** argv)
419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int i, j, k;
421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int check = 0;
422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int found = 0;
423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    unsigned char digest[HASHSIZE];
424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    unsigned char expected_digest[HASHSIZE];
425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FILE *checkfile;
426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    char checkline[LINESIZE];
427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    char *s;
428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef __BORLANDC__
429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    struct ffblk f;
430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int done;
431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    char path[MAXPATH];
432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    char drive[MAXDRIVE];
433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    char dir[MAXDIR];
434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    char name[MAXFILE];
435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    char ext[MAXEXT];
436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    unsigned char err;
438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    for (i = 1; i < argc; i++)
440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (argv[i][0] == '-')
442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            switch (argv[i][1])
444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            {
445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                case 'c':
446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                case 'C':
447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    check = 1;
448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    break;
449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                case 'g':
450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                case 'G':
451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    check = 0;
452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    break;
453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                default:
454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    syntax(argv[0]);
455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    for (i=1; i<argc; i++)
460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (argv[i][0] != '-')
462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef __BORLANDC__
464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fnsplit(argv[i], drive, dir, name, ext);
465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            done = findfirst(argv[i], &f, FA_RDONLY |
466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                FA_HIDDEN|FA_SYSTEM|FA_ARCH);
467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             while (!done)
468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            {
469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                sprintf(path, "%s%s%s", drive, dir, f.ff_name);
470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                s = path;
471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#else
472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                s = argv[i];
473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (check)
476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                {   /* Check fingerprint file. */
477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    found |= verifyfile(s);
478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                else
480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                {   /* Generate fingerprints & write to
481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                       stdout. */
482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    sha1file(s, digest);
483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    //printf("SHA1=");
484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    for (j=0; j<HASHSIZE; j++)
485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        printf("%02x", digest[j]);
486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    printf("  %s\n", s);
487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    found = 1;
488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef __BORLANDC__
491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                done = findnext(&f);
492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (!found)
498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (check)
500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fprintf(stderr,
502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                "No SHA1 lines found in %s\n",
503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                argv[i]);
504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        else
506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fprintf(stderr, "No files checked.\n");
508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            syntax(argv[0]);
509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return(0);  /* JHB */
512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif  /*CMDLINE*/
515