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