2 * Copyright 2003-2016 The OpenSSL Project Authors. All Rights Reserved.
4 * 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
13 #include <openssl/crypto.h>
14 #include "internal/cryptlib.h"
15 #include "internal/o_str.h"
17 int OPENSSL_memcmp(const void *v1
, const void *v2
, size_t n
)
19 const unsigned char *c1
= v1
, *c2
= v2
;
22 while (n
&& (ret
= *c1
- *c2
) == 0)
28 char *CRYPTO_strdup(const char *str
, const char* file
, int line
)
35 size
= strlen(str
) + 1;
36 ret
= CRYPTO_malloc(size
, file
, line
);
38 memcpy(ret
, str
, size
);
42 char *CRYPTO_strndup(const char *str
, size_t s
, const char* file
, int line
)
50 maxlen
= OPENSSL_strnlen(str
, s
);
52 ret
= CRYPTO_malloc(maxlen
+ 1, file
, line
);
54 memcpy(ret
, str
, maxlen
);
60 void *CRYPTO_memdup(const void *data
, size_t siz
, const char* file
, int line
)
64 if (data
== NULL
|| siz
>= INT_MAX
)
67 ret
= CRYPTO_malloc(siz
, file
, line
);
69 CRYPTOerr(CRYPTO_F_CRYPTO_MEMDUP
, ERR_R_MALLOC_FAILURE
);
72 return memcpy(ret
, data
, siz
);
75 size_t OPENSSL_strnlen(const char *str
, size_t maxlen
)
79 for (p
= str
; maxlen
-- != 0 && *p
!= '\0'; ++p
) ;
84 size_t OPENSSL_strlcpy(char *dst
, const char *src
, size_t size
)
87 for (; size
> 1 && *src
; size
--) {
93 return l
+ strlen(src
);
96 size_t OPENSSL_strlcat(char *dst
, const char *src
, size_t size
)
99 for (; size
> 0 && *dst
; size
--, dst
++)
101 return l
+ OPENSSL_strlcpy(dst
, src
, size
);
104 int OPENSSL_hexchar2int(unsigned char c
)
106 #ifdef CHARSET_EBCDIC
148 * Give a string of hex digits convert to a buffer
150 unsigned char *OPENSSL_hexstr2buf(const char *str
, long *len
)
152 unsigned char *hexbuf
, *q
;
153 unsigned char ch
, cl
;
155 const unsigned char *p
;
159 if ((hexbuf
= OPENSSL_malloc(s
>> 1)) == NULL
) {
160 CRYPTOerr(CRYPTO_F_OPENSSL_HEXSTR2BUF
, ERR_R_MALLOC_FAILURE
);
163 for (p
= (const unsigned char *)str
, q
= hexbuf
; *p
; ) {
169 CRYPTOerr(CRYPTO_F_OPENSSL_HEXSTR2BUF
,
170 CRYPTO_R_ODD_NUMBER_OF_DIGITS
);
171 OPENSSL_free(hexbuf
);
174 cli
= OPENSSL_hexchar2int(cl
);
175 chi
= OPENSSL_hexchar2int(ch
);
176 if (cli
< 0 || chi
< 0) {
177 OPENSSL_free(hexbuf
);
178 CRYPTOerr(CRYPTO_F_OPENSSL_HEXSTR2BUF
, CRYPTO_R_ILLEGAL_HEX_DIGIT
);
181 *q
++ = (unsigned char)((chi
<< 4) | cli
);
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)
194 char *OPENSSL_buf2hexstr(const unsigned char *buffer
, long len
)
196 static const char hexdig
[] = "0123456789ABCDEF";
198 const unsigned char *p
;
203 return OPENSSL_zalloc(1);
206 if ((tmp
= OPENSSL_malloc(len
* 3)) == NULL
) {
207 CRYPTOerr(CRYPTO_F_OPENSSL_BUF2HEXSTR
, ERR_R_MALLOC_FAILURE
);
211 for (i
= 0, p
= buffer
; i
< len
; i
++, p
++) {
212 *q
++ = hexdig
[(*p
>> 4) & 0xf];
213 *q
++ = hexdig
[*p
& 0xf];
217 #ifdef CHARSET_EBCDIC
218 ebcdic2ascii(tmp
, tmp
, q
- tmp
- 1);
224 int openssl_strerror_r(int errnum
, char *buf
, size_t buflen
)
226 #if defined(_MSC_VER) && _MSC_VER>=1400
227 return !strerror_s(buf
, buflen
, errnum
);
228 #elif defined(_GNU_SOURCE)
229 return strerror_r(errnum
, buf
, buflen
) != NULL
;
230 #elif (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112L) || \
231 (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE >= 600)
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
237 return !strerror_r(errnum
, buf
, buflen
);
240 /* Fall back to non-thread safe strerror()...its all we can do */
243 err
= strerror(errnum
);
244 /* Can this ever happen? */
247 strncpy(buf
, err
, buflen
- 1);
248 buf
[buflen
- 1] = '\0';