Code_t ZFormatAuthenticNotice(ZNotice_t *notice, char *buffer, int buffer_len, int *len, C_Block session) { ZNotice_t newnotice; char *ptr; int retval, hdrlen; newnotice = *notice; newnotice.z_auth = 1; newnotice.z_authent_len = 0; newnotice.z_ascii_authent = ""; if ((retval = Z_FormatRawHeader(&newnotice, buffer, buffer_len, &hdrlen, &ptr, NULL)) != ZERR_NONE) return (retval); newnotice.z_checksum = (ZChecksum_t)des_quad_cksum((void *)buffer, NULL, ptr - buffer, 0, (C_Block *)session); if ((retval = Z_FormatRawHeader(&newnotice, buffer, buffer_len, &hdrlen, NULL, NULL)) != ZERR_NONE) return (retval); ptr = buffer+hdrlen; if (newnotice.z_message_len+hdrlen > buffer_len) return (ZERR_PKTLEN); (void) memcpy(ptr, newnotice.z_message, newnotice.z_message_len); *len = hdrlen+newnotice.z_message_len; if (*len > Z_MAXPKTLEN) return (ZERR_PKTLEN); return (ZERR_NONE); }
Code_t ZFormatRawNoticeList(ZNotice_t *notice, char *list[], int nitems, char **buffer, int *ret_len) { char header[Z_MAXHEADERLEN]; int hdrlen, i, size; char *ptr; Code_t retval; if ((retval = Z_FormatRawHeader(notice, header, sizeof(header), &hdrlen, NULL, NULL)) != ZERR_NONE) return (retval); size = 0; for (i=0;i<nitems;i++) size += strlen(list[i])+1; *ret_len = hdrlen+size; if (!(*buffer = (char *) malloc((unsigned) *ret_len))) return (ENOMEM); (void) memcpy(*buffer, header, hdrlen); ptr = *buffer+hdrlen; for (;nitems;nitems--, list++) { i = strlen(*list)+1; (void) memcpy(ptr, *list, i); ptr += i; } return (ZERR_NONE); }
Code_t ZFormatRawNotice(register ZNotice_t *notice, char **buffer, int *ret_len) { char header[Z_MAXHEADERLEN]; int hdrlen; Code_t retval; if ((retval = Z_FormatRawHeader(notice, header, sizeof(header), &hdrlen, NULL, NULL)) != ZERR_NONE) return (retval); *ret_len = hdrlen+notice->z_message_len; /* *ret_len is never 0, don't have to worry about malloc(0) */ if (!(*buffer = (char *) malloc((unsigned) *ret_len))) return (ENOMEM); (void) memcpy(*buffer, header, hdrlen); (void) memcpy(*buffer+hdrlen, notice->z_message, notice->z_message_len); return (ZERR_NONE); }
Code_t ZMakeAuthentication(register ZNotice_t *notice, char *buffer, int buffer_len, int *len) { #ifdef HAVE_KRB5 return ZMakeZcodeAuthentication(notice, buffer, buffer_len, len/*?XXX*/); #else #ifdef HAVE_KRB4 int result; KTEXT_ST authent; char *cstart, *cend; ZChecksum_t checksum; CREDENTIALS cred; C_Block *session; result = krb_mk_req(&authent, SERVER_SERVICE, SERVER_INSTANCE, __Zephyr_realm, 0); if (result != MK_AP_OK) return (result+krb_err_base); result = krb_get_cred(SERVER_SERVICE, SERVER_INSTANCE, __Zephyr_realm, &cred); if (result != KSUCCESS) return (result+krb_err_base); session = (C_Block *)cred.session; notice->z_auth = 1; notice->z_authent_len = authent.length; notice->z_ascii_authent = (char *)malloc((unsigned)authent.length*3); /* zero length authent is an error, so malloc(0) is not a problem */ if (!notice->z_ascii_authent) return (ENOMEM); if ((result = ZMakeAscii(notice->z_ascii_authent, authent.length*3, authent.dat, authent.length)) != ZERR_NONE) { free(notice->z_ascii_authent); return (result); } result = Z_FormatRawHeader(notice, buffer, buffer_len, len, &cstart, &cend); free(notice->z_ascii_authent); notice->z_authent_len = 0; if (result) return(result); /* Compute a checksum over the header and message. */ checksum = des_quad_cksum((unsigned char *)buffer, NULL, cstart - buffer, 0, session); checksum ^= des_quad_cksum((unsigned char *)cend, NULL, buffer + *len - cend, 0, session); checksum ^= des_quad_cksum((unsigned char *)notice->z_message, NULL, notice->z_message_len, 0, session); notice->z_checksum = checksum; ZMakeAscii32(cstart, buffer + buffer_len - cstart, checksum); return (ZERR_NONE); #else notice->z_checksum = 0; notice->z_auth = 1; notice->z_authent_len = 0; notice->z_ascii_authent = ""; return (Z_FormatRawHeader(notice, buffer, buffer_len, len, NULL, NULL)); #endif #endif }