xref: /minix3/crypto/external/bsd/heimdal/dist/lib/krb5/data.c (revision ebfedea0ce5bbe81e252ddf32d732e40fb633fae)
1*ebfedea0SLionel Sambuc /*	$NetBSD: data.c,v 1.1.1.1 2011/04/13 18:15:33 elric Exp $	*/
2*ebfedea0SLionel Sambuc 
3*ebfedea0SLionel Sambuc /*
4*ebfedea0SLionel Sambuc  * Copyright (c) 1997 - 2007 Kungliga Tekniska Högskolan
5*ebfedea0SLionel Sambuc  * (Royal Institute of Technology, Stockholm, Sweden).
6*ebfedea0SLionel Sambuc  * All rights reserved.
7*ebfedea0SLionel Sambuc  *
8*ebfedea0SLionel Sambuc  * Redistribution and use in source and binary forms, with or without
9*ebfedea0SLionel Sambuc  * modification, are permitted provided that the following conditions
10*ebfedea0SLionel Sambuc  * are met:
11*ebfedea0SLionel Sambuc  *
12*ebfedea0SLionel Sambuc  * 1. Redistributions of source code must retain the above copyright
13*ebfedea0SLionel Sambuc  *    notice, this list of conditions and the following disclaimer.
14*ebfedea0SLionel Sambuc  *
15*ebfedea0SLionel Sambuc  * 2. Redistributions in binary form must reproduce the above copyright
16*ebfedea0SLionel Sambuc  *    notice, this list of conditions and the following disclaimer in the
17*ebfedea0SLionel Sambuc  *    documentation and/or other materials provided with the distribution.
18*ebfedea0SLionel Sambuc  *
19*ebfedea0SLionel Sambuc  * 3. Neither the name of the Institute nor the names of its contributors
20*ebfedea0SLionel Sambuc  *    may be used to endorse or promote products derived from this software
21*ebfedea0SLionel Sambuc  *    without specific prior written permission.
22*ebfedea0SLionel Sambuc  *
23*ebfedea0SLionel Sambuc  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
24*ebfedea0SLionel Sambuc  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25*ebfedea0SLionel Sambuc  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26*ebfedea0SLionel Sambuc  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
27*ebfedea0SLionel Sambuc  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28*ebfedea0SLionel Sambuc  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29*ebfedea0SLionel Sambuc  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30*ebfedea0SLionel Sambuc  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31*ebfedea0SLionel Sambuc  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32*ebfedea0SLionel Sambuc  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33*ebfedea0SLionel Sambuc  * SUCH DAMAGE.
34*ebfedea0SLionel Sambuc  */
35*ebfedea0SLionel Sambuc 
36*ebfedea0SLionel Sambuc #include "krb5_locl.h"
37*ebfedea0SLionel Sambuc 
38*ebfedea0SLionel Sambuc /**
39*ebfedea0SLionel Sambuc  * Reset the (potentially uninitalized) krb5_data structure.
40*ebfedea0SLionel Sambuc  *
41*ebfedea0SLionel Sambuc  * @param p krb5_data to reset.
42*ebfedea0SLionel Sambuc  *
43*ebfedea0SLionel Sambuc  * @ingroup krb5
44*ebfedea0SLionel Sambuc  */
45*ebfedea0SLionel Sambuc 
46*ebfedea0SLionel Sambuc KRB5_LIB_FUNCTION void KRB5_LIB_CALL
krb5_data_zero(krb5_data * p)47*ebfedea0SLionel Sambuc krb5_data_zero(krb5_data *p)
48*ebfedea0SLionel Sambuc {
49*ebfedea0SLionel Sambuc     p->length = 0;
50*ebfedea0SLionel Sambuc     p->data   = NULL;
51*ebfedea0SLionel Sambuc }
52*ebfedea0SLionel Sambuc 
53*ebfedea0SLionel Sambuc /**
54*ebfedea0SLionel Sambuc  * Free the content of krb5_data structure, its ok to free a zeroed
55*ebfedea0SLionel Sambuc  * structure (with memset() or krb5_data_zero()). When done, the
56*ebfedea0SLionel Sambuc  * structure will be zeroed. The same function is called
57*ebfedea0SLionel Sambuc  * krb5_free_data_contents() in MIT Kerberos.
58*ebfedea0SLionel Sambuc  *
59*ebfedea0SLionel Sambuc  * @param p krb5_data to free.
60*ebfedea0SLionel Sambuc  *
61*ebfedea0SLionel Sambuc  * @ingroup krb5
62*ebfedea0SLionel Sambuc  */
63*ebfedea0SLionel Sambuc 
64*ebfedea0SLionel Sambuc KRB5_LIB_FUNCTION void KRB5_LIB_CALL
krb5_data_free(krb5_data * p)65*ebfedea0SLionel Sambuc krb5_data_free(krb5_data *p)
66*ebfedea0SLionel Sambuc {
67*ebfedea0SLionel Sambuc     if(p->data != NULL)
68*ebfedea0SLionel Sambuc 	free(p->data);
69*ebfedea0SLionel Sambuc     krb5_data_zero(p);
70*ebfedea0SLionel Sambuc }
71*ebfedea0SLionel Sambuc 
72*ebfedea0SLionel Sambuc /**
73*ebfedea0SLionel Sambuc  * Free krb5_data (and its content).
74*ebfedea0SLionel Sambuc  *
75*ebfedea0SLionel Sambuc  * @param context Kerberos 5 context.
76*ebfedea0SLionel Sambuc  * @param p krb5_data to free.
77*ebfedea0SLionel Sambuc  *
78*ebfedea0SLionel Sambuc  * @ingroup krb5
79*ebfedea0SLionel Sambuc  */
80*ebfedea0SLionel Sambuc 
81*ebfedea0SLionel Sambuc KRB5_LIB_FUNCTION void KRB5_LIB_CALL
krb5_free_data(krb5_context context,krb5_data * p)82*ebfedea0SLionel Sambuc krb5_free_data(krb5_context context,
83*ebfedea0SLionel Sambuc 	       krb5_data *p)
84*ebfedea0SLionel Sambuc {
85*ebfedea0SLionel Sambuc     krb5_data_free(p);
86*ebfedea0SLionel Sambuc     free(p);
87*ebfedea0SLionel Sambuc }
88*ebfedea0SLionel Sambuc 
89*ebfedea0SLionel Sambuc /**
90*ebfedea0SLionel Sambuc  * Allocate data of and krb5_data.
91*ebfedea0SLionel Sambuc  *
92*ebfedea0SLionel Sambuc  * @param p krb5_data to allocate.
93*ebfedea0SLionel Sambuc  * @param len size to allocate.
94*ebfedea0SLionel Sambuc  *
95*ebfedea0SLionel Sambuc  * @return Returns 0 to indicate success. Otherwise an kerberos et
96*ebfedea0SLionel Sambuc  * error code is returned.
97*ebfedea0SLionel Sambuc  *
98*ebfedea0SLionel Sambuc  * @ingroup krb5
99*ebfedea0SLionel Sambuc  */
100*ebfedea0SLionel Sambuc 
101*ebfedea0SLionel Sambuc KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
krb5_data_alloc(krb5_data * p,int len)102*ebfedea0SLionel Sambuc krb5_data_alloc(krb5_data *p, int len)
103*ebfedea0SLionel Sambuc {
104*ebfedea0SLionel Sambuc     p->data = malloc(len);
105*ebfedea0SLionel Sambuc     if(len && p->data == NULL)
106*ebfedea0SLionel Sambuc 	return ENOMEM;
107*ebfedea0SLionel Sambuc     p->length = len;
108*ebfedea0SLionel Sambuc     return 0;
109*ebfedea0SLionel Sambuc }
110*ebfedea0SLionel Sambuc 
111*ebfedea0SLionel Sambuc /**
112*ebfedea0SLionel Sambuc  * Grow (or shrink) the content of krb5_data to a new size.
113*ebfedea0SLionel Sambuc  *
114*ebfedea0SLionel Sambuc  * @param p krb5_data to free.
115*ebfedea0SLionel Sambuc  * @param len new size.
116*ebfedea0SLionel Sambuc  *
117*ebfedea0SLionel Sambuc  * @return Returns 0 to indicate success. Otherwise an kerberos et
118*ebfedea0SLionel Sambuc  * error code is returned.
119*ebfedea0SLionel Sambuc  *
120*ebfedea0SLionel Sambuc  * @ingroup krb5
121*ebfedea0SLionel Sambuc  */
122*ebfedea0SLionel Sambuc 
123*ebfedea0SLionel Sambuc KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
krb5_data_realloc(krb5_data * p,int len)124*ebfedea0SLionel Sambuc krb5_data_realloc(krb5_data *p, int len)
125*ebfedea0SLionel Sambuc {
126*ebfedea0SLionel Sambuc     void *tmp;
127*ebfedea0SLionel Sambuc     tmp = realloc(p->data, len);
128*ebfedea0SLionel Sambuc     if(len && !tmp)
129*ebfedea0SLionel Sambuc 	return ENOMEM;
130*ebfedea0SLionel Sambuc     p->data = tmp;
131*ebfedea0SLionel Sambuc     p->length = len;
132*ebfedea0SLionel Sambuc     return 0;
133*ebfedea0SLionel Sambuc }
134*ebfedea0SLionel Sambuc 
135*ebfedea0SLionel Sambuc /**
136*ebfedea0SLionel Sambuc  * Copy the data of len into the krb5_data.
137*ebfedea0SLionel Sambuc  *
138*ebfedea0SLionel Sambuc  * @param p krb5_data to copy into.
139*ebfedea0SLionel Sambuc  * @param data data to copy..
140*ebfedea0SLionel Sambuc  * @param len new size.
141*ebfedea0SLionel Sambuc  *
142*ebfedea0SLionel Sambuc  * @return Returns 0 to indicate success. Otherwise an kerberos et
143*ebfedea0SLionel Sambuc  * error code is returned.
144*ebfedea0SLionel Sambuc  *
145*ebfedea0SLionel Sambuc  * @ingroup krb5
146*ebfedea0SLionel Sambuc  */
147*ebfedea0SLionel Sambuc 
148*ebfedea0SLionel Sambuc KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
krb5_data_copy(krb5_data * p,const void * data,size_t len)149*ebfedea0SLionel Sambuc krb5_data_copy(krb5_data *p, const void *data, size_t len)
150*ebfedea0SLionel Sambuc {
151*ebfedea0SLionel Sambuc     if (len) {
152*ebfedea0SLionel Sambuc 	if(krb5_data_alloc(p, len))
153*ebfedea0SLionel Sambuc 	    return ENOMEM;
154*ebfedea0SLionel Sambuc 	memmove(p->data, data, len);
155*ebfedea0SLionel Sambuc     } else
156*ebfedea0SLionel Sambuc 	p->data = NULL;
157*ebfedea0SLionel Sambuc     p->length = len;
158*ebfedea0SLionel Sambuc     return 0;
159*ebfedea0SLionel Sambuc }
160*ebfedea0SLionel Sambuc 
161*ebfedea0SLionel Sambuc /**
162*ebfedea0SLionel Sambuc  * Copy the data into a newly allocated krb5_data.
163*ebfedea0SLionel Sambuc  *
164*ebfedea0SLionel Sambuc  * @param context Kerberos 5 context.
165*ebfedea0SLionel Sambuc  * @param indata the krb5_data data to copy
166*ebfedea0SLionel Sambuc  * @param outdata new krb5_date to copy too. Free with krb5_free_data().
167*ebfedea0SLionel Sambuc  *
168*ebfedea0SLionel Sambuc  * @return Returns 0 to indicate success. Otherwise an kerberos et
169*ebfedea0SLionel Sambuc  * error code is returned.
170*ebfedea0SLionel Sambuc  *
171*ebfedea0SLionel Sambuc  * @ingroup krb5
172*ebfedea0SLionel Sambuc  */
173*ebfedea0SLionel Sambuc 
174*ebfedea0SLionel Sambuc KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
krb5_copy_data(krb5_context context,const krb5_data * indata,krb5_data ** outdata)175*ebfedea0SLionel Sambuc krb5_copy_data(krb5_context context,
176*ebfedea0SLionel Sambuc 	       const krb5_data *indata,
177*ebfedea0SLionel Sambuc 	       krb5_data **outdata)
178*ebfedea0SLionel Sambuc {
179*ebfedea0SLionel Sambuc     krb5_error_code ret;
180*ebfedea0SLionel Sambuc     ALLOC(*outdata, 1);
181*ebfedea0SLionel Sambuc     if(*outdata == NULL) {
182*ebfedea0SLionel Sambuc 	krb5_set_error_message(context, ENOMEM, "malloc: out of memory");
183*ebfedea0SLionel Sambuc 	return ENOMEM;
184*ebfedea0SLionel Sambuc     }
185*ebfedea0SLionel Sambuc     ret = der_copy_octet_string(indata, *outdata);
186*ebfedea0SLionel Sambuc     if(ret) {
187*ebfedea0SLionel Sambuc 	krb5_clear_error_message (context);
188*ebfedea0SLionel Sambuc 	free(*outdata);
189*ebfedea0SLionel Sambuc 	*outdata = NULL;
190*ebfedea0SLionel Sambuc     }
191*ebfedea0SLionel Sambuc     return ret;
192*ebfedea0SLionel Sambuc }
193*ebfedea0SLionel Sambuc 
194*ebfedea0SLionel Sambuc /**
195*ebfedea0SLionel Sambuc  * Compare to data.
196*ebfedea0SLionel Sambuc  *
197*ebfedea0SLionel Sambuc  * @param data1 krb5_data to compare
198*ebfedea0SLionel Sambuc  * @param data2 krb5_data to compare
199*ebfedea0SLionel Sambuc  *
200*ebfedea0SLionel Sambuc  * @return return the same way as memcmp(), useful when sorting.
201*ebfedea0SLionel Sambuc  *
202*ebfedea0SLionel Sambuc  * @ingroup krb5
203*ebfedea0SLionel Sambuc  */
204*ebfedea0SLionel Sambuc 
205*ebfedea0SLionel Sambuc KRB5_LIB_FUNCTION int KRB5_LIB_CALL
krb5_data_cmp(const krb5_data * data1,const krb5_data * data2)206*ebfedea0SLionel Sambuc krb5_data_cmp(const krb5_data *data1, const krb5_data *data2)
207*ebfedea0SLionel Sambuc {
208*ebfedea0SLionel Sambuc     if (data1->length != data2->length)
209*ebfedea0SLionel Sambuc 	return data1->length - data2->length;
210*ebfedea0SLionel Sambuc     return memcmp(data1->data, data2->data, data1->length);
211*ebfedea0SLionel Sambuc }
212*ebfedea0SLionel Sambuc 
213*ebfedea0SLionel Sambuc /**
214*ebfedea0SLionel Sambuc  * Compare to data not exposing timing information from the checksum data
215*ebfedea0SLionel Sambuc  *
216*ebfedea0SLionel Sambuc  * @param data1 krb5_data to compare
217*ebfedea0SLionel Sambuc  * @param data2 krb5_data to compare
218*ebfedea0SLionel Sambuc  *
219*ebfedea0SLionel Sambuc  * @return returns zero for same data, otherwise non zero.
220*ebfedea0SLionel Sambuc  *
221*ebfedea0SLionel Sambuc  * @ingroup krb5
222*ebfedea0SLionel Sambuc  */
223*ebfedea0SLionel Sambuc 
224*ebfedea0SLionel Sambuc KRB5_LIB_FUNCTION int KRB5_LIB_CALL
krb5_data_ct_cmp(const krb5_data * data1,const krb5_data * data2)225*ebfedea0SLionel Sambuc krb5_data_ct_cmp(const krb5_data *data1, const krb5_data *data2)
226*ebfedea0SLionel Sambuc {
227*ebfedea0SLionel Sambuc     if (data1->length != data2->length)
228*ebfedea0SLionel Sambuc 	return data1->length - data2->length;
229*ebfedea0SLionel Sambuc     return ct_memcmp(data1->data, data2->data, data1->length);
230*ebfedea0SLionel Sambuc }
231