dgst.c revision 55714
1/* apps/dgst.c */ 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 3 * All rights reserved. 4 * 5 * This package is an SSL implementation written 6 * by Eric Young (eay@cryptsoft.com). 7 * The implementation was written so as to conform with Netscapes SSL. 8 * 9 * This library is free for commercial and non-commercial use as long as 10 * the following conditions are aheared to. The following conditions 11 * apply to all code found in this distribution, be it the RC4, RSA, 12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation 13 * included with this distribution is covered by the same copyright terms 14 * except that the holder is Tim Hudson (tjh@cryptsoft.com). 15 * 16 * Copyright remains Eric Young's, and as such any Copyright notices in 17 * the code are not to be removed. 18 * If this package is used in a product, Eric Young should be given attribution 19 * as the author of the parts of the library used. 20 * This can be in the form of a textual message at program startup or 21 * in documentation (online or textual) provided with the package. 22 * 23 * Redistribution and use in source and binary forms, with or without 24 * modification, are permitted provided that the following conditions 25 * are met: 26 * 1. Redistributions of source code must retain the copyright 27 * notice, this list of conditions and the following disclaimer. 28 * 2. Redistributions in binary form must reproduce the above copyright 29 * notice, this list of conditions and the following disclaimer in the 30 * documentation and/or other materials provided with the distribution. 31 * 3. All advertising materials mentioning features or use of this software 32 * must display the following acknowledgement: 33 * "This product includes cryptographic software written by 34 * Eric Young (eay@cryptsoft.com)" 35 * The word 'cryptographic' can be left out if the rouines from the library 36 * being used are not cryptographic related :-). 37 * 4. If you include any Windows specific code (or a derivative thereof) from 38 * the apps directory (application code) you must include an acknowledgement: 39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 40 * 41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 51 * SUCH DAMAGE. 52 * 53 * The licence and distribution terms for any publically available version or 54 * derivative of this code cannot be changed. i.e. this code cannot simply be 55 * copied and put under another distribution licence 56 * [including the GNU Public Licence.] 57 */ 58 59#include <stdio.h> 60#include <string.h> 61#include <stdlib.h> 62#include "apps.h" 63#include <openssl/bio.h> 64#include <openssl/err.h> 65#include <openssl/evp.h> 66#include <openssl/objects.h> 67#include <openssl/x509.h> 68#include <openssl/pem.h> 69 70#undef BUFSIZE 71#define BUFSIZE 1024*8 72 73#undef PROG 74#define PROG dgst_main 75 76void do_fp(unsigned char *buf,BIO *f,int sep); 77int MAIN(int argc, char **argv) 78 { 79 unsigned char *buf=NULL; 80 int i,err=0; 81 const EVP_MD *md=NULL,*m; 82 BIO *in=NULL,*inp; 83 BIO *bmd=NULL; 84 const char *name; 85#define PROG_NAME_SIZE 16 86 char pname[PROG_NAME_SIZE]; 87 int separator=0; 88 int debug=0; 89 90 apps_startup(); 91 92 if ((buf=(unsigned char *)Malloc(BUFSIZE)) == NULL) 93 { 94 BIO_printf(bio_err,"out of memory\n"); 95 goto end; 96 } 97 if (bio_err == NULL) 98 if ((bio_err=BIO_new(BIO_s_file())) != NULL) 99 BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT); 100 101 /* first check the program name */ 102 program_name(argv[0],pname,PROG_NAME_SIZE); 103 104 md=EVP_get_digestbyname(pname); 105 106 argc--; 107 argv++; 108 while (argc > 0) 109 { 110 if ((*argv)[0] != '-') break; 111 if (strcmp(*argv,"-c") == 0) 112 separator=1; 113 else if (strcmp(*argv,"-d") == 0) 114 debug=1; 115 else if ((m=EVP_get_digestbyname(&((*argv)[1]))) != NULL) 116 md=m; 117 else 118 break; 119 argc--; 120 argv++; 121 } 122 123 if (md == NULL) 124 md=EVP_md5(); 125 126 if ((argc > 0) && (argv[0][0] == '-')) /* bad option */ 127 { 128 BIO_printf(bio_err,"unknown option '%s'\n",*argv); 129 BIO_printf(bio_err,"options are\n"); 130 BIO_printf(bio_err,"-c to output the digest with separating colons\n"); 131 BIO_printf(bio_err,"-d to output debug info\n"); 132 BIO_printf(bio_err,"-%3s to use the %s message digest algorithm (default)\n", 133 LN_md5,LN_md5); 134 BIO_printf(bio_err,"-%3s to use the %s message digest algorithm\n", 135 LN_md2,LN_md2); 136 BIO_printf(bio_err,"-%3s to use the %s message digest algorithm\n", 137 LN_sha1,LN_sha1); 138 BIO_printf(bio_err,"-%3s to use the %s message digest algorithm\n", 139 LN_sha,LN_sha); 140 BIO_printf(bio_err,"-%3s to use the %s message digest algorithm\n", 141 LN_mdc2,LN_mdc2); 142 BIO_printf(bio_err,"-%3s to use the %s message digest algorithm\n", 143 LN_ripemd160,LN_ripemd160); 144 err=1; 145 goto end; 146 } 147 148 in=BIO_new(BIO_s_file()); 149 bmd=BIO_new(BIO_f_md()); 150 if (debug) 151 { 152 BIO_set_callback(in,BIO_debug_callback); 153 /* needed for windows 3.1 */ 154 BIO_set_callback_arg(in,bio_err); 155 } 156 157 if ((in == NULL) || (bmd == NULL)) 158 { 159 ERR_print_errors(bio_err); 160 goto end; 161 } 162 163 /* we use md as a filter, reading from 'in' */ 164 BIO_set_md(bmd,md); 165 inp=BIO_push(bmd,in); 166 167 if (argc == 0) 168 { 169 BIO_set_fp(in,stdin,BIO_NOCLOSE); 170 do_fp(buf,inp,separator); 171 } 172 else 173 { 174 name=OBJ_nid2sn(md->type); 175 for (i=0; i<argc; i++) 176 { 177 if (BIO_read_filename(in,argv[i]) <= 0) 178 { 179 perror(argv[i]); 180 err++; 181 continue; 182 } 183 printf("%s(%s)= ",name,argv[i]); 184 do_fp(buf,inp,separator); 185 (void)BIO_reset(bmd); 186 } 187 } 188end: 189 if (buf != NULL) 190 { 191 memset(buf,0,BUFSIZE); 192 Free(buf); 193 } 194 if (in != NULL) BIO_free(in); 195 if (bmd != NULL) BIO_free(bmd); 196 EXIT(err); 197 } 198 199void do_fp(unsigned char *buf, BIO *bp, int sep) 200 { 201 int len; 202 int i; 203 204 for (;;) 205 { 206 i=BIO_read(bp,(char *)buf,BUFSIZE); 207 if (i <= 0) break; 208 } 209 len=BIO_gets(bp,(char *)buf,BUFSIZE); 210 211 for (i=0; i<len; i++) 212 { 213 if (sep && (i != 0)) 214 putc(':',stdout); 215 printf("%02x",buf[i]); 216 } 217 printf("\n"); 218 } 219 220