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