| 
														
															@@ -1891,6 +1891,12 @@ crypto_strongest_rand_syscall(uint8_t *out, size_t out_len) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 { 
														 | 
														
														 | 
														
															 { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															   tor_assert(out_len <= MAX_STRONGEST_RAND_SIZE); 
														 | 
														
														 | 
														
															   tor_assert(out_len <= MAX_STRONGEST_RAND_SIZE); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+  /* We only log at notice-level here because in the case that this function 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+   * fails the crypto_strongest_rand_raw() caller will log with a warning-level 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+   * message and let crypto_strongest_rand() error out and finally terminating 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+   * Tor with an assertion error. 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+   */ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 #ifdef TOR_UNIT_TESTS 
														 | 
														
														 | 
														
															 #ifdef TOR_UNIT_TESTS 
														 | 
													
												
											
												
													
														| 
														 | 
														
															   if (break_strongest_rng_syscall) 
														 | 
														
														 | 
														
															   if (break_strongest_rng_syscall) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     return -1; 
														 | 
														
														 | 
														
															     return -1; 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -1903,13 +1909,13 @@ crypto_strongest_rand_syscall(uint8_t *out, size_t out_len) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															   if (!provider_set) { 
														 | 
														
														 | 
														
															   if (!provider_set) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     if (!CryptAcquireContext(&provider, NULL, NULL, PROV_RSA_FULL, 
														 | 
														
														 | 
														
															     if (!CryptAcquireContext(&provider, NULL, NULL, PROV_RSA_FULL, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                              CRYPT_VERIFYCONTEXT)) { 
														 | 
														
														 | 
														
															                              CRYPT_VERIFYCONTEXT)) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-      log_warn(LD_CRYPTO, "Can't get CryptoAPI provider [1]"); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+      log_notice(LD_CRYPTO, "Unable to set Windows CryptoAPI provider [1]."); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															       return -1; 
														 | 
														
														 | 
														
															       return -1; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     } 
														 | 
														
														 | 
														
															     } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     provider_set = 1; 
														 | 
														
														 | 
														
															     provider_set = 1; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															   } 
														 | 
														
														 | 
														
															   } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															   if (!CryptGenRandom(provider, out_len, out)) { 
														 | 
														
														 | 
														
															   if (!CryptGenRandom(provider, out_len, out)) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    log_warn(LD_CRYPTO, "Can't get entropy from CryptoAPI."); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    log_notice(LD_CRYPTO, "Unable get entropy from the Windows CryptoAPI."); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     return -1; 
														 | 
														
														 | 
														
															     return -1; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															   } 
														 | 
														
														 | 
														
															   } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -1951,12 +1957,14 @@ crypto_strongest_rand_syscall(uint8_t *out, size_t out_len) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															       /* Useful log message for errno. */ 
														 | 
														
														 | 
														
															       /* Useful log message for errno. */ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															       if (errno == ENOSYS) { 
														 | 
														
														 | 
														
															       if (errno == ENOSYS) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        log_warn(LD_CRYPTO, "Can't get entropy from getrandom()." 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-                 " You are running a version of Tor built to support" 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-                 " getrandom(), but the kernel doesn't implement this" 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-                 " function--probably because it is too old?"); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        log_notice(LD_CRYPTO, "Can't get entropy from getrandom()." 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                   " You are running a version of Tor built to support" 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                   " getrandom(), but the kernel doesn't implement this" 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                   " function--probably because it is too old?" 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                   " Trying fallback method instead."); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															       } else { 
														 | 
														
														 | 
														
															       } else { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        log_warn(LD_CRYPTO, "Can't get entropy from getrandom(): %s.", 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        log_notice(LD_CRYPTO, "Can't get entropy from getrandom(): %s.", 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                              " Trying fallback method instead." 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                  strerror(errno)); 
														 | 
														
														 | 
														
															                  strerror(errno)); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															       } 
														 | 
														
														 | 
														
															       } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -2009,7 +2017,7 @@ crypto_strongest_rand_fallback(uint8_t *out, size_t out_len) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															   size_t n; 
														 | 
														
														 | 
														
															   size_t n; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															   for (i = 0; filenames[i]; ++i) { 
														 | 
														
														 | 
														
															   for (i = 0; filenames[i]; ++i) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    log_debug(LD_FS, "Considering %s for entropy", filenames[i]); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    log_debug(LD_FS, "Considering %s as entropy source", filenames[i]); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     fd = open(sandbox_intern_string(filenames[i]), O_RDONLY, 0); 
														 | 
														
														 | 
														
															     fd = open(sandbox_intern_string(filenames[i]), O_RDONLY, 0); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     if (fd<0) continue; 
														 | 
														
														 | 
														
															     if (fd<0) continue; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     log_info(LD_CRYPTO, "Reading entropy from \"%s\"", filenames[i]); 
														 | 
														
														 | 
														
															     log_info(LD_CRYPTO, "Reading entropy from \"%s\"", filenames[i]); 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -2018,9 +2026,10 @@ crypto_strongest_rand_fallback(uint8_t *out, size_t out_len) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     if (n != out_len) { 
														 | 
														
														 | 
														
															     if (n != out_len) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															       /* LCOV_EXCL_START 
														 | 
														
														 | 
														
															       /* LCOV_EXCL_START 
														 | 
													
												
											
												
													
														| 
														 | 
														
															        * We can't make /dev/foorandom actually fail. */ 
														 | 
														
														 | 
														
															        * We can't make /dev/foorandom actually fail. */ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-      log_warn(LD_CRYPTO, 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-               "Error reading from entropy source (read only %lu bytes).", 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-               (unsigned long)n); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+      log_notice(LD_CRYPTO, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                 "Error reading from entropy source %s (read only %lu bytes).", 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                 filenames[i], 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                 (unsigned long)n); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															       return -1; 
														 | 
														
														 | 
														
															       return -1; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															       /* LCOV_EXCL_STOP */ 
														 | 
														
														 | 
														
															       /* LCOV_EXCL_STOP */ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     } 
														 | 
														
														 | 
														
															     } 
														 |