1 /* $NetBSD: der_copy.c,v 1.2 2017/01/28 21:31:45 christos 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.2 2017/01/28 21:31:45 christos 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_integer64 (const int64_t *from, int64_t *to) 61 { 62 *to = *from; 63 return 0; 64 } 65 66 int 67 der_copy_unsigned (const unsigned *from, unsigned *to) 68 { 69 *to = *from; 70 return 0; 71 } 72 73 int 74 der_copy_unsigned64 (const uint64_t *from, uint64_t *to) 75 { 76 *to = *from; 77 return 0; 78 } 79 80 int 81 der_copy_generalized_time (const time_t *from, time_t *to) 82 { 83 *to = *from; 84 return 0; 85 } 86 87 int 88 der_copy_utctime (const time_t *from, time_t *to) 89 { 90 *to = *from; 91 return 0; 92 } 93 94 int 95 der_copy_utf8string (const heim_utf8_string *from, heim_utf8_string *to) 96 { 97 return der_copy_general_string(from, to); 98 } 99 100 int 101 der_copy_printable_string (const heim_printable_string *from, 102 heim_printable_string *to) 103 { 104 to->length = from->length; 105 to->data = malloc(to->length + 1); 106 if(to->data == NULL) 107 return ENOMEM; 108 memcpy(to->data, from->data, to->length); 109 ((char *)to->data)[to->length] = '\0'; 110 return 0; 111 } 112 113 int 114 der_copy_ia5_string (const heim_ia5_string *from, 115 heim_ia5_string *to) 116 { 117 return der_copy_printable_string(from, to); 118 } 119 120 int 121 der_copy_bmp_string (const heim_bmp_string *from, heim_bmp_string *to) 122 { 123 to->length = from->length; 124 to->data = malloc(to->length * sizeof(to->data[0])); 125 if(to->length != 0 && to->data == NULL) 126 return ENOMEM; 127 memcpy(to->data, from->data, to->length * sizeof(to->data[0])); 128 return 0; 129 } 130 131 int 132 der_copy_universal_string (const heim_universal_string *from, 133 heim_universal_string *to) 134 { 135 to->length = from->length; 136 to->data = malloc(to->length * sizeof(to->data[0])); 137 if(to->length != 0 && to->data == NULL) 138 return ENOMEM; 139 memcpy(to->data, from->data, to->length * sizeof(to->data[0])); 140 return 0; 141 } 142 143 int 144 der_copy_visible_string (const heim_visible_string *from, 145 heim_visible_string *to) 146 { 147 return der_copy_general_string(from, to); 148 } 149 150 int 151 der_copy_octet_string (const heim_octet_string *from, heim_octet_string *to) 152 { 153 to->length = from->length; 154 to->data = malloc(to->length); 155 if(to->length != 0 && to->data == NULL) 156 return ENOMEM; 157 memcpy(to->data, from->data, to->length); 158 return 0; 159 } 160 161 int 162 der_copy_heim_integer (const heim_integer *from, heim_integer *to) 163 { 164 to->length = from->length; 165 to->data = malloc(to->length); 166 if(to->length != 0 && to->data == NULL) 167 return ENOMEM; 168 memcpy(to->data, from->data, to->length); 169 to->negative = from->negative; 170 return 0; 171 } 172 173 int 174 der_copy_oid (const heim_oid *from, heim_oid *to) 175 { 176 to->length = from->length; 177 to->components = malloc(to->length * sizeof(*to->components)); 178 if (to->length != 0 && to->components == NULL) 179 return ENOMEM; 180 memcpy(to->components, from->components, 181 to->length * sizeof(*to->components)); 182 return 0; 183 } 184 185 int 186 der_copy_bit_string (const heim_bit_string *from, heim_bit_string *to) 187 { 188 size_t len; 189 190 len = (from->length + 7) / 8; 191 to->length = from->length; 192 to->data = malloc(len); 193 if(len != 0 && to->data == NULL) 194 return ENOMEM; 195 memcpy(to->data, from->data, len); 196 return 0; 197 } 198