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);