struct rx_securityClass * rxkad_NewClientSecurityObject(rxkad_level level, struct ktc_encryptionKey *sessionkey, afs_int32 kvno, int ticketLen, char *ticket) { struct rx_securityClass *tsc; struct rxkad_cprivate *tcp; int code; int size, psize; rxkad_Init(); size = sizeof(struct rx_securityClass); tsc = rxi_Alloc(size); memset((void *)tsc, 0, size); tsc->refCount = 1; /* caller gets one for free */ tsc->ops = &rxkad_client_ops; psize = PDATA_SIZE(ticketLen); tcp = rxi_Alloc(psize); memset((void *)tcp, 0, psize); tsc->privateData = (char *)tcp; tcp->type |= rxkad_client; tcp->level = level; code = fc_keysched(sessionkey, tcp->keysched); if (code) { rxi_Free(tcp, psize); rxi_Free(tsc, sizeof(struct rx_securityClass)); return 0; /* bad key */ } memcpy((void *)tcp->ivec, (void *)sessionkey, sizeof(tcp->ivec)); tcp->kvno = kvno; /* key version number */ tcp->ticketLen = ticketLen; /* length of ticket */ if (tcp->ticketLen > MAXKTCTICKETLEN) { rxi_Free(tcp, psize); rxi_Free(tsc, sizeof(struct rx_securityClass)); return 0; /* bad key */ } memcpy(tcp->ticket, ticket, ticketLen); INC_RXKAD_STATS(clientObjects); return tsc; }
struct rx_securityClass * rxkad_NewServerSecurityObject(rxkad_level level, void *get_key_rock, int (*get_key) (void *get_key_rock, int kvno, struct ktc_encryptionKey * serverKey), int (*user_ok) (char *name, char *instance, char *cell, afs_int32 kvno)) { struct rx_securityClass *tsc; struct rxkad_sprivate *tsp; int size; rxkad_Init(); if (!get_key) return 0; size = sizeof(struct rx_securityClass); tsc = rxi_Alloc(size); memset(tsc, 0, size); tsc->refCount = 1; /* caller has one reference */ tsc->ops = &rxkad_server_ops; size = sizeof(struct rxkad_sprivate); tsp = rxi_Alloc(size); memset(tsp, 0, size); tsc->privateData = (char *)tsp; tsp->type |= rxkad_server; /* so can identify later */ tsp->level = level; /* level of encryption */ tsp->get_key_rock = get_key_rock; tsp->get_key = get_key; /* to get server ticket */ tsp->user_ok = user_ok; /* to inform server of client id. */ init_random_int32(); INC_RXKAD_STATS(serverObjects); return tsc; }