1/*	$NetBSD: extra.c,v 1.1.1.1 2011/04/13 18:14:40 elric Exp $	*/
2
3/*
4 * Copyright (c) 2003 - 2005 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#include <krb5/heim_asn1.h>
40
41__RCSID("$NetBSD: extra.c,v 1.1.1.1 2011/04/13 18:14:40 elric Exp $");
42
43int
44encode_heim_any(unsigned char *p, size_t len,
45		const heim_any *data, size_t *size)
46{
47    return der_put_octet_string (p, len, data, size);
48}
49
50int
51decode_heim_any(const unsigned char *p, size_t len,
52		heim_any *data, size_t *size)
53{
54    size_t len_len, length, l;
55    Der_class thisclass;
56    Der_type thistype;
57    unsigned int thistag;
58    int e;
59
60    memset(data, 0, sizeof(*data));
61
62    e = der_get_tag (p, len, &thisclass, &thistype, &thistag, &l);
63    if (e) return e;
64    if (l > len)
65	return ASN1_OVERFLOW;
66    e = der_get_length(p + l, len - l, &length, &len_len);
67    if (e) return e;
68    if (length == ASN1_INDEFINITE) {
69        if (len < len_len + l)
70	    return ASN1_OVERFLOW;
71	length = len - (len_len + l);
72    } else {
73	if (len < length + len_len + l)
74	    return ASN1_OVERFLOW;
75    }
76
77    data->data = malloc(length + len_len + l);
78    if (data->data == NULL)
79	return ENOMEM;
80    data->length = length + len_len + l;
81    memcpy(data->data, p, length + len_len + l);
82
83    if (size)
84	*size = length + len_len + l;
85
86    return 0;
87}
88
89void
90free_heim_any(heim_any *data)
91{
92    der_free_octet_string(data);
93}
94
95size_t
96length_heim_any(const heim_any *data)
97{
98    return data->length;
99}
100
101int
102copy_heim_any(const heim_any *from, heim_any *to)
103{
104    return der_copy_octet_string(from, to);
105}
106
107int
108encode_heim_any_set(unsigned char *p, size_t len,
109		    const heim_any_set *data, size_t *size)
110{
111    return der_put_octet_string (p, len, data, size);
112}
113
114int
115decode_heim_any_set(const unsigned char *p, size_t len,
116		heim_any_set *data, size_t *size)
117{
118    return der_get_octet_string(p, len, data, size);
119}
120
121void
122free_heim_any_set(heim_any_set *data)
123{
124    der_free_octet_string(data);
125}
126
127size_t
128length_heim_any_set(const heim_any *data)
129{
130    return data->length;
131}
132
133int
134copy_heim_any_set(const heim_any_set *from, heim_any_set *to)
135{
136    return der_copy_octet_string(from, to);
137}
138
139int
140heim_any_cmp(const heim_any_set *p, const heim_any_set *q)
141{
142    return der_heim_octet_string_cmp(p, q);
143}
144