This Trac instance is not used for development anymore!

We migrated our development workflow to git and Gitea.
To test the future redirection, replace trac by ariadne in the page URL.

source: ps/trunk/build/premake/premake5/contrib/mbedtls/library/entropy_poll.c

Last change on this file was 20366, checked in by Itms, 7 years ago

Alpha 12 version of Premake 5, including prebuilt binary for Windows.
Directly taken from https://premake.github.io/.

Refs #3729.

File size: 5.2 KB
Line 
1/*
2 * Platform-specific and custom entropy polling functions
3 *
4 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
5 * SPDX-License-Identifier: Apache-2.0
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
8 * not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 * This file is part of mbed TLS (https://tls.mbed.org)
20 */
21
22#if !defined(MBEDTLS_CONFIG_FILE)
23#include "mbedtls/config.h"
24#else
25#include MBEDTLS_CONFIG_FILE
26#endif
27
28#if defined(MBEDTLS_ENTROPY_C)
29
30#include "mbedtls/entropy.h"
31#include "mbedtls/entropy_poll.h"
32
33#if defined(MBEDTLS_TIMING_C)
34#include <string.h>
35#include "mbedtls/timing.h"
36#endif
37#if defined(MBEDTLS_HAVEGE_C)
38#include "mbedtls/havege.h"
39#endif
40
41#if !defined(MBEDTLS_NO_PLATFORM_ENTROPY)
42#if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32)
43
44#if !defined(_WIN32_WINNT)
45#define _WIN32_WINNT 0x0400
46#endif
47#include <windows.h>
48#include <wincrypt.h>
49
50int mbedtls_platform_entropy_poll( void *data, unsigned char *output, size_t len,
51 size_t *olen )
52{
53 HCRYPTPROV provider;
54 ((void) data);
55 *olen = 0;
56
57 if( CryptAcquireContext( &provider, NULL, NULL,
58 PROV_RSA_FULL, CRYPT_VERIFYCONTEXT ) == FALSE )
59 {
60 return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
61 }
62
63 if( CryptGenRandom( provider, (DWORD) len, output ) == FALSE )
64 return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
65
66 CryptReleaseContext( provider, 0 );
67 *olen = len;
68
69 return( 0 );
70}
71#else /* _WIN32 && !EFIX64 && !EFI32 */
72
73/*
74 * Test for Linux getrandom() support.
75 * Since there is no wrapper in the libc yet, use the generic syscall wrapper
76 * available in GNU libc and compatible libc's (eg uClibc).
77 */
78#if defined(__linux__) && defined(__GLIBC__)
79#include <unistd.h>
80#include <sys/syscall.h>
81#if defined(SYS_getrandom)
82#define HAVE_GETRANDOM
83
84static int getrandom_wrapper( void *buf, size_t buflen, unsigned int flags )
85{
86 /* MemSan cannot understand that the syscall writes to the buffer */
87#if defined(__has_feature)
88#if __has_feature(memory_sanitizer)
89 memset( buf, 0, buflen );
90#endif
91#endif
92
93 return( syscall( SYS_getrandom, buf, buflen, flags ) );
94}
95
96#include <sys/utsname.h>
97/* Check if version is at least 3.17.0 */
98static int check_version_3_17_plus( void )
99{
100 int minor;
101 struct utsname un;
102 const char *ver;
103
104 /* Get version information */
105 uname(&un);
106 ver = un.release;
107
108 /* Check major version; assume a single digit */
109 if( ver[0] < '3' || ver[0] > '9' || ver [1] != '.' )
110 return( -1 );
111
112 if( ver[0] - '0' > 3 )
113 return( 0 );
114
115 /* Ok, so now we know major == 3, check minor.
116 * Assume 1 or 2 digits. */
117 if( ver[2] < '0' || ver[2] > '9' )
118 return( -1 );
119
120 minor = ver[2] - '0';
121
122 if( ver[3] >= '0' && ver[3] <= '9' )
123 minor = 10 * minor + ver[3] - '0';
124 else if( ver [3] != '.' )
125 return( -1 );
126
127 if( minor < 17 )
128 return( -1 );
129
130 return( 0 );
131}
132static int has_getrandom = -1;
133#endif /* SYS_getrandom */
134#endif /* __linux__ */
135
136#include <stdio.h>
137
138int mbedtls_platform_entropy_poll( void *data,
139 unsigned char *output, size_t len, size_t *olen )
140{
141 FILE *file;
142 size_t read_len;
143 ((void) data);
144
145#if defined(HAVE_GETRANDOM)
146 if( has_getrandom == -1 )
147 has_getrandom = ( check_version_3_17_plus() == 0 );
148
149 if( has_getrandom )
150 {
151 int ret;
152
153 if( ( ret = getrandom_wrapper( output, len, 0 ) ) < 0 )
154 return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
155
156 *olen = ret;
157 return( 0 );
158 }
159#endif /* HAVE_GETRANDOM */
160
161 *olen = 0;
162
163 file = fopen( "/dev/urandom", "rb" );
164 if( file == NULL )
165 return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
166
167 read_len = fread( output, 1, len, file );
168 if( read_len != len )
169 {
170 fclose( file );
171 return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
172 }
173
174 fclose( file );
175 *olen = len;
176
177 return( 0 );
178}
179#endif /* _WIN32 && !EFIX64 && !EFI32 */
180#endif /* !MBEDTLS_NO_PLATFORM_ENTROPY */
181
182#if defined(MBEDTLS_TIMING_C)
183int mbedtls_hardclock_poll( void *data,
184 unsigned char *output, size_t len, size_t *olen )
185{
186 unsigned long timer = mbedtls_timing_hardclock();
187 ((void) data);
188 *olen = 0;
189
190 if( len < sizeof(unsigned long) )
191 return( 0 );
192
193 memcpy( output, &timer, sizeof(unsigned long) );
194 *olen = sizeof(unsigned long);
195
196 return( 0 );
197}
198#endif /* MBEDTLS_TIMING_C */
199
200#if defined(MBEDTLS_HAVEGE_C)
201int mbedtls_havege_poll( void *data,
202 unsigned char *output, size_t len, size_t *olen )
203{
204 mbedtls_havege_state *hs = (mbedtls_havege_state *) data;
205 *olen = 0;
206
207 if( mbedtls_havege_random( hs, output, len ) != 0 )
208 return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
209
210 *olen = len;
211
212 return( 0 );
213}
214#endif /* MBEDTLS_HAVEGE_C */
215
216#endif /* MBEDTLS_ENTROPY_C */
Note: See TracBrowser for help on using the repository browser.