der_format.c revision 1.1.1.1.10.1
1/* $NetBSD: der_format.c,v 1.1.1.1.10.1 2014/08/19 23:45:17 tls Exp $ */ 2 3/* 4 * Copyright (c) 2005 Kungliga Tekniska H��gskolan 5 * (Royal Institute of Technology, Stockholm, Sweden). 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * 3. Neither the name of the Institute nor the names of its contributors 20 * may be used to endorse or promote products derived from this software 21 * without specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 * SUCH DAMAGE. 34 */ 35 36#include "der_locl.h" 37#include <krb5/hex.h> 38 39__RCSID("NetBSD"); 40 41int 42der_parse_hex_heim_integer (const char *p, heim_integer *data) 43{ 44 ssize_t len; 45 46 data->length = 0; 47 data->negative = 0; 48 data->data = NULL; 49 50 if (*p == '-') { 51 p++; 52 data->negative = 1; 53 } 54 55 len = strlen(p); 56 if (len <= 0) { 57 data->data = NULL; 58 data->length = 0; 59 return EINVAL; 60 } 61 62 data->length = (len / 2) + 1; 63 data->data = malloc(data->length); 64 if (data->data == NULL) { 65 data->length = 0; 66 return ENOMEM; 67 } 68 69 len = hex_decode(p, data->data, data->length); 70 if (len < 0) { 71 free(data->data); 72 data->data = NULL; 73 data->length = 0; 74 return EINVAL; 75 } 76 77 { 78 unsigned char *q = data->data; 79 while(len > 0 && *q == 0) { 80 q++; 81 len--; 82 } 83 data->length = len; 84 memmove(data->data, q, len); 85 } 86 return 0; 87} 88 89int 90der_print_hex_heim_integer (const heim_integer *data, char **p) 91{ 92 ssize_t len; 93 char *q; 94 95 len = hex_encode(data->data, data->length, p); 96 if (len < 0) 97 return ENOMEM; 98 99 if (data->negative) { 100 len = asprintf(&q, "-%s", *p); 101 free(*p); 102 if (len < 0) 103 return ENOMEM; 104 *p = q; 105 } 106 return 0; 107} 108 109int 110der_print_heim_oid (const heim_oid *oid, char delim, char **str) 111{ 112 struct rk_strpool *p = NULL; 113 size_t i; 114 115 if (oid->length == 0) 116 return EINVAL; 117 118 for (i = 0; i < oid->length ; i++) { 119 p = rk_strpoolprintf(p, "%d", oid->components[i]); 120 if (p && i < oid->length - 1) 121 p = rk_strpoolprintf(p, "%c", delim); 122 if (p == NULL) { 123 *str = NULL; 124 return ENOMEM; 125 } 126 } 127 128 *str = rk_strpoolcollect(p); 129 if (*str == NULL) 130 return ENOMEM; 131 return 0; 132} 133 134int 135der_parse_heim_oid (const char *str, const char *sep, heim_oid *data) 136{ 137 char *s, *w, *brkt, *endptr; 138 unsigned int *c; 139 long l; 140 141 data->length = 0; 142 data->components = NULL; 143 144 if (sep == NULL) 145 sep = "."; 146 147 s = strdup(str); 148 149 for (w = strtok_r(s, sep, &brkt); 150 w != NULL; 151 w = strtok_r(NULL, sep, &brkt)) { 152 153 c = realloc(data->components, 154 (data->length + 1) * sizeof(data->components[0])); 155 if (c == NULL) { 156 der_free_oid(data); 157 free(s); 158 return ENOMEM; 159 } 160 data->components = c; 161 162 l = strtol(w, &endptr, 10); 163 if (*endptr != '\0' || l < 0 || l > INT_MAX) { 164 der_free_oid(data); 165 free(s); 166 return EINVAL; 167 } 168 data->components[data->length++] = l; 169 } 170 free(s); 171 return 0; 172} 173