2 * Copyright (c) 2004 Max Bowsher
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * A copy of the GNU General Public License can be found at
12 * Written by Max Bowsher
22 MD5Sum::MD5Sum(const MD5Sum
& source
)
28 MD5Sum::operator= (const MD5Sum
& source
)
31 memcpy(digest
, source
.digest
, sizeof(digest
));
33 if (source
.internalData
)
35 internalData
= new gcry_md_hd_t
;
36 *internalData
= *(source
.internalData
);
43 if (internalData
) delete internalData
;
47 MD5Sum::set(const unsigned char digest
[16])
49 memcpy(this->digest
, digest
, sizeof(this->digest
));
51 if (internalData
) delete internalData
;
57 if (internalData
) delete internalData
;
58 internalData
= new gcry_md_hd_t
;
60 gcry_md_open(internalData
, GCRY_MD_MD5
, 0);
64 MD5Sum::append(const unsigned char* data
, int nbytes
)
67 throw new std::logic_error("MD5Sum::append() called on an object not "
68 "in the 'Accumulating' state");
69 gcry_md_write(*internalData
, data
, nbytes
);
76 throw new std::logic_error("MD5Sum::finish() called on an object not "
77 "in the 'Accumulating' state");
78 memcpy(digest
, gcry_md_read(*internalData
, GCRY_MD_MD5
), 16);
80 delete internalData
; internalData
= 0;
86 std::ostringstream hexdigest
;
88 for (int i
=0; i
<16; ++i
)
89 hexdigest
<< std::hex
<< std::setfill('0') << std::setw(2)
90 << static_cast<unsigned int>(digest
[i
]);
91 return hexdigest
.str();
95 MD5Sum::operator == (const MD5Sum
& other
) const
97 if (state
!= Set
|| other
.state
!= Set
)
98 throw new std::logic_error("MD5Sum comparison attempted on operands not "
99 "in the 'Set' state");
100 return (memcmp(digest
, other
.digest
, sizeof(digest
)) == 0);