diff options
author | Mounir IDRASSI <mounir.idrassi@idrix.fr> | 2019-02-12 18:49:12 +0100 |
---|---|---|
committer | Mounir IDRASSI <mounir.idrassi@idrix.fr> | 2019-02-12 19:06:14 +0100 |
commit | 86f0fde6e7914f055c5872bf7f2f565cc09977fc (patch) | |
tree | fea427f46509ccaa1cb77ec233cb2ab41157576e /src/Crypto/jitterentropy-base-user.h | |
parent | a5943c07fbc2754e0785cfa3d4645e96ae87b405 (diff) | |
download | VeraCrypt-86f0fde6e7914f055c5872bf7f2f565cc09977fc.tar.gz VeraCrypt-86f0fde6e7914f055c5872bf7f2f565cc09977fc.zip |
Windows: Use Hardware RNG based on CPU timing jitter "Jitterentropy" by Stephan Mueller as a good alternative to RDRAND (http://www.chronox.de/jent.html, smueller@chronox.de)
Diffstat (limited to 'src/Crypto/jitterentropy-base-user.h')
-rw-r--r-- | src/Crypto/jitterentropy-base-user.h | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/src/Crypto/jitterentropy-base-user.h b/src/Crypto/jitterentropy-base-user.h new file mode 100644 index 00000000..cbb2f47e --- /dev/null +++ b/src/Crypto/jitterentropy-base-user.h @@ -0,0 +1,136 @@ +/* + * Non-physical true random number generator based on timing jitter. + * + * Copyright Stephan Mueller <smueller@chronox.de>, 2013 + * + * License + * ======= + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, and the entire permission notice in its entirety, + * including the disclaimer of warranties. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * ALTERNATIVELY, this product may be distributed under the terms of + * the GNU General Public License, in which case the provisions of the GPL are + * required INSTEAD OF the above restrictions. (This clause is + * necessary due to a potential bad interaction between the GPL and + * the restrictions contained in a BSD-style copyright.) + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF + * WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + e USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ + +/* Adapted for VeraCrypt */ + +#pragma once + +#include "Common/Tcdefs.h" +#include "misc.h" +#include "cpu.h" +#include <stdlib.h> +#include <string.h> + +typedef uint64 __u64; + +#ifdef _MSC_VER + +typedef uint64 uint64_t; +typedef int64 int64_t; + +#ifndef _UEFI +#define CONFIG_CRYPTO_CPU_JITTERENTROPY_SECURE_MEMORY +#endif + +#ifndef _UEFI +typedef SSIZE_T ssize_t; +#else +#if CRYPTOPP_BOOL_X64 +typedef int64 ssize_t; +#else +typedef int32 ssize_t; +#endif +#endif + +static VC_INLINE void jent_get_nstime(__u64 *out) +{ + *out = __rdtsc();; +} + +#else + +/* taken from Linux kernel */ +#if CRYPTOPP_BOOL_X64 +#define DECLARE_ARGS(val, low, high) unsigned low, high +#define EAX_EDX_VAL(val, low, high) ((low) | ((__u64)(high) << 32)) +#define EAX_EDX_RET(val, low, high) "=a" (low), "=d" (high) +#else +#define DECLARE_ARGS(val, low, high) unsigned long long val +#define EAX_EDX_VAL(val, low, high) (val) +#define EAX_EDX_RET(val, low, high) "=A" (val) +#endif + +static VC_INLINE void jent_get_nstime(__u64 *out) +{ + DECLARE_ARGS(val, low, high); + asm volatile("rdtsc" : EAX_EDX_RET(val, low, high)); + *out = EAX_EDX_VAL(val, low, high); +} + +#endif + +static VC_INLINE void *jent_zalloc(size_t len) +{ + void *tmp = NULL; + tmp = TCalloc(len); + if(NULL != tmp) + { + memset(tmp, 0, len); +#if defined(_WIN32) && !defined(TC_WINDOWS_DRIVER) && !defined(_UEFI) + VirtualLock (tmp, len); +#endif + } + return tmp; +} + +static VC_INLINE void jent_zfree(void *ptr, unsigned int len) +{ + if (len % 8) + burn(ptr, len); + else + FAST_ERASE64(ptr, len); +#if defined(_WIN32) && !defined(TC_WINDOWS_DRIVER) && !defined(_UEFI) + VirtualUnlock (ptr, len); +#endif + TCfree(ptr); +} + +static VC_INLINE int jent_fips_enabled(void) +{ + return 0; +} + +/* --- helpers needed in user space -- */ + +#define rol64(x,n) rotl64(x,n) + + + |