der_format.c revision 233294
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