home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / kerberosIV / krb / create_auth_reply.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-06-25  |  3.7 KB  |  120 lines

  1. /*
  2.  * $Source: /usr/src/kerberosIV/krb/RCS/create_auth_reply.c,v $
  3.  * $Author: kfall $
  4.  *
  5.  * Copyright 1985, 1986, 1987, 1988 by the Massachusetts Institute
  6.  * of Technology.
  7.  *
  8.  * For copying and distribution information, please see the file
  9.  * <mit-copyright.h>.
  10.  */
  11.  
  12. #ifndef lint
  13. static char *rcsid_create_auth_reply_c =
  14. "$Header: /usr/src/kerberosIV/krb/RCS/create_auth_reply.c,v 4.11 90/06/25 20:55:20 kfall Exp $";
  15. #endif /* lint */
  16.  
  17. #include <mit-copyright.h>
  18. #include <des.h>
  19. #include <krb.h>
  20. #include <prot.h>
  21. #include <strings.h>
  22.  
  23. /*
  24.  * This routine is called by the Kerberos authentication server
  25.  * to create a reply to an authentication request.  The routine
  26.  * takes the user's name, instance, and realm, the client's
  27.  * timestamp, the number of tickets, the user's key version
  28.  * number and the ciphertext containing the tickets themselves.
  29.  * It constructs a packet and returns a pointer to it.
  30.  *
  31.  * Notes: The packet returned by this routine is static.  Thus, if you
  32.  * intend to keep the result beyond the next call to this routine, you
  33.  * must copy it elsewhere.
  34.  *
  35.  * The packet is built in the following format:
  36.  * 
  37.  *             variable
  38.  * type            or constant       data
  39.  * ----            -----------       ----
  40.  * 
  41.  * unsigned char    KRB_PROT_VERSION   protocol version number
  42.  * 
  43.  * unsigned char    AUTH_MSG_KDC_REPLY protocol message type
  44.  * 
  45.  * [least significant    HOST_BYTE_ORDER       sender's (server's) byte
  46.  *  bit of above field]               order
  47.  * 
  48.  * string        pname           principal's name
  49.  * 
  50.  * string        pinst           principal's instance
  51.  * 
  52.  * string        prealm           principal's realm
  53.  * 
  54.  * unsigned long    time_ws           client's timestamp
  55.  * 
  56.  * unsigned char    n           number of tickets
  57.  * 
  58.  * unsigned long    x_date           expiration date
  59.  * 
  60.  * unsigned char    kvno           master key version
  61.  * 
  62.  * short        w_1           cipher length
  63.  * 
  64.  * ---            cipher->dat       cipher data
  65.  */
  66.  
  67. KTEXT
  68. create_auth_reply(pname,pinst,prealm,time_ws,n,x_date,kvno,cipher)
  69.     char *pname;                /* Principal's name */
  70.     char *pinst;                /* Principal's instance */
  71.     char *prealm;               /* Principal's authentication domain */
  72.     long time_ws;               /* Workstation time */
  73.     int n;                      /* Number of tickets */
  74.     unsigned long x_date;    /* Principal's expiration date */
  75.     int kvno;                   /* Principal's key version number */
  76.     KTEXT cipher;               /* Cipher text with tickets and
  77.                  * session keys */
  78. {
  79.     static  KTEXT_ST pkt_st;
  80.     KTEXT pkt = &pkt_st;
  81.     unsigned char *v =  pkt->dat; /* Prot vers number */
  82.     unsigned char *t = (pkt->dat+1); /* Prot message type */
  83.     short w_l;            /* Cipher length */
  84.  
  85.     /* Create fixed part of packet */
  86.     *v = (unsigned char) KRB_PROT_VERSION;
  87.     *t = (unsigned char) AUTH_MSG_KDC_REPLY;
  88.     *t |= HOST_BYTE_ORDER;
  89.  
  90.     if (n != 0)
  91.     *v = 3;
  92.  
  93.     /* Add the basic info */
  94.     (void) strcpy((char *) (pkt->dat+2), pname);
  95.     pkt->length = 3 + strlen(pname);
  96.     (void) strcpy((char *) (pkt->dat+pkt->length),pinst);
  97.     pkt->length += 1 + strlen(pinst);
  98.     (void) strcpy((char *) (pkt->dat+pkt->length),prealm);
  99.     pkt->length += 1 + strlen(prealm);
  100.     /* Workstation timestamp */
  101.     bcopy((char *) &time_ws, (char *) (pkt->dat+pkt->length), 4);
  102.     pkt->length += 4;
  103.     *(pkt->dat+(pkt->length)++) = (unsigned char) n;
  104.     /* Expiration date */
  105.     bcopy((char *) &x_date, (char *) (pkt->dat+pkt->length),4);
  106.     pkt->length += 4;
  107.  
  108.     /* Now send the ciphertext and info to help decode it */
  109.     *(pkt->dat+(pkt->length)++) = (unsigned char) kvno;
  110.     w_l = (short) cipher->length;
  111.     bcopy((char *) &w_l,(char *) (pkt->dat+pkt->length),2);
  112.     pkt->length += 2;
  113.     bcopy((char *) (cipher->dat), (char *) (pkt->dat+pkt->length),
  114.       cipher->length);
  115.     pkt->length += cipher->length;
  116.  
  117.     /* And return the packet */
  118.     return pkt;
  119. }
  120.