/ tools / xmem.c
xmem.c
  1  /*
  2   * Copyright (c) 2016 Thomas Pornin <pornin@bolet.org>
  3   *
  4   * Permission is hereby granted, free of charge, to any person obtaining 
  5   * a copy of this software and associated documentation files (the
  6   * "Software"), to deal in the Software without restriction, including
  7   * without limitation the rights to use, copy, modify, merge, publish,
  8   * distribute, sublicense, and/or sell copies of the Software, and to
  9   * permit persons to whom the Software is furnished to do so, subject to
 10   * the following conditions:
 11   *
 12   * The above copyright notice and this permission notice shall be 
 13   * included in all copies or substantial portions of the Software.
 14   *
 15   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
 16   * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 17   * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
 18   * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
 19   * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 20   * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 21   * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 22   * SOFTWARE.
 23   */
 24  
 25  #include "brssl.h"
 26  
 27  /* see brssl.h */
 28  void *
 29  xmalloc(size_t len)
 30  {
 31  	void *buf;
 32  
 33  	if (len == 0) {
 34  		return NULL;
 35  	}
 36  	buf = malloc(len);
 37  	if (buf == NULL) {
 38  		fprintf(stderr, "ERROR: could not allocate %lu byte(s)\n",
 39  			(unsigned long)len);
 40  		exit(EXIT_FAILURE);
 41  	}
 42  	return buf;
 43  }
 44  
 45  /* see brssl.h */
 46  void
 47  xfree(void *buf)
 48  {
 49  	if (buf != NULL) {
 50  		free(buf);
 51  	}
 52  }
 53  
 54  /* see brssl.h */
 55  void *
 56  xblobdup(const void *src, size_t len)
 57  {
 58  	void *buf;
 59  
 60  	buf = xmalloc(len);
 61  	memcpy(buf, src, len);
 62  	return buf;
 63  }
 64  
 65  /* see brssl.h */
 66  char *
 67  xstrdup(const void *src)
 68  {
 69  	return xblobdup(src, strlen(src) + 1);
 70  }
 71  
 72  /* see brssl.h */
 73  br_x509_pkey *
 74  xpkeydup(const br_x509_pkey *pk)
 75  {
 76  	br_x509_pkey *pk2;
 77  
 78  	pk2 = xmalloc(sizeof *pk2);
 79  	pk2->key_type = pk->key_type;
 80  	switch (pk->key_type) {
 81  	case BR_KEYTYPE_RSA:
 82  		pk2->key.rsa.n = xblobdup(pk->key.rsa.n, pk->key.rsa.nlen);
 83  		pk2->key.rsa.nlen = pk->key.rsa.nlen;
 84  		pk2->key.rsa.e = xblobdup(pk->key.rsa.e, pk->key.rsa.elen);
 85  		pk2->key.rsa.elen = pk->key.rsa.elen;
 86  		break;
 87  	case BR_KEYTYPE_EC:
 88  		pk2->key.ec.curve = pk->key.ec.curve;
 89  		pk2->key.ec.q = xblobdup(pk->key.ec.q, pk->key.ec.qlen);
 90  		pk2->key.ec.qlen = pk->key.ec.qlen;
 91  		break;
 92  	default:
 93  		fprintf(stderr, "Unknown public key type: %u\n",
 94  			(unsigned)pk->key_type);
 95  		exit(EXIT_FAILURE);
 96  	}
 97  	return pk2;
 98  }
 99  
100  /* see brssl.h */
101  void
102  xfreepkey(br_x509_pkey *pk)
103  {
104  	if (pk != NULL) {
105  		switch (pk->key_type) {
106  		case BR_KEYTYPE_RSA:
107  			xfree(pk->key.rsa.n);
108  			xfree(pk->key.rsa.e);
109  			break;
110  		case BR_KEYTYPE_EC:
111  			xfree(pk->key.ec.q);
112  			break;
113  		default:
114  			fprintf(stderr, "Unknown public key type: %u\n",
115  				(unsigned)pk->key_type);
116  			exit(EXIT_FAILURE);
117  		}
118  		xfree(pk);
119  	}
120  }