martin      98/05/13 08:31:02

  Modified:    src/os/bs2000 ebcdic.h ebcdic.c
               src/main md5c.c
  Log:
  Fix digest authentication for EBCDIC charset
  
  Revision  Changes    Path
  1.4       +1 -0      apache-1.3/src/os/bs2000/ebcdic.h
  
  Index: ebcdic.h
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/os/bs2000/ebcdic.h,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -u -r1.3 -r1.4
  --- ebcdic.h  1998/04/01 14:09:08     1.3
  +++ ebcdic.h  1998/05/13 15:31:00     1.4
  @@ -3,5 +3,6 @@
   extern const unsigned char os_toascii[256];
   extern const unsigned char os_toebcdic[256];
   void ebcdic2ascii(unsigned char *dest, const unsigned char *srce, size_t 
count);
  +void ebcdic2ascii_strictly(unsigned char *dest, const unsigned char *srce, 
size_t count);
   void ascii2ebcdic(unsigned char *dest, const unsigned char *srce, size_t 
count);
   
  
  
  
  1.7       +7 -0      apache-1.3/src/os/bs2000/ebcdic.c
  
  Index: ebcdic.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/os/bs2000/ebcdic.c,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -u -r1.6 -r1.7
  --- ebcdic.c  1998/04/01 14:09:08     1.6
  +++ ebcdic.c  1998/05/13 15:31:01     1.7
  @@ -237,6 +237,13 @@
        }
   }
   void
  +ebcdic2ascii_strictly(unsigned char *dest, const unsigned char *srce, size_t 
count)
  +{
  +     while (count-- != 0) {
  +             *dest++ = os_toascii_strictly[*srce++];
  +     }
  +}
  +void
   ascii2ebcdic(unsigned char *dest, const unsigned char *srce, size_t count)
   {
        while (count-- != 0) {
  
  
  
  1.14      +22 -3     apache-1.3/src/main/md5c.c
  
  Index: md5c.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/main/md5c.c,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -u -r1.13 -r1.14
  --- md5c.c    1998/05/04 17:10:12     1.13
  +++ md5c.c    1998/05/13 15:31:02     1.14
  @@ -92,6 +92,9 @@
   
   #include "conf.h"
   #include "md5.h"
  +#ifdef CHARSET_EBCDIC
  +#include "ebcdic.h"
  +#endif /*CHARSET_EBCDIC*/
   
   /* Constants for MD5Transform routine.
    */
  @@ -210,12 +213,12 @@
       memcpy(&context->buffer[idx], &input[i], inputLen - i);
   #else /*CHARSET_EBCDIC*/
       if (inputLen >= partLen) {
  -     ebcdic2ascii(&context->buffer[idx], input, partLen);
  +     ebcdic2ascii_strictly(&context->buffer[idx], input, partLen);
        MD5Transform(context->state, context->buffer);
   
        for (i = partLen; i + 63 < inputLen; i += 64) {
            unsigned char inp_tmp[64];
  -         ebcdic2ascii(inp_tmp, &input[i], 64);
  +         ebcdic2ascii_strictly(inp_tmp, &input[i], 64);
            MD5Transform(context->state, inp_tmp);
        }
   
  @@ -225,7 +228,7 @@
        i = 0;
   
       /* Buffer remaining input */
  -    ebcdic2ascii(&context->buffer[idx], &input[i], inputLen - i);
  +    ebcdic2ascii_strictly(&context->buffer[idx], &input[i], inputLen - i);
   #endif /*CHARSET_EBCDIC*/
   }
   
  @@ -237,8 +240,24 @@
       unsigned char bits[8];
       unsigned int idx, padLen;
   
  +
       /* Save number of bits */
       Encode(bits, context->count, 8);
  +
  +#ifdef CHARSET_EBCDIC
  +    /* XXX: @@@: In order to make this no more complex than necessary,
  +     * this kludge converts the bits[] array using the ascii-to-ebcdic
  +     * table, because the following ap_MD5Update() re-translates
  +     * its input (ebcdic-to-ascii).
  +     * Otherwise, we would have to pass a "conversion" flag to ap_MD5Update()
  +     */
  +    ascii2ebcdic(bits,bits,8);
  +
  +    /* Since everything is converted to ascii within ap_MD5Update(), 
  +     * the initial 0x80 (PADDING[0]) must be stored as 0x20 
  +     */
  +    PADDING[0] = os_toebcdic[0x80];
  +#endif /*CHARSET_EBCDIC*/
   
       /* Pad out to 56 mod 64. */
       idx = (unsigned int) ((context->count[0] >> 3) & 0x3f);
  
  
  

Reply via email to