1/* $NetBSD$ */ 2 3/* 4 * Copyright (c) 1997 - 2006 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 "der_locl.h" 39 40__RCSID("$NetBSD$"); 41 42int 43der_copy_general_string (const heim_general_string *from, 44 heim_general_string *to) 45{ 46 *to = strdup(*from); 47 if(*to == NULL) 48 return ENOMEM; 49 return 0; 50} 51 52int 53der_copy_integer (const int *from, int *to) 54{ 55 *to = *from; 56 return 0; 57} 58 59int 60der_copy_unsigned (const unsigned *from, unsigned *to) 61{ 62 *to = *from; 63 return 0; 64} 65 66int 67der_copy_generalized_time (const time_t *from, time_t *to) 68{ 69 *to = *from; 70 return 0; 71} 72 73int 74der_copy_utctime (const time_t *from, time_t *to) 75{ 76 *to = *from; 77 return 0; 78} 79 80int 81der_copy_utf8string (const heim_utf8_string *from, heim_utf8_string *to) 82{ 83 return der_copy_general_string(from, to); 84} 85 86int 87der_copy_printable_string (const heim_printable_string *from, 88 heim_printable_string *to) 89{ 90 to->length = from->length; 91 to->data = malloc(to->length + 1); 92 if(to->data == NULL) 93 return ENOMEM; 94 memcpy(to->data, from->data, to->length); 95 ((char *)to->data)[to->length] = '\0'; 96 return 0; 97} 98 99int 100der_copy_ia5_string (const heim_ia5_string *from, 101 heim_ia5_string *to) 102{ 103 return der_copy_printable_string(from, to); 104} 105 106int 107der_copy_bmp_string (const heim_bmp_string *from, heim_bmp_string *to) 108{ 109 to->length = from->length; 110 to->data = malloc(to->length * sizeof(to->data[0])); 111 if(to->length != 0 && to->data == NULL) 112 return ENOMEM; 113 memcpy(to->data, from->data, to->length * sizeof(to->data[0])); 114 return 0; 115} 116 117int 118der_copy_universal_string (const heim_universal_string *from, 119 heim_universal_string *to) 120{ 121 to->length = from->length; 122 to->data = malloc(to->length * sizeof(to->data[0])); 123 if(to->length != 0 && to->data == NULL) 124 return ENOMEM; 125 memcpy(to->data, from->data, to->length * sizeof(to->data[0])); 126 return 0; 127} 128 129int 130der_copy_visible_string (const heim_visible_string *from, 131 heim_visible_string *to) 132{ 133 return der_copy_general_string(from, to); 134} 135 136int 137der_copy_octet_string (const heim_octet_string *from, heim_octet_string *to) 138{ 139 to->length = from->length; 140 to->data = malloc(to->length); 141 if(to->length != 0 && to->data == NULL) 142 return ENOMEM; 143 memcpy(to->data, from->data, to->length); 144 return 0; 145} 146 147int 148der_copy_heim_integer (const heim_integer *from, heim_integer *to) 149{ 150 to->length = from->length; 151 to->data = malloc(to->length); 152 if(to->length != 0 && to->data == NULL) 153 return ENOMEM; 154 memcpy(to->data, from->data, to->length); 155 to->negative = from->negative; 156 return 0; 157} 158 159int 160der_copy_oid (const heim_oid *from, heim_oid *to) 161{ 162 to->length = from->length; 163 to->components = malloc(to->length * sizeof(*to->components)); 164 if (to->length != 0 && to->components == NULL) 165 return ENOMEM; 166 memcpy(to->components, from->components, 167 to->length * sizeof(*to->components)); 168 return 0; 169} 170 171int 172der_copy_bit_string (const heim_bit_string *from, heim_bit_string *to) 173{ 174 size_t len; 175 176 len = (from->length + 7) / 8; 177 to->length = from->length; 178 to->data = malloc(len); 179 if(len != 0 && to->data == NULL) 180 return ENOMEM; 181 memcpy(to->data, from->data, len); 182 return 0; 183} 184