Path: blob/main/crypto/krb5/src/lib/kadm5/kadm_rpc_xdr.c
39536 views
/* -*- mode: c; c-file-style: "bsd"; indent-tabs-mode: t -*- */1/*2* Copyright 1993 OpenVision Technologies, Inc., All Rights Reserved3*/45#include <gssrpc/rpc.h>6#include <krb5.h>7#include <errno.h>8#include <kadm5/admin.h>9#include <kadm5/kadm_rpc.h>10#include <kadm5/admin_xdr.h>11#include <stdlib.h>12#include <string.h>1314static bool_t15_xdr_kadm5_principal_ent_rec(XDR *xdrs, kadm5_principal_ent_rec *objp,16int v);17static bool_t18_xdr_kadm5_policy_ent_rec(XDR *xdrs, kadm5_policy_ent_rec *objp, int vers);1920/*21* Function: xdr_ui_422*23* Purpose: XDR function which serves as a wrapper for xdr_u_int32,24* to prevent compiler warnings about type clashes between u_int3225* and krb5_ui_4.26*/27bool_t xdr_ui_4(XDR *xdrs, krb5_ui_4 *objp)28{29/* Assumes that krb5_ui_4 and u_int32 are both four bytes long.30This should not be a harmful assumption. */31return xdr_u_int32(xdrs, (uint32_t *) objp);32}333435/*36* Function: xdr_nullstring37*38* Purpose: XDR function for "strings" that are either NULL-terminated39* or NULL.40*/41bool_t xdr_nullstring(XDR *xdrs, char **objp)42{43u_int size;4445if (xdrs->x_op == XDR_ENCODE) {46if (*objp == NULL)47size = 0;48else49size = strlen(*objp) + 1;50}51if (! xdr_u_int(xdrs, &size)) {52return FALSE;53}54switch (xdrs->x_op) {55case XDR_DECODE:56if (size == 0) {57*objp = NULL;58return TRUE;59} else if (*objp == NULL) {60*objp = (char *) mem_alloc(size);61if (*objp == NULL) {62errno = ENOMEM;63return FALSE;64}65}66if (!xdr_opaque(xdrs, *objp, size))67return FALSE;68/* Check that the unmarshalled bytes are a C string. */69if ((*objp)[size - 1] != '\0')70return FALSE;71if (memchr(*objp, '\0', size - 1) != NULL)72return FALSE;73return TRUE;7475case XDR_ENCODE:76if (size != 0)77return (xdr_opaque(xdrs, *objp, size));78return TRUE;7980case XDR_FREE:81if (*objp != NULL)82mem_free(*objp, size);83*objp = NULL;84return TRUE;85}8687return FALSE;88}8990/*91* Function: xdr_nulltype92*93* Purpose: XDR function for arbitrary pointer types that are either94* NULL or contain data.95*/96bool_t xdr_nulltype(XDR *xdrs, void **objp, xdrproc_t proc)97{98bool_t null;99100switch (xdrs->x_op) {101case XDR_DECODE:102if (!xdr_bool(xdrs, &null))103return FALSE;104if (null) {105*objp = NULL;106return TRUE;107}108return (*proc)(xdrs, objp);109110case XDR_ENCODE:111if (*objp == NULL)112null = TRUE;113else114null = FALSE;115if (!xdr_bool(xdrs, &null))116return FALSE;117if (null == FALSE)118return (*proc)(xdrs, objp);119return TRUE;120121case XDR_FREE:122if (*objp)123return (*proc)(xdrs, objp);124return TRUE;125}126127return FALSE;128}129130bool_t131xdr_krb5_timestamp(XDR *xdrs, krb5_timestamp *objp)132{133/* This assumes that int32 and krb5_timestamp are the same size.134This shouldn't be a problem, since we've got a unit test which135checks for this. */136if (!xdr_int32(xdrs, (int32_t *) objp)) {137return (FALSE);138}139return (TRUE);140}141142bool_t143xdr_krb5_kvno(XDR *xdrs, krb5_kvno *objp)144{145return xdr_u_int(xdrs, objp);146}147148bool_t149xdr_krb5_deltat(XDR *xdrs, krb5_deltat *objp)150{151/* This assumes that int32 and krb5_deltat are the same size.152This shouldn't be a problem, since we've got a unit test which153checks for this. */154if (!xdr_int32(xdrs, (int32_t *) objp)) {155return (FALSE);156}157return (TRUE);158}159160bool_t161xdr_krb5_flags(XDR *xdrs, krb5_flags *objp)162{163/* This assumes that int32 and krb5_flags are the same size.164This shouldn't be a problem, since we've got a unit test which165checks for this. */166if (!xdr_int32(xdrs, (int32_t *) objp)) {167return (FALSE);168}169return (TRUE);170}171172bool_t173xdr_krb5_ui_4(XDR *xdrs, krb5_ui_4 *objp)174{175if (!xdr_u_int32(xdrs, (uint32_t *) objp)) {176return (FALSE);177}178return (TRUE);179}180181bool_t182xdr_krb5_int16(XDR *xdrs, krb5_int16 *objp)183{184int tmp;185186tmp = (int) *objp;187188if (!xdr_int(xdrs, &tmp))189return(FALSE);190191*objp = (krb5_int16) tmp;192193return(TRUE);194}195196/*197* Function: xdr_krb5_ui_2198*199* Purpose: XDR function which serves as a wrapper for xdr_u_int,200* to prevent compiler warnings about type clashes between u_int201* and krb5_ui_2.202*/203bool_t204xdr_krb5_ui_2(XDR *xdrs, krb5_ui_2 *objp)205{206unsigned int tmp;207208tmp = (unsigned int) *objp;209210if (!xdr_u_int(xdrs, &tmp))211return(FALSE);212213*objp = (krb5_ui_2) tmp;214215return(TRUE);216}217218219220static bool_t xdr_krb5_boolean(XDR *xdrs, krb5_boolean *kbool)221{222bool_t val;223224switch (xdrs->x_op) {225case XDR_DECODE:226if (!xdr_bool(xdrs, &val))227return FALSE;228229*kbool = (val == FALSE) ? FALSE : TRUE;230return TRUE;231232case XDR_ENCODE:233val = *kbool ? TRUE : FALSE;234return xdr_bool(xdrs, &val);235236case XDR_FREE:237return TRUE;238}239240return FALSE;241}242243bool_t xdr_krb5_key_data_nocontents(XDR *xdrs, krb5_key_data *objp)244{245/*246* Note that this function intentionally DOES NOT transfer key247* length or contents! xdr_krb5_key_data in adb_xdr.c does, but248* that is only for use within the server-side library.249*/250unsigned int tmp;251252if (xdrs->x_op == XDR_DECODE)253memset(objp, 0, sizeof(krb5_key_data));254255if (!xdr_krb5_int16(xdrs, &objp->key_data_ver)) {256return (FALSE);257}258if (!xdr_krb5_ui_2(xdrs, &objp->key_data_kvno)) {259return (FALSE);260}261if (!xdr_krb5_int16(xdrs, &objp->key_data_type[0])) {262return (FALSE);263}264if (objp->key_data_ver > 1) {265if (!xdr_krb5_int16(xdrs, &objp->key_data_type[1])) {266return (FALSE);267}268}269/*270* kadm5_get_principal on the server side allocates and returns271* key contents when asked. Even though this function refuses to272* transmit that data, it still has to *free* the data at the273* appropriate time to avoid a memory leak.274*/275if (xdrs->x_op == XDR_FREE) {276tmp = (unsigned int) objp->key_data_length[0];277if (!xdr_bytes(xdrs, (char **) &objp->key_data_contents[0],278&tmp, ~0))279return FALSE;280281tmp = (unsigned int) objp->key_data_length[1];282if (!xdr_bytes(xdrs, (char **) &objp->key_data_contents[1],283&tmp, ~0))284return FALSE;285}286287return (TRUE);288}289290291bool_t292xdr_krb5_key_salt_tuple(XDR *xdrs, krb5_key_salt_tuple *objp)293{294if (!xdr_krb5_enctype(xdrs, &objp->ks_enctype))295return FALSE;296if (!xdr_krb5_salttype(xdrs, &objp->ks_salttype))297return FALSE;298return TRUE;299}300301bool_t xdr_krb5_tl_data(XDR *xdrs, krb5_tl_data **tl_data_head)302{303krb5_tl_data *tl, *tl2;304bool_t more;305unsigned int len;306307switch (xdrs->x_op) {308case XDR_FREE:309tl = tl2 = *tl_data_head;310while (tl) {311tl2 = tl->tl_data_next;312free(tl->tl_data_contents);313free(tl);314tl = tl2;315}316*tl_data_head = NULL;317break;318319case XDR_ENCODE:320tl = *tl_data_head;321while (1) {322more = (tl != NULL);323if (!xdr_bool(xdrs, &more))324return FALSE;325if (tl == NULL)326break;327if (!xdr_krb5_int16(xdrs, &tl->tl_data_type))328return FALSE;329len = tl->tl_data_length;330if (!xdr_bytes(xdrs, (char **) &tl->tl_data_contents, &len, ~0))331return FALSE;332tl = tl->tl_data_next;333}334break;335336case XDR_DECODE:337tl = NULL;338while (1) {339if (!xdr_bool(xdrs, &more))340return FALSE;341if (more == FALSE)342break;343tl2 = (krb5_tl_data *) malloc(sizeof(krb5_tl_data));344if (tl2 == NULL)345return FALSE;346memset(tl2, 0, sizeof(krb5_tl_data));347if (!xdr_krb5_int16(xdrs, &tl2->tl_data_type))348return FALSE;349if (!xdr_bytes(xdrs, (char **)&tl2->tl_data_contents, &len, ~0))350return FALSE;351tl2->tl_data_length = len;352353tl2->tl_data_next = tl;354tl = tl2;355}356357*tl_data_head = tl;358break;359}360361return TRUE;362}363364bool_t365xdr_kadm5_ret_t(XDR *xdrs, kadm5_ret_t *objp)366{367uint32_t tmp;368369if (xdrs->x_op == XDR_ENCODE)370tmp = (uint32_t) *objp;371372if (!xdr_u_int32(xdrs, &tmp))373return (FALSE);374375if (xdrs->x_op == XDR_DECODE)376*objp = (kadm5_ret_t) tmp;377378return (TRUE);379}380381bool_t xdr_kadm5_principal_ent_rec(XDR *xdrs,382kadm5_principal_ent_rec *objp)383{384return _xdr_kadm5_principal_ent_rec(xdrs, objp, KADM5_API_VERSION_3);385}386387static bool_t388_xdr_kadm5_principal_ent_rec(XDR *xdrs, kadm5_principal_ent_rec *objp,389int v)390{391unsigned int n;392bool_t r;393394if (!xdr_krb5_principal(xdrs, &objp->principal)) {395return (FALSE);396}397if (!xdr_krb5_timestamp(xdrs, &objp->princ_expire_time)) {398return (FALSE);399}400if (!xdr_krb5_timestamp(xdrs, &objp->last_pwd_change)) {401return (FALSE);402}403if (!xdr_krb5_timestamp(xdrs, &objp->pw_expiration)) {404return (FALSE);405}406if (!xdr_krb5_deltat(xdrs, &objp->max_life)) {407return (FALSE);408}409if (!xdr_nulltype(xdrs, (void **) &objp->mod_name,410(xdrproc_t)xdr_krb5_principal)) {411return (FALSE);412}413if (!xdr_krb5_timestamp(xdrs, &objp->mod_date)) {414return (FALSE);415}416if (!xdr_krb5_flags(xdrs, &objp->attributes)) {417return (FALSE);418}419if (!xdr_krb5_kvno(xdrs, &objp->kvno)) {420return (FALSE);421}422if (!xdr_krb5_kvno(xdrs, &objp->mkvno)) {423return (FALSE);424}425if (!xdr_nullstring(xdrs, &objp->policy)) {426return (FALSE);427}428if (!xdr_long(xdrs, &objp->aux_attributes)) {429return (FALSE);430}431if (!xdr_krb5_deltat(xdrs, &objp->max_renewable_life)) {432return (FALSE);433}434if (!xdr_krb5_timestamp(xdrs, &objp->last_success)) {435return (FALSE);436}437if (!xdr_krb5_timestamp(xdrs, &objp->last_failed)) {438return (FALSE);439}440if (!xdr_krb5_kvno(xdrs, &objp->fail_auth_count)) {441return (FALSE);442}443if (!xdr_krb5_int16(xdrs, &objp->n_key_data)) {444return (FALSE);445}446if (xdrs->x_op == XDR_DECODE && objp->n_key_data < 0) {447return (FALSE);448}449if (!xdr_krb5_int16(xdrs, &objp->n_tl_data)) {450return (FALSE);451}452if (!xdr_nulltype(xdrs, (void **) &objp->tl_data,453(xdrproc_t)xdr_krb5_tl_data)) {454return FALSE;455}456n = objp->n_key_data;457r = xdr_array(xdrs, (caddr_t *) &objp->key_data, &n, objp->n_key_data,458sizeof(krb5_key_data),459(xdrproc_t)xdr_krb5_key_data_nocontents);460objp->n_key_data = n;461if (!r) {462return (FALSE);463}464465return (TRUE);466}467468static bool_t469_xdr_kadm5_policy_ent_rec(XDR *xdrs, kadm5_policy_ent_rec *objp, int vers)470{471if (!xdr_nullstring(xdrs, &objp->policy)) {472return (FALSE);473}474/* these all used to be u_int32, but it's stupid for sized types475to be exposed at the api, and they're the same as longs on the476wire. */477if (!xdr_long(xdrs, &objp->pw_min_life)) {478return (FALSE);479}480if (!xdr_long(xdrs, &objp->pw_max_life)) {481return (FALSE);482}483if (!xdr_long(xdrs, &objp->pw_min_length)) {484return (FALSE);485}486if (!xdr_long(xdrs, &objp->pw_min_classes)) {487return (FALSE);488}489if (!xdr_long(xdrs, &objp->pw_history_num)) {490return (FALSE);491}492if (!xdr_long(xdrs, &objp->policy_refcnt)) {493return (FALSE);494}495if (xdrs->x_op == XDR_DECODE) {496objp->pw_max_fail = 0;497objp->pw_failcnt_interval = 0;498objp->pw_lockout_duration = 0;499objp->attributes = 0;500objp->max_life = 0;501objp->max_renewable_life = 0;502objp->allowed_keysalts = NULL;503objp->n_tl_data = 0;504objp->tl_data = NULL;505}506if (vers >= KADM5_API_VERSION_3) {507if (!xdr_krb5_kvno(xdrs, &objp->pw_max_fail))508return (FALSE);509if (!xdr_krb5_deltat(xdrs, &objp->pw_failcnt_interval))510return (FALSE);511if (!xdr_krb5_deltat(xdrs, &objp->pw_lockout_duration))512return (FALSE);513}514if (vers >= KADM5_API_VERSION_4) {515if (!xdr_krb5_flags(xdrs, &objp->attributes)) {516return (FALSE);517}518if (!xdr_krb5_deltat(xdrs, &objp->max_life)) {519return (FALSE);520}521if (!xdr_krb5_deltat(xdrs, &objp->max_renewable_life)) {522return (FALSE);523}524if (!xdr_nullstring(xdrs, &objp->allowed_keysalts)) {525return (FALSE);526}527if (!xdr_krb5_int16(xdrs, &objp->n_tl_data)) {528return (FALSE);529}530if (!xdr_nulltype(xdrs, (void **) &objp->tl_data,531(xdrproc_t)xdr_krb5_tl_data)) {532return FALSE;533}534}535return (TRUE);536}537538bool_t539xdr_kadm5_policy_ent_rec(XDR *xdrs, kadm5_policy_ent_rec *objp)540{541return _xdr_kadm5_policy_ent_rec(xdrs, objp, KADM5_API_VERSION_4);542}543544bool_t545xdr_cprinc_arg(XDR *xdrs, cprinc_arg *objp)546{547if (!xdr_ui_4(xdrs, &objp->api_version)) {548return (FALSE);549}550if (!_xdr_kadm5_principal_ent_rec(xdrs, &objp->rec,551objp->api_version)) {552return (FALSE);553}554if (!xdr_long(xdrs, &objp->mask)) {555return (FALSE);556}557if (!xdr_nullstring(xdrs, &objp->passwd)) {558return (FALSE);559}560return (TRUE);561}562563bool_t564xdr_cprinc3_arg(XDR *xdrs, cprinc3_arg *objp)565{566if (!xdr_ui_4(xdrs, &objp->api_version)) {567return (FALSE);568}569if (!_xdr_kadm5_principal_ent_rec(xdrs, &objp->rec,570objp->api_version)) {571return (FALSE);572}573if (!xdr_long(xdrs, &objp->mask)) {574return (FALSE);575}576if (!xdr_array(xdrs, (caddr_t *)&objp->ks_tuple,577(unsigned int *)&objp->n_ks_tuple, ~0,578sizeof(krb5_key_salt_tuple),579(xdrproc_t)xdr_krb5_key_salt_tuple)) {580return (FALSE);581}582if (!xdr_nullstring(xdrs, &objp->passwd)) {583return (FALSE);584}585return (TRUE);586}587588bool_t589xdr_generic_ret(XDR *xdrs, generic_ret *objp)590{591if (!xdr_ui_4(xdrs, &objp->api_version)) {592return (FALSE);593}594if (!xdr_kadm5_ret_t(xdrs, &objp->code)) {595return (FALSE);596}597598return(TRUE);599}600601bool_t602xdr_dprinc_arg(XDR *xdrs, dprinc_arg *objp)603{604if (!xdr_ui_4(xdrs, &objp->api_version)) {605return (FALSE);606}607if (!xdr_krb5_principal(xdrs, &objp->princ)) {608return (FALSE);609}610return (TRUE);611}612613bool_t614xdr_mprinc_arg(XDR *xdrs, mprinc_arg *objp)615{616if (!xdr_ui_4(xdrs, &objp->api_version)) {617return (FALSE);618}619if (!_xdr_kadm5_principal_ent_rec(xdrs, &objp->rec,620objp->api_version)) {621return (FALSE);622}623if (!xdr_long(xdrs, &objp->mask)) {624return (FALSE);625}626return (TRUE);627}628629bool_t630xdr_rprinc_arg(XDR *xdrs, rprinc_arg *objp)631{632if (!xdr_ui_4(xdrs, &objp->api_version)) {633return (FALSE);634}635if (!xdr_krb5_principal(xdrs, &objp->src)) {636return (FALSE);637}638if (!xdr_krb5_principal(xdrs, &objp->dest)) {639return (FALSE);640}641return (TRUE);642}643644bool_t645xdr_gprincs_arg(XDR *xdrs, gprincs_arg *objp)646{647if (!xdr_ui_4(xdrs, &objp->api_version)) {648return (FALSE);649}650if (!xdr_nullstring(xdrs, &objp->exp)) {651return (FALSE);652}653return (TRUE);654}655656bool_t657xdr_gprincs_ret(XDR *xdrs, gprincs_ret *objp)658{659if (!xdr_ui_4(xdrs, &objp->api_version)) {660return (FALSE);661}662if (!xdr_kadm5_ret_t(xdrs, &objp->code)) {663return (FALSE);664}665if (objp->code == KADM5_OK) {666if (!xdr_int(xdrs, &objp->count)) {667return (FALSE);668}669if (!xdr_array(xdrs, (caddr_t *) &objp->princs,670(unsigned int *) &objp->count, ~0,671sizeof(char *), (xdrproc_t)xdr_nullstring)) {672return (FALSE);673}674}675676return (TRUE);677}678679bool_t680xdr_chpass_arg(XDR *xdrs, chpass_arg *objp)681{682if (!xdr_ui_4(xdrs, &objp->api_version)) {683return (FALSE);684}685if (!xdr_krb5_principal(xdrs, &objp->princ)) {686return (FALSE);687}688if (!xdr_nullstring(xdrs, &objp->pass)) {689return (FALSE);690}691return (TRUE);692}693694bool_t695xdr_chpass3_arg(XDR *xdrs, chpass3_arg *objp)696{697if (!xdr_ui_4(xdrs, &objp->api_version)) {698return (FALSE);699}700if (!xdr_krb5_principal(xdrs, &objp->princ)) {701return (FALSE);702}703if (!xdr_krb5_boolean(xdrs, &objp->keepold)) {704return (FALSE);705}706if (!xdr_array(xdrs, (caddr_t *)&objp->ks_tuple,707(unsigned int*)&objp->n_ks_tuple, ~0,708sizeof(krb5_key_salt_tuple),709(xdrproc_t)xdr_krb5_key_salt_tuple)) {710return (FALSE);711}712if (!xdr_nullstring(xdrs, &objp->pass)) {713return (FALSE);714}715return (TRUE);716}717718bool_t719xdr_setkey_arg(XDR *xdrs, setkey_arg *objp)720{721if (!xdr_ui_4(xdrs, &objp->api_version)) {722return (FALSE);723}724if (!xdr_krb5_principal(xdrs, &objp->princ)) {725return (FALSE);726}727if (!xdr_array(xdrs, (caddr_t *) &objp->keyblocks,728(unsigned int *) &objp->n_keys, ~0,729sizeof(krb5_keyblock), (xdrproc_t)xdr_krb5_keyblock)) {730return (FALSE);731}732return (TRUE);733}734735bool_t736xdr_setkey3_arg(XDR *xdrs, setkey3_arg *objp)737{738if (!xdr_ui_4(xdrs, &objp->api_version)) {739return (FALSE);740}741if (!xdr_krb5_principal(xdrs, &objp->princ)) {742return (FALSE);743}744if (!xdr_krb5_boolean(xdrs, &objp->keepold)) {745return (FALSE);746}747if (!xdr_array(xdrs, (caddr_t *) &objp->ks_tuple,748(unsigned int *) &objp->n_ks_tuple, ~0,749sizeof(krb5_key_salt_tuple),750(xdrproc_t)xdr_krb5_key_salt_tuple)) {751return (FALSE);752}753if (!xdr_array(xdrs, (caddr_t *) &objp->keyblocks,754(unsigned int *) &objp->n_keys, ~0,755sizeof(krb5_keyblock), (xdrproc_t)xdr_krb5_keyblock)) {756return (FALSE);757}758return (TRUE);759}760761bool_t762xdr_setkey4_arg(XDR *xdrs, setkey4_arg *objp)763{764if (!xdr_ui_4(xdrs, &objp->api_version)) {765return FALSE;766}767if (!xdr_krb5_principal(xdrs, &objp->princ)) {768return FALSE;769}770if (!xdr_krb5_boolean(xdrs, &objp->keepold)) {771return FALSE;772}773if (!xdr_array(xdrs, (caddr_t *) &objp->key_data,774(unsigned int *) &objp->n_key_data, ~0,775sizeof(kadm5_key_data),776(xdrproc_t)xdr_kadm5_key_data)) {777return FALSE;778}779return TRUE;780}781782bool_t783xdr_chrand_arg(XDR *xdrs, chrand_arg *objp)784{785if (!xdr_ui_4(xdrs, &objp->api_version)) {786return (FALSE);787}788if (!xdr_krb5_principal(xdrs, &objp->princ)) {789return (FALSE);790}791return (TRUE);792}793794bool_t795xdr_chrand3_arg(XDR *xdrs, chrand3_arg *objp)796{797if (!xdr_ui_4(xdrs, &objp->api_version)) {798return (FALSE);799}800if (!xdr_krb5_principal(xdrs, &objp->princ)) {801return (FALSE);802}803if (!xdr_krb5_boolean(xdrs, &objp->keepold)) {804return (FALSE);805}806if (!xdr_array(xdrs, (caddr_t *)&objp->ks_tuple,807(unsigned int*)&objp->n_ks_tuple, ~0,808sizeof(krb5_key_salt_tuple),809(xdrproc_t)xdr_krb5_key_salt_tuple)) {810return (FALSE);811}812return (TRUE);813}814815bool_t816xdr_chrand_ret(XDR *xdrs, chrand_ret *objp)817{818if (!xdr_ui_4(xdrs, &objp->api_version)) {819return (FALSE);820}821if (!xdr_kadm5_ret_t(xdrs, &objp->code)) {822return (FALSE);823}824if (objp->code == KADM5_OK) {825if (!xdr_array(xdrs, (char **)&objp->keys,826(unsigned int *)&objp->n_keys, ~0,827sizeof(krb5_keyblock),828(xdrproc_t)xdr_krb5_keyblock))829return FALSE;830}831832return (TRUE);833}834835bool_t836xdr_gprinc_arg(XDR *xdrs, gprinc_arg *objp)837{838if (!xdr_ui_4(xdrs, &objp->api_version)) {839return (FALSE);840}841if (!xdr_krb5_principal(xdrs, &objp->princ)) {842return (FALSE);843}844if (!xdr_long(xdrs, &objp->mask)) {845return FALSE;846}847848return (TRUE);849}850851bool_t852xdr_gprinc_ret(XDR *xdrs, gprinc_ret *objp)853{854if (!xdr_ui_4(xdrs, &objp->api_version)) {855return (FALSE);856}857if (!xdr_kadm5_ret_t(xdrs, &objp->code)) {858return (FALSE);859}860if(objp->code == KADM5_OK) {861if (!_xdr_kadm5_principal_ent_rec(xdrs, &objp->rec,862objp->api_version)) {863return (FALSE);864}865}866867return (TRUE);868}869870bool_t871xdr_cpol_arg(XDR *xdrs, cpol_arg *objp)872{873if (!xdr_ui_4(xdrs, &objp->api_version)) {874return (FALSE);875}876if (!_xdr_kadm5_policy_ent_rec(xdrs, &objp->rec,877objp->api_version)) {878return (FALSE);879}880if (!xdr_long(xdrs, &objp->mask)) {881return (FALSE);882}883return (TRUE);884}885886bool_t887xdr_dpol_arg(XDR *xdrs, dpol_arg *objp)888{889if (!xdr_ui_4(xdrs, &objp->api_version)) {890return (FALSE);891}892if (!xdr_nullstring(xdrs, &objp->name)) {893return (FALSE);894}895return (TRUE);896}897898bool_t899xdr_mpol_arg(XDR *xdrs, mpol_arg *objp)900{901if (!xdr_ui_4(xdrs, &objp->api_version)) {902return (FALSE);903}904if (!_xdr_kadm5_policy_ent_rec(xdrs, &objp->rec,905objp->api_version)) {906return (FALSE);907}908if (!xdr_long(xdrs, &objp->mask)) {909return (FALSE);910}911return (TRUE);912}913914bool_t915xdr_gpol_arg(XDR *xdrs, gpol_arg *objp)916{917if (!xdr_ui_4(xdrs, &objp->api_version)) {918return (FALSE);919}920if (!xdr_nullstring(xdrs, &objp->name)) {921return (FALSE);922}923return (TRUE);924}925926bool_t927xdr_gpol_ret(XDR *xdrs, gpol_ret *objp)928{929if (!xdr_ui_4(xdrs, &objp->api_version)) {930return (FALSE);931}932if (!xdr_kadm5_ret_t(xdrs, &objp->code)) {933return (FALSE);934}935if(objp->code == KADM5_OK) {936if (!_xdr_kadm5_policy_ent_rec(xdrs, &objp->rec,937objp->api_version))938return (FALSE);939}940941return (TRUE);942}943944bool_t945xdr_gpols_arg(XDR *xdrs, gpols_arg *objp)946{947if (!xdr_ui_4(xdrs, &objp->api_version)) {948return (FALSE);949}950if (!xdr_nullstring(xdrs, &objp->exp)) {951return (FALSE);952}953return (TRUE);954}955956bool_t957xdr_gpols_ret(XDR *xdrs, gpols_ret *objp)958{959if (!xdr_ui_4(xdrs, &objp->api_version)) {960return (FALSE);961}962if (!xdr_kadm5_ret_t(xdrs, &objp->code)) {963return (FALSE);964}965if (objp->code == KADM5_OK) {966if (!xdr_int(xdrs, &objp->count)) {967return (FALSE);968}969if (!xdr_array(xdrs, (caddr_t *) &objp->pols,970(unsigned int *) &objp->count, ~0,971sizeof(char *), (xdrproc_t)xdr_nullstring)) {972return (FALSE);973}974}975976return (TRUE);977}978979bool_t xdr_getprivs_ret(XDR *xdrs, getprivs_ret *objp)980{981if (!xdr_ui_4(xdrs, &objp->api_version)) {982return (FALSE);983}984if (! xdr_kadm5_ret_t(xdrs, &objp->code) ||985! xdr_long(xdrs, &objp->privs))986return FALSE;987988return TRUE;989}990991bool_t992xdr_purgekeys_arg(XDR *xdrs, purgekeys_arg *objp)993{994if (!xdr_ui_4(xdrs, &objp->api_version)) {995return (FALSE);996}997if (!xdr_krb5_principal(xdrs, &objp->princ)) {998return (FALSE);999}1000if (!xdr_int(xdrs, &objp->keepkvno)) {1001return FALSE;1002}10031004return (TRUE);1005}10061007bool_t1008xdr_gstrings_arg(XDR *xdrs, gstrings_arg *objp)1009{1010if (!xdr_ui_4(xdrs, &objp->api_version)) {1011return (FALSE);1012}1013if (!xdr_krb5_principal(xdrs, &objp->princ)) {1014return (FALSE);1015}10161017return (TRUE);1018}10191020bool_t1021xdr_gstrings_ret(XDR *xdrs, gstrings_ret *objp)1022{1023if (!xdr_ui_4(xdrs, &objp->api_version)) {1024return (FALSE);1025}1026if (!xdr_kadm5_ret_t(xdrs, &objp->code)) {1027return (FALSE);1028}1029if (objp->code == KADM5_OK) {1030if (!xdr_int(xdrs, &objp->count)) {1031return (FALSE);1032}1033if (!xdr_array(xdrs, (caddr_t *) &objp->strings,1034(unsigned int *) &objp->count, ~0,1035sizeof(krb5_string_attr),1036(xdrproc_t)xdr_krb5_string_attr)) {1037return (FALSE);1038}1039}10401041return (TRUE);1042}10431044bool_t1045xdr_sstring_arg(XDR *xdrs, sstring_arg *objp)1046{1047if (!xdr_ui_4(xdrs, &objp->api_version)) {1048return (FALSE);1049}1050if (!xdr_krb5_principal(xdrs, &objp->princ)) {1051return (FALSE);1052}1053if (!xdr_nullstring(xdrs, &objp->key)) {1054return (FALSE);1055}1056if (!xdr_nullstring(xdrs, &objp->value)) {1057return (FALSE);1058}10591060return (TRUE);1061}10621063bool_t1064xdr_krb5_principal(XDR *xdrs, krb5_principal *objp)1065{1066int ret;1067char *p = NULL;1068krb5_principal pr = NULL;1069static krb5_context context = NULL;10701071/* using a static context here is ugly, but should work1072ok, and the other solutions are even uglier */10731074if (!context &&1075kadm5_init_krb5_context(&context))1076return(FALSE);10771078switch(xdrs->x_op) {1079case XDR_ENCODE:1080if (*objp) {1081if((ret = krb5_unparse_name(context, *objp, &p)) != 0)1082return FALSE;1083}1084if(!xdr_nullstring(xdrs, &p))1085return FALSE;1086if (p) free(p);1087break;1088case XDR_DECODE:1089if(!xdr_nullstring(xdrs, &p))1090return FALSE;1091if (p) {1092ret = krb5_parse_name(context, p, &pr);1093if(ret != 0)1094return FALSE;1095*objp = pr;1096free(p);1097} else1098*objp = NULL;1099break;1100case XDR_FREE:1101if(*objp != NULL)1102krb5_free_principal(context, *objp);1103*objp = NULL;1104break;1105}1106return TRUE;1107}11081109bool_t1110xdr_krb5_octet(XDR *xdrs, krb5_octet *objp)1111{1112if (!xdr_u_char(xdrs, objp))1113return (FALSE);1114return (TRUE);1115}11161117bool_t1118xdr_krb5_enctype(XDR *xdrs, krb5_enctype *objp)1119{1120if (!xdr_int32(xdrs, (int32_t *) objp))1121return (FALSE);1122return (TRUE);1123}11241125bool_t1126xdr_krb5_salttype(XDR *xdrs, krb5_int32 *objp)1127{1128if (!xdr_int32(xdrs, (int32_t *) objp))1129return FALSE;1130return TRUE;1131}11321133bool_t1134xdr_krb5_keyblock(XDR *xdrs, krb5_keyblock *objp)1135{1136char *cp;11371138/* XXX This only works because free_keyblock assumes ->contents1139is allocated by malloc() */1140if(!xdr_krb5_enctype(xdrs, &objp->enctype))1141return FALSE;1142cp = (char *)objp->contents;1143if(!xdr_bytes(xdrs, &cp, &objp->length, ~0))1144return FALSE;1145objp->contents = (uint8_t *)cp;1146return TRUE;1147}11481149bool_t1150xdr_krb5_string_attr(XDR *xdrs, krb5_string_attr *objp)1151{1152if (!xdr_nullstring(xdrs, &objp->key))1153return FALSE;1154if (!xdr_nullstring(xdrs, &objp->value))1155return FALSE;1156if (xdrs->x_op == XDR_DECODE &&1157(objp->key == NULL || objp->value == NULL))1158return FALSE;1159return TRUE;1160}11611162bool_t1163xdr_kadm5_key_data(XDR *xdrs, kadm5_key_data *objp)1164{1165if (!xdr_krb5_kvno(xdrs, &objp->kvno))1166return FALSE;1167if (!xdr_krb5_keyblock(xdrs, &objp->key))1168return FALSE;1169if (!xdr_krb5_int16(xdrs, &objp->salt.type))1170return FALSE;1171if (!xdr_bytes(xdrs, &objp->salt.data.data,1172&objp->salt.data.length, ~0))1173return FALSE;1174return TRUE;1175}11761177bool_t1178xdr_getpkeys_arg(XDR *xdrs, getpkeys_arg *objp)1179{1180if (!xdr_ui_4(xdrs, &objp->api_version)) {1181return FALSE;1182}1183if (!xdr_krb5_principal(xdrs, &objp->princ)) {1184return FALSE;1185}1186if (!xdr_krb5_kvno(xdrs, &objp->kvno)) {1187return FALSE;1188}1189return TRUE;1190}11911192bool_t1193xdr_getpkeys_ret(XDR *xdrs, getpkeys_ret *objp)1194{1195if (!xdr_ui_4(xdrs, &objp->api_version)) {1196return FALSE;1197}1198if (!xdr_kadm5_ret_t(xdrs, &objp->code)) {1199return FALSE;1200}1201if (objp->code == KADM5_OK) {1202if (!xdr_array(xdrs, (caddr_t *) &objp->key_data,1203(unsigned int *) &objp->n_key_data, ~0,1204sizeof(kadm5_key_data),1205(xdrproc_t)xdr_kadm5_key_data)) {1206return FALSE;1207}1208}1209return TRUE;1210}12111212bool_t1213xdr_calias_arg(XDR *xdrs, calias_arg *objp)1214{1215if (!xdr_ui_4(xdrs, &objp->api_version)) {1216return (FALSE);1217}1218if (!xdr_krb5_principal(xdrs, &objp->alias)) {1219return (FALSE);1220}1221if (!xdr_krb5_principal(xdrs, &objp->target)) {1222return (FALSE);1223}1224return (TRUE);1225}122612271228