rearrange md5 code for sharing. update shared smallut

This commit is contained in:
Jean-Francois Dockes 2018-11-06 09:46:05 +01:00
parent 2fb61f2583
commit 1d62b50c7e
6 changed files with 80 additions and 130 deletions

View File

@ -17,9 +17,6 @@
* will fill a supplied 16-byte array with the digest.
*/
#include "autoconfig.h"
//#include <compat.h>
#include "md5.h"
#include <string.h>
@ -47,6 +44,9 @@ static uint8_t PADDING[MD5_BLOCK_LENGTH] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
static void MD5Pad(MD5_CTX *);
static void MD5Transform(uint32_t [4], const uint8_t [MD5_BLOCK_LENGTH]);
/*
* Start MD5 accumulation. Set bit count to 0 and buffer to mysterious
* initialization constants.
@ -103,7 +103,7 @@ MD5Update(MD5_CTX *ctx, const unsigned char *input, size_t len)
* Pad pad to 64-byte boundary with the bit pattern
* 1 0* (64-bit count of bits processed, MSB-first)
*/
void
static void
MD5Pad(MD5_CTX *ctx)
{
uint8_t count[8];
@ -155,7 +155,7 @@ MD5Final(unsigned char digest[MD5_DIGEST_LENGTH], MD5_CTX *ctx)
* reflect the addition of 16 longwords of new data. MD5Update blocks
* the data and converts bytes into longwords for this routine.
*/
void
static void
MD5Transform(uint32_t state[4], const uint8_t block[MD5_BLOCK_LENGTH])
{
uint32_t a, b, c, d, in[MD5_BLOCK_LENGTH / 4];
@ -250,3 +250,52 @@ MD5Transform(uint32_t state[4], const uint8_t block[MD5_BLOCK_LENGTH])
state[2] += c;
state[3] += d;
}
// C++ utilities
using std::string;
void MD5Final(string &digest, MD5_CTX *context)
{
unsigned char d[16];
MD5Final (d, context);
digest.assign((const char *)d, 16);
}
string& MD5String(const string& data, string& digest)
{
MD5_CTX ctx;
MD5Init(&ctx);
MD5Update(&ctx, (const unsigned char*)data.c_str(), data.length());
MD5Final(digest, &ctx);
return digest;
}
string& MD5HexPrint(const string& digest, string &out)
{
out.erase();
out.reserve(33);
static const char hex[]="0123456789abcdef";
const unsigned char *hash = (const unsigned char *)digest.c_str();
for (int i = 0; i < 16; i++) {
out.append(1, hex[hash[i] >> 4]);
out.append(1, hex[hash[i] & 0x0f]);
}
return out;
}
string& MD5HexScan(const string& xdigest, string& digest)
{
digest.erase();
if (xdigest.length() != 32) {
return digest;
}
for (unsigned int i = 0; i < 16; i++) {
unsigned int val;
if (sscanf(xdigest.c_str() + 2*i, "%2x", &val) != 1) {
digest.erase();
return digest;
}
digest.append(1, (unsigned char)val);
}
return digest;
}

View File

@ -30,8 +30,13 @@ typedef struct MD5Context {
void MD5Init(MD5_CTX *);
void MD5Update(MD5_CTX *, const uint8_t *, size_t);
void MD5Pad(MD5_CTX *);
void MD5Final(uint8_t [MD5_DIGEST_LENGTH], MD5_CTX *);
void MD5Transform(uint32_t [4], const uint8_t [MD5_BLOCK_LENGTH]);
/** md5 c++ utility wrappers */
#include <string>
extern void MD5Final(std::string& digest, MD5_CTX *);
extern std::string& MD5String(const std::string& data, std::string& digest);
extern std::string& MD5HexPrint(const std::string& digest, std::string& xdigest);
extern std::string& MD5HexScan(const std::string& xdigest, std::string& digest);
#endif /* _MD5_H_ */

View File

@ -14,8 +14,6 @@
* Free Software Foundation, Inc.,
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef TEST_MD5
#include "autoconfig.h"
#include <stdio.h>
@ -23,54 +21,10 @@
#include "md5ut.h"
/* Convenience utilities */
void MD5Final(string &digest, MD5_CTX *context)
{
unsigned char d[16];
MD5Final (d, context);
digest.assign((const char *)d, 16);
}
string& MD5String(const string& data, string& digest)
{
MD5_CTX ctx;
MD5Init(&ctx);
MD5Update(&ctx, (const unsigned char*)data.c_str(), data.length());
MD5Final(digest, &ctx);
return digest;
}
string& MD5HexPrint(const string& digest, string &out)
{
out.erase();
out.reserve(33);
static const char hex[]="0123456789abcdef";
const unsigned char *hash = (const unsigned char *)digest.c_str();
for (int i = 0; i < 16; i++) {
out.append(1, hex[hash[i] >> 4]);
out.append(1, hex[hash[i] & 0x0f]);
}
return out;
}
string& MD5HexScan(const string& xdigest, string& digest)
{
digest.erase();
if (xdigest.length() != 32) {
return digest;
}
for (unsigned int i = 0; i < 16; i++) {
unsigned int val;
if (sscanf(xdigest.c_str() + 2*i, "%2x", &val) != 1) {
digest.erase();
return digest;
}
digest.append(1, (unsigned char)val);
}
return digest;
}
#include "readfile.h"
using namespace std;
class FileScanMd5 : public FileScanDo {
public:
FileScanMd5(string& d) : digest(d) {}
@ -87,6 +41,7 @@ public:
string &digest;
MD5_CTX ctx;
};
bool MD5File(const string& filename, string &digest, string *reason)
{
FileScanMd5 md5er(digest);
@ -96,58 +51,3 @@ bool MD5File(const string& filename, string &digest, string *reason)
MD5Final(md5er.digest, &md5er.ctx);
return true;
}
#else // TEST_MD5
// Test driver
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <iostream>
#include "md5ut.h"
using namespace std;
static const char *thisprog;
static char usage [] =
"trmd5 filename\n\n"
;
static void
Usage(void)
{
fprintf(stderr, "%s: usage:\n%s", thisprog, usage);
exit(1);
}
int main(int argc, const char **argv)
{
thisprog = argv[0];
argc--; argv++;
if (argc != 1)
Usage();
string filename = *argv++;argc--;
string reason, digest;
if (!MD5File(filename, digest, &reason)) {
cerr << reason << endl;
exit(1);
} else {
string hex;
cout << "MD5 (" << filename << ") = " << MD5HexPrint(digest, hex) << endl;
string digest1;
MD5HexScan(hex, digest1);
if (digest1.compare(digest)) {
cout << "MD5HexScan Failure" << endl;
cout << MD5HexPrint(digest, hex) << " " << digest.length() << " -> "
<< MD5HexPrint(digest1, hex) << " " << digest1.length() << endl;
exit(1);
}
}
exit(0);
}
#endif

View File

@ -17,17 +17,11 @@
#ifndef _MD5UT_H_
#define _MD5UT_H_
#include <sys/types.h>
#include "md5.h"
/** md5 utility wrappers */
#include <string>
using std::string;
extern void MD5Final(string& digest, MD5_CTX *);
extern bool MD5File(const string& filename, string& digest, string *reason);
extern string& MD5String(const string& data, string& digest);
extern string& MD5HexPrint(const string& digest, string& xdigest);
extern string& MD5HexScan(const string& xdigest, string& digest);
/** md5 utility: compute file md5 */
extern bool MD5File(const std::string& filename, std::string& digest,
std::string *reason);
#endif /* _MD5UT_H_ */

View File

@ -477,13 +477,13 @@ void ltrimstring(string& s, const char *ws)
}
// Remove some chars and replace them with spaces
string neutchars(const string& str, const string& chars)
string neutchars(const string& str, const string& chars, char rep)
{
string out;
neutchars(str, out, chars);
neutchars(str, out, chars, rep);
return out;
}
void neutchars(const string& str, string& out, const string& chars)
void neutchars(const string& str, string& out, const string& chars, char rep)
{
string::size_type startPos, pos;
@ -498,7 +498,7 @@ void neutchars(const string& str, string& out, const string& chars)
if (pos == string::npos) {
out += str.substr(startPos);
} else {
out += str.substr(startPos, pos - startPos) + " ";
out += str.substr(startPos, pos - startPos) + rep;
}
}
}
@ -1237,9 +1237,10 @@ class SimpleRegexp::Internal {
public:
Internal(const string& exp, int flags, int nm)
: expr(exp,
basic_regex<char>::flag_type(regex_constants::extended |
((flags&SRE_ICASE) ? int(regex_constants::icase) : 0) |
((flags&SRE_NOSUB) ? int(regex_constants::nosubs) : 0)
basic_regex<char>::flag_type(
regex_constants::extended |
((flags&SRE_ICASE) ? int(regex_constants::icase) : 0) |
((flags&SRE_NOSUB) ? int(regex_constants::nosubs) : 0)
)), ok(true), nmatch(nm) {
}
std::regex expr;

View File

@ -152,9 +152,10 @@ extern std::string escapeHtml(const std::string& in);
extern std::string makeCString(const std::string& in);
/** Replace some chars with spaces (ie: newline chars). */
extern std::string neutchars(const std::string& str, const std::string& chars);
extern std::string neutchars(const std::string& str, const std::string& chars,
char rep = ' ');
extern void neutchars(const std::string& str, std::string& out,
const std::string& chars);
const std::string& chars, char rep = ' ');
/** Turn string into something that won't be expanded by a shell. In practise
* quote with double-quotes and escape $`\ */