summaryrefslogtreecommitdiff
path: root/lib/securerandom.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/securerandom.rb')
-rw-r--r--lib/securerandom.rb13
1 files changed, 9 insertions, 4 deletions
diff --git a/lib/securerandom.rb b/lib/securerandom.rb
index bb1d83e0d9..6f85532ce8 100644
--- a/lib/securerandom.rb
+++ b/lib/securerandom.rb
@@ -91,16 +91,21 @@ module SecureRandom
unless defined?(@has_win32)
begin
- require 'Win32API'
+ advapi32 = Module.new do
+ require "fiddle/import"
+ extend Fiddle::Importer
+ dlload "advapi32"
+ extern "int CryptAcquireContext(void*, void*, void*, unsigned long, unsigned long)"
+ extern "int CryptGenRandom(void*, unsigned long, void*)"
+ end
- crypt_acquire_context = Win32API.new("advapi32", "CryptAcquireContext", 'PPPII', 'L')
- @crypt_gen_random = Win32API.new("advapi32", "CryptGenRandom", 'VIP', 'L')
+ @crypt_gen_random = advapi32.method(:CryptGenRandom)
hProvStr = " " * Fiddle::SIZEOF_VOIDP
prov_rsa_full = 1
crypt_verifycontext = 0xF0000000
- if crypt_acquire_context.call(hProvStr, nil, nil, prov_rsa_full, crypt_verifycontext) == 0
+ if advapi32.CryptAcquireContext(hProvStr, nil, nil, prov_rsa_full, crypt_verifycontext) == 0
raise SystemCallError, "CryptAcquireContext failed: #{lastWin32ErrorMessage}"
end
type = Fiddle::SIZEOF_VOIDP == Fiddle::SIZEOF_LONG_LONG ? 'q' : 'l'