Home | History | Annotate | Line # | Download | only in asn1
      1 /*	$NetBSD: extra.c,v 1.2 2017/01/28 21:31:45 christos Exp $	*/
      2 
      3 /*
      4  * Copyright (c) 2003 - 2005 Kungliga Tekniska Hgskolan
      5  * (Royal Institute of Technology, Stockholm, Sweden).
      6  * All rights reserved.
      7  *
      8  * Portions Copyright (c) 2009 Apple Inc. All rights reserved.
      9  *
     10  * Redistribution and use in source and binary forms, with or without
     11  * modification, are permitted provided that the following conditions
     12  * are met:
     13  *
     14  * 1. Redistributions of source code must retain the above copyright
     15  *    notice, this list of conditions and the following disclaimer.
     16  *
     17  * 2. Redistributions in binary form must reproduce the above copyright
     18  *    notice, this list of conditions and the following disclaimer in the
     19  *    documentation and/or other materials provided with the distribution.
     20  *
     21  * 3. Neither the name of the Institute nor the names of its contributors
     22  *    may be used to endorse or promote products derived from this software
     23  *    without specific prior written permission.
     24  *
     25  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
     26  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     27  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     28  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
     29  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     30  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     31  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     32  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     33  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     34  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     35  * SUCH DAMAGE.
     36  */
     37 
     38 #include "der_locl.h"
     39 #include <krb5/heim_asn1.h>
     40 
     41 __RCSID("$NetBSD: extra.c,v 1.2 2017/01/28 21:31:45 christos Exp $");
     42 
     43 int
     44 encode_heim_any(unsigned char *p, size_t len,
     45 		const heim_any *data, size_t *size)
     46 {
     47     return der_put_octet_string (p, len, data, size);
     48 }
     49 
     50 int
     51 decode_heim_any(const unsigned char *p, size_t len,
     52 		heim_any *data, size_t *size)
     53 {
     54     size_t len_len, length, l;
     55     Der_class thisclass;
     56     Der_type thistype;
     57     unsigned int thistag;
     58     int e;
     59 
     60     memset(data, 0, sizeof(*data));
     61 
     62     e = der_get_tag (p, len, &thisclass, &thistype, &thistag, &l);
     63     if (e) return e;
     64     if (l > len)
     65 	return ASN1_OVERFLOW;
     66     e = der_get_length(p + l, len - l, &length, &len_len);
     67     if (e) return e;
     68     if (length == ASN1_INDEFINITE) {
     69         if (len < len_len + l)
     70 	    return ASN1_OVERFLOW;
     71 	length = len - (len_len + l);
     72     } else {
     73 	if (len < length + len_len + l)
     74 	    return ASN1_OVERFLOW;
     75     }
     76 
     77     data->data = malloc(length + len_len + l);
     78     if (data->data == NULL)
     79 	return ENOMEM;
     80     data->length = length + len_len + l;
     81     memcpy(data->data, p, length + len_len + l);
     82 
     83     if (size)
     84 	*size = length + len_len + l;
     85 
     86     return 0;
     87 }
     88 
     89 void
     90 free_heim_any(heim_any *data)
     91 {
     92     der_free_octet_string(data);
     93 }
     94 
     95 size_t
     96 length_heim_any(const heim_any *data)
     97 {
     98     return data->length;
     99 }
    100 
    101 int
    102 copy_heim_any(const heim_any *from, heim_any *to)
    103 {
    104     return der_copy_octet_string(from, to);
    105 }
    106 
    107 int
    108 encode_heim_any_set(unsigned char *p, size_t len,
    109 		    const heim_any_set *data, size_t *size)
    110 {
    111     return der_put_octet_string (p, len, data, size);
    112 }
    113 
    114 int
    115 decode_heim_any_set(const unsigned char *p, size_t len,
    116 		heim_any_set *data, size_t *size)
    117 {
    118     return der_get_octet_string(p, len, data, size);
    119 }
    120 
    121 void
    122 free_heim_any_set(heim_any_set *data)
    123 {
    124     der_free_octet_string(data);
    125 }
    126 
    127 size_t
    128 length_heim_any_set(const heim_any *data)
    129 {
    130     return data->length;
    131 }
    132 
    133 int
    134 copy_heim_any_set(const heim_any_set *from, heim_any_set *to)
    135 {
    136     return der_copy_octet_string(from, to);
    137 }
    138 
    139 int
    140 heim_any_cmp(const heim_any_set *p, const heim_any_set *q)
    141 {
    142     return der_heim_octet_string_cmp(p, q);
    143 }
    144