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