marshall.c revision 178826
1167465Smp/* 259243Sobrien * Copyright (c) 1997 - 1999 Kungliga Tekniska H�gskolan 359243Sobrien * (Royal Institute of Technology, Stockholm, Sweden). 459243Sobrien * All rights reserved. 559243Sobrien * 659243Sobrien * Redistribution and use in source and binary forms, with or without 759243Sobrien * modification, are permitted provided that the following conditions 859243Sobrien * are met: 959243Sobrien * 1059243Sobrien * 1. Redistributions of source code must retain the above copyright 1159243Sobrien * notice, this list of conditions and the following disclaimer. 1259243Sobrien * 1359243Sobrien * 2. Redistributions in binary form must reproduce the above copyright 1459243Sobrien * notice, this list of conditions and the following disclaimer in the 1559243Sobrien * documentation and/or other materials provided with the distribution. 1659243Sobrien * 17100616Smp * 3. Neither the name of the Institute nor the names of its contributors 1859243Sobrien * may be used to endorse or promote products derived from this software 1959243Sobrien * without specific prior written permission. 2059243Sobrien * 2159243Sobrien * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 2259243Sobrien * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2359243Sobrien * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2459243Sobrien * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 2559243Sobrien * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2659243Sobrien * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2759243Sobrien * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2859243Sobrien * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2959243Sobrien * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3059243Sobrien * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3159243Sobrien * SUCH DAMAGE. 3259243Sobrien */ 3359243Sobrien 3459243Sobrien#include "kadm5_locl.h" 35167465Smp 3659243SobrienRCSID("$Id: marshall.c 21745 2007-07-31 16:11:25Z lha $"); 37167465Smp 38167465Smpkadm5_ret_t 39167465Smpkadm5_store_key_data(krb5_storage *sp, 40167465Smp krb5_key_data *key) 4159243Sobrien{ 4259243Sobrien krb5_data c; 4359243Sobrien krb5_store_int32(sp, key->key_data_ver); 4459243Sobrien krb5_store_int32(sp, key->key_data_kvno); 4559243Sobrien krb5_store_int32(sp, key->key_data_type[0]); 4659243Sobrien c.length = key->key_data_length[0]; 47167465Smp c.data = key->key_data_contents[0]; 4859243Sobrien krb5_store_data(sp, c); 4959243Sobrien krb5_store_int32(sp, key->key_data_type[1]); 5059243Sobrien c.length = key->key_data_length[1]; 5159243Sobrien c.data = key->key_data_contents[1]; 52145479Smp krb5_store_data(sp, c); 5359243Sobrien return 0; 5459243Sobrien} 5559243Sobrien 5659243Sobrienkadm5_ret_t 5759243Sobrienkadm5_ret_key_data(krb5_storage *sp, 58167465Smp krb5_key_data *key) 5959243Sobrien{ 60167465Smp krb5_data c; 6159243Sobrien int32_t tmp; 6259243Sobrien krb5_ret_int32(sp, &tmp); 63167465Smp key->key_data_ver = tmp; 64167465Smp krb5_ret_int32(sp, &tmp); 65167465Smp key->key_data_kvno = tmp; 66167465Smp krb5_ret_int32(sp, &tmp); 67167465Smp key->key_data_type[0] = tmp; 68167465Smp krb5_ret_data(sp, &c); 69167465Smp key->key_data_length[0] = c.length; 70167465Smp key->key_data_contents[0] = c.data; 71167465Smp krb5_ret_int32(sp, &tmp); 72167465Smp key->key_data_type[1] = tmp; 73167465Smp krb5_ret_data(sp, &c); 7459243Sobrien key->key_data_length[1] = c.length; 75167465Smp key->key_data_contents[1] = c.data; 7659243Sobrien return 0; 77167465Smp} 78167465Smp 7959243Sobrienkadm5_ret_t 8059243Sobrienkadm5_store_tl_data(krb5_storage *sp, 81145479Smp krb5_tl_data *tl) 82167465Smp{ 83167465Smp krb5_data c; 84167465Smp krb5_store_int32(sp, tl->tl_data_type); 85145479Smp c.length = tl->tl_data_length; 8659243Sobrien c.data = tl->tl_data_contents; 8759243Sobrien krb5_store_data(sp, c); 8859243Sobrien return 0; 89167465Smp} 9059243Sobrien 9159243Sobrienkadm5_ret_t 9259243Sobrienkadm5_ret_tl_data(krb5_storage *sp, 9359243Sobrien krb5_tl_data *tl) 9459243Sobrien{ 9559243Sobrien krb5_data c; 9659243Sobrien int32_t tmp; 9759243Sobrien krb5_ret_int32(sp, &tmp); 9859243Sobrien tl->tl_data_type = tmp; 99167465Smp krb5_ret_data(sp, &c); 10059243Sobrien tl->tl_data_length = c.length; 10159243Sobrien tl->tl_data_contents = c.data; 10259243Sobrien return 0; 10359243Sobrien} 10459243Sobrien 10559243Sobrienstatic kadm5_ret_t 10659243Sobrienstore_principal_ent(krb5_storage *sp, 10759243Sobrien kadm5_principal_ent_t princ, 10859243Sobrien uint32_t mask) 109167465Smp{ 110167465Smp int i; 11159243Sobrien 112167465Smp if (mask & KADM5_PRINCIPAL) 113167465Smp krb5_store_principal(sp, princ->principal); 11459243Sobrien if (mask & KADM5_PRINC_EXPIRE_TIME) 115167465Smp krb5_store_int32(sp, princ->princ_expire_time); 11659243Sobrien if (mask & KADM5_PW_EXPIRATION) 117167465Smp krb5_store_int32(sp, princ->pw_expiration); 11859243Sobrien if (mask & KADM5_LAST_PWD_CHANGE) 119167465Smp krb5_store_int32(sp, princ->last_pwd_change); 12059243Sobrien if (mask & KADM5_MAX_LIFE) 12159243Sobrien krb5_store_int32(sp, princ->max_life); 12259243Sobrien if (mask & KADM5_MOD_NAME) { 123167465Smp krb5_store_int32(sp, princ->mod_name != NULL); 12459243Sobrien if(princ->mod_name) 125145479Smp krb5_store_principal(sp, princ->mod_name); 12659243Sobrien } 12759243Sobrien if (mask & KADM5_MOD_TIME) 12859243Sobrien krb5_store_int32(sp, princ->mod_date); 12959243Sobrien if (mask & KADM5_ATTRIBUTES) 13059243Sobrien krb5_store_int32(sp, princ->attributes); 13159243Sobrien if (mask & KADM5_KVNO) 13259243Sobrien krb5_store_int32(sp, princ->kvno); 133167465Smp if (mask & KADM5_MKVNO) 13459243Sobrien krb5_store_int32(sp, princ->mkvno); 135145479Smp if (mask & KADM5_POLICY) { 13659243Sobrien krb5_store_int32(sp, princ->policy != NULL); 13759243Sobrien if(princ->policy) 13859243Sobrien krb5_store_string(sp, princ->policy); 13959243Sobrien } 14059243Sobrien if (mask & KADM5_AUX_ATTRIBUTES) 14159243Sobrien krb5_store_int32(sp, princ->aux_attributes); 14259243Sobrien if (mask & KADM5_MAX_RLIFE) 143167465Smp krb5_store_int32(sp, princ->max_renewable_life); 14459243Sobrien if (mask & KADM5_LAST_SUCCESS) 14559243Sobrien krb5_store_int32(sp, princ->last_success); 14659243Sobrien if (mask & KADM5_LAST_FAILED) 14759243Sobrien krb5_store_int32(sp, princ->last_failed); 14859243Sobrien if (mask & KADM5_FAIL_AUTH_COUNT) 14959243Sobrien krb5_store_int32(sp, princ->fail_auth_count); 15059243Sobrien if (mask & KADM5_KEY_DATA) { 151167465Smp krb5_store_int32(sp, princ->n_key_data); 15259243Sobrien for(i = 0; i < princ->n_key_data; i++) 153145479Smp kadm5_store_key_data(sp, &princ->key_data[i]); 15459243Sobrien } 15559243Sobrien if (mask & KADM5_TL_DATA) { 15659243Sobrien krb5_tl_data *tp; 15759243Sobrien 158167465Smp krb5_store_int32(sp, princ->n_tl_data); 159167465Smp for(tp = princ->tl_data; tp; tp = tp->tl_data_next) 16059243Sobrien kadm5_store_tl_data(sp, tp); 16159243Sobrien } 162167465Smp return 0; 163167465Smp} 164167465Smp 165167465Smp 166167465Smpkadm5_ret_t 167167465Smpkadm5_store_principal_ent(krb5_storage *sp, 168167465Smp kadm5_principal_ent_t princ) 169167465Smp{ 170167465Smp return store_principal_ent (sp, princ, ~0); 171167465Smp} 172167465Smp 173167465Smpkadm5_ret_t 174167465Smpkadm5_store_principal_ent_mask(krb5_storage *sp, 175167465Smp kadm5_principal_ent_t princ, 176167465Smp uint32_t mask) 177167465Smp{ 17859243Sobrien krb5_store_int32(sp, mask); 179167465Smp return store_principal_ent (sp, princ, mask); 18059243Sobrien} 181167465Smp 18259243Sobrienstatic kadm5_ret_t 183167465Smpret_principal_ent(krb5_storage *sp, 184167465Smp kadm5_principal_ent_t princ, 185167465Smp uint32_t mask) 186167465Smp{ 187167465Smp int i; 18859243Sobrien int32_t tmp; 18959243Sobrien 19059243Sobrien if (mask & KADM5_PRINCIPAL) 19159243Sobrien krb5_ret_principal(sp, &princ->principal); 19259243Sobrien 193145479Smp if (mask & KADM5_PRINC_EXPIRE_TIME) { 19459243Sobrien krb5_ret_int32(sp, &tmp); 195167465Smp princ->princ_expire_time = tmp; 19659243Sobrien } 19759243Sobrien if (mask & KADM5_PW_EXPIRATION) { 198145479Smp krb5_ret_int32(sp, &tmp); 199145479Smp princ->pw_expiration = tmp; 20059243Sobrien } 20159243Sobrien if (mask & KADM5_LAST_PWD_CHANGE) { 20259243Sobrien krb5_ret_int32(sp, &tmp); 203167465Smp princ->last_pwd_change = tmp; 20459243Sobrien } 20559243Sobrien if (mask & KADM5_MAX_LIFE) { 20659243Sobrien krb5_ret_int32(sp, &tmp); 20759243Sobrien princ->max_life = tmp; 208145479Smp } 20959243Sobrien if (mask & KADM5_MOD_NAME) { 21059243Sobrien krb5_ret_int32(sp, &tmp); 211167465Smp if(tmp) 21259243Sobrien krb5_ret_principal(sp, &princ->mod_name); 21359243Sobrien else 214145479Smp princ->mod_name = NULL; 21559243Sobrien } 21659243Sobrien if (mask & KADM5_MOD_TIME) { 21759243Sobrien krb5_ret_int32(sp, &tmp); 21859243Sobrien princ->mod_date = tmp; 21959243Sobrien } 220145479Smp if (mask & KADM5_ATTRIBUTES) { 221145479Smp krb5_ret_int32(sp, &tmp); 222167465Smp princ->attributes = tmp; 223145479Smp } 224145479Smp if (mask & KADM5_KVNO) { 22559243Sobrien krb5_ret_int32(sp, &tmp); 22659243Sobrien princ->kvno = tmp; 22759243Sobrien } 22859243Sobrien if (mask & KADM5_MKVNO) { 229167465Smp krb5_ret_int32(sp, &tmp); 23059243Sobrien princ->mkvno = tmp; 231167465Smp } 23259243Sobrien if (mask & KADM5_POLICY) { 23359243Sobrien krb5_ret_int32(sp, &tmp); 23459243Sobrien if(tmp) 23559243Sobrien krb5_ret_string(sp, &princ->policy); 23659243Sobrien else 23759243Sobrien princ->policy = NULL; 238167465Smp } 23959243Sobrien if (mask & KADM5_AUX_ATTRIBUTES) { 24059243Sobrien krb5_ret_int32(sp, &tmp); 24159243Sobrien princ->aux_attributes = tmp; 24259243Sobrien } 24359243Sobrien if (mask & KADM5_MAX_RLIFE) { 24459243Sobrien krb5_ret_int32(sp, &tmp); 24559243Sobrien princ->max_renewable_life = tmp; 24659243Sobrien } 24759243Sobrien if (mask & KADM5_LAST_SUCCESS) { 24859243Sobrien krb5_ret_int32(sp, &tmp); 24959243Sobrien princ->last_success = tmp; 25059243Sobrien } 25159243Sobrien if (mask & KADM5_LAST_FAILED) { 25259243Sobrien krb5_ret_int32(sp, &tmp); 25359243Sobrien princ->last_failed = tmp; 25459243Sobrien } 255167465Smp if (mask & KADM5_FAIL_AUTH_COUNT) { 25659243Sobrien krb5_ret_int32(sp, &tmp); 257167465Smp princ->fail_auth_count = tmp; 25859243Sobrien } 259131962Smp if (mask & KADM5_KEY_DATA) { 260131962Smp krb5_ret_int32(sp, &tmp); 261145479Smp princ->n_key_data = tmp; 262131962Smp princ->key_data = malloc(princ->n_key_data * sizeof(*princ->key_data)); 263131962Smp if (princ->key_data == NULL) 26459243Sobrien return ENOMEM; 26559243Sobrien for(i = 0; i < princ->n_key_data; i++) 26659243Sobrien kadm5_ret_key_data(sp, &princ->key_data[i]); 26759243Sobrien } 268167465Smp if (mask & KADM5_TL_DATA) { 269167465Smp krb5_ret_int32(sp, &tmp); 27059243Sobrien princ->n_tl_data = tmp; 27159243Sobrien princ->tl_data = NULL; 27259243Sobrien for(i = 0; i < princ->n_tl_data; i++){ 27359243Sobrien krb5_tl_data *tp = malloc(sizeof(*tp)); 27459243Sobrien if (tp == NULL) 27559243Sobrien return ENOMEM; 27659243Sobrien kadm5_ret_tl_data(sp, tp); 277167465Smp tp->tl_data_next = princ->tl_data; 27859243Sobrien princ->tl_data = tp; 27959243Sobrien } 280167465Smp } 28159243Sobrien return 0; 28259243Sobrien} 283131962Smp 284131962Smpkadm5_ret_t 285131962Smpkadm5_ret_principal_ent(krb5_storage *sp, 286131962Smp kadm5_principal_ent_t princ) 287131962Smp{ 28859243Sobrien return ret_principal_ent (sp, princ, ~0); 28959243Sobrien} 29059243Sobrien 29159243Sobrienkadm5_ret_t 29259243Sobrienkadm5_ret_principal_ent_mask(krb5_storage *sp, 29359243Sobrien kadm5_principal_ent_t princ, 29459243Sobrien uint32_t *mask) 29559243Sobrien{ 29659243Sobrien int32_t tmp; 29759243Sobrien 298167465Smp krb5_ret_int32 (sp, &tmp); 29959243Sobrien *mask = tmp; 300167465Smp return ret_principal_ent (sp, princ, *mask); 30159243Sobrien} 30259243Sobrien 30359243Sobrienkadm5_ret_t 30459243Sobrien_kadm5_marshal_params(krb5_context context, 30559243Sobrien kadm5_config_params *params, 30659243Sobrien krb5_data *out) 30759243Sobrien{ 30859243Sobrien krb5_storage *sp = krb5_storage_emem(); 30959243Sobrien 31059243Sobrien krb5_store_int32(sp, params->mask & (KADM5_CONFIG_REALM)); 311167465Smp 312167465Smp if(params->mask & KADM5_CONFIG_REALM) 313167465Smp krb5_store_string(sp, params->realm); 31459243Sobrien krb5_storage_to_data(sp, out); 31559243Sobrien krb5_storage_free(sp); 31659243Sobrien 31759243Sobrien return 0; 31859243Sobrien} 319167465Smp 32059243Sobrienkadm5_ret_t 32159243Sobrien_kadm5_unmarshal_params(krb5_context context, 322167465Smp krb5_data *in, 323167465Smp kadm5_config_params *params) 324167465Smp{ 32559243Sobrien krb5_storage *sp = krb5_storage_from_data(in); 32659243Sobrien int32_t mask; 32759243Sobrien 328167465Smp krb5_ret_int32(sp, &mask); 329145479Smp params->mask = mask; 330145479Smp 331145479Smp if(params->mask & KADM5_CONFIG_REALM) 33259243Sobrien krb5_ret_string(sp, ¶ms->realm); 33359243Sobrien krb5_storage_free(sp); 33459243Sobrien 33559243Sobrien return 0; 33659243Sobrien} 33759243Sobrien