X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Flib%2Fmd5.c;h=26532fbf0f3a1355aeb38a24d337d0031208f9ac;hb=5450f5e38d6dd94600c7c35fedf7f9ccea3e7adb;hp=0f52e9908b1920e75523e41e55e9b8990747b82d;hpb=a6b589632d0810ca5af2982f4cba47446d971a6d;p=bacula%2Fbacula diff --git a/bacula/src/lib/md5.c b/bacula/src/lib/md5.c index 0f52e9908b..26532fbf0f 100644 --- a/bacula/src/lib/md5.c +++ b/bacula/src/lib/md5.c @@ -1,3 +1,30 @@ +/* + Bacula® - The Network Backup Solution + + Copyright (C) 2000-2007 Free Software Foundation Europe e.V. + + The main author of Bacula is Kern Sibbald, with contributions from + many others, a complete list can be found in the file AUTHORS. + This program is Free Software; you can redistribute it and/or + modify it under the terms of version two of the GNU General Public + License as published by the Free Software Foundation and included + in the file LICENSE. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. + + Bacula® is a registered trademark of Kern Sibbald. + The licensor of Bacula is the Free Software Foundation Europe + (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, + Switzerland, email:ftf@fsfeurope.org. +*/ /* * This code implements the MD5 message-digest algorithm. * The algorithm is due to Ron Rivest. This code was @@ -21,6 +48,8 @@ prototypes) to maintain the tradition that Netfone will compile with Sun's original "cc". */ + + #include "bacula.h" #ifndef HAVE_BIGENDIAN @@ -252,6 +281,21 @@ void MD5Transform(uint32_t buf[4], uint32_t in[16]) #ifdef MD5_SUM #define OUTPUT_BASE64 1 + +static void usage() +{ + fprintf(stderr, +"\n" +"Usage: md5sum [-d decode] \n" +" -d decode the data file\n" +" -? print this message.\n" +"\n\n"); + + exit(1); +} + +static bool decode = false; + /* * Reads a single ASCII file and prints the HEX md5 sum. */ @@ -262,16 +306,35 @@ int main(int argc, char *argv[]) MD5Context ctx; char buf[5000]; char signature[20]; + int ch; + + while ((ch = getopt(argc, argv, "d?")) != -1) { + switch (ch) { + case 'd': + decode = true; + break; + case '?': + default: + usage(); + } + } + + argc -= optind; + argv += optind; if (argc < 1) { printf("Must have filename\n"); exit(1); } - fd = fopen(argv[1], "r"); + + fd = fopen(argv[0], "rb"); if (!fd) { - printf("Could not open %s: ERR=%s\n", argv[1], strerror(errno)); + printf("Could not open %s: ERR=%s\n", argv[0], strerror(errno)); exit(1); } + if (decode) { + goto decode_it; + } MD5Init(&ctx); while (fgets(buf, sizeof(buf), fd)) { MD5Update(&ctx, (unsigned char *)buf, strlen(buf)); @@ -283,9 +346,38 @@ int main(int argc, char *argv[]) #ifdef OUTPUT_BASE64 char MD5buf[40]; /* 24 should do */ memset(MD5buf, 0, 40); - bin_to_base64(MD5buf, (char *)signature, 16); /* encode 16 bytes */ + bin_to_base64(MD5buf, sizeof(MD5buf), (char *)signature, 16, true); /* encode 16 bytes */ printf(" %s", MD5buf); #endif - printf(" %s\n", argv[1]); + printf(" %s\n", argv[0]); + exit(0); + +decode_it: + while (fgets(buf, sizeof(buf), fd)) { + char bin[40]; + unsigned char *p = (unsigned char *)buf; + unsigned char ch; + int val; + for (int i=0; i < 16; i++) { + if (*p <= '9') { + val = *p - '0'; + } else { + val = *p - 'a' + 10; + } + ch = val << 4; + p++; + if (*p <= '9') { + val = *p - '0'; + } else { + val = *p - 'a' + 10; + } + signature[i] = ch + val; + p++; + } + signature[16] = 0; + printf("%s", buf); + bin_to_base64(bin, sizeof(bin), (char *)signature, 16, true); + printf("%s\n", bin); + } } #endif