Drizzled Public API Documentation

CSMd5.h
00001 /*
00002   Copyright (C) 1999, 2002 Aladdin Enterprises.  All rights reserved.
00003 
00004   This software is provided 'as-is', without any express or implied
00005   warranty.  In no event will the authors be held liable for any damages
00006   arising from the use of this software.
00007 
00008   Permission is granted to anyone to use this software for any purpose,
00009   including commercial applications, and to alter it and redistribute it
00010   freely, subject to the following restrictions:
00011 
00012   1. The origin of this software must not be misrepresented; you must not
00013      claim that you wrote the original software. If you use this software
00014      in a product, an acknowledgment in the product documentation would be
00015      appreciated but is not required.
00016   2. Altered source versions must be plainly marked as such, and must not be
00017      misrepresented as being the original software.
00018   3. This notice may not be removed or altered from any source distribution.
00019 
00020   L. Peter Deutsch
00021   ghost@aladdin.com
00022 
00023  */
00024 /* $Id: md5.h,v 1.4 2002/04/13 19:20:28 lpd Exp $ */
00025 /*
00026   Independent implementation of MD5 (RFC 1321).
00027 
00028   This code implements the MD5 Algorithm defined in RFC 1321, whose
00029   text is available at
00030   http://www.ietf.org/rfc/rfc1321.txt
00031   The code is derived from the text of the RFC, including the test suite
00032   (section A.5) but excluding the rest of Appendix A.  It does not include
00033   any code or documentation that is identified in the RFC as being
00034   copyrighted.
00035 
00036   The original and principal author of md5.h is L. Peter Deutsch
00037   <ghost@aladdin.com>.  Other authors are noted in the change history
00038   that follows (in reverse chronological order):
00039 
00040   2002-04-13 lpd Removed support for non-ANSI compilers; removed
00041   references to Ghostscript; clarified derivation from RFC 1321;
00042   now handles byte order either statically or dynamically.
00043   1999-11-04 lpd Edited comments slightly for automatic TOC extraction.
00044   1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5);
00045   added conditionalization for C++ compilation from Martin
00046   Purschke <purschke@bnl.gov>.
00047   1999-05-03 lpd Original version.
00048  */
00049 
00050 /* Copyright (C) 2008 PrimeBase Technologies GmbH, Germany
00051  *
00052  * PrimeBase S3Daemon
00053  *
00054  * This program is free software; you can redistribute it and/or modify
00055  * it under the terms of the GNU General Public License as published by
00056  * the Free Software Foundation; either version 2 of the License, or
00057  * (at your option) any later version.
00058  *
00059  * This program is distributed in the hope that it will be useful,
00060  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00061  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00062  * GNU General Public License for more details.
00063  *
00064  * You should have received a copy of the GNU General Public License
00065  * along with this program; if not, write to the Free Software
00066  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
00067  *
00068  *  Modified by Barry Leslie on 10/17/08.
00069  *  I have put a C++ wrapper around the data and functions to create an Md5 class.
00070  *
00071  */
00072 #pragma once
00073 #ifndef md5_INCLUDED
00074 #define md5_INCLUDED
00075 
00076 #include <string.h>
00077 
00078 #include "CSDefs.h"
00079 
00080 /* Define the state of the MD5 Algorithm. */
00081 typedef unsigned int md5_word_t;
00082 
00083 #define MD5_CHECKSUM_SIZE     CHECKSUM_VALUE_SIZE
00084 #define MD5_CHECKSUM_STRING_SIZE  (CHECKSUM_VALUE_SIZE * 2 + 1)
00085 
00086 class CSMd5 {
00087   private:
00088   struct md5_state_s {
00089     md5_word_t  count[2];   /* message length in bits, lsw first */
00090     md5_word_t  abcd[4];    /* digest buffer */
00091     u_char    buf[64];    /* accumulate block */
00092   } md5_state;
00093 
00094   u_char      digest[MD5_CHECKSUM_SIZE];
00095   char      digest_cstr[MD5_CHECKSUM_STRING_SIZE];
00096 
00097   void md5_process(const u_char *data /*[64]*/);
00098   void md5_digest();
00099 
00100   public:
00101   CSMd5() {
00102     md5_init();
00103   }
00104 
00105   void md5_init();
00106 
00107   /* Append a string to the message. */
00108   void md5_append(const u_char  *data, int nbytes);
00109 
00110   void md5_append(const char  *data) {
00111     md5_append((const u_char  *) data, strlen(data));
00112   }
00113 
00114   /* Finish the message and return the digest. */
00115   
00116   // Returns the raw bin digest.
00117   const u_char *md5_get_digest() {
00118     if (!digest_cstr[0])
00119       md5_digest();
00120     return digest;
00121   }
00122 
00123   // Returns the bin/hex digest.
00124   void md5_get_digest(Md5Digest *d) {
00125     if (!digest_cstr[0])
00126       md5_digest();
00127       
00128     memcpy(d->val, digest, CHECKSUM_VALUE_SIZE);
00129   }
00130   
00131   // Returns the bin/hex digest.
00132   const char *md5_get_digest_cstr() {
00133     if (!digest_cstr[0])
00134       md5_digest();
00135     return digest_cstr;
00136   }
00137   
00138 };
00139 
00140 #endif /* md5_INCLUDED */