1 /* $NetBSD: der_copy.c,v 1.3 2023/06/19 21:41:42 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.3 2023/06/19 21:41:42 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 if (from->data == NULL) { 155 to->data = NULL; 156 return 0; 157 } 158 to->data = malloc(to->length); 159 if (to->length != 0 && to->data == NULL) 160 return ENOMEM; 161 memcpy(to->data, from->data, to->length); 162 return 0; 163 } 164 165 int 166 der_copy_heim_integer (const heim_integer *from, heim_integer *to) 167 { 168 to->length = from->length; 169 to->data = malloc(to->length); 170 if(to->length != 0 && to->data == NULL) 171 return ENOMEM; 172 memcpy(to->data, from->data, to->length); 173 to->negative = from->negative; 174 return 0; 175 } 176 177 int 178 der_copy_oid (const heim_oid *from, heim_oid *to) 179 { 180 to->length = from->length; 181 to->components = malloc(to->length * sizeof(*to->components)); 182 if (to->length != 0 && to->components == NULL) 183 return ENOMEM; 184 memcpy(to->components, from->components, 185 to->length * sizeof(*to->components)); 186 return 0; 187 } 188 189 int 190 der_copy_bit_string (const heim_bit_string *from, heim_bit_string *to) 191 { 192 size_t len; 193 194 len = (from->length + 7) / 8; 195 to->length = from->length; 196 to->data = malloc(len); 197 if(len != 0 && to->data == NULL) 198 return ENOMEM; 199 memcpy(to->data, from->data, len); 200 return 0; 201 } 202