Skip Menu |
 

This queue is for tickets about the Crypt-Random-Seed CPAN distribution.

Report information
The Basics
Id: 96813
Status: new
Priority: 0/
Queue: Crypt-Random-Seed

People
Owner: Nobody in particular
Requestors: sisyphus [...] cpan.org
Cc:
AdminCc:

Bug Information
Severity: Wishlist
Broken in: (no value)
Fixed in: (no value)



Subject: [Win32] Dependency upon Win32::API is not ideal
Download (untitled) / with headers
text/plain 1.2k
Hi Dana, Dave, I'd prefer to see CryptGenRandom and RtlGenRandom called via XSubs - thereby removing the Win32::API dependency. Win32::API certainly filled a role back in the day when Windows machines typically were missing a C compiler. But now that those days have gone, I don't see why one would prefer to build and install Win32::API in preference to compiling XSubs. While Win32-API-0.77 (current stable) builds straight out of the box on Strawberry Perls, it won't do so on those 64-bit perls built using a mingw64 cross-compiler. This is not actually the fault of Win32::API. I think it's that EU::MM doesn't realize that "as.exe" is actually named "x86_64-w64-mingw32-as.exe" - and I'll file a bug report against EU::MM for that when I've worked out the patch. It is, of course, quite easy to work around this problem - one simply creates a copy of "x86_64-w64-mingw32-as.exe" named "as.exe" and Win32-API-0.77 then builds fine. In the interests of advancing the replacement of Win32::API, I'm attaching 'random2.pl' which contains 2 XSubs - one that wraps RtlGenRandom and one that wraps CryptGenRandom. For your convenience, they come in the form of an Inline::C script. I'm rating this bug report as "wishlist" - which, to my mind, implies that you are quite free to ignore it completely ;-) Cheers, Rob
Subject: random2.pl
Download random2.pl
text/x-perl 1.7k
use strict; use warnings; use Devel::Peek; use Inline C => Config => BUILD_NOISY => 1, USING => 'ParseRegExp'; use Inline C => <<'EOC'; #include <wincrypt.h> /* needed for crypt_gen_random() but not for rtl_gen_random() */ SV * crypt_gen_random(unsigned long len) { SV * ret; char * buff; HCRYPTPROV prov = 0; if(!CryptAcquireContextA(&prov, 0, 0, PROV_RSA_FULL, CRYPT_SILENT | CRYPT_VERIFYCONTEXT)) croak("Call to CryptAcquireContextA() failed"); Newx(buff, len, char); if(buff == NULL) { CryptReleaseContext(&prov, 0); croak ("Failed to allocate memory for buffer"); } if(!CryptGenRandom(prov, len, buff)) { Safefree(buff); CryptReleaseContext(&prov, 0); croak("Call to CryptGenRandom() failed"); } ret = newSVpv(buff, len); Safefree(buff); CryptReleaseContext(&prov, 0); return ret; } SV * rtl_gen_random(unsigned long len) { SV * ret; unsigned long i; char * buff; Newx(buff, len, char); if(buff == 0) croak ("Failed to allocate memory for 'buff'"); HMODULE hLib=LoadLibrary("ADVAPI32.DLL"); if (hLib) { BOOLEAN (APIENTRY *pfn)(void*, ULONG) = (BOOLEAN (APIENTRY *)(void*,ULONG))GetProcAddress(hLib,"SystemFunction036"); if(pfn(buff,len)) ret = newSVpv(buff, len); else { FreeLibrary(hLib); croak("Call to 'SystemFunction036' failed"); } FreeLibrary(hLib); } else { croak("Failed to load ADVAPI32.dll"); } Safefree(buff); return ret; } EOC my $c = crypt_gen_random(100); print "$c\n", length($c), "\n"; Dump($c); my $r = rtl_gen_random(100); print "\n$r\n", length($r), "\n"; Dump($r);
Download (untitled) / with headers
text/plain 379b
Hmmm ... Checking this on my XP laptop, I find that the 3 calls to CryptReleaseContext(&prov, 0); should instead be CryptReleaseContext(prov, 0); A bug in the version of Inline::C that I was using (0.55) prevented the appearance of the "passing arg 1 of `CryptReleaseContext' makes integer from pointer without a cast" warning that the first rendition produces. Cheers, Rob


This service is sponsored and maintained by Best Practical Solutions and runs on Perl.org infrastructure.

Please report any issues with rt.cpan.org to rt-cpan-admin@bestpractical.com.