1178825Sdfr/*
2178825Sdfr * Copyright (c) 2006 - 2007 Kungliga Tekniska H�gskolan
3178825Sdfr * (Royal Institute of Technology, Stockholm, Sweden).
4178825Sdfr * All rights reserved.
5178825Sdfr *
6178825Sdfr * Redistribution and use in source and binary forms, with or without
7178825Sdfr * modification, are permitted provided that the following conditions
8178825Sdfr * are met:
9178825Sdfr *
10178825Sdfr * 1. Redistributions of source code must retain the above copyright
11178825Sdfr *    notice, this list of conditions and the following disclaimer.
12178825Sdfr *
13178825Sdfr * 2. Redistributions in binary form must reproduce the above copyright
14178825Sdfr *    notice, this list of conditions and the following disclaimer in the
15178825Sdfr *    documentation and/or other materials provided with the distribution.
16178825Sdfr *
17178825Sdfr * 3. Neither the name of the Institute nor the names of its contributors
18178825Sdfr *    may be used to endorse or promote products derived from this software
19178825Sdfr *    without specific prior written permission.
20178825Sdfr *
21178825Sdfr * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22178825Sdfr * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23178825Sdfr * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24178825Sdfr * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25178825Sdfr * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26178825Sdfr * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27178825Sdfr * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28178825Sdfr * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29178825Sdfr * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30178825Sdfr * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31178825Sdfr * SUCH DAMAGE.
32178825Sdfr */
33178825Sdfr
34178825Sdfr#include "hx_locl.h"
35178825SdfrRCSID("$Id: peer.c 22345 2007-12-26 19:03:51Z lha $");
36178825Sdfr
37178825Sdfr/**
38178825Sdfr * @page page_peer Hx509 crypto selecting functions
39178825Sdfr *
40178825Sdfr * Peer info structures are used togeter with hx509_crypto_select() to
41178825Sdfr * select the best avaible crypto algorithm to use.
42178825Sdfr *
43178825Sdfr * See the library functions here: @ref hx509_peer
44178825Sdfr */
45178825Sdfr
46178825Sdfr/**
47178825Sdfr * Allocate a new peer info structure an init it to default values.
48178825Sdfr *
49178825Sdfr * @param context A hx509 context.
50178825Sdfr * @param peer return an allocated peer, free with hx509_peer_info_free().
51178825Sdfr *
52178825Sdfr * @return An hx509 error code, see hx509_get_error_string().
53178825Sdfr *
54178825Sdfr * @ingroup hx509_peer
55178825Sdfr */
56178825Sdfr
57178825Sdfrint
58178825Sdfrhx509_peer_info_alloc(hx509_context context, hx509_peer_info *peer)
59178825Sdfr{
60178825Sdfr    *peer = calloc(1, sizeof(**peer));
61178825Sdfr    if (*peer == NULL) {
62178825Sdfr	hx509_set_error_string(context, 0, ENOMEM, "out of memory");
63178825Sdfr	return ENOMEM;
64178825Sdfr    }
65178825Sdfr    return 0;
66178825Sdfr}
67178825Sdfr
68178825Sdfr
69178825Sdfrstatic void
70178825Sdfrfree_cms_alg(hx509_peer_info peer)
71178825Sdfr{
72178825Sdfr    if (peer->val) {
73178825Sdfr	size_t i;
74178825Sdfr	for (i = 0; i < peer->len; i++)
75178825Sdfr	    free_AlgorithmIdentifier(&peer->val[i]);
76178825Sdfr	free(peer->val);
77178825Sdfr	peer->val = NULL;
78178825Sdfr	peer->len = 0;
79178825Sdfr    }
80178825Sdfr}
81178825Sdfr
82178825Sdfr/**
83178825Sdfr * Free a peer info structure.
84178825Sdfr *
85178825Sdfr * @param peer peer info to be freed.
86178825Sdfr *
87178825Sdfr * @ingroup hx509_peer
88178825Sdfr */
89178825Sdfr
90178825Sdfrvoid
91178825Sdfrhx509_peer_info_free(hx509_peer_info peer)
92178825Sdfr{
93178825Sdfr    if (peer == NULL)
94178825Sdfr	return;
95178825Sdfr    if (peer->cert)
96178825Sdfr	hx509_cert_free(peer->cert);
97178825Sdfr    free_cms_alg(peer);
98178825Sdfr    memset(peer, 0, sizeof(*peer));
99178825Sdfr    free(peer);
100178825Sdfr}
101178825Sdfr
102178825Sdfr/**
103178825Sdfr * Set the certificate that remote peer is using.
104178825Sdfr *
105178825Sdfr * @param peer peer info to update
106178825Sdfr * @param cert cerificate of the remote peer.
107178825Sdfr *
108178825Sdfr * @return An hx509 error code, see hx509_get_error_string().
109178825Sdfr *
110178825Sdfr * @ingroup hx509_peer
111178825Sdfr */
112178825Sdfr
113178825Sdfrint
114178825Sdfrhx509_peer_info_set_cert(hx509_peer_info peer,
115178825Sdfr			 hx509_cert cert)
116178825Sdfr{
117178825Sdfr    if (peer->cert)
118178825Sdfr	hx509_cert_free(peer->cert);
119178825Sdfr    peer->cert = hx509_cert_ref(cert);
120178825Sdfr    return 0;
121178825Sdfr}
122178825Sdfr
123178825Sdfr/**
124178825Sdfr * Set the algorithms that the peer supports.
125178825Sdfr *
126178825Sdfr * @param context A hx509 context.
127178825Sdfr * @param peer the peer to set the new algorithms for
128178825Sdfr * @param val array of supported AlgorithmsIdentiers
129178825Sdfr * @param len length of array val.
130178825Sdfr *
131178825Sdfr * @return An hx509 error code, see hx509_get_error_string().
132178825Sdfr *
133178825Sdfr * @ingroup hx509_peer
134178825Sdfr */
135178825Sdfr
136178825Sdfrint
137178825Sdfrhx509_peer_info_set_cms_algs(hx509_context context,
138178825Sdfr			     hx509_peer_info peer,
139178825Sdfr			     const AlgorithmIdentifier *val,
140178825Sdfr			     size_t len)
141178825Sdfr{
142178825Sdfr    size_t i;
143178825Sdfr
144178825Sdfr    free_cms_alg(peer);
145178825Sdfr
146178825Sdfr    peer->val = calloc(len, sizeof(*peer->val));
147178825Sdfr    if (peer->val == NULL) {
148178825Sdfr	peer->len = 0;
149178825Sdfr	hx509_set_error_string(context, 0, ENOMEM, "out of memory");
150178825Sdfr	return ENOMEM;
151178825Sdfr    }
152178825Sdfr    peer->len = len;
153178825Sdfr    for (i = 0; i < len; i++) {
154178825Sdfr	int ret;
155178825Sdfr	ret = copy_AlgorithmIdentifier(&val[i], &peer->val[i]);
156178825Sdfr	if (ret) {
157178825Sdfr	    hx509_clear_error_string(context);
158178825Sdfr	    free_cms_alg(peer);
159178825Sdfr	    return ret;
160178825Sdfr	}
161178825Sdfr    }
162178825Sdfr    return 0;
163178825Sdfr}
164178825Sdfr
165178825Sdfr#if 0
166178825Sdfr
167178825Sdfr/*
168178825Sdfr * S/MIME
169178825Sdfr */
170178825Sdfr
171178825Sdfrint
172178825Sdfrhx509_peer_info_parse_smime(hx509_peer_info peer,
173178825Sdfr			    const heim_octet_string *data)
174178825Sdfr{
175178825Sdfr    return 0;
176178825Sdfr}
177178825Sdfr
178178825Sdfrint
179178825Sdfrhx509_peer_info_unparse_smime(hx509_peer_info peer,
180178825Sdfr			      heim_octet_string *data)
181178825Sdfr{
182178825Sdfr    return 0;
183178825Sdfr}
184178825Sdfr
185178825Sdfr/*
186178825Sdfr * For storing hx509_peer_info to be able to cache them.
187178825Sdfr */
188178825Sdfr
189178825Sdfrint
190178825Sdfrhx509_peer_info_parse(hx509_peer_info peer,
191178825Sdfr		      const heim_octet_string *data)
192178825Sdfr{
193178825Sdfr    return 0;
194178825Sdfr}
195178825Sdfr
196178825Sdfrint
197178825Sdfrhx509_peer_info_unparse(hx509_peer_info peer,
198178825Sdfr			heim_octet_string *data)
199178825Sdfr{
200178825Sdfr    return 0;
201178825Sdfr}
202178825Sdfr#endif
203