blob: 528655aa8ce8a8529819ee3080387104cf852f92 [file] [log] [blame]
Matt Caswell0f113f32015-01-22 03:40:55 +00001/*
Rich Salz62867572016-05-17 14:24:46 -04002 * Copyright 2003-2016 The OpenSSL Project Authors. All Rights Reserved.
Richard Levittee6fa67f2003-09-09 14:48:36 +00003 *
Rich Salz62867572016-05-17 14:24:46 -04004 * Licensed under the OpenSSL license (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
Richard Levittee6fa67f2003-09-09 14:48:36 +00008 */
9
Richard Levitte8ee18dd2004-03-24 09:40:23 +000010#include <ctype.h>
Rich Salz7644a9a2015-12-16 16:12:24 -050011#include <limits.h>
Andy Polyakov3b4de6e2004-12-31 00:00:05 +000012#include <e_os.h>
Rich Salz7644a9a2015-12-16 16:12:24 -050013#include <openssl/crypto.h>
14#include "internal/cryptlib.h"
Richard Levitte68570792015-05-14 14:54:49 +020015#include "internal/o_str.h"
Richard Levittee6fa67f2003-09-09 14:48:36 +000016
Matt Caswell0f113f32015-01-22 03:40:55 +000017int OPENSSL_memcmp(const void *v1, const void *v2, size_t n)
18{
19 const unsigned char *c1 = v1, *c2 = v2;
20 int ret = 0;
Andy Polyakov7a060502005-09-20 20:19:07 +000021
Matt Caswell0f113f32015-01-22 03:40:55 +000022 while (n && (ret = *c1 - *c2) == 0)
23 n--, c1++, c2++;
Andy Polyakov7a060502005-09-20 20:19:07 +000024
Matt Caswell0f113f32015-01-22 03:40:55 +000025 return ret;
26}
Rich Salz7644a9a2015-12-16 16:12:24 -050027
28char *CRYPTO_strdup(const char *str, const char* file, int line)
29{
30 char *ret;
Dmitry-Mea89c9a02016-02-03 17:34:14 +030031 size_t size;
Rich Salz7644a9a2015-12-16 16:12:24 -050032
33 if (str == NULL)
34 return NULL;
Dmitry-Mea89c9a02016-02-03 17:34:14 +030035 size = strlen(str) + 1;
36 ret = CRYPTO_malloc(size, file, line);
Rich Salz7644a9a2015-12-16 16:12:24 -050037 if (ret != NULL)
Dmitry-Mea89c9a02016-02-03 17:34:14 +030038 memcpy(ret, str, size);
Rich Salz7644a9a2015-12-16 16:12:24 -050039 return ret;
40}
41
42char *CRYPTO_strndup(const char *str, size_t s, const char* file, int line)
43{
Rich Salz7644a9a2015-12-16 16:12:24 -050044 size_t maxlen;
45 char *ret;
46
47 if (str == NULL)
48 return NULL;
49
Matt Caswellb6e78582016-02-26 16:50:59 +000050 maxlen = OPENSSL_strnlen(str, s);
Rich Salz7644a9a2015-12-16 16:12:24 -050051
52 ret = CRYPTO_malloc(maxlen + 1, file, line);
53 if (ret) {
54 memcpy(ret, str, maxlen);
55 ret[maxlen] = '\0';
56 }
57 return ret;
58}
59
60void *CRYPTO_memdup(const void *data, size_t siz, const char* file, int line)
61{
62 void *ret;
63
64 if (data == NULL || siz >= INT_MAX)
65 return NULL;
66
67 ret = CRYPTO_malloc(siz, file, line);
68 if (ret == NULL) {
69 CRYPTOerr(CRYPTO_F_CRYPTO_MEMDUP, ERR_R_MALLOC_FAILURE);
70 return NULL;
71 }
72 return memcpy(ret, data, siz);
73}
74
75size_t OPENSSL_strnlen(const char *str, size_t maxlen)
76{
77 const char *p;
78
79 for (p = str; maxlen-- != 0 && *p != '\0'; ++p) ;
80
81 return p - str;
82}
83
84size_t OPENSSL_strlcpy(char *dst, const char *src, size_t size)
85{
86 size_t l = 0;
87 for (; size > 1 && *src; size--) {
88 *dst++ = *src++;
89 l++;
90 }
91 if (size)
92 *dst = '\0';
93 return l + strlen(src);
94}
95
96size_t OPENSSL_strlcat(char *dst, const char *src, size_t size)
97{
98 size_t l = 0;
99 for (; size > 0 && *dst; size--, dst++)
100 l++;
101 return l + OPENSSL_strlcpy(dst, src, size);
102}
Rich Salz14f051a2016-04-13 15:58:28 -0400103
104int OPENSSL_hexchar2int(unsigned char c)
105{
106#ifdef CHARSET_EBCDIC
107 c = os_toebcdic[c];
108#endif
109
110 switch (c) {
111 case '0':
112 return 0;
113 case '1':
114 return 1;
115 case '2':
116 return 2;
117 case '3':
118 return 3;
119 case '4':
120 return 4;
121 case '5':
122 return 5;
123 case '6':
124 return 6;
125 case '7':
126 return 7;
127 case '8':
128 return 8;
129 case '9':
130 return 9;
131 case 'a': case 'A':
132 return 0x0A;
133 case 'b': case 'B':
134 return 0x0B;
135 case 'c': case 'C':
136 return 0x0C;
137 case 'd': case 'D':
138 return 0x0D;
139 case 'e': case 'E':
140 return 0x0E;
141 case 'f': case 'F':
142 return 0x0F;
143 }
144 return -1;
145}
146
147/*
148 * Give a string of hex digits convert to a buffer
149 */
150unsigned char *OPENSSL_hexstr2buf(const char *str, long *len)
151{
152 unsigned char *hexbuf, *q;
153 unsigned char ch, cl;
Matt Caswell235f9322016-04-18 15:12:58 +0100154 int chi, cli;
Rich Salz14f051a2016-04-13 15:58:28 -0400155 const unsigned char *p;
156 size_t s;
157
158 s = strlen(str);
159 if ((hexbuf = OPENSSL_malloc(s >> 1)) == NULL) {
160 CRYPTOerr(CRYPTO_F_OPENSSL_HEXSTR2BUF, ERR_R_MALLOC_FAILURE);
161 return NULL;
162 }
163 for (p = (const unsigned char *)str, q = hexbuf; *p; ) {
164 ch = *p++;
165 if (ch == ':')
166 continue;
167 cl = *p++;
168 if (!cl) {
169 CRYPTOerr(CRYPTO_F_OPENSSL_HEXSTR2BUF,
170 CRYPTO_R_ODD_NUMBER_OF_DIGITS);
171 OPENSSL_free(hexbuf);
172 return NULL;
173 }
Matt Caswell235f9322016-04-18 15:12:58 +0100174 cli = OPENSSL_hexchar2int(cl);
175 chi = OPENSSL_hexchar2int(ch);
176 if (cli < 0 || chi < 0) {
Rich Salz14f051a2016-04-13 15:58:28 -0400177 OPENSSL_free(hexbuf);
178 CRYPTOerr(CRYPTO_F_OPENSSL_HEXSTR2BUF, CRYPTO_R_ILLEGAL_HEX_DIGIT);
179 return NULL;
180 }
Matt Caswell235f9322016-04-18 15:12:58 +0100181 *q++ = (unsigned char)((chi << 4) | cli);
Rich Salz14f051a2016-04-13 15:58:28 -0400182 }
183
184 if (len)
185 *len = q - hexbuf;
186 return hexbuf;
187}
188
189/*
190 * Given a buffer of length 'len' return a OPENSSL_malloc'ed string with its
191 * hex representation @@@ (Contents of buffer are always kept in ASCII, also
192 * on EBCDIC machines)
193 */
194char *OPENSSL_buf2hexstr(const unsigned char *buffer, long len)
195{
Benjamin Kadukf44903a2017-04-14 11:53:04 -0500196 static const char hexdig[] = "0123456789ABCDEF";
Rich Salz14f051a2016-04-13 15:58:28 -0400197 char *tmp, *q;
198 const unsigned char *p;
199 int i;
200
Kurt Roeckx01238ae2016-06-19 14:16:16 +0200201 if (len == 0)
202 {
203 return OPENSSL_zalloc(1);
204 }
205
206 if ((tmp = OPENSSL_malloc(len * 3)) == NULL) {
Rich Salz14f051a2016-04-13 15:58:28 -0400207 CRYPTOerr(CRYPTO_F_OPENSSL_BUF2HEXSTR, ERR_R_MALLOC_FAILURE);
208 return NULL;
209 }
210 q = tmp;
211 for (i = 0, p = buffer; i < len; i++, p++) {
212 *q++ = hexdig[(*p >> 4) & 0xf];
213 *q++ = hexdig[*p & 0xf];
214 *q++ = ':';
215 }
216 q[-1] = 0;
217#ifdef CHARSET_EBCDIC
218 ebcdic2ascii(tmp, tmp, q - tmp - 1);
219#endif
220
221 return tmp;
222}
Matt Caswell7d378182016-05-23 13:52:29 +0100223
224int openssl_strerror_r(int errnum, char *buf, size_t buflen)
225{
Andy Polyakov43c41162016-05-26 23:00:21 +0200226#if defined(_MSC_VER) && _MSC_VER>=1400
227 return !strerror_s(buf, buflen, errnum);
Andy Polyakovefdb2d62016-05-27 12:04:09 +0200228#elif defined(_GNU_SOURCE)
229 return strerror_r(errnum, buf, buflen) != NULL;
Bernd Edlinger01b76c22017-02-23 14:52:23 +0100230#elif (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112L) || \
231 (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE >= 600)
Matt Caswell7d378182016-05-23 13:52:29 +0100232 /*
233 * We can use "real" strerror_r. The OpenSSL version differs in that it
234 * gives 1 on success and 0 on failure for consistency with other OpenSSL
235 * functions. Real strerror_r does it the other way around
236 */
237 return !strerror_r(errnum, buf, buflen);
238#else
239 char *err;
240 /* Fall back to non-thread safe strerror()...its all we can do */
241 if (buflen < 2)
242 return 0;
243 err = strerror(errnum);
244 /* Can this ever happen? */
245 if (err == NULL)
246 return 0;
247 strncpy(buf, err, buflen - 1);
248 buf[buflen - 1] = '\0';
249 return 1;
250#endif
251}