|
|
1.1.1.8 ! root 1: /* mdfile.c - Message Digest routines for PGP. ! 2: PGP: Pretty Good(tm) Privacy - public key cryptography for the masses. ! 3: ! 4: (c) Copyright 1990-1996 by Philip Zimmermann. All rights reserved. ! 5: The author assumes no liability for damages resulting from the use ! 6: of this software, even if the damage results from defects in this ! 7: software. No warranty is expressed or implied. ! 8: ! 9: Note that while most PGP source modules bear Philip Zimmermann's ! 10: copyright notice, many of them have been revised or entirely written ! 11: by contributors who frequently failed to put their names in their ! 12: code. Code that has been incorporated into PGP from other authors ! 13: was either originally published in the public domain or is used with ! 14: permission from the various authors. ! 15: ! 16: PGP is available for free to the public under certain restrictions. ! 17: See the PGP User's Guide (included in the release package) for ! 18: important information about licensing, patent restrictions on ! 19: certain algorithms, trademarks, copyrights, and export controls. ! 20: */ ! 21: ! 22: #include <stdio.h> ! 23: #include "mpilib.h" ! 24: #include "mdfile.h" ! 25: #include "fileio.h" ! 26: #include "language.h" ! 27: #include "pgp.h" ! 28: #ifdef MACTC5 ! 29: #include "Macutil3.h" ! 30: #endif ! 31: ! 32: /* Begin MD5 routines */ ! 33: ! 34: /* Note - the routines in this module, except for MD_addbuffer, ! 35: * do not "finish" the MD5 calculation. MD_addbuffer finishes the ! 36: * calculation in each case, usually to append the timestamp and class info. ! 37: */ ! 38: ! 39: /* Computes the message digest for a file from current position for ! 40: longcount bytes. ! 41: Uses the RSA Data Security Inc. MD5 Message Digest Algorithm */ ! 42: int MDfile0_len(struct MD5Context *mdContext, FILE * f, word32 longcount) ! 43: { ! 44: int bytecount; ! 45: unsigned char buffer[1024]; ! 46: ! 47: MD5Init(mdContext); ! 48: /* Process 1024 bytes at a time... */ ! 49: do { ! 50: if (longcount < (word32) 1024) ! 51: bytecount = (int) longcount; ! 52: else ! 53: bytecount = 1024; ! 54: bytecount = fread(buffer, 1, bytecount, f); ! 55: if (bytecount > 0) { ! 56: MD5Update(mdContext, buffer, bytecount); ! 57: longcount -= bytecount; ! 58: #ifdef MACTC5 ! 59: mac_poll_for_break(); ! 60: #endif ! 61: } ! 62: /* if text block was short, exit loop */ ! 63: } while (bytecount == 1024); ! 64: return 0; ! 65: } /* MDfile0_len */ ! 66: ! 67: ! 68: /* Computes the message digest for a file from current position to EOF. ! 69: Uses the RSA Data Security Inc. MD5 Message Digest Algorithm */ ! 70: ! 71: static int MDfile0(struct MD5Context *mdContext, FILE * inFile) ! 72: { ! 73: int bytes; ! 74: unsigned char buffer[1024]; ! 75: ! 76: MD5Init(mdContext); ! 77: while ((bytes = fread(buffer, 1, 1024, inFile)) != 0) ! 78: #ifdef MACTC5 ! 79: { ! 80: mac_poll_for_break(); ! 81: MD5Update(mdContext,buffer,bytes); ! 82: } ! 83: #else ! 84: MD5Update(mdContext, buffer, bytes); ! 85: #endif ! 86: return 0; ! 87: } ! 88: ! 89: /* Computes the message digest for a specified file */ ! 90: ! 91: int MDfile(struct MD5Context *mdContext, char *filename) ! 92: { ! 93: FILE *inFile; ! 94: inFile = fopen(filename, FOPRBIN); ! 95: ! 96: if (inFile == NULL) { ! 97: fprintf(pgpout, LANG("\n\007Can't open file '%s'\n"), filename); ! 98: return -1; ! 99: } ! 100: MDfile0(mdContext, inFile); ! 101: fclose(inFile); ! 102: return 0; ! 103: } ! 104: ! 105: /* Add a buffer's worth of data to the MD5 computation. If a digest ! 106: * pointer is supplied, complete the computation and write the digest. ! 107: */ ! 108: void MD_addbuffer(struct MD5Context *mdContext, byte * buf, int buflen, ! 109: byte digest[16]) ! 110: { ! 111: MD5Update(mdContext, buf, buflen); ! 112: if (digest) { ! 113: MD5Final(digest, mdContext); ! 114: burn(*mdContext); /* Paranoia */ ! 115: } ! 116: } ! 117: ! 118: /* End MD5 routines */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.