You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by di...@hyperreal.org on 1999/08/08 13:45:21 UTC

cvs commit: apache-1.3/src/support ab.c

dirkx       99/08/08 04:45:20

  Modified:    src/ap   Makefile.tmpl ap_sha1.c
               src/include ap.h ap_sha1.h httpd.h
               src/main http_protocol.c util.c
               src/modules/proxy proxy_ftp.c
               src/support ab.c
  Log:
  Collating various peoples patches on base64, md5 and sha1
  which sanitize the uuencoding used in various places a
  little bit; and getting rid of all the warnings.
  
  What is left now is moving ap_sha1.h and ap_md5.h into
  ap.h OR #including them there and modularizing the ap.h
  file. Secondly it might be nice to swap the base64-ish
  encoding used in apache's its own MD5 passwords to the
  uu-encoded one to get rid of those routines. But that
  would break compatibility betwen the 1.x series.
  
  Let's hope this is all for now.
  
   Modified Files:
   	ap/Makefile.tmpl ap/ap_checkpass.c ap/ap_md5c.c ap/ap_sha1.c
   	include/ap.h include/ap_sha1.h include/httpd.h
   	main/http_protocol.c main/util.c modules/proxy/proxy_ftp.c
   	support/ab.c
  
  Revision  Changes    Path
  1.34      +1 -1      apache-1.3/src/ap/Makefile.tmpl
  
  Index: Makefile.tmpl
  ===================================================================
  RCS file: /x3/home/cvs/apache-1.3/src/ap/Makefile.tmpl,v
  retrieving revision 1.33
  retrieving revision 1.34
  diff -u -r1.33 -r1.34
  --- Makefile.tmpl	1999/08/02 10:13:44	1.33
  +++ Makefile.tmpl	1999/08/08 11:45:15	1.34
  @@ -6,7 +6,7 @@
   LIB=libap.a
   
   OBJS=ap_cpystrn.o ap_execve.o ap_fnmatch.o ap_getpass.o ap_md5c.o ap_signal.o \
  -     ap_slack.o ap_snprintf.o ap_sha1.o ap_checkpass.o
  +     ap_slack.o ap_snprintf.o ap_sha1.o ap_checkpass.o ap_base64.o
   
   .c.o:
   	$(CC) -c $(INCLUDES) $(CFLAGS) $<
  
  
  
  1.4       +85 -102   apache-1.3/src/ap/ap_sha1.c
  
  Index: ap_sha1.c
  ===================================================================
  RCS file: /x3/home/cvs/apache-1.3/src/ap/ap_sha1.c,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- ap_sha1.c	1999/08/05 20:04:01	1.3
  +++ ap_sha1.c	1999/08/08 11:45:15	1.4
  @@ -6,7 +6,7 @@
    * are met:
    *
    * 1. Redistributions of source code must retain the above copyright
  - *    notice, this list of conditions and the following disclaimer. 
  + *    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
  @@ -70,10 +70,10 @@
    *     will always generate the same hash, making it easier
    *     to break since the search space is smaller.
    *
  - * See also the documentation in support/SHA1 as to hints on how to 
  + * See also the documentation in support/SHA1 as to hints on how to
    * migrate an existing netscape installation and other supplied utitlites.
    *
  - * This software also makes use of the following components: 
  + * This software also makes use of the following components:
    *
    * NIST Secure Hash Algorithm
    *  	heavily modified by Uwe Hollerbach uh@alumni.caltech edu
  @@ -86,15 +86,15 @@
    *
    * Metamail's copyright is:
    * 	Copyright (c) 1991 Bell Communications Research, Inc. (Bellcore)
  - * 	Permission to use, copy, modify, and distribute this material 
  - *	for any purpose and without fee is hereby granted, provided 
  - *	that the above copyright notice and this permission notice 
  - *	appear in all copies, and that the name of Bellcore not be 
  - *	used in advertising or publicity pertaining to this 
  - *	material without the specific, prior written permission 
  - *	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", 
  + * 	Permission to use, copy, modify, and distribute this material
  + *	for any purpose and without fee is hereby granted, provided
  + *	that the above copyright notice and this permission notice
  + *	appear in all copies, and that the name of Bellcore not be
  + *	used in advertising or publicity pertaining to this
  + *	material without the specific, prior written permission
  + *	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.
    */
   
  @@ -133,30 +133,13 @@
       temp = ROT32(A,5) + f##n(B,C,D) + E + W[i] + CONST##n;	\
       E = D; D = C; C = ROT32(B,30); B = A; A = temp
   
  -typedef unsigned char AP_BYTE;     /* an 8-bit quantity */
  -typedef unsigned long AP_LONG;     /* a 32-bit quantity */
  - 
   #define SHA_BLOCKSIZE           64
   #define SHA_DIGESTSIZE          20
  - 
  -typedef struct {
  -    AP_LONG digest[5];             /* message digest */
  -    AP_LONG count_lo, count_hi;    /* 64-bit bit count */
  -    AP_LONG data[16];              /* SHA data buffer */
  -    int local;                  /* unprocessed amount in data */
  -} SHA_INFO;
  -
  -static void sha_init(SHA_INFO *);
  -static void sha_update(SHA_INFO *, const AP_BYTE *, int);
  -static void sha_final(SHA_INFO *);
  -static void sha_raw_swap(SHA_INFO *);
  -static void output64chunk(unsigned char, unsigned char, unsigned char,
  -			  int, unsigned char **);
  -static void encode_mime64(unsigned char *, unsigned char *, int);
  -void sha1_base64(char *, int, char *);
   
  +typedef unsigned char AP_BYTE;
  +
   /* do SHA transformation */
  -static void sha_transform(SHA_INFO *sha_info)
  +static void sha_transform(AP_SHA1_CTX *sha_info)
   {
       int i;
       AP_LONG temp, A, B, C, D, E, W[80];
  @@ -236,7 +219,7 @@
       int i;
       AP_BYTE ct[4], *cp;
   
  -    if (isLittleEndian()) {    /* do the swap only if it is little endian */
  +    if (isLittleEndian()) {	/* do the swap only if it is little endian */
   	count /= sizeof(AP_LONG);
   	cp = (AP_BYTE *) buffer;
   	for (i = 0; i < count; ++i) {
  @@ -255,7 +238,7 @@
   
   /* initialize the SHA digest */
   
  -static void sha_init(SHA_INFO *sha_info)
  +API_EXPORT(void) ap_SHA1Init(AP_SHA1_CTX *sha_info)
   {
       sha_info->digest[0] = 0x67452301L;
       sha_info->digest[1] = 0xefcdab89L;
  @@ -269,7 +252,9 @@
   
   /* update the SHA digest */
   
  -static void sha_update(SHA_INFO *sha_info, const AP_BYTE *buffer, int count)
  +API_EXPORT(void) ap_SHA1Update_binary(AP_SHA1_CTX *sha_info,
  +				      const unsigned char *buffer,
  +				      unsigned int count)
   {
       int i;
   
  @@ -306,12 +291,55 @@
       sha_info->local = count;
   }
   
  +API_EXPORT(void) ap_SHA1Update(AP_SHA1_CTX *sha_info, const char *buf,
  +			       unsigned int count)
  +{
  +#ifdef CHARSET_EBCDIC
  +    int i;
  +    const AP_BYTE *buffer = (const AP_BYTE *) buf;
  +
  +    if ((sha_info->count_lo + ((LONG) count << 3)) < sha_info->count_lo) {
  +	++sha_info->count_hi;
  +    }
  +    sha_info->count_lo += (LONG) count << 3;
  +    sha_info->count_hi += (LONG) count >> 29;
  +    if (sha_info->local) {
  +	i = SHA_BLOCKSIZE - sha_info->local;
  +	if (i > count) {
  +	    i = count;
  +	}
  +	ebcdic2ascii_strictly(((AP_BYTE *) sha_info->data) + sha_info->local, ubuf, i);
  +	count -= i;
  +	buffer += i;
  +	sha_info->local += i;
  +	if (sha_info->local == SHA_BLOCKSIZE) {
  +	    maybe_byte_reverse(sha_info->data, SHA_BLOCKSIZE);
  +	    sha_transform(sha_info);
  +	}
  +	else {
  +	    return;
  +	}
  +    }
  +    while (count >= SHA_BLOCKSIZE) {
  +	ebcdic2ascii_strictly(sha_info->data, buffer, SHA_BLOCKSIZE);
  +	buffer += SHA_BLOCKSIZE;
  +	count -= SHA_BLOCKSIZE;
  +	maybe_byte_reverse(sha_info->data, SHA_BLOCKSIZE);
  +	sha_transform(sha_info);
  +    }
  +    ebcdic2ascii_strictly(sha_info->data, buffer, count);
  +    sha_info->local = count;
  +#else
  +    ap_SHA1Update_binary(sha_info, (const unsigned char *) buf, count);
  +#endif
  +}
  +
   /* finish computing the SHA digest */
   
  -static void sha_final(SHA_INFO *sha_info)
  +API_EXPORT(void) ap_SHA1Final(unsigned char digest[20], AP_SHA1_CTX *sha_info)
   {
  -    int count;
  -    AP_LONG lo_bit_count, hi_bit_count;
  +    int count, i, j;
  +    AP_LONG lo_bit_count, hi_bit_count, k;
   
       lo_bit_count = sha_info->count_lo;
       hi_bit_count = sha_info->count_hi;
  @@ -331,66 +359,17 @@
       sha_info->data[14] = hi_bit_count;
       sha_info->data[15] = lo_bit_count;
       sha_transform(sha_info);
  -}
  -
  -/*
  -   internally implemented as an array of longs, need to swap if 
  -   you're going to access the memory in the raw, instead of looping
  -   through with arrays of longs.
  -*/
   
  -static void sha_raw_swap(SHA_INFO *sha_info)
  -{
  -    int i;
  -
  -    for (i = 0; i < 5; ++i) {
  -	maybe_byte_reverse((AP_LONG *) &sha_info->digest[i], 4);
  +    for (i = 0, j = 0; j < SHA_DIGESTSIZE; i++) {
  +	k = sha_info->digest[i];
  +	digest[j++] = (unsigned char) ((k >> 24) & 0xff);
  +	digest[j++] = (unsigned char) ((k >> 16) & 0xff);
  +	digest[j++] = (unsigned char) ((k >> 8) & 0xff);
  +	digest[j++] = (unsigned char) (k & 0xff);
       }
   }
   
  -static char basis_64[] =
  -  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
   
  -static void output64chunk(unsigned char c1, unsigned char c2, unsigned char c3,
  -			  int pads, unsigned char **outfile)
  -{
  -    *(*outfile)++ = basis_64[c1>>2];
  -
  -    *(*outfile)++ = basis_64[((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4)];
  -    if (pads == 2) {
  -	*(*outfile)++ = '=';
  -	*(*outfile)++ = '=';
  -    }
  -    else if (pads) {
  -	*(*outfile)++ =  basis_64[((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6)];
  -	*(*outfile)++ = '=';
  -    }
  -    else {
  -	*(*outfile)++ = basis_64[((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6)];
  -	*(*outfile)++ = basis_64[c3 & 0x3F];
  -    }
  -}
  -
  -static void encode_mime64(unsigned char *in, unsigned char *out, int length)
  -{
  -    int diff, ct = 0;
  -
  -    while ((diff = length - ct)) {
  -	if ( diff >= 3 ) {
  -	    diff = 3;
  -	    output64chunk(in[ct], in[ct+1], in[ct+2], 0, &out);
  -	}
  -	else if (diff == 2) {
  -	    output64chunk(in[ct], in[ct+1], 0, 1, &out);
  -	}
  -	else if (diff == 1) {
  -	    output64chunk(in[ct], 0, 0, 2, &out);
  -	}
  -	ct += diff;
  -    }
  -    *out++ = 0;
  -}
  -
   /* {SHA} is the prefix used for base64 encoded sha1 in
    * ldap data interchange format.
    */
  @@ -398,23 +377,27 @@
   
   API_EXPORT(void) ap_sha1_base64(const char *clear, int len, char *out)
   {
  -    SHA_INFO context;
  +    int l;
  +    AP_SHA1_CTX context;
  +    AP_BYTE digest[SHA_DIGESTSIZE];
   
       if (!strncmp(clear, sha1_id, strlen(sha1_id))) {
   	clear += strlen(sha1_id);
       }
  -
  -    sha_init(&context);
  -    sha_update(&context, clear, len);
  -    sha_final(&context);
   
  -    sha_raw_swap(&context);
  +    ap_SHA1Init(&context);
  +    ap_SHA1Update(&context, clear, len);
  +    ap_SHA1Final(digest, &context);
   
       /* private marker. */
       strcpy(out, sha1_id);
   
       /* SHA1 hash is always 20 chars */
  -    encode_mime64((char *)context.digest, out+strlen(sha1_id), 20);
  -    /* output of MIME Base 64 encoded SHA1 is always
  -     * 28 characters + strlen(sha1_id) */
  +    l = ap_uuencode_binary(out + strlen(sha1_id), digest, sizeof(digest));
  +    out[l + strlen(sha1_id)] = '\0';
  +
  +    /*
  +     * output of MIME Base 64 encoded SHA1 is always 28 characters +
  +     * strlen(sha1_id)
  +     */
   }
  
  
  
  1.23      +24 -0     apache-1.3/src/include/ap.h
  
  Index: ap.h
  ===================================================================
  RCS file: /x3/home/cvs/apache-1.3/src/include/ap.h,v
  retrieving revision 1.22
  retrieving revision 1.23
  diff -u -r1.22 -r1.23
  --- ap.h	1999/08/02 20:50:14	1.22
  +++ ap.h	1999/08/08 11:45:16	1.23
  @@ -159,6 +159,30 @@
   			    __attribute__((format(printf,3,4)));
   API_EXPORT(int) ap_vsnprintf(char *buf, size_t len, const char *format,
   			     va_list ap);
  +/* Simple BASE64 encode/decode functions.
  + * 
  + * As we might encode binary strings, hence we require the length of
  + * the incoming plain source. And return the length of what we decoded.
  + *
  + * The decoding function takes any non valid char (i.e. whitespace, \0
  + * or anything non A-Z,0-9 etc as terminal.
  + * 
  + * plain strings/binary sequences are not assumed '\0' terminated. Encoded
  + * strings are neither. But propably should.
  + *
  + */
  +API_EXPORT(int) ap_uuencode_len(int len);
  +API_EXPORT(int) ap_uuencode(char * coded_dst, const char *plain_src,int len_plain_src);
  +API_EXPORT(int) ap_uuencode_binary(char * coded_dst, const unsigned char *plain_src,int len_plain_src);
  +
  +API_EXPORT(int) ap_uudecode_len(const char * coded_src);
  +API_EXPORT(int) ap_uudecode(char * plain_dst, const char *coded_src);
  +API_EXPORT(int) ap_uudecode_binary(unsigned char * plain_dst, const char *coded_src);
  +
  +/* Password validation, as used in AuthType Basic which is able to cope
  + * (based on the prexix) with the SHA1, Apache's internal MD5 and (depending
  + * on your platform either plain or crypt(3) passwords.
  + */
   API_EXPORT(char *) ap_validate_password(const char *passwd, const char *hash);
   
   #ifdef __cplusplus
  
  
  
  1.4       +17 -1     apache-1.3/src/include/ap_sha1.h
  
  Index: ap_sha1.h
  ===================================================================
  RCS file: /x3/home/cvs/apache-1.3/src/include/ap_sha1.h,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- ap_sha1.h	1999/08/05 20:04:03	1.3
  +++ ap_sha1.h	1999/08/08 11:45:16	1.4
  @@ -84,11 +84,27 @@
   extern "C" {
   #endif
   
  +typedef unsigned long AP_LONG;     /* a 32-bit quantity */
  +
  +typedef struct {
  +    AP_LONG digest[5];             /* message digest */
  +    AP_LONG count_lo, count_hi;    /* 64-bit bit count */
  +    AP_LONG data[16];              /* SHA data buffer */
  +    int local;                     /* unprocessed amount in data */
  +} AP_SHA1_CTX;
  +
   extern const char *sha1_id;	/* passwd prefix marker for SHA1 */
   API_EXPORT(void) ap_sha1_base64(const char *clear, int len, char *out);
  +API_EXPORT(void) ap_SHA1Init(AP_SHA1_CTX *context);
  +API_EXPORT(void) ap_SHA1Update(AP_SHA1_CTX *context, const char *input,
  +			       unsigned int inputLen);
  +API_EXPORT(void) ap_SHA1Update_binary(AP_SHA1_CTX *context,
  +				      const unsigned char *input,
  +				      unsigned int inputLen);
  +API_EXPORT(void) ap_SHA1Final(unsigned char digest[20], AP_SHA1_CTX *context);
   
   #ifdef __cplusplus
   }
   #endif
   
  -#endif	/* !APACHE_MD5_H */
  +#endif	/* !APACHE_SHA1_H */
  
  
  
  1.289     +2 -2      apache-1.3/src/include/httpd.h
  
  Index: httpd.h
  ===================================================================
  RCS file: /x3/home/cvs/apache-1.3/src/include/httpd.h,v
  retrieving revision 1.288
  retrieving revision 1.289
  diff -u -r1.288 -r1.289
  --- httpd.h	1999/07/29 22:58:23	1.288
  +++ httpd.h	1999/08/08 11:45:16	1.289
  @@ -990,8 +990,8 @@
   API_EXPORT(int) ap_is_matchexp(const char *str);
   API_EXPORT(int) ap_strcmp_match(const char *str, const char *exp);
   API_EXPORT(int) ap_strcasecmp_match(const char *str, const char *exp);
  -API_EXPORT(char *) ap_uudecode(pool *, const char *);
  -API_EXPORT(char *) ap_uuencode(pool *p, char *string); 
  +API_EXPORT(char *) ap_puudecode(pool *, const char *);
  +API_EXPORT(char *) ap_puuencode(pool *p, char *string); 
   #ifdef OS2
   void os2pathname(char *path);
   char *ap_double_quotes(pool *p, char *str);
  
  
  
  1.276     +7 -1      apache-1.3/src/main/http_protocol.c
  
  Index: http_protocol.c
  ===================================================================
  RCS file: /x3/home/cvs/apache-1.3/src/main/http_protocol.c,v
  retrieving revision 1.275
  retrieving revision 1.276
  diff -u -r1.275 -r1.276
  --- http_protocol.c	1999/07/31 03:30:18	1.275
  +++ http_protocol.c	1999/08/08 11:45:18	1.276
  @@ -1151,7 +1151,13 @@
           return AUTH_REQUIRED;
       }
   
  -    t = ap_uudecode(r->pool, auth_line);
  +    /* CHARSET_EBCDIC Issue's here ?!? Compare with 32/9 instead
  +     * as we are operating on an octed stream ?
  +     */
  +    while (*auth_line== ' ' || *auth_line== '\t')
  +        auth_line++;
  +
  +    t = ap_puudecode(r->pool, auth_line);
       /* Note that this allocation has to be made from r->connection->pool
        * because it has the lifetime of the connection.  The other allocations
        * are temporary and can be tossed away any time.
  
  
  
  1.169     +18 -154   apache-1.3/src/main/util.c
  
  Index: util.c
  ===================================================================
  RCS file: /x3/home/cvs/apache-1.3/src/main/util.c,v
  retrieving revision 1.168
  retrieving revision 1.169
  diff -u -r1.168 -r1.169
  --- util.c	1999/08/02 10:45:32	1.168
  +++ util.c	1999/08/08 11:45:18	1.169
  @@ -1957,167 +1957,31 @@
       return server_hostname;
   }
   
  -/* aaaack but it's fast and const should make it shared text page. */
  -static const unsigned char pr2six[256] =
  +/* simple 'pool' alloc()ing glue to ap_base64.c
  + */
  +API_EXPORT(char *) ap_puudecode(pool *p, const char *bufcoded)
   {
  -    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
  -    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
  -    64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63, 52, 53, 54,
  -    55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64, 64, 0, 1, 2, 3,
  -    4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
  -    22, 23, 24, 25, 64, 64, 64, 64, 64, 64, 26, 27, 28, 29, 30, 31, 32,
  -    33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
  -    50, 51, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
  -    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
  -    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
  -    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
  -    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
  -    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
  -    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
  -    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64
  -};
  +    char *decoded;
  +    int l;
   
  -API_EXPORT(char *) ap_uudecode(pool *p, const char *bufcoded)
  -{
  -    int nbytesdecoded;
  -    register const unsigned char *bufin;
  -    register char *bufplain;
  -    register unsigned char *bufout;
  -    register int nprbytes;
  -
  -    /* Strip leading whitespace. */
  -
  -    while (*bufcoded == ' ' || *bufcoded == '\t')
  -	bufcoded++;
  -
  -    /* Figure out how many characters are in the input buffer.
  -     * Allocate this many from the per-transaction pool for the result.
  -     */
  -#ifndef CHARSET_EBCDIC
  -    bufin = (const unsigned char *) bufcoded;
  -    while (pr2six[*(bufin++)] <= 63);
  -    nprbytes = (bufin - (const unsigned char *) bufcoded) - 1;
  -    nbytesdecoded = ((nprbytes + 3) / 4) * 3;
  -
  -    bufplain = ap_palloc(p, nbytesdecoded + 1);
  -    bufout = (unsigned char *) bufplain;
  -
  -    bufin = (const unsigned char *) bufcoded;
  -
  -    while (nprbytes > 4) {
  -	*(bufout++) =
  -	    (unsigned char) (pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4);
  -	*(bufout++) =
  -	    (unsigned char) (pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2);
  -	*(bufout++) =
  -	    (unsigned char) (pr2six[bufin[2]] << 6 | pr2six[bufin[3]]);
  -	bufin += 4;
  -	nprbytes -= 4;
  -    }
  -
  -    /* Note: (nprbytes == 1) would be an error, so just ingore that case */
  -    if (nprbytes > 1) {
  -	*(bufout++) =
  -	    (unsigned char) (pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4);
  -    }
  -    if (nprbytes > 2) {
  -	*(bufout++) =
  -	    (unsigned char) (pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2);
  -    }
  -    if (nprbytes > 3) {
  -        *(bufout++) =
  -            (unsigned char) (pr2six[bufin[2]] << 6 | pr2six[bufin[3]]);
  -    }
  -#else /*CHARSET_EBCDIC*/
  -    bufin = (const unsigned char *) bufcoded;
  -    while (pr2six[os_toascii[(unsigned char)*(bufin++)]] <= 63);
  -    nprbytes = (bufin - (const unsigned char *) bufcoded) - 1;
  -    nbytesdecoded = ((nprbytes + 3) / 4) * 3;
  +    decoded = (char *) ap_palloc(p, 1+ap_uudecode_len(bufcoded));
  +    l = ap_uudecode(decoded,bufcoded);
  +    decoded[l]='\0'; /* make binary sequence into string */
   
  -    bufplain = ap_palloc(p, nbytesdecoded + 1);
  -    bufout = (unsigned char *) bufplain;
  -
  -    bufin = (const unsigned char *) bufcoded;
  -
  -    while (nprbytes > 4) {
  -	*(bufout++) = os_toebcdic[
  -	    (unsigned char) (pr2six[os_toascii[*bufin]] << 2 | pr2six[os_toascii[bufin[1]]] >> 4)];
  -	*(bufout++) = os_toebcdic[
  -	    (unsigned char) (pr2six[os_toascii[bufin[1]]] << 4 | pr2six[os_toascii[bufin[2]]] >> 2)];
  -	*(bufout++) = os_toebcdic[
  -	    (unsigned char) (pr2six[os_toascii[bufin[2]]] << 6 | pr2six[os_toascii[bufin[3]]])];
  -	bufin += 4;
  -	nprbytes -= 4;
  -    }
  -
  -    /* Note: (nprbytes == 1) would be an error, so just ingore that case */
  -    if (nprbytes > 1) {
  -	*(bufout++) = os_toebcdic[
  -	    (unsigned char) (pr2six[os_toascii[*bufin]] << 2 | pr2six[os_toascii[bufin[1]]] >> 4)];
  -    }
  -    if (nprbytes > 2) {
  -	*(bufout++) = os_toebcdic[
  -	    (unsigned char) (pr2six[os_toascii[bufin[1]]] << 4 | pr2six[os_toascii[bufin[2]]] >> 2)];
  -    }
  -    if (nprbytes > 3) {
  -        *(bufout++) = os_toebcdic[
  -            (unsigned char) (pr2six[os_toascii[bufin[2]]] << 6 | pr2six[os_toascii[bufin[3]]])];
  -    }
  -#endif /*CHARSET_EBCDIC*/
  -
  -    nbytesdecoded -= (4 - nprbytes) & 3;
  -    bufplain[nbytesdecoded] = '\0';
  -
  -    return bufplain;
  +    return decoded;
   }
   
  -static const char basis_64[] = 
  -"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 
  - 
  -API_EXPORT(char *) ap_uuencode(pool *a, char *string) 
  +API_EXPORT(char *) ap_puuencode(pool *p, char *string) 
   { 
  -    int i, len = strlen(string); 
  -    char *p; 
  -    char *encoded = (char *) ap_palloc(a, ((len+2) / 3 * 4) + 1); 
  - 
  -    p = encoded; 
  -#ifndef CHARSET_EBCDIC
  -    for (i = 0; i < len-2; i += 3) { 
  -        *p++ = basis_64[(string[i] >> 2) & 0x3F]; 
  -        *p++ = basis_64[((string[i] & 0x3) << 4) | ((int) (string[i + 1] & 0xF0) >> 4)]; 
  -        *p++ = basis_64[((string[i + 1] & 0xF) << 2) | ((int) (string[i + 2] & 0xC0) >> 6)]; 
  -        *p++ = basis_64[string[i + 2] & 0x3F]; 
  -    } 
  -    if (i < len) {
  -        *p++ = basis_64[(string[i] >> 2) & 0x3F]; 
  -       *p++ = basis_64[((string[i] & 0x3) << 4) | ((int) (string[i + 1] & 0xF0) >> 4)]; 
  -       if (i == (len-2))
  -           *p++ = basis_64[((string[i + 1] & 0xF) << 2)]; 
  -       else
  -           *p++ = '='; 
  -       *p++ = '='; 
  -    }
  -#else /*CHARSET_EBCDIC*/
  -    for (i = 0; i < len-2; i += 3) { 
  -        *p++ = basis_64[(os_toascii[string[i]] >> 2) & 0x3F]; 
  -        *p++ = basis_64[((os_toascii[string[i]] & 0x3) << 4) | ((int) (os_toascii[string[i + 1]] & 0xF0) >> 4)]; 
  -        *p++ = basis_64[((os_toascii[string[i + 1]] & 0xF) << 2) | ((int) (os_toascii[string[i + 2]] & 0xC0) >> 6)]; 
  -        *p++ = basis_64[os_toascii[string[i + 2]] & 0x3F]; 
  -    } 
  -    if (i < len) {
  -        *p++ = basis_64[(os_toascii[string[i]] >> 2) & 0x3F]; 
  -       *p++ = basis_64[((os_toascii[string[i]] & 0x3) << 4) | ((int) (os_toascii[string[i + 1]] & 0xF0) >> 4)]; 
  -       if (i == (len-2))
  -           *p++ = basis_64[((os_toascii[string[i + 1]] & 0xF) << 2)]; 
  -       else
  -           *p++ = '='; 
  -       *p++ = '='; 
  -    }
  -#endif /*CHARSET_EBCDIC*/
  +    char *encoded;
  +    int l = strlen(string);
  +
  +    encoded = (char *) ap_palloc(p, 1+ap_uuencode_len(l));
  +    l=ap_uuencode(encoded,string,l);
  +    encoded[l]='\0'; /* make binary sequence into string */
   
  -    *p = '\0'; 
  -    return encoded; 
  -} 
  +    return encoded;
  +}
   
   #ifdef OS2
   void os2pathname(char *path)
  
  
  
  1.77      +1 -1      apache-1.3/src/modules/proxy/proxy_ftp.c
  
  Index: proxy_ftp.c
  ===================================================================
  RCS file: /x3/home/cvs/apache-1.3/src/modules/proxy/proxy_ftp.c,v
  retrieving revision 1.76
  retrieving revision 1.77
  diff -u -r1.76 -r1.77
  --- proxy_ftp.c	1999/06/05 15:48:11	1.76
  +++ proxy_ftp.c	1999/08/08 11:45:19	1.77
  @@ -510,7 +510,7 @@
        */
       if ((password = ap_table_get(r->headers_in, "Authorization")) != NULL
   	&& strcasecmp(ap_getword(r->pool, &password, ' '), "Basic") == 0
  -	&& (password = ap_uudecode(r->pool, password))[0] != ':') {
  +	&& (password = ap_puudecode(r->pool, password))[0] != ':') {
   	/* Note that this allocation has to be made from r->connection->pool
   	 * because it has the lifetime of the connection.  The other allocations
   	 * are temporary and can be tossed away any time.
  
  
  
  1.27      +19 -57    apache-1.3/src/support/ab.c
  
  Index: ab.c
  ===================================================================
  RCS file: /x3/home/cvs/apache-1.3/src/support/ab.c,v
  retrieving revision 1.26
  retrieving revision 1.27
  diff -u -r1.26 -r1.27
  --- ab.c	1999/07/19 07:19:43	1.26
  +++ ab.c	1999/08/08 11:45:20	1.27
  @@ -123,6 +123,7 @@
   #define ap_select       select
   #else				/* (!)NO_APACHE_INCLUDES */
   #include "ap_config.h"
  +#include "ap_base64.h"
   #ifdef CHARSET_EBCDIC
   #include "ebcdic.h"
   #endif
  @@ -238,56 +239,6 @@
       exit(errno);
   }
   
  -/* -- simple uuencode, lifted from main/util.c which
  - *    needed the pool, so duplicated here with normal
  - *    malloc.
  - */
  -static const char basis_64[] =
  -"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  -
  -static char *uuencode(char *string)
  -{
  -    int i, len = strlen(string);
  -    char *p;
  -    char *encoded = (char *) malloc((len + 2) / 3 * 4 + 1);
  -    p = encoded;
  -#ifndef CHARSET_EBCDIC
  -    for (i = 0; i < len-2; i += 3) {
  -        *p++ = basis_64[(string[i] >> 2) & 0x3F];
  -        *p++ = basis_64[((string[i] & 0x3) << 4) | ((int) (string[i + 1] & 0xF0) >> 4)];
  -        *p++ = basis_64[((string[i + 1] & 0xF) << 2) | ((int) (string[i + 2] & 0xC0) >> 6)];
  -        *p++ = basis_64[string[i + 2] & 0x3F];
  -    }
  -    if (i < len) {
  -        *p++ = basis_64[(string[i] >> 2) & 0x3F];
  -        *p++ = basis_64[((string[i] & 0x3) << 4) | ((int) (string[i + 1] & 0xF0) >> 4)];
  -        if (i == (len-2))
  -           *p++ = basis_64[((string[i + 1] & 0xF) << 2)];
  -        else
  -           *p++ = '=';
  -        *p++ = '=';
  -    }
  -#else /*CHARSET_EBCDIC*/
  -    for (i = 0; i < len-2; i += 3) {
  -        *p++ = basis_64[(os_toascii[string[i]] >> 2) & 0x3F];
  -        *p++ = basis_64[((os_toascii[string[i]] & 0x3) << 4) | ((int) (os_toascii[string[i + 1]] & 0xF0) >> 4)];
  -        *p++ = basis_64[((os_toascii[string[i + 1]] & 0xF) << 2) | ((int) (os_toascii[string[i + 2]] & 0xC0) >> 6)];
  -        *p++ = basis_64[os_toascii[string[i + 2]] & 0x3F];
  -    }
  -    if (i < len) {
  -       *p++ = basis_64[(os_toascii[string[i]] >> 2) & 0x3F];
  -       *p++ = basis_64[((os_toascii[string[i]] & 0x3) << 4) | ((int) (os_toascii[string[i + 1]] & 0xF0) >> 4)];
  -       if (i == (len-2))
  -           *p++ = basis_64[((os_toascii[string[i + 1]] & 0xF) << 2)];
  -       else
  -           *p++ = '=';
  -       *p++ = '=';
  -    }
  -#endif /*CHARSET_EBCDIC*/
  -    *p = '\0';
  -    return encoded;
  -}
  -
   /* --------------------------------------------------------- */
   
   /* write out request to a connection - assumes we can write
  @@ -1021,7 +972,8 @@
   /* sort out command-line args and call test */
   int main(int argc, char **argv)
   {
  -    int c, r;
  +    int c, r,l;
  +    char tmp[1024];
   
       /* table defaults  */
       tablestring = "";
  @@ -1064,25 +1016,35 @@
   	case 'T':
   	    strcpy(content_type, optarg);
   	    break;
  -	case 'C':
  +	case 'C': 
   	    strncat(cookie, "Cookie: ", sizeof(cookie));
   	    strncat(cookie, optarg, sizeof(cookie));
   	    strncat(cookie, "\r\n", sizeof(cookie));
   	    break;
  -	case 'A':
  -	    /*
  -	     * assume username passwd already to be in colon separated form.
  +	case 'A': 
  +	    /* assume username passwd already to be in colon separated form. Ready
  +	     * to be uu-encoded.
   	     */
  +	    while(isspace(*optarg))
  +		optarg++;
  +	    l=ap_uuencode(tmp,optarg,strlen(optarg));
  +	    tmp[l]='\0';
  +
   	    strncat(auth, "Authorization: basic ", sizeof(auth));
  -	    strncat(auth, uuencode(optarg), sizeof(auth));
  +	    strncat(auth, tmp, sizeof(auth));
   	    strncat(auth, "\r\n", sizeof(auth));
   	    break;
   	case 'P':
   	    /*
   	     * assume username passwd already to be in colon separated form.
   	     */
  +	    while(isspace(*optarg))
  +		optarg++;
  +	    l=ap_uuencode(tmp,optarg,strlen(optarg));
  +	    tmp[l]='\0';
  +
   	    strncat(auth, "Proxy-Authorization: basic ", sizeof(auth));
  -	    strncat(auth, uuencode(optarg), sizeof(auth));
  +	    strncat(auth, tmp, sizeof(auth));
   	    strncat(auth, "\r\n", sizeof(auth));
   	    break;
   	case 'H':