diff options
Diffstat (limited to 'lib/hx509/file.c')
| -rw-r--r-- | lib/hx509/file.c | 156 | 
1 files changed, 41 insertions, 115 deletions
| diff --git a/lib/hx509/file.c b/lib/hx509/file.c index b076b74f44df..4f7e87f070ae 100644 --- a/lib/hx509/file.c +++ b/lib/hx509/file.c @@ -1,47 +1,46 @@  /* - * Copyright (c) 2005 - 2006 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden).  - * All rights reserved.  + * Copyright (c) 2005 - 2006 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:  + * 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.  + * 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.  + * 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.  + * 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.  + * 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 "hx_locl.h" -RCSID("$ID$");  int -_hx509_map_file_os(const char *fn, heim_octet_string *os, struct stat *rsb) +_hx509_map_file_os(const char *fn, heim_octet_string *os)  {      size_t length;      void *data;      int ret; -    ret = _hx509_map_file(fn, &data, &length, rsb); +    ret = rk_undumpdata(fn, &data, &length);      os->data = data;      os->length = length; @@ -52,86 +51,13 @@ _hx509_map_file_os(const char *fn, heim_octet_string *os, struct stat *rsb)  void  _hx509_unmap_file_os(heim_octet_string *os)  { -    _hx509_unmap_file(os->data, os->length); -} - -int -_hx509_map_file(const char *fn, void **data, size_t *length, struct stat *rsb) -{ -    struct stat sb; -    size_t len; -    ssize_t l; -    int ret; -    void *d; -    int fd; - -    *data = NULL; -    *length = 0; - -    fd = open(fn, O_RDONLY); -    if (fd < 0) -	return errno; -     -    if (fstat(fd, &sb) < 0) { -	ret = errno; -	close(fd); -	return ret; -    } - -    len = sb.st_size; - -    d = malloc(len); -    if (d == NULL) { -	close(fd); -	return ENOMEM; -    } -     -    l = read(fd, d, len); -    close(fd); -    if (l < 0 || l != len) { -	free(d); -	return EINVAL; -    } - -    if (rsb) -	*rsb = sb; -    *data = d; -    *length = len; -    return 0; -} - -void -_hx509_unmap_file(void *data, size_t len) -{ -    free(data); +    rk_xfree(os->data);  }  int  _hx509_write_file(const char *fn, const void *data, size_t length)  { -    ssize_t sz; -    const unsigned char *p = data; -    int fd; - -    fd = open(fn, O_WRONLY|O_TRUNC|O_CREAT, 0644); -    if (fd < 0) -	return errno; - -    do { -	sz = write(fd, p, length); -	if (sz < 0) { -	    int saved_errno = errno; -	    close(fd); -	    return saved_errno; -	} -	if (sz == 0) -	    break; -	length -= sz; -    } while (length > 0); -		 -    if (close(fd) == -1) -	return errno; - +    rk_dumpdata(fn, data, length);      return 0;  } @@ -140,13 +66,13 @@ _hx509_write_file(const char *fn, const void *data, size_t length)   */  static void -header(FILE *f, const char *type, const char *str) +print_pem_stamp(FILE *f, const char *type, const char *str)  {      fprintf(f, "-----%s %s-----\n", type, str);  }  int -hx509_pem_write(hx509_context context, const char *type,  +hx509_pem_write(hx509_context context, const char *type,  		hx509_pem_header *headers, FILE *f,  		const void *data, size_t size)  { @@ -155,11 +81,11 @@ hx509_pem_write(hx509_context context, const char *type,      char *line;  #define ENCODE_LINE_LENGTH	54 -     -    header(f, "BEGIN", type); + +    print_pem_stamp(f, "BEGIN", type);      while (headers) { -	fprintf(f, "%s: %s\n%s",  +	fprintf(f, "%s: %s\n%s",  		headers->header, headers->value,  		headers->next ? "" : "\n");  	headers = headers->next; @@ -167,11 +93,11 @@ hx509_pem_write(hx509_context context, const char *type,      while (size > 0) {  	ssize_t l; -	 +  	length = size;  	if (length > ENCODE_LINE_LENGTH)  	    length = ENCODE_LINE_LENGTH; -	 +  	l = base64_encode(p, length, &line);  	if (l < 0) {  	    hx509_set_error_string(context, 0, ENOMEM, @@ -184,7 +110,7 @@ hx509_pem_write(hx509_context context, const char *type,  	free(line);      } -    header(f, "END", type); +    print_pem_stamp(f, "END", type);      return 0;  } @@ -194,7 +120,7 @@ hx509_pem_write(hx509_context context, const char *type,   */  int -hx509_pem_add_header(hx509_pem_header **headers,  +hx509_pem_add_header(hx509_pem_header **headers,  		     const char *header, const char *value)  {      hx509_pem_header *h; @@ -255,7 +181,7 @@ hx509_pem_find_header(const hx509_pem_header *h, const char *header)  int  hx509_pem_read(hx509_context context, -	       FILE *f,  +	       FILE *f,  	       hx509_pem_read_func func,  	       void *ctx)  { @@ -285,7 +211,7 @@ hx509_pem_read(hx509_context context,  	    if (i > 0)  		i--;  	} -	     +  	switch (where) {  	case BEFORE:  	    if (strncmp("-----BEGIN ", buf, 11) == 0) { @@ -334,7 +260,7 @@ hx509_pem_read(hx509_context context,  		free(p);  		goto out;  	    } -	     +  	    data = erealloc(data, len + i);  	    memcpy(((char *)data) + len, p, i);  	    free(p); | 
