Add ABI tests for rdrand.

This one is easy. For others we may wish to get in the habit of pulling
assembly declarations into headers.

Bug: 181
Change-Id: I24c774e3c9b1f983585b9828b0783ceddd08f0e7
Reviewed-on: https://boringssl-review.googlesource.com/c/33967
Commit-Queue: David Benjamin <davidben@google.com>
Reviewed-by: Adam Langley <agl@google.com>
diff --git a/crypto/rand_extra/rand_test.cc b/crypto/rand_extra/rand_test.cc
index 9ee3f26..9bc5d97 100644
--- a/crypto/rand_extra/rand_test.cc
+++ b/crypto/rand_extra/rand_test.cc
@@ -14,10 +14,14 @@
 
 #include <openssl/rand.h>
 
+#include <stdio.h>
+
 #include <gtest/gtest.h>
 
+#include <openssl/cpu.h>
 #include <openssl/span.h>
 
+#include "../test/abi_test.h"
 #include "../test/test_util.h"
 
 #if defined(OPENSSL_THREADS)
@@ -28,7 +32,6 @@
 
 #if !defined(OPENSSL_WINDOWS)
 #include <errno.h>
-#include <stdio.h>
 #include <sys/types.h>
 #include <sys/wait.h>
 #include <unistd.h>
@@ -183,4 +186,26 @@
   // Draw entropy in parallel with lower concurrency than the previous maximum.
   RunConcurrentRands(kFewerThreads);
 }
-#endif
+#endif  // OPENSSL_THREADS
+
+#if defined(OPENSSL_X86_64) && defined(SUPPORTS_ABI_TEST)
+extern "C" {
+int CRYPTO_rdrand(uint8_t out[8]);
+int CRYPTO_rdrand_multiple8_buf(uint8_t *buf, size_t len);
+}  // extern "C"
+
+TEST(RandTest, RdrandABI) {
+  if ((OPENSSL_ia32cap_P[1] & (1u << 30)) == 0) {
+    fprintf(stderr, "rdrand not supported. Skipping.\n");
+    return;
+  }
+
+  uint8_t buf[32];
+  CHECK_ABI(CRYPTO_rdrand, buf);
+  CHECK_ABI(CRYPTO_rdrand_multiple8_buf, nullptr, 0);
+  CHECK_ABI(CRYPTO_rdrand_multiple8_buf, buf, 8);
+  CHECK_ABI(CRYPTO_rdrand_multiple8_buf, buf, 16);
+  CHECK_ABI(CRYPTO_rdrand_multiple8_buf, buf, 24);
+  CHECK_ABI(CRYPTO_rdrand_multiple8_buf, buf, 32);
+}
+#endif  // OPENSSL_X86_64 && SUPPORTS_ABI_TEST