peer.c revision 178826
168651Skris/* 268651Skris * Copyright (c) 2006 - 2007 Kungliga Tekniska H�gskolan 368651Skris * (Royal Institute of Technology, Stockholm, Sweden). 468651Skris * All rights reserved. 568651Skris * 668651Skris * Redistribution and use in source and binary forms, with or without 768651Skris * modification, are permitted provided that the following conditions 868651Skris * are met: 968651Skris * 1068651Skris * 1. Redistributions of source code must retain the above copyright 1168651Skris * notice, this list of conditions and the following disclaimer. 1268651Skris * 1368651Skris * 2. Redistributions in binary form must reproduce the above copyright 1468651Skris * notice, this list of conditions and the following disclaimer in the 1568651Skris * documentation and/or other materials provided with the distribution. 1668651Skris * 1768651Skris * 3. Neither the name of the Institute nor the names of its contributors 1868651Skris * may be used to endorse or promote products derived from this software 1968651Skris * without specific prior written permission. 2068651Skris * 2168651Skris * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 2268651Skris * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2368651Skris * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2468651Skris * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 2568651Skris * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2668651Skris * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2768651Skris * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2868651Skris * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2968651Skris * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3068651Skris * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3168651Skris * SUCH DAMAGE. 3268651Skris */ 3368651Skris 3468651Skris#include "hx_locl.h" 3568651SkrisRCSID("$Id: peer.c 22345 2007-12-26 19:03:51Z lha $"); 3668651Skris 3768651Skris/** 3868651Skris * @page page_peer Hx509 crypto selecting functions 3968651Skris * 4068651Skris * Peer info structures are used togeter with hx509_crypto_select() to 4168651Skris * select the best avaible crypto algorithm to use. 4268651Skris * 4368651Skris * See the library functions here: @ref hx509_peer 4468651Skris */ 4568651Skris 4668651Skris/** 4768651Skris * Allocate a new peer info structure an init it to default values. 4868651Skris * 4968651Skris * @param context A hx509 context. 5068651Skris * @param peer return an allocated peer, free with hx509_peer_info_free(). 5168651Skris * 5268651Skris * @return An hx509 error code, see hx509_get_error_string(). 5368651Skris * 5468651Skris * @ingroup hx509_peer 5568651Skris */ 5668651Skris 5768651Skrisint 58hx509_peer_info_alloc(hx509_context context, hx509_peer_info *peer) 59{ 60 *peer = calloc(1, sizeof(**peer)); 61 if (*peer == NULL) { 62 hx509_set_error_string(context, 0, ENOMEM, "out of memory"); 63 return ENOMEM; 64 } 65 return 0; 66} 67 68 69static void 70free_cms_alg(hx509_peer_info peer) 71{ 72 if (peer->val) { 73 size_t i; 74 for (i = 0; i < peer->len; i++) 75 free_AlgorithmIdentifier(&peer->val[i]); 76 free(peer->val); 77 peer->val = NULL; 78 peer->len = 0; 79 } 80} 81 82/** 83 * Free a peer info structure. 84 * 85 * @param peer peer info to be freed. 86 * 87 * @ingroup hx509_peer 88 */ 89 90void 91hx509_peer_info_free(hx509_peer_info peer) 92{ 93 if (peer == NULL) 94 return; 95 if (peer->cert) 96 hx509_cert_free(peer->cert); 97 free_cms_alg(peer); 98 memset(peer, 0, sizeof(*peer)); 99 free(peer); 100} 101 102/** 103 * Set the certificate that remote peer is using. 104 * 105 * @param peer peer info to update 106 * @param cert cerificate of the remote peer. 107 * 108 * @return An hx509 error code, see hx509_get_error_string(). 109 * 110 * @ingroup hx509_peer 111 */ 112 113int 114hx509_peer_info_set_cert(hx509_peer_info peer, 115 hx509_cert cert) 116{ 117 if (peer->cert) 118 hx509_cert_free(peer->cert); 119 peer->cert = hx509_cert_ref(cert); 120 return 0; 121} 122 123/** 124 * Set the algorithms that the peer supports. 125 * 126 * @param context A hx509 context. 127 * @param peer the peer to set the new algorithms for 128 * @param val array of supported AlgorithmsIdentiers 129 * @param len length of array val. 130 * 131 * @return An hx509 error code, see hx509_get_error_string(). 132 * 133 * @ingroup hx509_peer 134 */ 135 136int 137hx509_peer_info_set_cms_algs(hx509_context context, 138 hx509_peer_info peer, 139 const AlgorithmIdentifier *val, 140 size_t len) 141{ 142 size_t i; 143 144 free_cms_alg(peer); 145 146 peer->val = calloc(len, sizeof(*peer->val)); 147 if (peer->val == NULL) { 148 peer->len = 0; 149 hx509_set_error_string(context, 0, ENOMEM, "out of memory"); 150 return ENOMEM; 151 } 152 peer->len = len; 153 for (i = 0; i < len; i++) { 154 int ret; 155 ret = copy_AlgorithmIdentifier(&val[i], &peer->val[i]); 156 if (ret) { 157 hx509_clear_error_string(context); 158 free_cms_alg(peer); 159 return ret; 160 } 161 } 162 return 0; 163} 164 165#if 0 166 167/* 168 * S/MIME 169 */ 170 171int 172hx509_peer_info_parse_smime(hx509_peer_info peer, 173 const heim_octet_string *data) 174{ 175 return 0; 176} 177 178int 179hx509_peer_info_unparse_smime(hx509_peer_info peer, 180 heim_octet_string *data) 181{ 182 return 0; 183} 184 185/* 186 * For storing hx509_peer_info to be able to cache them. 187 */ 188 189int 190hx509_peer_info_parse(hx509_peer_info peer, 191 const heim_octet_string *data) 192{ 193 return 0; 194} 195 196int 197hx509_peer_info_unparse(hx509_peer_info peer, 198 heim_octet_string *data) 199{ 200 return 0; 201} 202#endif 203