1 /* This file is part of the Project Athena Zephyr Notification System.
2 * It contains source for the ZFormatAuthenticNotice function.
4 * Created by: Robert French
8 * Copyright (c) 1987,1988 by the Massachusetts Institute of Technology.
9 * For copying and distribution information, see the file
14 static char rcsid_ZFormatAuthenticNotice_c[] = "$Id$";
19 #if defined(HAVE_KRB4) || defined(HAVE_KRB5)
21 ZFormatAuthenticNotice(ZNotice_t *notice,
22 register char *buffer,
23 register int buffer_len,
33 newnotice.z_authent_len = 0;
34 newnotice.z_ascii_authent = "";
36 if ((retval = Z_FormatRawHeader(&newnotice, buffer, buffer_len,
37 &hdrlen, &ptr, NULL)) != ZERR_NONE)
41 newnotice.z_checksum = 0;
43 newnotice.z_checksum =
44 (ZChecksum_t)des_quad_cksum(buffer, NULL, ptr - buffer, 0, session);
46 if ((retval = Z_FormatRawHeader(&newnotice, buffer, buffer_len,
47 &hdrlen, NULL, NULL)) != ZERR_NONE)
52 if (newnotice.z_message_len+hdrlen > buffer_len)
55 (void) memcpy(ptr, newnotice.z_message, newnotice.z_message_len);
57 *len = hdrlen+newnotice.z_message_len;
59 if (*len > Z_MAXPKTLEN)
68 ZFormatAuthenticNoticeV5(ZNotice_t *notice,
69 register char *buffer,
70 register int buffer_len,
72 krb5_keyblock *keyblock)
76 int retval, hdrlen, hdr_adj;
78 krb5_cksumtype cksumtype;
80 char *svcinst, *x, *y;
82 char *cksum_start, *cstart, *cend;
85 key_len = Z_keylen(keyblock);
86 retval = Z_ExtractEncCksum(keyblock, &enctype, &cksumtype);
88 return (ZAUTH_FAILED);
90 if (key_len == 8 && (enctype == ENCTYPE_DES_CBC_CRC ||
91 enctype == ENCTYPE_DES_CBC_MD4 ||
92 enctype == ENCTYPE_DES_CBC_MD5)) {
94 memcpy(&tmp, Z_keydata(keyblock), key_len);
95 return ZFormatAuthenticNotice(notice, buffer, buffer_len, len,
100 newnotice.z_auth = 1;
101 newnotice.z_authent_len = 0;
102 newnotice.z_ascii_authent = "";
104 if ((retval = Z_NewFormatRawHeader(&newnotice, buffer, buffer_len,
106 &cksum_start, &cksum_len, &cstart,
107 &cend)) != ZERR_NONE)
110 retval = Z_InsertZcodeChecksum(keyblock, &newnotice, buffer,
111 cksum_start, cksum_len, cstart, cend,
112 buffer_len, &hdr_adj);
120 if (newnotice.z_message_len+hdrlen > buffer_len)
121 return (ZERR_PKTLEN);
123 (void) memcpy(ptr, newnotice.z_message, newnotice.z_message_len);
125 *len = hdrlen+newnotice.z_message_len;
127 if (*len > Z_MAXPKTLEN)
128 return (ZERR_PKTLEN);