]> sjero.net Git - wget/blob - src/gen-md5.c
Updated config.guess, config.sub, install.sh.
[wget] / src / gen-md5.c
1 /* General MD5 support.
2    Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007,
3    2008 Free Software Foundation, Inc.
4
5 This file is part of GNU Wget.
6
7 GNU Wget is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
11
12 GNU Wget is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with Wget.  If not, see <http://www.gnu.org/licenses/>.
19
20 Additional permission under GNU GPL version 3 section 7
21
22 If you modify this program, or any covered work, by linking or
23 combining it with the OpenSSL project's OpenSSL library (or a
24 modified version of that library), containing parts covered by the
25 terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
26 grants you additional permission to convey the resulting work.
27 Corresponding Source for a non-source form of such a combination
28 shall include the source code for the parts of OpenSSL used as well
29 as that of the covered work.  */
30
31 #include "wget.h"
32
33 #include "gen-md5.h"
34
35 #ifdef HAVE_BUILTIN_MD5
36 # include <md5.h>
37 typedef struct md5_ctx gen_md5_context_imp;
38 #endif
39
40 #ifdef HAVE_SOLARIS_MD5
41 # include <md5.h>
42 typedef MD5_CTX gen_md5_context_imp;
43 #endif
44
45 #ifdef HAVE_OPENSSL_MD5
46 # include <openssl/md5.h>
47 typedef MD5_CTX gen_md5_context_imp;
48 #endif
49
50 struct gen_md5_context {
51   gen_md5_context_imp imp;
52 };
53
54 /* Originally I planned for these to be macros, but that's very hard
55    because some of these MD5 implementations use the same names for
56    their types.  For example, it is impossible to include <md5.h> and
57    <openssl/ssl.h> on Solaris, because the latter includes its own MD5
58    implementation, which clashes with <md5.h>.  */
59
60 int
61 gen_md5_context_size (void)
62 {
63   return sizeof (struct gen_md5_context);
64 }
65
66 void
67 gen_md5_init (gen_md5_context *ctx)
68 {
69   gen_md5_context_imp *ctx_imp = &ctx->imp;
70
71 #ifdef HAVE_BUILTIN_MD5
72   md5_init_ctx (ctx_imp);
73 #endif
74
75 #ifdef HAVE_SOLARIS_MD5
76   MD5Init (ctx_imp);
77 #endif
78
79 #ifdef HAVE_OPENSSL_MD5
80   MD5_Init (ctx_imp);
81 #endif
82 }
83
84 void
85 gen_md5_update (unsigned const char *buffer, int len, gen_md5_context *ctx)
86 {
87   gen_md5_context_imp *ctx_imp = &ctx->imp;
88
89 #ifdef HAVE_BUILTIN_MD5
90   md5_process_bytes (buffer, len, ctx_imp);
91 #endif
92
93 #ifdef HAVE_SOLARIS_MD5
94   MD5Update (ctx_imp, (unsigned char *)buffer, len);
95 #endif
96
97 #ifdef HAVE_OPENSSL_MD5
98   MD5_Update (ctx_imp, buffer, len);
99 #endif
100 }
101
102 void
103 gen_md5_finish (gen_md5_context *ctx, unsigned char *result)
104 {
105   gen_md5_context_imp *ctx_imp = &ctx->imp;
106
107 #ifdef HAVE_BUILTIN_MD5
108   md5_finish_ctx (ctx_imp, result);
109 #endif
110
111 #ifdef HAVE_SOLARIS_MD5
112   MD5Final (result, ctx_imp);
113 #endif
114
115 #ifdef HAVE_OPENSSL_MD5
116   MD5_Final (result, ctx_imp);
117 #endif
118 }
119
120 #if 0
121 /* A debugging function for checking whether an MD5 library works. */
122
123 #include "gen-md5.h"
124
125 char *
126 debug_test_md5 (char *buf)
127 {
128   unsigned char raw[16];
129   static char res[33];
130   unsigned char *p1;
131   char *p2;
132   int cnt;
133   ALLOCA_MD5_CONTEXT (ctx);
134
135   gen_md5_init (ctx);
136   gen_md5_update ((unsigned char *)buf, strlen (buf), ctx);
137   gen_md5_finish (ctx, raw);
138
139   p1 = raw;
140   p2 = res;
141   cnt = 16;
142   while (cnt--)
143     {
144       *p2++ = XNUM_TO_digit (*p1 >> 4);
145       *p2++ = XNUM_TO_digit (*p1 & 0xf);
146       ++p1;
147     }
148   *p2 = '\0';
149
150   return res;
151 }
152 #endif