source: trunk/programs/hash/sha2sum.c @ 1122

Revision 1122, 4.0 KB checked in by paul, 6 months ago (diff)
  • Lots of minimal changes to better support WINCE as a build target
Line 
1/*
2 *  sha2sum demonstration program
3 *
4 *  Copyright (C) 2006-2011, Brainspark B.V.
5 *
6 *  This file is part of PolarSSL (http://www.polarssl.org)
7 *  Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
8 *
9 *  All rights reserved.
10 *
11 *  This program is free software; you can redistribute it and/or modify
12 *  it under the terms of the GNU General Public License as published by
13 *  the Free Software Foundation; either version 2 of the License, or
14 *  (at your option) any later version.
15 *
16 *  This program is distributed in the hope that it will be useful,
17 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
18 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 *  GNU General Public License for more details.
20 *
21 *  You should have received a copy of the GNU General Public License along
22 *  with this program; if not, write to the Free Software Foundation, Inc.,
23 *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 */
25
26#ifndef _CRT_SECURE_NO_DEPRECATE
27#define _CRT_SECURE_NO_DEPRECATE 1
28#endif
29
30#include <string.h>
31#include <stdio.h>
32
33#include "polarssl/config.h"
34
35#include "polarssl/sha2.h"
36
37#if !defined(POLARSSL_SHA2_C) || !defined(POLARSSL_FS_IO)
38int main( int argc, char *argv[] )
39{
40    ((void) argc);
41    ((void) argv);
42
43    printf("POLARSSL_SHA2_C and/or POLARSSL_FS_IO not defined.\n");
44    return( 0 );
45}
46#else
47static int sha2_wrapper( char *filename, unsigned char *sum )
48{
49    int ret = sha2_file( filename, sum, 0 );
50
51    if( ret == 1 )
52        fprintf( stderr, "failed to open: %s\n", filename );
53
54    if( ret == 2 )
55        fprintf( stderr, "failed to read: %s\n", filename );
56
57    return( ret );
58}
59
60static int sha2_print( char *filename )
61{
62    int i;
63    unsigned char sum[32];
64
65    if( sha2_wrapper( filename, sum ) != 0 )
66        return( 1 );
67
68    for( i = 0; i < 32; i++ )
69        printf( "%02x", sum[i] );
70
71    printf( "  %s\n", filename );
72    return( 0 );
73}
74
75static int sha2_check( char *filename )
76{
77    int i;
78    size_t n;
79    FILE *f;
80    int nb_err1, nb_err2;
81    int nb_tot1, nb_tot2;
82    unsigned char sum[32];
83    char buf[65], line[1024];
84
85    if( ( f = fopen( filename, "rb" ) ) == NULL )
86    {
87        printf( "failed to open: %s\n", filename );
88        return( 1 );
89    }
90
91    nb_err1 = nb_err2 = 0;
92    nb_tot1 = nb_tot2 = 0;
93
94    memset( line, 0, sizeof( line ) );
95
96    n = sizeof( line );
97
98    while( fgets( line, (int) n - 1, f ) != NULL )
99    {
100        n = strlen( line );
101
102        if( n < 68 )
103            continue;
104
105        if( line[64] != ' ' || line[65] != ' ' )
106            continue;
107
108        if( line[n - 1] == '\n' ) { n--; line[n] = '\0'; }
109        if( line[n - 1] == '\r' ) { n--; line[n] = '\0'; }
110
111        nb_tot1++;
112
113        if( sha2_wrapper( line + 66, sum ) != 0 )
114        {
115            nb_err1++;
116            continue;
117        }
118
119        nb_tot2++;
120
121        for( i = 0; i < 32; i++ )
122            sprintf( buf + i * 2, "%02x", sum[i] );
123
124        if( memcmp( line, buf, 64 ) != 0 )
125        {
126            nb_err2++;
127            fprintf( stderr, "wrong checksum: %s\n", line + 66 );
128        }
129
130        n = sizeof( line );
131    }
132
133    if( nb_err1 != 0 )
134    {
135        printf( "WARNING: %d (out of %d) input files could "
136                "not be read\n", nb_err1, nb_tot1 );
137    }
138
139    if( nb_err2 != 0 )
140    {
141        printf( "WARNING: %d (out of %d) computed checksums did "
142                "not match\n", nb_err2, nb_tot2 );
143    }
144
145    return( nb_err1 != 0 || nb_err2 != 0 );
146}
147
148int main( int argc, char *argv[] )
149{
150    int ret, i;
151
152    if( argc == 1 )
153    {
154        printf( "print mode:  sha2sum <file> <file> ...\n" );
155        printf( "check mode:  sha2sum -c <checksum file>\n" );
156
157#if defined(_WIN32)
158        printf( "\n  Press Enter to exit this program.\n" );
159        fflush( stdout ); getchar();
160#endif
161
162        return( 1 );
163    }
164
165    if( argc == 3 && strcmp( "-c", argv[1] ) == 0 )
166        return( sha2_check( argv[2] ) );
167
168    ret = 0;
169    for( i = 1; i < argc; i++ )
170        ret |= sha2_print( argv[i] );
171
172    return( ret );
173}
174#endif /* POLARSSL_SHA2_C && POLARSSL_FS_IO */
Note: See TracBrowser for help on using the repository browser.

What are you looking for?