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