-/* ====================================================================
- * Copyright (c) 1995-1999 The Apache Group. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. All advertising materials mentioning features or use of this
- * software must display the following acknowledgment:
- * "This product includes software developed by the Apache Group
- * for use in the Apache HTTP server project (http://www.apache.org/)."
- *
- * 4. The names "Apache Server" and "Apache Group" must not be used to
- * endorse or promote products derived from this software without
- * prior written permission. For written permission, please contact
- * apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache"
- * nor may "Apache" appear in their names without prior written
- * permission of the Apache Group.
- *
- * 6. Redistributions of any form whatsoever must retain the following
- * acknowledgment:
- * "This product includes software developed by the Apache Group
- * for use in the Apache HTTP server project (http://www.apache.org/)."
- *
- * THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY
- * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE APACHE GROUP OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Group and was originally based
- * on public domain software written at the National Center for
- * Supercomputing Applications, University of Illinois, Urbana-Champaign.
- * For more information on the Apache Group and the Apache HTTP server
- * project, please see <http://www.apache.org/>.
- *
+/* Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
*/
/************************************************************************
* Original Code Copyright (C) 1994, Jeff Hostetler, Spyglass, Inc.
* Portions of Content-MD5 code Copyright (C) 1993, 1994 by Carnegie Mellon
* University (see Copyright below).
- * Portions of Content-MD5 code Copyright (C) 1991 Bell Communications
+ * Portions of Content-MD5 code Copyright (C) 1991 Bell Communications
* Research, Inc. (Bellcore) (see Copyright below).
* Portions extracted from mpack, John G. Myers - jgm+@cmu.edu
* Content-MD5 Code contributed by Martin Hamilton (martin@net.lut.ac.uk)
/* md5.c --Module Interface to MD5. */
/* Jeff Hostetler, Spyglass, Inc., 1994. */
+#include "ap_config.h"
+#include "apr_portable.h"
+#include "apr_strings.h"
#include "httpd.h"
#include "util_md5.h"
+#include "util_ebcdic.h"
-API_EXPORT(char *) ap_md5_binary(ap_context_t *p, const unsigned char *buf, int length)
+AP_DECLARE(char *) ap_md5_binary(apr_pool_t *p, const unsigned char *buf, int length)
{
const char *hex = "0123456789abcdef";
- AP_MD5_CTX my_md5;
- unsigned char hash[16];
- char *r, result[33];
+ apr_md5_ctx_t my_md5;
+ unsigned char hash[APR_MD5_DIGESTSIZE];
+ char *r, result[33]; /* (MD5_DIGESTSIZE * 2) + 1 */
int i;
/*
* Take the MD5 hash of the string argument.
*/
- ap_MD5Init(&my_md5);
- ap_MD5Update(&my_md5, buf, (unsigned int)length);
- ap_MD5Final(hash, &my_md5);
+ apr_md5_init(&my_md5);
+#if APR_CHARSET_EBCDIC
+ apr_md5_set_xlate(&my_md5, ap_hdrs_to_ascii);
+#endif
+ apr_md5_update(&my_md5, buf, (unsigned int)length);
+ apr_md5_final(hash, &my_md5);
- for (i = 0, r = result; i < 16; i++) {
- *r++ = hex[hash[i] >> 4];
- *r++ = hex[hash[i] & 0xF];
+ for (i = 0, r = result; i < APR_MD5_DIGESTSIZE; i++) {
+ *r++ = hex[hash[i] >> 4];
+ *r++ = hex[hash[i] & 0xF];
}
*r = '\0';
- return ap_pstrdup(p, result);
+ return apr_pstrndup(p, result, APR_MD5_DIGESTSIZE*2);
}
-API_EXPORT(char *) ap_md5(ap_context_t *p, const unsigned char *string)
+AP_DECLARE(char *) ap_md5(apr_pool_t *p, const unsigned char *string)
{
return ap_md5_binary(p, string, (int) strlen((char *)string));
}
* of an authorized representative of Bellcore. BELLCORE
* MAKES NO REPRESENTATIONS ABOUT THE ACCURACY OR SUITABILITY
* OF THIS MATERIAL FOR ANY PURPOSE. IT IS PROVIDED "AS IS",
- * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES.
+ * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES.
*/
static char basis_64[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-API_EXPORT(char *) ap_md5contextTo64(ap_context_t *a, AP_MD5_CTX * context)
+AP_DECLARE(char *) ap_md5contextTo64(apr_pool_t *a, apr_md5_ctx_t *context)
{
unsigned char digest[18];
char *encodedDigest;
int i;
char *p;
- encodedDigest = (char *) ap_pcalloc(a, 25 * sizeof(char));
+ encodedDigest = (char *) apr_pcalloc(a, 25 * sizeof(char));
- ap_MD5Final(digest, context);
+ apr_md5_final(digest, context);
digest[sizeof(digest) - 1] = digest[sizeof(digest) - 2] = 0;
p = encodedDigest;
for (i = 0; i < sizeof(digest); i += 3) {
- *p++ = basis_64[digest[i] >> 2];
- *p++ = basis_64[((digest[i] & 0x3) << 4) | ((int) (digest[i + 1] & 0xF0) >> 4)];
- *p++ = basis_64[((digest[i + 1] & 0xF) << 2) | ((int) (digest[i + 2] & 0xC0) >> 6)];
- *p++ = basis_64[digest[i + 2] & 0x3F];
+ *p++ = basis_64[digest[i] >> 2];
+ *p++ = basis_64[((digest[i] & 0x3) << 4) | ((int) (digest[i + 1] & 0xF0) >> 4)];
+ *p++ = basis_64[((digest[i + 1] & 0xF) << 2) | ((int) (digest[i + 2] & 0xC0) >> 6)];
+ *p++ = basis_64[digest[i + 2] & 0x3F];
}
*p-- = '\0';
*p-- = '=';
return encodedDigest;
}
-#ifdef CHARSET_EBCDIC
-
-API_EXPORT(char *) ap_md5digest(ap_context_t *p, APRFile infile, int convert)
+AP_DECLARE(char *) ap_md5digest(apr_pool_t *p, apr_file_t *infile)
{
- AP_MD5_CTX context;
- unsigned char buf[1000];
- long length = 0;
- int nbytes;
-
- ap_MD5Init(&context);
- /* ZZZ use AP func instead of fread. */
- while ((nbytes = read(infile, buf, sizeof(buf)))) {
- length += nbytes;
- if (!convert) {
- ascii2ebcdic(buf, buf, nbytes);
- }
- ap_MD5Update(&context, buf, nbytes);
+ apr_md5_ctx_t context;
+ unsigned char buf[4096]; /* keep this a multiple of 64 */
+ apr_size_t nbytes;
+ apr_off_t offset = 0L;
+
+ apr_md5_init(&context);
+ nbytes = sizeof(buf);
+ while (apr_file_read(infile, buf, &nbytes) == APR_SUCCESS) {
+ apr_md5_update(&context, buf, nbytes);
+ nbytes = sizeof(buf);
}
- /* ZZZ use AP seek func instead of REWIND. */
- lseek(infile, 0L, SEEK_SET);
+ apr_file_seek(infile, APR_SET, &offset);
return ap_md5contextTo64(p, &context);
}
-#else
-
-API_EXPORT(char *) ap_md5digest(ap_context_t *p, APRFile infile)
-{
- AP_MD5_CTX context;
- unsigned char buf[1000];
- long length = 0;
- int nbytes;
-
- ap_MD5Init(&context);
- /* ZZZ use AP func instead of fread. */
- while ((nbytes = read(infile, buf, sizeof(buf)))) {
- length += nbytes;
- ap_MD5Update(&context, buf, nbytes);
- }
- /* ZZZ use AP seek func instead of REWIND. */
- lseek(infile, 0L, SEEK_SET);
- return ap_md5contextTo64(p, &context);
-}
-
-#endif