mirror of
https://github.com/rust-lang/rust.git
synced 2025-06-05 11:48:30 +00:00
Use BCryptGenRandom instead of RtlGenRandom on Windows.
BCryptGenRandom isn't available on XP, but we dropped XP support a while ago.
This commit is contained in:
parent
9475e609b8
commit
1ed123828c
@ -262,6 +262,8 @@ pub const STACK_SIZE_PARAM_IS_A_RESERVATION: DWORD = 0x00010000;
|
|||||||
|
|
||||||
pub const STATUS_SUCCESS: NTSTATUS = 0x00000000;
|
pub const STATUS_SUCCESS: NTSTATUS = 0x00000000;
|
||||||
|
|
||||||
|
pub const BCRYPT_USE_SYSTEM_PREFERRED_RNG: DWORD = 0x00000002;
|
||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
#[cfg(not(target_pointer_width = "64"))]
|
#[cfg(not(target_pointer_width = "64"))]
|
||||||
pub struct WSADATA {
|
pub struct WSADATA {
|
||||||
@ -678,10 +680,6 @@ if #[cfg(not(target_vendor = "uwp"))] {
|
|||||||
|
|
||||||
#[link(name = "advapi32")]
|
#[link(name = "advapi32")]
|
||||||
extern "system" {
|
extern "system" {
|
||||||
// Forbidden when targeting UWP
|
|
||||||
#[link_name = "SystemFunction036"]
|
|
||||||
pub fn RtlGenRandom(RandomBuffer: *mut u8, RandomBufferLength: ULONG) -> BOOLEAN;
|
|
||||||
|
|
||||||
// Allowed but unused by UWP
|
// Allowed but unused by UWP
|
||||||
pub fn OpenProcessToken(
|
pub fn OpenProcessToken(
|
||||||
ProcessHandle: HANDLE,
|
ProcessHandle: HANDLE,
|
||||||
@ -743,8 +741,6 @@ if #[cfg(not(target_vendor = "uwp"))] {
|
|||||||
// UWP specific functions & types
|
// UWP specific functions & types
|
||||||
cfg_if::cfg_if! {
|
cfg_if::cfg_if! {
|
||||||
if #[cfg(target_vendor = "uwp")] {
|
if #[cfg(target_vendor = "uwp")] {
|
||||||
pub const BCRYPT_USE_SYSTEM_PREFERRED_RNG: DWORD = 0x00000002;
|
|
||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
pub struct FILE_STANDARD_INFO {
|
pub struct FILE_STANDARD_INFO {
|
||||||
pub AllocationSize: LARGE_INTEGER,
|
pub AllocationSize: LARGE_INTEGER,
|
||||||
@ -754,15 +750,6 @@ if #[cfg(target_vendor = "uwp")] {
|
|||||||
pub Directory: BOOLEAN,
|
pub Directory: BOOLEAN,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[link(name = "bcrypt")]
|
|
||||||
extern "system" {
|
|
||||||
pub fn BCryptGenRandom(
|
|
||||||
hAlgorithm: LPVOID,
|
|
||||||
pBuffer: *mut u8,
|
|
||||||
cbBuffer: ULONG,
|
|
||||||
dwFlags: ULONG,
|
|
||||||
) -> LONG;
|
|
||||||
}
|
|
||||||
#[link(name = "kernel32")]
|
#[link(name = "kernel32")]
|
||||||
extern "system" {
|
extern "system" {
|
||||||
pub fn GetFileInformationByHandleEx(
|
pub fn GetFileInformationByHandleEx(
|
||||||
@ -1085,6 +1072,18 @@ extern "system" {
|
|||||||
) -> c_int;
|
) -> c_int;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[link(name = "bcrypt")]
|
||||||
|
extern "system" {
|
||||||
|
// >= Vista / Server 2008
|
||||||
|
// https://docs.microsoft.com/en-us/windows/win32/api/bcrypt/nf-bcrypt-bcryptgenrandom
|
||||||
|
pub fn BCryptGenRandom(
|
||||||
|
hAlgorithm: LPVOID,
|
||||||
|
pBuffer: *mut u8,
|
||||||
|
cbBuffer: ULONG,
|
||||||
|
dwFlags: ULONG,
|
||||||
|
) -> NTSTATUS;
|
||||||
|
}
|
||||||
|
|
||||||
// Functions that aren't available on every version of Windows that we support,
|
// Functions that aren't available on every version of Windows that we support,
|
||||||
// but we still use them and just provide some form of a fallback implementation.
|
// but we still use them and just provide some form of a fallback implementation.
|
||||||
compat_fn! {
|
compat_fn! {
|
||||||
|
@ -2,18 +2,6 @@ use crate::io;
|
|||||||
use crate::mem;
|
use crate::mem;
|
||||||
use crate::sys::c;
|
use crate::sys::c;
|
||||||
|
|
||||||
#[cfg(not(target_vendor = "uwp"))]
|
|
||||||
pub fn hashmap_random_keys() -> (u64, u64) {
|
|
||||||
let mut v = (0, 0);
|
|
||||||
let ret =
|
|
||||||
unsafe { c::RtlGenRandom(&mut v as *mut _ as *mut u8, mem::size_of_val(&v) as c::ULONG) };
|
|
||||||
if ret == 0 {
|
|
||||||
panic!("couldn't generate random bytes: {}", io::Error::last_os_error());
|
|
||||||
}
|
|
||||||
v
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(target_vendor = "uwp")]
|
|
||||||
pub fn hashmap_random_keys() -> (u64, u64) {
|
pub fn hashmap_random_keys() -> (u64, u64) {
|
||||||
use crate::ptr;
|
use crate::ptr;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user