|
|
1.1.1.7 ! root 1: /* mdfile.c - Message Digest routines for PGP. ! 2: PGP: Pretty Good(tm) Privacy - public key cryptography for the masses. 1.1.1.6 root 3: 1.1.1.7 ! root 4: (c) Copyright 1990-1994 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: */ 1.1.1.6 root 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: 29: /* Begin MD5 routines */ 30: 31: /* Note - the routines in this module, except for MD_addbuffer, 32: * do not "finish" the MD5 calculation. MD_addbuffer finishes the 33: * calculation in each case, usually to append the timestamp and class info. 34: */ 35: 36: /* Computes the message digest for a file from current position for 37: longcount bytes. 38: Uses the RSA Data Security Inc. MD5 Message Digest Algorithm */ 1.1.1.7 ! root 39: int MDfile0_len(struct MD5Context *mdContext, FILE * f, word32 longcount) 1.1.1.6 root 40: { 1.1.1.7 ! root 41: int bytecount; ! 42: unsigned char buffer[1024]; 1.1.1.6 root 43: 1.1.1.7 ! root 44: MD5Init(mdContext); ! 45: /* Process 1024 bytes at a time... */ ! 46: do { ! 47: if (longcount < (word32) 1024) ! 48: bytecount = (int) longcount; ! 49: else ! 50: bytecount = 1024; ! 51: bytecount = fread(buffer, 1, bytecount, f); ! 52: if (bytecount > 0) { ! 53: MD5Update(mdContext, buffer, bytecount); ! 54: longcount -= bytecount; ! 55: } ! 56: /* if text block was short, exit loop */ ! 57: } while (bytecount == 1024); ! 58: return 0; ! 59: } /* MDfile0_len */ 1.1.1.6 root 60: 61: 62: /* Computes the message digest for a file from current position to EOF. 63: Uses the RSA Data Security Inc. MD5 Message Digest Algorithm */ 64: 1.1.1.7 ! root 65: static int MDfile0(struct MD5Context *mdContext, FILE * inFile) 1.1.1.6 root 66: { 1.1.1.7 ! root 67: int bytes; ! 68: unsigned char buffer[1024]; 1.1.1.6 root 69: 1.1.1.7 ! root 70: MD5Init(mdContext); ! 71: while ((bytes = fread(buffer, 1, 1024, inFile)) != 0) ! 72: MD5Update(mdContext, buffer, bytes); ! 73: return 0; 1.1.1.6 root 74: } 75: 76: /* Computes the message digest for a specified file */ 77: 1.1.1.7 ! root 78: int MDfile(struct MD5Context *mdContext, char *filename) 1.1.1.6 root 79: { 1.1.1.7 ! root 80: FILE *inFile; ! 81: inFile = fopen(filename, FOPRBIN); 1.1.1.6 root 82: 1.1.1.7 ! root 83: if (inFile == NULL) { ! 84: fprintf(pgpout, LANG("\n\007Can't open file '%s'\n"), filename); ! 85: return -1; ! 86: } ! 87: MDfile0(mdContext, inFile); ! 88: fclose(inFile); ! 89: return 0; 1.1.1.6 root 90: } 91: 92: /* Add a buffer's worth of data to the MD5 computation. If a digest 93: * pointer is supplied, complete the computation and write the digest. 94: */ 1.1.1.7 ! root 95: void MD_addbuffer(struct MD5Context *mdContext, byte * buf, int buflen, ! 96: byte digest[16]) 1.1.1.6 root 97: { 1.1.1.7 ! root 98: MD5Update(mdContext, buf, buflen); ! 99: if (digest) { ! 100: MD5Final(digest, mdContext); ! 101: burn(*mdContext); /* Paranoia */ ! 102: } 1.1.1.6 root 103: } 104: 105: /* End MD5 routines */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.