kafs: Fix a warning
[heimdal.git] / lib / krb5 / asn1_glue.c
blob7925632b6e6c3a22465dae538f7af485a18f935d
1 /*
2 * Copyright (c) 1997 Kungliga Tekniska Högskolan
3 * (Royal Institute of Technology, Stockholm, Sweden).
4 * All rights reserved.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
17 * 3. Neither the name of the Institute nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
38 #include "krb5_locl.h"
40 KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
41 _krb5_principal2principalname (PrincipalName *p,
42 const krb5_principal from)
44 return copy_PrincipalName(&from->name, p);
47 KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
48 _krb5_principalname2krb5_principal (krb5_context context,
49 krb5_principal *principal,
50 const PrincipalName from,
51 const Realm realm)
53 krb5_error_code ret;
54 krb5_principal p;
56 p = calloc(1, sizeof(*p));
57 if (p == NULL)
58 return krb5_enomem(context);
59 ret = copy_PrincipalName(&from, &p->name);
60 if (ret) {
61 free(p);
62 return ret;
64 p->realm = strdup(realm);
65 if (p->realm == NULL) {
66 free_PrincipalName(&p->name);
67 free(p);
68 return krb5_enomem(context);
70 *principal = p;
71 return 0;
74 KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
75 _krb5_ticket2krb5_principal(krb5_context context,
76 krb5_principal *principal,
77 const EncTicketPart *ticket,
78 const AuthorizationData *authenticator_ad)
80 krb5_error_code ret;
81 krb5_principal p = NULL;
83 *principal = NULL;
85 ret = _krb5_principalname2krb5_principal(context,
86 &p,
87 ticket->cname,
88 ticket->crealm);
89 if (ret == 0 &&
90 (p->nameattrs = calloc(1, sizeof(p->nameattrs[0]))) == NULL)
91 ret = krb5_enomem(context);
92 if (ret == 0)
93 p->nameattrs->authenticated = 1;
94 if (ret == 0 &&
95 (p->nameattrs->source =
96 calloc(1, sizeof(p->nameattrs->source[0]))) == NULL)
97 ret = krb5_enomem(context);
98 if (ret == 0) {
99 p->nameattrs->source->element =
100 choice_PrincipalNameAttrSrc_enc_ticket_part;
101 ret = copy_EncTicketPart(ticket,
102 &p->nameattrs->source->u.enc_ticket_part);
103 /* NOTE: we don't want to keep a copy of the session key here! */
104 if (ret == 0)
105 der_free_octet_string(&p->nameattrs->source->u.enc_ticket_part.key.keyvalue);
107 if (ret == 0 && authenticator_ad) {
108 p->nameattrs->authenticator_ad =
109 calloc(1, sizeof(p->nameattrs->authenticator_ad[0]));
110 if (p->nameattrs->authenticator_ad == NULL)
111 ret = krb5_enomem(context);
112 if (ret == 0)
113 ret = copy_AuthorizationData(authenticator_ad,
114 p->nameattrs->authenticator_ad);
117 if (ret == 0)
118 *principal = p;
119 else
120 krb5_free_principal(context, p);
121 return ret;
124 KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
125 _krb5_kdcrep2krb5_principal(krb5_context context,
126 krb5_principal *principal,
127 const EncKDCRepPart *kdcrep)
129 krb5_error_code ret;
130 krb5_principal p = NULL;
132 *principal = NULL;
134 ret = _krb5_principalname2krb5_principal(context,
136 kdcrep->sname,
137 kdcrep->srealm);
138 if (ret == 0 &&
139 (p->nameattrs = calloc(1, sizeof(p->nameattrs[0]))) == NULL)
140 ret = krb5_enomem(context);
141 if (ret == 0)
142 p->nameattrs->authenticated = 1;
143 if (ret == 0 &&
144 (p->nameattrs->source =
145 calloc(1, sizeof(p->nameattrs->source[0]))) == NULL)
146 ret = krb5_enomem(context);
147 if (ret == 0) {
148 p->nameattrs->source->element =
149 choice_PrincipalNameAttrSrc_enc_kdc_rep_part;
150 ret = copy_EncKDCRepPart(kdcrep,
151 &p->nameattrs->source->u.enc_kdc_rep_part);
152 /* NOTE: we don't want to keep a copy of the session key here! */
153 if (ret == 0)
154 der_free_octet_string(&p->nameattrs->source->u.enc_kdc_rep_part.key.keyvalue);
157 if (ret == 0)
158 *principal = p;
159 else
160 krb5_free_principal(context, p);
161 return ret;