From 7c785284bdc99155ebfb2fb192fcfb05bbcaef14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Love=20H=C3=B6rnquist=20=C3=85strand?= Date: Fri, 7 Oct 2005 03:49:16 +0000 Subject: [PATCH] Add parse and print functions for heim_integer. git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@16127 ec53bebd-3082-4978-b11e-865c3cabbd6b --- lib/asn1/Makefile.am | 1 + lib/asn1/der.h | 3 ++ lib/asn1/der_format.c | 96 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 100 insertions(+) create mode 100644 lib/asn1/der_format.c diff --git a/lib/asn1/Makefile.am b/lib/asn1/Makefile.am index 7b31d446a..26e741621 100644 --- a/lib/asn1/Makefile.am +++ b/lib/asn1/Makefile.am @@ -358,6 +358,7 @@ libasn1_la_SOURCES = \ der_length.c \ der_copy.c \ der_cmp.c \ + der_format.c \ extra.c \ timegm.c \ $(BUILT_SOURCES) diff --git a/lib/asn1/der.h b/lib/asn1/der.h index eaecaa49d..b8306742e 100644 --- a/lib/asn1/der.h +++ b/lib/asn1/der.h @@ -240,4 +240,7 @@ int der_get_type_num(const char *); const char * der_get_tag_name(unsigned); int der_get_tag_num(const char *); +int der_parse_hex_heim_integer(const char *, heim_integer *); +int der_print_hex_heim_integer(const heim_integer *, char **); + #endif /* __DER_H__ */ diff --git a/lib/asn1/der_format.c b/lib/asn1/der_format.c new file mode 100644 index 000000000..73d588dd0 --- /dev/null +++ b/lib/asn1/der_format.c @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2005 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "der_locl.h" +#include + +RCSID("$Id$"); + +int +der_parse_hex_heim_integer (const char *p, heim_integer *data) +{ + ssize_t len; + + data->length = 0; + data->negative = 0; + data->data = NULL; + + if (*p == '-') { + p++; + data->negative = 1; + } + + len = strlen(p); + if (len < 0) + return EINVAL; + + data->length = len / 2; + data->data = malloc(data->length); + if (data->data == NULL) + return ENOMEM; + + len = hex_decode(p, data->data, data->length); + if (len < 0) + return EINVAL; + + { + unsigned char *p = data->data; + while(*p == 0 && len > 0) { + p++; + len--; + } + data->length = len; + memmove(data->data, p, len); + } + return 0; +} + +int +der_print_hex_heim_integer (const heim_integer *data, char **p) +{ + ssize_t len; + char *q; + + len = hex_encode(data->data, data->length, p); + if (len < 0) + return ENOMEM; + + if (data->negative) { + len = asprintf(&q, "-%s", *p); + free(*p); + if (len < 0) + return ENOMEM; + *p = q; + } + return 0; +}