1 /* $NetBSD: der_copy.c,v 1.1.1.1 2011/04/13 18:14:40 elric Exp $ */ 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: der_copy.c,v 1.1.1.1 2011/04/13 18:14:40 elric Exp $"); 41 42 int 43 der_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 52 int 53 der_copy_integer (const int *from, int *to) 54 { 55 *to = *from; 56 return 0; 57 } 58 59 int 60 der_copy_unsigned (const unsigned *from, unsigned *to) 61 { 62 *to = *from; 63 return 0; 64 } 65 66 int 67 der_copy_generalized_time (const time_t *from, time_t *to) 68 { 69 *to = *from; 70 return 0; 71 } 72 73 int 74 der_copy_utctime (const time_t *from, time_t *to) 75 { 76 *to = *from; 77 return 0; 78 } 79 80 int 81 der_copy_utf8string (const heim_utf8_string *from, heim_utf8_string *to) 82 { 83 return der_copy_general_string(from, to); 84 } 85 86 int 87 der_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 99 int 100 der_copy_ia5_string (const heim_ia5_string *from, 101 heim_ia5_string *to) 102 { 103 return der_copy_printable_string(from, to); 104 } 105 106 int 107 der_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 117 int 118 der_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 129 int 130 der_copy_visible_string (const heim_visible_string *from, 131 heim_visible_string *to) 132 { 133 return der_copy_general_string(from, to); 134 } 135 136 int 137 der_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 147 int 148 der_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 159 int 160 der_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 171 int 172 der_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