void XdmcpUnwrap ( unsigned char *input, unsigned char *wrapper, unsigned char *output, int bytes) { int i, j, k; unsigned char tmp[8]; unsigned char blocks[2][8]; unsigned char expand_wrapper[8]; auth_wrapper_schedule schedule; _XdmcpWrapperToOddParity (wrapper, expand_wrapper); _XdmcpAuthSetup (expand_wrapper, schedule); k = 0; for (j = 0; j < bytes; j += 8) { if (bytes - j < 8) return; /* bad input length */ for (i = 0; i < 8; i++) blocks[k][i] = input[j + i]; _XdmcpAuthDoIt ((unsigned char *) (input + j), (unsigned char *) tmp, schedule, 0); /* block chaining */ k = (k == 0) ? 1 : 0; for (i = 0; i < 8; i++) { if (j == 0) output[j + i] = tmp[i]; else output[j + i] = tmp[i] ^ blocks[k][i]; } } }
void XdmcpWrap ( unsigned char *input, unsigned char *wrapper, unsigned char *output, int bytes) { int i, j; int len; unsigned char tmp[8]; unsigned char expand_wrapper[8]; auth_wrapper_schedule schedule; _XdmcpWrapperToOddParity (wrapper, expand_wrapper); _XdmcpAuthSetup (expand_wrapper, schedule); for (j = 0; j < bytes; j += 8) { len = 8; if (bytes - j < len) len = bytes - j; /* block chaining */ for (i = 0; i < len; i++) { if (j == 0) tmp[i] = input[i]; else tmp[i] = input[j + i] ^ output[j - 8 + i]; } for (; i < 8; i++) { if (j == 0) tmp[i] = 0; else tmp[i] = 0 ^ output[j - 8 + i]; } _XdmcpAuthDoIt (tmp, (output + j), schedule, 1); } }