Skip to content

Commit d386b5d

Browse files
author
Jethro Beekman
committed
Check for RDRAND failure
1 parent 6ca4943 commit d386b5d

File tree

1 file changed

+20
-2
lines changed

1 file changed

+20
-2
lines changed

src/os.rs

+20-2
Original file line numberDiff line numberDiff line change
@@ -436,13 +436,31 @@ mod imp {
436436
impl Rng for OsRng {
437437
fn next_u32(&mut self) -> u32 {
438438
let ret;
439-
unsafe{asm!("rdrand $0":"=r"(ret):::"volatile")};
439+
let mut retry=10;
440+
unsafe{asm!("
441+
1:
442+
rdrand $0
443+
jc 2f
444+
dec $1
445+
jnz 1b
446+
2:
447+
":"=r"(ret),"=r"(retry):"1"(retry)::"volatile")};
448+
if retry==0 { panic!("RDRAND failure") }
440449
ret
441450
}
442451
#[cfg(target_arch="x86_64")]
443452
fn next_u64(&mut self) -> u64 {
444453
let ret;
445-
unsafe{asm!("rdrand $0":"=r"(ret):::"volatile")};
454+
let mut retry=10;
455+
unsafe{asm!("
456+
1:
457+
rdrand $0
458+
jc 2f
459+
dec $1
460+
jnz 1b
461+
2:
462+
":"=r"(ret),"=r"(retry):"1"(retry)::"volatile")};
463+
if retry==0 { panic!("RDRAND failure") }
446464
ret
447465
}
448466
}

0 commit comments

Comments
 (0)