Annotation of 43BSDReno/kerberosIV/krb/decomp_ticket.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * $Source: /mit/kerberos/src/lib/krb/RCS/decomp_ticket.c,v $
        !             3:  * $Author: jtkohl $
        !             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_decomp_ticket_c =
        !            14: "$Header: decomp_ticket.c,v 4.12 89/05/16 18:44:46 jtkohl Exp $";
        !            15: #endif /* lint */
        !            16: 
        !            17: #include <mit-copyright.h>
        !            18: #include <stdio.h>
        !            19: #include <des.h>
        !            20: #include <krb.h>
        !            21: #include <prot.h>
        !            22: #include <strings.h>
        !            23: 
        !            24: /*
        !            25:  * This routine takes a ticket and pointers to the variables that
        !            26:  * should be filled in based on the information in the ticket.  It
        !            27: #ifndef NOENCRYPTION
        !            28:  * decrypts the ticket using the given key, and 
        !            29: #endif
        !            30:  * fills in values for its arguments.
        !            31:  *
        !            32:  * Note: if the client realm field in the ticket is the null string,
        !            33:  * then the "prealm" variable is filled in with the local realm (as
        !            34:  * defined by KRB_REALM).
        !            35:  *
        !            36:  * If the ticket byte order is different than the host's byte order
        !            37:  * (as indicated by the byte order bit of the "flags" field), then
        !            38:  * the KDC timestamp "time_sec" is byte-swapped.  The other fields
        !            39:  * potentially affected by byte order, "paddress" and "session" are
        !            40:  * not byte-swapped.
        !            41:  *
        !            42:  * The routine returns KFAILURE if any of the "pname", "pinstance",
        !            43:  * or "prealm" fields is too big, otherwise it returns KSUCCESS.
        !            44:  *
        !            45:  * The corresponding routine to generate tickets is create_ticket.
        !            46:  * When changes are made to this routine, the corresponding changes
        !            47:  * should also be made to that file.
        !            48:  *
        !            49:  * See create_ticket.c for the format of the ticket packet.
        !            50:  */
        !            51: 
        !            52: decomp_ticket(tkt, flags, pname, pinstance, prealm, paddress, session,
        !            53:               life, time_sec, sname, sinstance, key, key_s)
        !            54:     KTEXT tkt;                 /* The ticket to be decoded */
        !            55:     unsigned char *flags;       /* Kerberos ticket flags */
        !            56:     char *pname;               /* Authentication name */
        !            57:     char *pinstance;           /* Principal's instance */
        !            58:     char *prealm;              /* Principal's authentication domain */
        !            59:     unsigned long *paddress;    /* Net address of entity
        !            60:                                  * requesting ticket */
        !            61:     C_Block session;           /* Session key inserted in ticket */
        !            62:     int *life;                         /* Lifetime of the ticket */
        !            63:     unsigned long *time_sec;    /* Issue time and date */
        !            64:     char *sname;               /* Service name */
        !            65:     char *sinstance;           /* Service instance */
        !            66:     C_Block key;               /* Service's secret key
        !            67:                                  * (to decrypt the ticket) */
        !            68:     Key_schedule key_s;                /* The precomputed key schedule */
        !            69: {
        !            70:     static int tkt_swap_bytes;
        !            71:     unsigned char *uptr;
        !            72:     char *ptr = (char *)tkt->dat;
        !            73: 
        !            74: #ifndef NOENCRYPTION
        !            75:     /* Do the decryption */
        !            76:     pcbc_encrypt((C_Block *)tkt->dat,(C_Block *)tkt->dat,
        !            77:                  (long) tkt->length,key_s,key,0);
        !            78: #endif /* ! NOENCRYPTION */
        !            79: 
        !            80:     *flags = *ptr;              /* get flags byte */
        !            81:     ptr += sizeof(*flags);
        !            82:     tkt_swap_bytes = 0;
        !            83:     if (HOST_BYTE_ORDER != ((*flags >> K_FLAG_ORDER)& 1))
        !            84:         tkt_swap_bytes++;
        !            85: 
        !            86:     if (strlen(ptr) > ANAME_SZ)
        !            87:         return(KFAILURE);
        !            88:     (void) strcpy(pname,ptr);   /* pname */
        !            89:     ptr += strlen(pname) + 1;
        !            90: 
        !            91:     if (strlen(ptr) > INST_SZ)
        !            92:         return(KFAILURE);
        !            93:     (void) strcpy(pinstance,ptr); /* instance */
        !            94:     ptr += strlen(pinstance) + 1;
        !            95: 
        !            96:     if (strlen(ptr) > REALM_SZ)
        !            97:         return(KFAILURE);
        !            98:     (void) strcpy(prealm,ptr);  /* realm */
        !            99:     ptr += strlen(prealm) + 1;
        !           100:     /* temporary hack until realms are dealt with properly */
        !           101:     if (*prealm == 0)
        !           102:         (void) strcpy(prealm,KRB_REALM);
        !           103: 
        !           104:     bcopy(ptr,(char *)paddress,4); /* net address */
        !           105:     ptr += 4;
        !           106: 
        !           107:     bcopy(ptr,(char *)session,8); /* session key */
        !           108:     ptr+= 8;
        !           109: #ifdef notdef /* DONT SWAP SESSION KEY spm 10/22/86 */
        !           110:     if (tkt_swap_bytes)
        !           111:         swap_C_Block(session);
        !           112: #endif
        !           113: 
        !           114:     /* get lifetime, being certain we don't get negative lifetimes */
        !           115:     uptr = (unsigned char *) ptr++;
        !           116:     *life = (int) *uptr;
        !           117: 
        !           118:     bcopy(ptr,(char *) time_sec,4); /* issue time */
        !           119:     ptr += 4;
        !           120:     if (tkt_swap_bytes)
        !           121:         swap_u_long(*time_sec);
        !           122: 
        !           123:     (void) strcpy(sname,ptr);   /* service name */
        !           124:     ptr += 1 + strlen(sname);
        !           125: 
        !           126:     (void) strcpy(sinstance,ptr); /* instance */
        !           127:     ptr += 1 + strlen(sinstance);
        !           128:     return(KSUCCESS);
        !           129: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.