Line data Source code
1 : /*
2 : * Copyright (c) 2006 - 2007 Kungliga Tekniska Högskolan
3 : * (Royal Institute of Technology, Stockholm, Sweden).
4 : * All rights reserved.
5 : *
6 : * Portions Copyright (c) 2009 Apple Inc. All rights reserved.
7 : *
8 : * Redistribution and use in source and binary forms, with or without
9 : * modification, are permitted provided that the following conditions
10 : * are met:
11 : *
12 : * 1. Redistributions of source code must retain the above copyright
13 : * notice, this list of conditions and the following disclaimer.
14 : *
15 : * 2. Redistributions in binary form must reproduce the above copyright
16 : * notice, this list of conditions and the following disclaimer in the
17 : * documentation and/or other materials provided with the distribution.
18 : *
19 : * 3. Neither the name of the Institute nor the names of its contributors
20 : * may be used to endorse or promote products derived from this software
21 : * without specific prior written permission.
22 : *
23 : * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
24 : * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 : * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 : * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
27 : * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 : * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 : * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 : * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 : * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 : * SUCH DAMAGE.
34 : */
35 :
36 : #include "hx_locl.h"
37 :
38 : /**
39 : * @page page_peer Hx509 crypto selecting functions
40 : *
41 : * Peer info structures are used togeter with hx509_crypto_select() to
42 : * select the best avaible crypto algorithm to use.
43 : *
44 : * See the library functions here: @ref hx509_peer
45 : */
46 :
47 : /**
48 : * Allocate a new peer info structure an init it to default values.
49 : *
50 : * @param context A hx509 context.
51 : * @param peer return an allocated peer, free with hx509_peer_info_free().
52 : *
53 : * @return An hx509 error code, see hx509_get_error_string().
54 : *
55 : * @ingroup hx509_peer
56 : */
57 :
58 : HX509_LIB_FUNCTION int HX509_LIB_CALL
59 55 : hx509_peer_info_alloc(hx509_context context, hx509_peer_info *peer)
60 : {
61 55 : *peer = calloc(1, sizeof(**peer));
62 55 : if (*peer == NULL) {
63 0 : hx509_set_error_string(context, 0, ENOMEM, "out of memory");
64 0 : return ENOMEM;
65 : }
66 55 : return 0;
67 : }
68 :
69 :
70 : static void
71 106 : free_cms_alg(hx509_peer_info peer)
72 : {
73 106 : if (peer->val) {
74 : size_t i;
75 343 : for (i = 0; i < peer->len; i++)
76 288 : free_AlgorithmIdentifier(&peer->val[i]);
77 55 : free(peer->val);
78 55 : peer->val = NULL;
79 55 : peer->len = 0;
80 : }
81 106 : }
82 :
83 : /**
84 : * Free a peer info structure.
85 : *
86 : * @param peer peer info to be freed.
87 : *
88 : * @ingroup hx509_peer
89 : */
90 :
91 : HX509_LIB_FUNCTION void HX509_LIB_CALL
92 55 : hx509_peer_info_free(hx509_peer_info peer)
93 : {
94 55 : if (peer == NULL)
95 0 : return;
96 55 : if (peer->cert)
97 0 : hx509_cert_free(peer->cert);
98 55 : free_cms_alg(peer);
99 55 : memset(peer, 0, sizeof(*peer));
100 55 : free(peer);
101 : }
102 :
103 : /**
104 : * Set the certificate that remote peer is using.
105 : *
106 : * @param peer peer info to update
107 : * @param cert cerificate of the remote peer.
108 : *
109 : * @return An hx509 error code, see hx509_get_error_string().
110 : *
111 : * @ingroup hx509_peer
112 : */
113 :
114 : HX509_LIB_FUNCTION int HX509_LIB_CALL
115 0 : hx509_peer_info_set_cert(hx509_peer_info peer,
116 : hx509_cert cert)
117 : {
118 0 : if (peer->cert)
119 0 : hx509_cert_free(peer->cert);
120 0 : peer->cert = hx509_cert_ref(cert);
121 0 : return 0;
122 : }
123 :
124 : /**
125 : * Add an additional algorithm that the peer supports.
126 : *
127 : * @param context A hx509 context.
128 : * @param peer the peer to set the new algorithms for
129 : * @param val an AlgorithmsIdentier to add
130 : *
131 : * @return An hx509 error code, see hx509_get_error_string().
132 : *
133 : * @ingroup hx509_peer
134 : */
135 :
136 : HX509_LIB_FUNCTION int HX509_LIB_CALL
137 12 : hx509_peer_info_add_cms_alg(hx509_context context,
138 : hx509_peer_info peer,
139 : const AlgorithmIdentifier *val)
140 : {
141 0 : void *ptr;
142 0 : int ret;
143 :
144 12 : ptr = realloc(peer->val, sizeof(peer->val[0]) * (peer->len + 1));
145 12 : if (ptr == NULL) {
146 0 : hx509_set_error_string(context, 0, ENOMEM, "out of memory");
147 0 : return ENOMEM;
148 : }
149 12 : peer->val = ptr;
150 12 : ret = copy_AlgorithmIdentifier(val, &peer->val[peer->len]);
151 12 : if (ret == 0)
152 12 : peer->len += 1;
153 : else
154 0 : hx509_set_error_string(context, 0, ret, "out of memory");
155 12 : return ret;
156 : }
157 :
158 : /**
159 : * Set the algorithms that the peer supports.
160 : *
161 : * @param context A hx509 context.
162 : * @param peer the peer to set the new algorithms for
163 : * @param val array of supported AlgorithmsIdentiers
164 : * @param len length of array val.
165 : *
166 : * @return An hx509 error code, see hx509_get_error_string().
167 : *
168 : * @ingroup hx509_peer
169 : */
170 :
171 : HX509_LIB_FUNCTION int HX509_LIB_CALL
172 51 : hx509_peer_info_set_cms_algs(hx509_context context,
173 : hx509_peer_info peer,
174 : const AlgorithmIdentifier *val,
175 : size_t len)
176 : {
177 0 : size_t i;
178 :
179 51 : free_cms_alg(peer);
180 :
181 51 : peer->val = calloc(len, sizeof(*peer->val));
182 51 : if (peer->val == NULL) {
183 0 : peer->len = 0;
184 0 : hx509_set_error_string(context, 0, ENOMEM, "out of memory");
185 0 : return ENOMEM;
186 : }
187 51 : peer->len = len;
188 327 : for (i = 0; i < len; i++) {
189 0 : int ret;
190 276 : ret = copy_AlgorithmIdentifier(&val[i], &peer->val[i]);
191 276 : if (ret) {
192 0 : hx509_clear_error_string(context);
193 0 : free_cms_alg(peer);
194 0 : return ret;
195 : }
196 : }
197 51 : return 0;
198 : }
199 :
200 : #if 0
201 :
202 : /*
203 : * S/MIME
204 : */
205 :
206 : HX509_LIB_FUNCTION int HX509_LIB_CALL
207 : hx509_peer_info_parse_smime(hx509_peer_info peer,
208 : const heim_octet_string *data)
209 : {
210 : return 0;
211 : }
212 :
213 : HX509_LIB_FUNCTION int HX509_LIB_CALL
214 : hx509_peer_info_unparse_smime(hx509_peer_info peer,
215 : heim_octet_string *data)
216 : {
217 : return 0;
218 : }
219 :
220 : /*
221 : * For storing hx509_peer_info to be able to cache them.
222 : */
223 :
224 : HX509_LIB_FUNCTION int HX509_LIB_CALL
225 : hx509_peer_info_parse(hx509_peer_info peer,
226 : const heim_octet_string *data)
227 : {
228 : return 0;
229 : }
230 :
231 : HX509_LIB_FUNCTION int HX509_LIB_CALL
232 : hx509_peer_info_unparse(hx509_peer_info peer,
233 : heim_octet_string *data)
234 : {
235 : return 0;
236 : }
237 : #endif
|