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, &params->realm);
33359243Sobrien    krb5_storage_free(sp);
33459243Sobrien
33559243Sobrien    return 0;
33659243Sobrien}
33759243Sobrien