diff options
Diffstat (limited to 'thirdparty/mbedtls/library/entropy_poll.c')
| -rw-r--r-- | thirdparty/mbedtls/library/entropy_poll.c | 108 | 
1 files changed, 69 insertions, 39 deletions
| diff --git a/thirdparty/mbedtls/library/entropy_poll.c b/thirdparty/mbedtls/library/entropy_poll.c index 2095a7dd34..40f23fd2a6 100644 --- a/thirdparty/mbedtls/library/entropy_poll.c +++ b/thirdparty/mbedtls/library/entropy_poll.c @@ -2,13 +2,7 @@   *  Platform-specific and custom entropy polling functions   *   *  Copyright The Mbed TLS Contributors - *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later - * - *  This file is provided under the Apache License 2.0, or the - *  GNU General Public License v2.0 or later. - * - *  ********** - *  Apache License 2.0: + *  SPDX-License-Identifier: Apache-2.0   *   *  Licensed under the Apache License, Version 2.0 (the "License"); you may   *  not use this file except in compliance with the License. @@ -21,27 +15,6 @@   *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   *  See the License for the specific language governing permissions and   *  limitations under the License. - * - *  ********** - * - *  ********** - *  GNU General Public License v2.0 or later: - * - *  This program is free software; you can redistribute it and/or modify - *  it under the terms of the GNU General Public License as published by - *  the Free Software Foundation; either version 2 of the License, or - *  (at your option) any later version. - * - *  This program is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU General Public License for more details. - * - *  You should have received a copy of the GNU General Public License along - *  with this program; if not, write to the Free Software Foundation, Inc., - *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - *  **********   */  #if defined(__linux__) && !defined(_GNU_SOURCE) @@ -49,11 +22,7 @@  #define _GNU_SOURCE  #endif -#if !defined(MBEDTLS_CONFIG_FILE) -#include "mbedtls/config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif +#include "common.h"  #include <string.h> @@ -61,6 +30,7 @@  #include "mbedtls/entropy.h"  #include "mbedtls/entropy_poll.h" +#include "mbedtls/error.h"  #if defined(MBEDTLS_TIMING_C)  #include "mbedtls/timing.h" @@ -76,7 +46,7 @@  #if !defined(unix) && !defined(__unix__) && !defined(__unix) && \      !defined(__APPLE__) && !defined(_WIN32) && !defined(__QNXNTO__) && \ -    !defined(__HAIKU__) +    !defined(__HAIKU__) && !defined(__midipix__)  #error "Platform entropy sources only work on Unix and Windows, see MBEDTLS_NO_PLATFORM_ENTROPY in config.h"  #endif @@ -134,7 +104,7 @@ int mbedtls_platform_entropy_poll( void *data, unsigned char *output, size_t len   * Since there is no wrapper in the libc yet, use the generic syscall wrapper   * available in GNU libc and compatible libc's (eg uClibc).   */ -#if defined(__linux__) && defined(__GLIBC__) +#if ((defined(__linux__) && defined(__GLIBC__)) || defined(__midipix__))  #include <unistd.h>  #include <sys/syscall.h>  #if defined(SYS_getrandom) @@ -152,7 +122,57 @@ static int getrandom_wrapper( void *buf, size_t buflen, unsigned int flags )      return( syscall( SYS_getrandom, buf, buflen, flags ) );  }  #endif /* SYS_getrandom */ -#endif /* __linux__ */ +#endif /* __linux__ || __midipix__ */ + +#if defined(__FreeBSD__) || defined(__DragonFly__) +#include <sys/param.h> +#if (defined(__FreeBSD__) && __FreeBSD_version >= 1200000) || \ +    (defined(__DragonFly__) && __DragonFly_version >= 500700) +#include <errno.h> +#include <sys/random.h> +#define HAVE_GETRANDOM +static int getrandom_wrapper( void *buf, size_t buflen, unsigned int flags ) +{ +    return getrandom( buf, buflen, flags ); +} +#endif /* (__FreeBSD__ && __FreeBSD_version >= 1200000) || +          (__DragonFly__ && __DragonFly_version >= 500700) */ +#endif /* __FreeBSD__ || __DragonFly__ */ + +/* + * Some BSD systems provide KERN_ARND. + * This is equivalent to reading from /dev/urandom, only it doesn't require an + * open file descriptor, and provides up to 256 bytes per call (basically the + * same as getentropy(), but with a longer history). + * + * Documentation: https://netbsd.gw.com/cgi-bin/man-cgi?sysctl+7 + */ +#if (defined(__FreeBSD__) || defined(__NetBSD__)) && !defined(HAVE_GETRANDOM) +#include <sys/param.h> +#include <sys/sysctl.h> +#if defined(KERN_ARND) +#define HAVE_SYSCTL_ARND + +static int sysctl_arnd_wrapper( unsigned char *buf, size_t buflen ) +{ +    int name[2]; +    size_t len; + +    name[0] = CTL_KERN; +    name[1] = KERN_ARND; + +    while( buflen > 0 ) +    { +        len = buflen > 256 ? 256 : buflen; +        if( sysctl(name, 2, buf, &len, NULL, 0) == -1 ) +            return( -1 ); +        buflen -= len; +        buf += len; +    } +    return( 0 ); +} +#endif /* KERN_ARND */ +#endif /* __FreeBSD__ || __NetBSD__ */  #include <stdio.h> @@ -161,7 +181,7 @@ int mbedtls_platform_entropy_poll( void *data,  {      FILE *file;      size_t read_len; -    int ret; +    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;      ((void) data);  #if defined(HAVE_GETRANDOM) @@ -178,6 +198,15 @@ int mbedtls_platform_entropy_poll( void *data,      ((void) ret);  #endif /* HAVE_GETRANDOM */ +#if defined(HAVE_SYSCTL_ARND) +    ((void) file); +    ((void) read_len); +    if( sysctl_arnd_wrapper( output, len ) == -1 ) +        return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED ); +    *olen = len; +    return( 0 ); +#else +      *olen = 0;      file = fopen( "/dev/urandom", "rb" ); @@ -195,6 +224,7 @@ int mbedtls_platform_entropy_poll( void *data,      *olen = len;      return( 0 ); +#endif /* HAVE_SYSCTL_ARND */  }  #endif /* _WIN32 && !EFIX64 && !EFI32 */  #endif /* !MBEDTLS_NO_PLATFORM_ENTROPY */ @@ -205,13 +235,13 @@ int mbedtls_null_entropy_poll( void *data,  {      ((void) data);      ((void) output); -    *olen = 0; +    *olen = 0;      if( len < sizeof(unsigned char) )          return( 0 ); +    output[0] = 0;      *olen = sizeof(unsigned char); -      return( 0 );  }  #endif |