1/* 2 * Copyright (c) 2011-12 Apple Inc. All Rights Reserved. 3 * 4 * @APPLE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. Please obtain a copy of the License at 10 * http://www.opensource.apple.com/apsl/ and read it before using this 11 * file. 12 * 13 * The Original Code and all software distributed under the License are 14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 18 * Please see the License for the specific language governing rights and 19 * limitations under the License. 20 * 21 * @APPLE_LICENSE_HEADER_END@ 22 */ 23/* 24 * Copyright (c) 2005 Kungliga Tekniska Högskolan 25 * (Royal Institute of Technology, Stockholm, Sweden). 26 * All rights reserved. 27 * 28 * Redistribution and use in source and binary forms, with or without 29 * modification, are permitted provided that the following conditions 30 * are met: 31 * 32 * 1. Redistributions of source code must retain the above copyright 33 * notice, this list of conditions and the following disclaimer. 34 * 35 * 2. Redistributions in binary form must reproduce the above copyright 36 * notice, this list of conditions and the following disclaimer in the 37 * documentation and/or other materials provided with the distribution. 38 * 39 * 3. Neither the name of the Institute nor the names of its contributors 40 * may be used to endorse or promote products derived from this software 41 * without specific prior written permission. 42 * 43 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 44 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 45 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 46 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 47 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 48 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 49 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 50 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 51 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 52 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 53 * SUCH DAMAGE. 54 */ 55 56#include "asn1-der_locl.h" 57 58#include "hex.h" 59 60struct strpool; 61char *strpoolcollect(struct strpool *); 62struct strpool *strpoolprintf(struct strpool *, const char *, ...); 63void strpoolfree(struct strpool *); 64 65int 66der_parse_hex_heim_integer (const char *p, heim_integer *data) 67{ 68 ssize_t len; 69 70 data->length = 0; 71 data->negative = 0; 72 data->data = NULL; 73 74 if (*p == '-') { 75 p++; 76 data->negative = 1; 77 } 78 79 len = strlen(p); 80 if (len <= 0) { 81 data->data = NULL; 82 data->length = 0; 83 return EINVAL; 84 } 85 86 data->length = (len / 2) + 1; 87 data->data = malloc(data->length); 88 if (data->data == NULL) { 89 data->length = 0; 90 return ENOMEM; 91 } 92 93 len = hex_decode(p, data->data, data->length); 94 if (len < 0) { 95 free(data->data); 96 data->data = NULL; 97 data->length = 0; 98 return EINVAL; 99 } 100 101 { 102 unsigned char *q = data->data; 103 while(len > 0 && *q == 0) { 104 q++; 105 len--; 106 } 107 data->length = len; 108 memmove(data->data, q, len); 109 } 110 return 0; 111} 112 113int 114der_print_hex_heim_integer (const heim_integer *data, char **p) 115{ 116 ssize_t len; 117 char *q; 118 119 len = hex_encode(data->data, data->length, p); 120 if (len < 0) 121 return ENOMEM; 122 123 if (data->negative) { 124 len = asprintf(&q, "-%s", *p); 125 free(*p); 126 if (len < 0) 127 return ENOMEM; 128 *p = q; 129 } 130 return 0; 131} 132 133int 134der_print_heim_oid (const heim_oid *oid, char delim, char **str) 135{ 136 struct strpool *p = NULL; 137 size_t i; 138 139 if (oid->length == 0) 140 return EINVAL; 141 142 for (i = 0; i < oid->length ; i++) { 143 p = strpoolprintf(p, "%d", oid->components[i]); 144 if (p && i < oid->length - 1) 145 p = strpoolprintf(p, "%c", delim); 146 if (p == NULL) { 147 *str = NULL; 148 return ENOMEM; 149 } 150 } 151 152 *str = strpoolcollect(p); 153 if (*str == NULL) 154 return ENOMEM; 155 return 0; 156} 157 158int 159der_parse_heim_oid (const char *str, const char *sep, heim_oid *data) 160{ 161 char *s, *w, *brkt, *endptr; 162 unsigned int *c; 163 long l; 164 165 data->length = 0; 166 data->components = NULL; 167 168 if (sep == NULL) 169 sep = "."; 170 171 s = strdup(str); 172 173 for (w = strtok_r(s, sep, &brkt); 174 w != NULL; 175 w = strtok_r(NULL, sep, &brkt)) { 176 177 c = realloc(data->components, 178 (data->length + 1) * sizeof(data->components[0])); 179 if (c == NULL) { 180 der_free_oid(data); 181 free(s); 182 return ENOMEM; 183 } 184 data->components = c; 185 186 l = strtol(w, &endptr, 10); 187 if (*endptr != '\0' || l < 0 || l > INT_MAX) { 188 der_free_oid(data); 189 free(s); 190 return EINVAL; 191 } 192 data->components[data->length++] = l; 193 } 194 free(s); 195 return 0; 196} 197