1 /* $Id: md5sum.cc,v 1.4 2004/06/20 20:35:15 atterer Exp $ -*- C++ -*-
3 |_) /| Copyright (C) 2000-2004 | richard@
4 | \/¯| Richard Atterer | atterer.net
6 "Ported" to C++ by RA. Uses glibc code for the actual algorithm.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License, version 2. See
10 the file COPYING for details.
12 Quite secure 128-bit checksum
21 #include <glibc-md5.hh>
24 //______________________________________________________________________
26 void MD5Sum::ProgressReporter::error(const string& message) {
27 cerr << message << endl;
29 void MD5Sum::ProgressReporter::info(const string& message) {
30 cerr << message << endl;
32 void MD5Sum::ProgressReporter::readingMD5(uint64, uint64) { }
34 MD5Sum::ProgressReporter MD5Sum::noReport;
35 //______________________________________________________________________
37 MD5Sum::MD5Sum(const MD5Sum& md) {
40 for (int i = 0; i < 16; ++i) sum[i] = md.sum[i];
46 //________________________________________
48 // NB must work with self-assign
49 MD5Sum& MD5Sum::operator=(const MD5Sum& md) {
51 finished = md.finished;
56 for (int i = 0; i < 16; ++i) sum[i] = md.sum[i];
58 if (p == 0) p = new md5_ctx();
63 //______________________________________________________________________
65 string MD5::toString() const {
67 m.write(sum, 16).flush();
70 //______________________________________________________________________
72 bool MD5::operator_less2(const MD5& x) const {
73 if (sum[1] < x.sum[1]) return true;
74 if (sum[1] > x.sum[1]) return false;
75 if (sum[2] < x.sum[2]) return true;
76 if (sum[2] > x.sum[2]) return false;
77 if (sum[3] < x.sum[3]) return true;
78 if (sum[3] > x.sum[3]) return false;
79 if (sum[4] < x.sum[4]) return true;
80 if (sum[4] > x.sum[4]) return false;
81 if (sum[5] < x.sum[5]) return true;
82 if (sum[5] > x.sum[5]) return false;
83 if (sum[6] < x.sum[6]) return true;
84 if (sum[6] > x.sum[6]) return false;
85 if (sum[7] < x.sum[7]) return true;
86 if (sum[7] > x.sum[7]) return false;
87 if (sum[8] < x.sum[8]) return true;
88 if (sum[8] > x.sum[8]) return false;
89 if (sum[9] < x.sum[9]) return true;
90 if (sum[9] > x.sum[9]) return false;
91 if (sum[10] < x.sum[10]) return true;
92 if (sum[10] > x.sum[10]) return false;
93 if (sum[11] < x.sum[11]) return true;
94 if (sum[11] > x.sum[11]) return false;
95 if (sum[12] < x.sum[12]) return true;
96 if (sum[12] > x.sum[12]) return false;
97 if (sum[13] < x.sum[13]) return true;
98 if (sum[13] > x.sum[13]) return false;
99 if (sum[14] < x.sum[14]) return true;
100 if (sum[14] > x.sum[14]) return false;
101 if (sum[15] < x.sum[15]) return true;
104 //______________________________________________________________________
106 uint64 MD5Sum::updateFromStream(bistream& s, uint64 size, size_t bufSize,
107 ProgressReporter& pr) {
108 uint64 nextReport = REPORT_INTERVAL; // When next to call reporter
109 uint64 toRead = size;
110 uint64 bytesRead = 0;
112 buffer.resize(bufSize);
113 byte* buf = &buffer[0];
114 // Read from stream and update *this
115 while (s && !s.eof() && toRead > 0) {
116 size_t n = (toRead < bufSize ? toRead : bufSize);
117 readBytes(s, buf, n);
122 if (bytesRead >= nextReport) {
123 pr.readingMD5(bytesRead, size);
124 nextReport += REPORT_INTERVAL;