1 /* $NetBSD: peer.c,v 1.2 2017/01/28 21:31:48 christos 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 60 int 61 hx509_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 72 static void 73 free_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 93 void 94 hx509_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 116 int 117 hx509_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 138 int 139 hx509_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 173 int 174 hx509_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 208 int 209 hx509_peer_info_parse_smime(hx509_peer_info peer, 210 const heim_octet_string *data) 211 { 212 return 0; 213 } 214 215 int 216 hx509_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 226 int 227 hx509_peer_info_parse(hx509_peer_info peer, 228 const heim_octet_string *data) 229 { 230 return 0; 231 } 232 233 int 234 hx509_peer_info_unparse(hx509_peer_info peer, 235 heim_octet_string *data) 236 { 237 return 0; 238 } 239 #endif 240