From 63e063c0681783c90e604aa788dc4e9e52f0719b Mon Sep 17 00:00:00 2001 From: "Robert S. French" Date: Sun, 5 Jul 1987 22:08:41 +0000 Subject: Initial revision --- lib/ZCkAuth.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 lib/ZCkAuth.c (limited to 'lib/ZCkAuth.c') diff --git a/lib/ZCkAuth.c b/lib/ZCkAuth.c new file mode 100644 index 0000000..bb7108c --- /dev/null +++ b/lib/ZCkAuth.c @@ -0,0 +1,64 @@ +/* This file is part of the Project Athena Zephyr Notification System. + * It contains source for the ZCheckAuthentication function. + * + * Created by: Robert French + * + * $Source$ + * $Author$ + * + * Copyright (c) 1987 by the Massachusetts Institute of Technology. + * For copying and distribution information, see the file + * "mit-copyright.h". + */ +/* $Header$ */ + +#include + +#include + +int ZCheckAuthentication(notice,buffer,from) + ZNotice_t *notice; + ZPacket_t buffer; + struct sockaddr_in *from; +{ + int result; + char srcprincipal[ANAME_SZ+INST_SZ+REALM_SZ+4]; + KTEXT_ST authent; + AUTH_DAT dat; + ZChecksum_t our_checksum; + CREDENTIALS cred; + + if (!notice->z_auth) + return (0); + + if (__Zephyr_server) { + if (ZReadAscii(notice->z_ascii_authent, + strlen(notice->z_ascii_authent)+1, + (char *)authent.dat, + notice->z_authent_len) == ZERR_BADFIELD) { + return (0); + } + authent.length = notice->z_authent_len; + result = rd_ap_req(&authent,SERVER_SERVICE, + SERVER_INSTANCE,from->sin_addr.s_addr, + &dat,SERVER_SRVTAB); + bcopy((char *)dat.session,(char *)__Zephyr_session, + sizeof(C_Block)); + (void) sprintf(srcprincipal,"%s%s%s@%s",dat.pname, + dat.pinst[0]?".":"",dat.pinst,dat.prealm); + if (strcmp(srcprincipal,notice->z_sender)) + return (0); + return (result == RD_AP_OK); + } + + if (result = get_credentials(SERVER_SERVICE,SERVER_INSTANCE, + __Zephyr_realm,&cred)) + return (result+krb_err_base); + + our_checksum = (ZChecksum_t)quad_cksum(buffer,NULL, + notice->z_recipient+ + strlen(notice->z_recipient)+1- + buffer,0,cred.session); + + return (our_checksum == notice->z_checksum); +} -- cgit v1.2.3