2011-12-03 22:45:14 +01:00
|
|
|
/*
|
|
|
|
* Platform-specific and custom entropy polling functions
|
|
|
|
*
|
2020-08-19 16:37:36 +02:00
|
|
|
* Copyright The Mbed TLS Contributors
|
Update license headers to Apache-2.0 OR GPL-2.0-or-later
This will allow us to ship the LTS branches in a single archive
This commit was generated using the following script:
# ========================
#!/bin/sh
header1='\ * 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:\
*\
* Licensed under the Apache License, Version 2.0 (the "License"); you may\
* not use this file except in compliance with the License.\
* You may obtain a copy of the License at\
*\
* http://www.apache.org/licenses/LICENSE-2.0\
*\
* Unless required by applicable law or agreed to in writing, software\
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT\
* 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.\
*\
* **********'
find -path './.git' -prune -o '(' -name '*.c' -o -name '*.cpp' -o -name '*.fmt' -o -name '*.h' ')' -print | xargs sed -i "
# Normalize the first line of the copyright headers (no text on the first line of a block comment)
/^\/\*.*Copyright.*Arm/I s/\/\*/&\n */
# Insert new copyright header
/SPDX-License-Identifier/ i\
$header1
# Delete old copyright header
/SPDX-License-Identifier/,$ {
# Delete lines until the one preceding the mbedtls declaration
N
1,/This file is part of/ {
/This file is part of/! D
}
}
"
# Format copyright header for inclusion into scripts
header2=$(echo "$header1" | sed 's/^\\\? \* \?/#/')
find -path './.git' -prune -o '(' -name '*.gdb' -o -name '*.pl' -o -name '*.py' -o -name '*.sh' ')' -print | xargs sed -i "
# Insert new copyright header
/SPDX-License-Identifier/ i\
$header2
# Delete old copyright header
/SPDX-License-Identifier/,$ {
# Delete lines until the one preceding the mbedtls declaration
N
1,/This file is part of/ {
/This file is part of/! D
}
}
"
# ========================
Signed-off-by: Bence Szépkúti <bence.szepkuti@arm.com>
2020-06-05 13:02:18 +02:00
|
|
|
* 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:
|
2011-12-03 22:45:14 +01:00
|
|
|
*
|
2015-09-04 14:21:07 +02:00
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
|
|
* not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
2011-12-03 22:45:14 +01:00
|
|
|
*
|
2015-09-04 14:21:07 +02:00
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
2011-12-03 22:45:14 +01:00
|
|
|
*
|
2015-09-04 14:21:07 +02:00
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
|
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
2011-12-03 22:45:14 +01:00
|
|
|
*
|
Update license headers to Apache-2.0 OR GPL-2.0-or-later
This will allow us to ship the LTS branches in a single archive
This commit was generated using the following script:
# ========================
#!/bin/sh
header1='\ * 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:\
*\
* Licensed under the Apache License, Version 2.0 (the "License"); you may\
* not use this file except in compliance with the License.\
* You may obtain a copy of the License at\
*\
* http://www.apache.org/licenses/LICENSE-2.0\
*\
* Unless required by applicable law or agreed to in writing, software\
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT\
* 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.\
*\
* **********'
find -path './.git' -prune -o '(' -name '*.c' -o -name '*.cpp' -o -name '*.fmt' -o -name '*.h' ')' -print | xargs sed -i "
# Normalize the first line of the copyright headers (no text on the first line of a block comment)
/^\/\*.*Copyright.*Arm/I s/\/\*/&\n */
# Insert new copyright header
/SPDX-License-Identifier/ i\
$header1
# Delete old copyright header
/SPDX-License-Identifier/,$ {
# Delete lines until the one preceding the mbedtls declaration
N
1,/This file is part of/ {
/This file is part of/! D
}
}
"
# Format copyright header for inclusion into scripts
header2=$(echo "$header1" | sed 's/^\\\? \* \?/#/')
find -path './.git' -prune -o '(' -name '*.gdb' -o -name '*.pl' -o -name '*.py' -o -name '*.sh' ')' -print | xargs sed -i "
# Insert new copyright header
/SPDX-License-Identifier/ i\
$header2
# Delete old copyright header
/SPDX-License-Identifier/,$ {
# Delete lines until the one preceding the mbedtls declaration
N
1,/This file is part of/ {
/This file is part of/! D
}
}
"
# ========================
Signed-off-by: Bence Szépkúti <bence.szepkuti@arm.com>
2020-06-05 13:02:18 +02:00
|
|
|
* **********
|
|
|
|
*
|
|
|
|
* **********
|
|
|
|
* 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.
|
|
|
|
*
|
|
|
|
* **********
|
2011-12-03 22:45:14 +01:00
|
|
|
*/
|
|
|
|
|
2017-12-05 13:08:15 +01:00
|
|
|
#if defined(__linux__)
|
|
|
|
/* Ensure that syscall() is available even when compiling with -std=c99 */
|
|
|
|
#define _GNU_SOURCE
|
|
|
|
#endif
|
|
|
|
|
2015-04-08 12:49:31 +02:00
|
|
|
#if !defined(MBEDTLS_CONFIG_FILE)
|
2015-03-09 18:05:11 +01:00
|
|
|
#include "mbedtls/config.h"
|
2014-04-29 12:39:06 +02:00
|
|
|
#else
|
2015-04-08 12:49:31 +02:00
|
|
|
#include MBEDTLS_CONFIG_FILE
|
2014-04-29 12:39:06 +02:00
|
|
|
#endif
|
2011-12-03 22:45:14 +01:00
|
|
|
|
2018-06-01 14:38:45 +02:00
|
|
|
#include <string.h>
|
|
|
|
|
2015-04-08 12:49:31 +02:00
|
|
|
#if defined(MBEDTLS_ENTROPY_C)
|
2011-12-03 22:45:14 +01:00
|
|
|
|
2015-03-09 18:05:11 +01:00
|
|
|
#include "mbedtls/entropy.h"
|
|
|
|
#include "mbedtls/entropy_poll.h"
|
2011-12-03 22:45:14 +01:00
|
|
|
|
2015-04-08 12:49:31 +02:00
|
|
|
#if defined(MBEDTLS_TIMING_C)
|
2015-03-09 18:05:11 +01:00
|
|
|
#include "mbedtls/timing.h"
|
2011-12-03 22:45:14 +01:00
|
|
|
#endif
|
2015-04-08 12:49:31 +02:00
|
|
|
#if defined(MBEDTLS_HAVEGE_C)
|
2015-03-09 18:05:11 +01:00
|
|
|
#include "mbedtls/havege.h"
|
2011-12-03 22:45:14 +01:00
|
|
|
#endif
|
2016-06-01 12:29:42 +02:00
|
|
|
#if defined(MBEDTLS_ENTROPY_NV_SEED)
|
|
|
|
#include "mbedtls/platform.h"
|
|
|
|
#endif
|
2011-12-03 22:45:14 +01:00
|
|
|
|
2015-04-08 12:49:31 +02:00
|
|
|
#if !defined(MBEDTLS_NO_PLATFORM_ENTROPY)
|
2016-02-22 10:33:34 +01:00
|
|
|
|
|
|
|
#if !defined(unix) && !defined(__unix__) && !defined(__unix) && \
|
2018-04-12 02:27:32 +02:00
|
|
|
!defined(__APPLE__) && !defined(_WIN32) && !defined(__QNXNTO__) && \
|
|
|
|
!defined(__HAIKU__)
|
2016-02-22 10:33:34 +01:00
|
|
|
#error "Platform entropy sources only work on Unix and Windows, see MBEDTLS_NO_PLATFORM_ENTROPY in config.h"
|
|
|
|
#endif
|
|
|
|
|
2013-10-28 18:48:30 +01:00
|
|
|
#if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32)
|
2011-12-03 22:45:14 +01:00
|
|
|
|
|
|
|
#if !defined(_WIN32_WINNT)
|
|
|
|
#define _WIN32_WINNT 0x0400
|
|
|
|
#endif
|
2012-11-02 12:06:08 +01:00
|
|
|
#include <windows.h>
|
2011-12-03 22:45:14 +01:00
|
|
|
#include <wincrypt.h>
|
|
|
|
|
2015-04-08 12:49:31 +02:00
|
|
|
int mbedtls_platform_entropy_poll( void *data, unsigned char *output, size_t len,
|
2011-12-03 22:45:14 +01:00
|
|
|
size_t *olen )
|
|
|
|
{
|
|
|
|
HCRYPTPROV provider;
|
2011-12-05 14:54:00 +01:00
|
|
|
((void) data);
|
2011-12-03 22:45:14 +01:00
|
|
|
*olen = 0;
|
|
|
|
|
|
|
|
if( CryptAcquireContext( &provider, NULL, NULL,
|
|
|
|
PROV_RSA_FULL, CRYPT_VERIFYCONTEXT ) == FALSE )
|
|
|
|
{
|
2015-04-08 12:49:31 +02:00
|
|
|
return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
|
2011-12-03 22:45:14 +01:00
|
|
|
}
|
|
|
|
|
2013-10-11 18:58:55 +02:00
|
|
|
if( CryptGenRandom( provider, (DWORD) len, output ) == FALSE )
|
2016-01-26 11:39:26 +01:00
|
|
|
{
|
|
|
|
CryptReleaseContext( provider, 0 );
|
2015-04-08 12:49:31 +02:00
|
|
|
return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
|
2016-01-26 11:39:26 +01:00
|
|
|
}
|
2011-12-03 22:45:14 +01:00
|
|
|
|
|
|
|
CryptReleaseContext( provider, 0 );
|
|
|
|
*olen = len;
|
|
|
|
|
|
|
|
return( 0 );
|
|
|
|
}
|
2014-05-01 13:03:14 +02:00
|
|
|
#else /* _WIN32 && !EFIX64 && !EFI32 */
|
2011-12-03 22:45:14 +01:00
|
|
|
|
2015-01-09 14:34:13 +01:00
|
|
|
/*
|
|
|
|
* Test for Linux getrandom() support.
|
|
|
|
* 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__)
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <sys/syscall.h>
|
|
|
|
#if defined(SYS_getrandom)
|
|
|
|
#define HAVE_GETRANDOM
|
Entropy: Fall through to /dev/random if getrandom() syscall unknown
This commit fixes issue #1212 related to platform-specific entropy
polling in an syscall-emulated environment.
Previously, the implementation of the entropy gathering function
`mbedtls_platform_entropy_poll()` for linux machines used the
following logic to determine how to obtain entropy from the kernel:
1. If the getrandom() system call identifier SYS_getrandom is present and
the kernel version is 3.17 or higher, use syscall( SYS_getrandom, ... )
2. Otherwise, fall back to reading from /dev/random.
There are two issues with this:
1. Portability:
When cross-compiling the code for a different
architecture and running it through system call
emulation in qemu, qemu reports the host kernel
version through uname but, as of v.2.5.0,
doesn't support emulating the getrandom() syscall.
This leads to `mbedtls_platform_entropy_poll()`
failing even though reading from /dev/random would
have worked.
2. Style:
Extracting the linux kernel version from
the output of `uname` is slightly tedious.
This commit fixes both by implementing the suggestion in #1212:
- It removes the kernel-version detection through uname().
- Instead, it checks whether `syscall( SYS_getrandom, ... )`
fails with errno set to ENOSYS indicating an unknown system call.
If so, it falls through to trying to read from /dev/random.
Fixes #1212.
2018-10-18 12:49:25 +02:00
|
|
|
#include <errno.h>
|
2015-06-22 18:06:17 +02:00
|
|
|
|
2015-01-09 14:34:13 +01:00
|
|
|
static int getrandom_wrapper( void *buf, size_t buflen, unsigned int flags )
|
|
|
|
{
|
2015-06-22 18:06:17 +02:00
|
|
|
/* MemSan cannot understand that the syscall writes to the buffer */
|
|
|
|
#if defined(__has_feature)
|
|
|
|
#if __has_feature(memory_sanitizer)
|
|
|
|
memset( buf, 0, buflen );
|
|
|
|
#endif
|
|
|
|
#endif
|
2015-01-09 14:34:13 +01:00
|
|
|
return( syscall( SYS_getrandom, buf, buflen, flags ) );
|
|
|
|
}
|
2015-04-29 14:03:28 +02:00
|
|
|
#endif /* SYS_getrandom */
|
|
|
|
#endif /* __linux__ */
|
2015-01-09 14:34:13 +01:00
|
|
|
|
2011-12-03 22:45:14 +01:00
|
|
|
#include <stdio.h>
|
|
|
|
|
2015-04-08 12:49:31 +02:00
|
|
|
int mbedtls_platform_entropy_poll( void *data,
|
2011-12-03 22:45:14 +01:00
|
|
|
unsigned char *output, size_t len, size_t *olen )
|
|
|
|
{
|
|
|
|
FILE *file;
|
2015-08-27 12:02:40 +02:00
|
|
|
size_t read_len;
|
Entropy: Fall through to /dev/random if getrandom() syscall unknown
This commit fixes issue #1212 related to platform-specific entropy
polling in an syscall-emulated environment.
Previously, the implementation of the entropy gathering function
`mbedtls_platform_entropy_poll()` for linux machines used the
following logic to determine how to obtain entropy from the kernel:
1. If the getrandom() system call identifier SYS_getrandom is present and
the kernel version is 3.17 or higher, use syscall( SYS_getrandom, ... )
2. Otherwise, fall back to reading from /dev/random.
There are two issues with this:
1. Portability:
When cross-compiling the code for a different
architecture and running it through system call
emulation in qemu, qemu reports the host kernel
version through uname but, as of v.2.5.0,
doesn't support emulating the getrandom() syscall.
This leads to `mbedtls_platform_entropy_poll()`
failing even though reading from /dev/random would
have worked.
2. Style:
Extracting the linux kernel version from
the output of `uname` is slightly tedious.
This commit fixes both by implementing the suggestion in #1212:
- It removes the kernel-version detection through uname().
- Instead, it checks whether `syscall( SYS_getrandom, ... )`
fails with errno set to ENOSYS indicating an unknown system call.
If so, it falls through to trying to read from /dev/random.
Fixes #1212.
2018-10-18 12:49:25 +02:00
|
|
|
int ret;
|
2011-12-03 22:45:14 +01:00
|
|
|
((void) data);
|
|
|
|
|
2015-04-29 14:03:28 +02:00
|
|
|
#if defined(HAVE_GETRANDOM)
|
Entropy: Fall through to /dev/random if getrandom() syscall unknown
This commit fixes issue #1212 related to platform-specific entropy
polling in an syscall-emulated environment.
Previously, the implementation of the entropy gathering function
`mbedtls_platform_entropy_poll()` for linux machines used the
following logic to determine how to obtain entropy from the kernel:
1. If the getrandom() system call identifier SYS_getrandom is present and
the kernel version is 3.17 or higher, use syscall( SYS_getrandom, ... )
2. Otherwise, fall back to reading from /dev/random.
There are two issues with this:
1. Portability:
When cross-compiling the code for a different
architecture and running it through system call
emulation in qemu, qemu reports the host kernel
version through uname but, as of v.2.5.0,
doesn't support emulating the getrandom() syscall.
This leads to `mbedtls_platform_entropy_poll()`
failing even though reading from /dev/random would
have worked.
2. Style:
Extracting the linux kernel version from
the output of `uname` is slightly tedious.
This commit fixes both by implementing the suggestion in #1212:
- It removes the kernel-version detection through uname().
- Instead, it checks whether `syscall( SYS_getrandom, ... )`
fails with errno set to ENOSYS indicating an unknown system call.
If so, it falls through to trying to read from /dev/random.
Fixes #1212.
2018-10-18 12:49:25 +02:00
|
|
|
ret = getrandom_wrapper( output, len, 0 );
|
|
|
|
if( ret >= 0 )
|
2015-04-29 14:03:28 +02:00
|
|
|
{
|
|
|
|
*olen = ret;
|
|
|
|
return( 0 );
|
|
|
|
}
|
Entropy: Fall through to /dev/random if getrandom() syscall unknown
This commit fixes issue #1212 related to platform-specific entropy
polling in an syscall-emulated environment.
Previously, the implementation of the entropy gathering function
`mbedtls_platform_entropy_poll()` for linux machines used the
following logic to determine how to obtain entropy from the kernel:
1. If the getrandom() system call identifier SYS_getrandom is present and
the kernel version is 3.17 or higher, use syscall( SYS_getrandom, ... )
2. Otherwise, fall back to reading from /dev/random.
There are two issues with this:
1. Portability:
When cross-compiling the code for a different
architecture and running it through system call
emulation in qemu, qemu reports the host kernel
version through uname but, as of v.2.5.0,
doesn't support emulating the getrandom() syscall.
This leads to `mbedtls_platform_entropy_poll()`
failing even though reading from /dev/random would
have worked.
2. Style:
Extracting the linux kernel version from
the output of `uname` is slightly tedious.
This commit fixes both by implementing the suggestion in #1212:
- It removes the kernel-version detection through uname().
- Instead, it checks whether `syscall( SYS_getrandom, ... )`
fails with errno set to ENOSYS indicating an unknown system call.
If so, it falls through to trying to read from /dev/random.
Fixes #1212.
2018-10-18 12:49:25 +02:00
|
|
|
else if( errno != ENOSYS )
|
|
|
|
return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
|
|
|
|
/* Fall through if the system call isn't known. */
|
|
|
|
#else
|
2018-11-05 12:43:07 +01:00
|
|
|
((void) ret);
|
2015-04-29 14:03:28 +02:00
|
|
|
#endif /* HAVE_GETRANDOM */
|
|
|
|
|
2011-12-03 22:45:14 +01:00
|
|
|
*olen = 0;
|
|
|
|
|
|
|
|
file = fopen( "/dev/urandom", "rb" );
|
|
|
|
if( file == NULL )
|
2015-04-08 12:49:31 +02:00
|
|
|
return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
|
2014-05-01 13:03:14 +02:00
|
|
|
|
2015-08-27 12:02:40 +02:00
|
|
|
read_len = fread( output, 1, len, file );
|
|
|
|
if( read_len != len )
|
2011-12-03 22:45:14 +01:00
|
|
|
{
|
|
|
|
fclose( file );
|
2015-04-08 12:49:31 +02:00
|
|
|
return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
|
2011-12-03 22:45:14 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
fclose( file );
|
|
|
|
*olen = len;
|
|
|
|
|
|
|
|
return( 0 );
|
|
|
|
}
|
2014-05-01 13:03:14 +02:00
|
|
|
#endif /* _WIN32 && !EFIX64 && !EFI32 */
|
2015-04-08 12:49:31 +02:00
|
|
|
#endif /* !MBEDTLS_NO_PLATFORM_ENTROPY */
|
2011-12-03 22:45:14 +01:00
|
|
|
|
2016-06-11 03:31:21 +02:00
|
|
|
#if defined(MBEDTLS_TEST_NULL_ENTROPY)
|
2016-06-12 01:31:33 +02:00
|
|
|
int mbedtls_null_entropy_poll( void *data,
|
2016-06-08 16:29:18 +02:00
|
|
|
unsigned char *output, size_t len, size_t *olen )
|
|
|
|
{
|
|
|
|
((void) data);
|
2016-06-11 03:31:21 +02:00
|
|
|
((void) output);
|
2016-06-08 16:29:18 +02:00
|
|
|
*olen = 0;
|
|
|
|
|
|
|
|
if( len < sizeof(unsigned char) )
|
|
|
|
return( 0 );
|
|
|
|
|
|
|
|
*olen = sizeof(unsigned char);
|
|
|
|
|
|
|
|
return( 0 );
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2015-04-08 12:49:31 +02:00
|
|
|
#if defined(MBEDTLS_TIMING_C)
|
|
|
|
int mbedtls_hardclock_poll( void *data,
|
2011-12-03 22:45:14 +01:00
|
|
|
unsigned char *output, size_t len, size_t *olen )
|
|
|
|
{
|
2015-04-08 12:49:31 +02:00
|
|
|
unsigned long timer = mbedtls_timing_hardclock();
|
2011-12-03 22:45:14 +01:00
|
|
|
((void) data);
|
|
|
|
*olen = 0;
|
|
|
|
|
|
|
|
if( len < sizeof(unsigned long) )
|
|
|
|
return( 0 );
|
|
|
|
|
|
|
|
memcpy( output, &timer, sizeof(unsigned long) );
|
|
|
|
*olen = sizeof(unsigned long);
|
|
|
|
|
|
|
|
return( 0 );
|
|
|
|
}
|
2015-04-08 12:49:31 +02:00
|
|
|
#endif /* MBEDTLS_TIMING_C */
|
2011-12-03 22:45:14 +01:00
|
|
|
|
2015-04-08 12:49:31 +02:00
|
|
|
#if defined(MBEDTLS_HAVEGE_C)
|
|
|
|
int mbedtls_havege_poll( void *data,
|
2011-12-03 22:45:14 +01:00
|
|
|
unsigned char *output, size_t len, size_t *olen )
|
|
|
|
{
|
2015-04-08 12:49:31 +02:00
|
|
|
mbedtls_havege_state *hs = (mbedtls_havege_state *) data;
|
2011-12-03 22:45:14 +01:00
|
|
|
*olen = 0;
|
|
|
|
|
2015-04-08 12:49:31 +02:00
|
|
|
if( mbedtls_havege_random( hs, output, len ) != 0 )
|
|
|
|
return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
|
2011-12-03 22:45:14 +01:00
|
|
|
|
|
|
|
*olen = len;
|
|
|
|
|
|
|
|
return( 0 );
|
|
|
|
}
|
2015-04-08 12:49:31 +02:00
|
|
|
#endif /* MBEDTLS_HAVEGE_C */
|
2011-12-03 22:45:14 +01:00
|
|
|
|
2016-06-01 12:29:42 +02:00
|
|
|
#if defined(MBEDTLS_ENTROPY_NV_SEED)
|
|
|
|
int mbedtls_nv_seed_poll( void *data,
|
|
|
|
unsigned char *output, size_t len, size_t *olen )
|
|
|
|
{
|
|
|
|
unsigned char buf[MBEDTLS_ENTROPY_BLOCK_SIZE];
|
|
|
|
size_t use_len = MBEDTLS_ENTROPY_BLOCK_SIZE;
|
|
|
|
((void) data);
|
|
|
|
|
|
|
|
memset( buf, 0, MBEDTLS_ENTROPY_BLOCK_SIZE );
|
|
|
|
|
|
|
|
if( mbedtls_nv_seed_read( buf, MBEDTLS_ENTROPY_BLOCK_SIZE ) < 0 )
|
|
|
|
return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
|
|
|
|
|
|
|
|
if( len < use_len )
|
|
|
|
use_len = len;
|
|
|
|
|
|
|
|
memcpy( output, buf, use_len );
|
|
|
|
*olen = use_len;
|
|
|
|
|
|
|
|
return( 0 );
|
|
|
|
}
|
|
|
|
#endif /* MBEDTLS_ENTROPY_NV_SEED */
|
|
|
|
|
2015-04-08 12:49:31 +02:00
|
|
|
#endif /* MBEDTLS_ENTROPY_C */
|