summaryrefslogtreecommitdiffstats
path: root/mac-x86_64/crypto/rand/rdrand-x86_64.S
diff options
context:
space:
mode:
authorAdam Langley <agl@google.com>2015-06-23 16:28:07 -0700
committerAdam Langley <agl@google.com>2015-06-23 16:33:55 -0700
commitbd9957e6e28506c4431ce8d3cadbc0a04905b15e (patch)
tree25164b0a84665df0c05eb07a4abb82b39fa6d6a0 /mac-x86_64/crypto/rand/rdrand-x86_64.S
parente0846beeb321f7d3170e4e389950b12fce69ab10 (diff)
downloadexternal_boringssl-bd9957e6e28506c4431ce8d3cadbc0a04905b15e.zip
external_boringssl-bd9957e6e28506c4431ce8d3cadbc0a04905b15e.tar.gz
external_boringssl-bd9957e6e28506c4431ce8d3cadbc0a04905b15e.tar.bz2
Handle RDRAND failures.
I mistakenly believed that only RDSEED could fail. However, the Intel manuals state that RDRAND can fail too. This change cherry-picks the following BoringSSL changes: 2cac3506 – Handle RDRAND failures. 248abbd7 – Add missing comma in .type pragma for rdrand code. Change-Id: Icdc56a50ce36e9c525063583882c676a5312d313
Diffstat (limited to 'mac-x86_64/crypto/rand/rdrand-x86_64.S')
-rw-r--r--mac-x86_64/crypto/rand/rdrand-x86_64.S39
1 files changed, 38 insertions, 1 deletions
diff --git a/mac-x86_64/crypto/rand/rdrand-x86_64.S b/mac-x86_64/crypto/rand/rdrand-x86_64.S
index 1ba990f..f0df296 100644
--- a/mac-x86_64/crypto/rand/rdrand-x86_64.S
+++ b/mac-x86_64/crypto/rand/rdrand-x86_64.S
@@ -1,11 +1,48 @@
#if defined(__x86_64__)
.text
+
+
+
.globl _CRYPTO_rdrand
.private_extern _CRYPTO_rdrand
.p2align 4
_CRYPTO_rdrand:
-.byte 0x48, 0x0f, 0xc7, 0xf0
+ xorq %rax,%rax
+
+
+.byte 0x48, 0x0f, 0xc7, 0xf1
+
+ adcq %rax,%rax
+ movq %rcx,0(%rdi)
+ .byte 0xf3,0xc3
+
+
+
+
+
+.globl _CRYPTO_rdrand_multiple8_buf
+.private_extern _CRYPTO_rdrand_multiple8_buf
+
+.p2align 4
+_CRYPTO_rdrand_multiple8_buf:
+ testq %rsi,%rsi
+ jz L$out
+ movq $8,%rdx
+L$loop:
+
+
+.byte 0x48, 0x0f, 0xc7, 0xf1
+ jnc L$err
+ movq %rcx,0(%rdi)
+ addq %rdx,%rdi
+ subq %rdx,%rsi
+ jnz L$loop
+L$out:
+ movq $1,%rax
+ .byte 0xf3,0xc3
+L$err:
+ xorq %rax,%rax
.byte 0xf3,0xc3
#endif