1178825Sdfr/*
2233294Sstas * Copyright (c) 2005 Kungliga Tekniska H��gskolan
3233294Sstas * (Royal Institute of Technology, Stockholm, Sweden).
4233294Sstas * All rights reserved.
5178825Sdfr *
6233294Sstas * Redistribution and use in source and binary forms, with or without
7233294Sstas * modification, are permitted provided that the following conditions
8233294Sstas * are met:
9178825Sdfr *
10233294Sstas * 1. Redistributions of source code must retain the above copyright
11233294Sstas *    notice, this list of conditions and the following disclaimer.
12178825Sdfr *
13233294Sstas * 2. Redistributions in binary form must reproduce the above copyright
14233294Sstas *    notice, this list of conditions and the following disclaimer in the
15233294Sstas *    documentation and/or other materials provided with the distribution.
16178825Sdfr *
17233294Sstas * 3. Neither the name of the Institute nor the names of its contributors
18233294Sstas *    may be used to endorse or promote products derived from this software
19233294Sstas *    without specific prior written permission.
20178825Sdfr *
21233294Sstas * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22233294Sstas * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23233294Sstas * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24233294Sstas * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25233294Sstas * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26233294Sstas * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27233294Sstas * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28233294Sstas * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29233294Sstas * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30233294Sstas * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31233294Sstas * SUCH DAMAGE.
32178825Sdfr */
33178825Sdfr
34178825Sdfr#include "der_locl.h"
35178825Sdfr#include <hex.h>
36178825Sdfr
37233294SstasRCSID("$Id$");
38178825Sdfr
39178825Sdfrint
40178825Sdfrder_parse_hex_heim_integer (const char *p, heim_integer *data)
41178825Sdfr{
42178825Sdfr    ssize_t len;
43178825Sdfr
44178825Sdfr    data->length = 0;
45178825Sdfr    data->negative = 0;
46178825Sdfr    data->data = NULL;
47178825Sdfr
48178825Sdfr    if (*p == '-') {
49178825Sdfr	p++;
50178825Sdfr	data->negative = 1;
51178825Sdfr    }
52178825Sdfr
53178825Sdfr    len = strlen(p);
54178825Sdfr    if (len <= 0) {
55178825Sdfr	data->data = NULL;
56178825Sdfr	data->length = 0;
57178825Sdfr	return EINVAL;
58178825Sdfr    }
59233294Sstas
60178825Sdfr    data->length = (len / 2) + 1;
61178825Sdfr    data->data = malloc(data->length);
62178825Sdfr    if (data->data == NULL) {
63178825Sdfr	data->length = 0;
64178825Sdfr	return ENOMEM;
65178825Sdfr    }
66178825Sdfr
67178825Sdfr    len = hex_decode(p, data->data, data->length);
68178825Sdfr    if (len < 0) {
69178825Sdfr	free(data->data);
70178825Sdfr	data->data = NULL;
71178825Sdfr	data->length = 0;
72178825Sdfr	return EINVAL;
73178825Sdfr    }
74178825Sdfr
75178825Sdfr    {
76178825Sdfr	unsigned char *q = data->data;
77178825Sdfr	while(len > 0 && *q == 0) {
78178825Sdfr	    q++;
79178825Sdfr	    len--;
80178825Sdfr	}
81178825Sdfr	data->length = len;
82178825Sdfr	memmove(data->data, q, len);
83178825Sdfr    }
84178825Sdfr    return 0;
85178825Sdfr}
86178825Sdfr
87178825Sdfrint
88178825Sdfrder_print_hex_heim_integer (const heim_integer *data, char **p)
89178825Sdfr{
90178825Sdfr    ssize_t len;
91178825Sdfr    char *q;
92178825Sdfr
93178825Sdfr    len = hex_encode(data->data, data->length, p);
94178825Sdfr    if (len < 0)
95178825Sdfr	return ENOMEM;
96178825Sdfr
97178825Sdfr    if (data->negative) {
98178825Sdfr	len = asprintf(&q, "-%s", *p);
99178825Sdfr	free(*p);
100178825Sdfr	if (len < 0)
101178825Sdfr	    return ENOMEM;
102178825Sdfr	*p = q;
103178825Sdfr    }
104178825Sdfr    return 0;
105178825Sdfr}
106178825Sdfr
107178825Sdfrint
108178825Sdfrder_print_heim_oid (const heim_oid *oid, char delim, char **str)
109178825Sdfr{
110178825Sdfr    struct rk_strpool *p = NULL;
111233294Sstas    size_t i;
112178825Sdfr
113178825Sdfr    if (oid->length == 0)
114178825Sdfr	return EINVAL;
115178825Sdfr
116178825Sdfr    for (i = 0; i < oid->length ; i++) {
117178825Sdfr	p = rk_strpoolprintf(p, "%d", oid->components[i]);
118178825Sdfr	if (p && i < oid->length - 1)
119178825Sdfr	    p = rk_strpoolprintf(p, "%c", delim);
120178825Sdfr	if (p == NULL) {
121178825Sdfr	    *str = NULL;
122178825Sdfr	    return ENOMEM;
123178825Sdfr	}
124178825Sdfr    }
125178825Sdfr
126178825Sdfr    *str = rk_strpoolcollect(p);
127178825Sdfr    if (*str == NULL)
128178825Sdfr	return ENOMEM;
129178825Sdfr    return 0;
130178825Sdfr}
131178825Sdfr
132178825Sdfrint
133178825Sdfrder_parse_heim_oid (const char *str, const char *sep, heim_oid *data)
134178825Sdfr{
135178825Sdfr    char *s, *w, *brkt, *endptr;
136178825Sdfr    unsigned int *c;
137178825Sdfr    long l;
138178825Sdfr
139178825Sdfr    data->length = 0;
140178825Sdfr    data->components = NULL;
141178825Sdfr
142178825Sdfr    if (sep == NULL)
143178825Sdfr	sep = ".";
144178825Sdfr
145178825Sdfr    s = strdup(str);
146178825Sdfr
147233294Sstas    for (w = strtok_r(s, sep, &brkt);
148233294Sstas	 w != NULL;
149178825Sdfr	 w = strtok_r(NULL, sep, &brkt)) {
150178825Sdfr
151178825Sdfr	c = realloc(data->components,
152178825Sdfr		    (data->length + 1) * sizeof(data->components[0]));
153178825Sdfr	if (c == NULL) {
154178825Sdfr	    der_free_oid(data);
155178825Sdfr	    free(s);
156178825Sdfr	    return ENOMEM;
157178825Sdfr	}
158178825Sdfr	data->components = c;
159178825Sdfr
160178825Sdfr	l = strtol(w, &endptr, 10);
161178825Sdfr	if (*endptr != '\0' || l < 0 || l > INT_MAX) {
162178825Sdfr	    der_free_oid(data);
163178825Sdfr	    free(s);
164178825Sdfr	    return EINVAL;
165178825Sdfr	}
166178825Sdfr	data->components[data->length++] = l;
167178825Sdfr    }
168178825Sdfr    free(s);
169178825Sdfr    return 0;
170178825Sdfr}
171