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