Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
G
getrandom
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Issue analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
felixmoebius
getrandom
Commits
283f9f8b
Unverified
Commit
283f9f8b
authored
5 years ago
by
Artyom Pavlov
Committed by
GitHub
5 years ago
Browse files
Options
Downloads
Patches
Plain Diff
Add Windows UWP support (#69)
parent
86c2cd62
No related branches found
Branches containing commit
No related tags found
No related merge requests found
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
.travis.yml
+1
-0
1 addition, 0 deletions
.travis.yml
appveyor.yml
+12
-1
12 additions, 1 deletion
appveyor.yml
build.rs
+19
-0
19 additions, 0 deletions
build.rs
src/lib.rs
+10
-0
10 additions, 0 deletions
src/lib.rs
src/windows_uwp.rs
+59
-0
59 additions, 0 deletions
src/windows_uwp.rs
with
101 additions
and
1 deletion
.travis.yml
+
1
−
0
View file @
283f9f8b
...
...
@@ -137,6 +137,7 @@ matrix:
-
cargo xbuild --target=x86_64-unknown-uefi
-
cargo xbuild --target=x86_64-unknown-hermit
-
cargo xbuild --target=x86_64-unknown-l4re-uclibc
-
cargo xbuild --target=x86_64-uwp-windows-gnu
# Trust cross-built/emulated targets. We must repeat all non-default values.
-
rust
:
stable
...
...
This diff is collapsed.
Click to expand it.
appveyor.yml
+
12
−
1
View file @
283f9f8b
...
...
@@ -21,10 +21,21 @@ environment:
matrix
:
-
TARGET
:
x86_64-pc-windows-msvc
CHANNEL
:
1.32.0
-
TARGET
:
x86_64-pc-windows-msvc
CHANNEL
:
stable
-
TARGET
:
x86_64-pc-windows-msvc
CHANNEL
:
nightly
-
TARGET
:
i686-pc-windows-msvc
CHANNEL
:
nightly
-
TARGET
:
x86_64-pc-windows-gnu
CHANNEL
:
nightly
-
TARGET
:
i686-pc-windows-gnu
CHANNEL
:
nightly
install
:
-
appveyor DownloadFile https://win.rustup.rs/ -FileName rustup-init.exe
-
rustup-init.exe -y --default-host %TARGET%
-
rustup-init.exe -y --default-host %TARGET%
--default-toolchain %CHANNEL%
-
set PATH=%PATH%;C:\Users\appveyor\.cargo\bin
-
rustc -V
-
cargo -V
...
...
This diff is collapsed.
Click to expand it.
build.rs
0 → 100644
+
19
−
0
View file @
283f9f8b
#![deny(warnings)]
use
std
::
env
;
fn
main
()
{
let
target
=
env
::
var
(
"TARGET"
)
.expect
(
"TARGET was not set"
);
if
target
.contains
(
"-uwp-windows-"
)
{
// for BCryptGenRandom
println!
(
"cargo:rustc-link-lib=bcrypt"
);
// to work around unavailability of `target_vendor` on Rust 1.33
println!
(
"cargo:rustc-cfg=getrandom_uwp"
);
}
else
if
target
.contains
(
"windows"
)
{
// for RtlGenRandom (aka SystemFunction036)
println!
(
"cargo:rustc-link-lib=advapi32"
);
}
else
if
target
.contains
(
"apple-ios"
)
{
// for SecRandomCopyBytes and kSecRandomDefault
println!
(
"cargo:rustc-link-lib=framework=Security"
);
}
}
This diff is collapsed.
Click to expand it.
src/lib.rs
+
10
−
0
View file @
283f9f8b
...
...
@@ -126,6 +126,14 @@ cfg_if! {
macro_rules!
error
{
(
$
(
$
x
:
tt
)
*
)
=>
{};
}
#[allow(unused)]
macro_rules!
warn
{
(
$
(
$
x
:
tt
)
*
)
=>
{};
}
#[allow(unused)]
macro_rules!
info
{
(
$
(
$
x
:
tt
)
*
)
=>
{};
}
}
}
...
...
@@ -202,6 +210,8 @@ cfg_if! {
#[path
=
"solaris_illumos.rs"
]
mod
imp
;
}
else
if
#[cfg(target_os
=
"wasi"
)]
{
#[path
=
"wasi.rs"
]
mod
imp
;
}
else
if
#[cfg(all(windows,
getrandom_uwp))]
{
#[path
=
"windows_uwp.rs"
]
mod
imp
;
}
else
if
#[cfg(windows)]
{
#[path
=
"windows.rs"
]
mod
imp
;
}
else
if
#[cfg(all(target_arch
=
"x86_64"
,
any(
...
...
This diff is collapsed.
Click to expand it.
src/windows_uwp.rs
0 → 100644
+
59
−
0
View file @
283f9f8b
// Copyright 2018 Developers of the Rand project.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// https://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
//! Implementation for Windows UWP targets. After deprecation of Windows XP
//! and Vista, this can superseed the `RtlGenRandom`-based implementation.
use
crate
::
Error
;
use
core
::{
ffi
::
c_void
,
num
::
NonZeroU32
,
ptr
};
const
BCRYPT_USE_SYSTEM_PREFERRED_RNG
:
u32
=
0x00000002
;
extern
"system"
{
fn
BCryptGenRandom
(
hAlgorithm
:
*
mut
c_void
,
pBuffer
:
*
mut
u8
,
cbBuffer
:
u32
,
dwFlags
:
u32
,
)
->
u32
;
}
pub
fn
getrandom_inner
(
dest
:
&
mut
[
u8
])
->
Result
<
(),
Error
>
{
// Prevent overflow of u32
for
chunk
in
dest
.chunks_mut
(
u32
::
max_value
()
as
usize
)
{
let
ret
=
unsafe
{
BCryptGenRandom
(
ptr
::
null_mut
(),
chunk
.as_mut_ptr
(),
chunk
.len
()
as
u32
,
BCRYPT_USE_SYSTEM_PREFERRED_RNG
,
)
};
// NTSTATUS codes use two highest bits for severity status
match
ret
>>
30
{
0b01
=>
{
info!
(
"BCryptGenRandom: information code 0x{:08X}"
,
ret
);
}
0b10
=>
{
warn!
(
"BCryptGenRandom: warning code 0x{:08X}"
,
ret
);
}
0b11
=>
{
error!
(
"BCryptGenRandom: failed with 0x{:08X}"
,
ret
);
// We zeroize the highest bit, so the error code will reside
// inside the range of designated for OS codes.
let
code
=
ret
^
(
1
<<
31
);
// SAFETY: the second highest bit is always equal to one,
// so it's impossible to get zero. Unfortunately compiler
// is not smart enough to figure out it yet.
let
code
=
unsafe
{
NonZeroU32
::
new_unchecked
(
code
)
};
return
Err
(
Error
::
from
(
code
));
}
_
=>
(),
}
}
Ok
(())
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment