home *** CD-ROM | disk | FTP | other *** search
/ PC-Online 1998 February / PCOnline_02_1998.iso / filesbbs / os2 / pgp263.arj / PGP263I.SRC / PGP263II.ZIP / src / mdfile.c < prev    next >
C/C++ Source or Header  |  1996-01-02  |  4KB  |  119 lines

  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 */
  119.