NAME

Win32::GenRandom - XS wrappers of CryptGenRandom and RtlGenRandom.

FUNCTIONS

@c = cgr($how_many, $size); # 1st arg is optional

 Returns a list of $how_many strings - each string consisting of
 $size random bytes.
 Returns just one string if the $how_many is not specified - in which
 case the function may be called either as:
   $c = cgr($size);
   or
   @c = cgr($size);
 This function uses CryptGenRandom to generate the random strings.

@c = rgr($how_many, $size); # 1st arg is optional

 As for cgr() - but uses RtlGenRandom instead of CryptGenRandom
 to generate the random strings.
 (Not available on Windows 2000 and earlier - croaks if used on
 such a system.)

@c = gr($how_many, $size); # $how_many is an optional arg.

 As for cgr() and rgr() - but returns rgr(@_) if
 $Win32::GenRandom::rtl_avail is true (ie if RtlGenRandom is
 available); otherwise returns cgr(@_).

@c = cgr_uv($how_many); # $how_many is an optional arg.

 Returns a list of $how_many Perl internal unsigned integer
 values (UV). Whether the returned values are 32-bit or 64-bit
 depends upon your perl configuration.
 Returns just one UV if $how_many is not specified - in which
 case the function may be called either as:
   $c = cgr_uv();
   or
   @c = cgr_uv();
 This function uses CryptGenRandom to generate the random UVs.

@c = rgr_uv($how_many); # $how_many is an optional arg.

 As for cgr_uv() - but uses RtlGenRandom instead of CryptGenRandom
 to generate the random UVs.
 (Not available on Windows 2000 and earlier - croaks if used on
 such a system.)

@c = gr_uv($how_many); # $how_many is an optional arg.

 As for cgr_uv() and rgr_uv) - but returns rgr_uv() if
 $Win32::GenRandom::rtl_avail is true (ie if RtlGenRandom is
 available); otherwise returns cgr_uv(@_).

@c = cgr_32($how_many); # $how_many is an optional arg.

 Returns a list of $how_many 32-bit unsigned integer values.
 Returns just one integer if $how_many is not specified - in
 which case the function may be called either as:
   $c = cgr_32();
   or
   @c = cgr_32();
 This function uses CryptGenRandom to generate the random UVs.

@c = rgr_32($how_many); # $how_many is an optional arg.

 As for cgr_32() - but uses RtlGenRandom instead of CryptGenRandom
 to generate the random 32-bit values.
 (Not available on Windows 2000 and earlier - croaks if used on
 such a system.)

@c = gr_32($how_many); # $how_many is an optional arg.

 As for cgr_32() and rgr_32() - but returns rgr_32(@_) if
 $Win32::GenRandom::rtl_avail is true (ie if RtlGenRandom is
 available); otherwise returns cgr_32(@_).

@c = cgr_custom($how_many, $size, $container, $prov, $type, $flags);
@c = cgr_custom_uv($how_many, $container, $prov, $type, $flags);
@c = cgr_custom_32($how_many, $container, $prov, $type, $flags);

 Again, $how_many is optional and, if absent, defaults to 1 - in
 which case the returned value can be assigned to either a scalar
 or an array.
 These functions are the same as cgr(), cgr_uv() and cgr_32(), but
 they allow the user to specify the args that CryptAcquireContextA
 takes, instead of forcing the user to accept the defaults that
 cgr(), cgr_uv() and cgr_32() provide.
 $container is the key container name (string). Provide the empty
 string if you don't want to specify a particular value.
 $prov is the name (string) of the Cryptographic Service Provider to
 be used. Specify the empty string if you don't want to specify a
 particular CSP.
 $type specifies the type of provider to acquire.
 $flags is, as the name suggests, the flag value to be used.
 For your convenience, the allowed Type and Flag constants provided
 by wincrypt.h have been wrapped in perl subs of the same name - see
 the CONSTANTS section below.
 See the MSDN docs for CryptAcquireContext for more info.

$which = which_crypto();

 Returns 'RtlGenRandom' if $Win32::GenRandom::rtl_avail is true;
 otherwise returns 'CryptGenRandom'.
 IOW it tells us which crypto functionality the "gr" functions will
 use - and is just another way to access the value of
 $Win32::GenRandom::rtl_avail (via subroutine call).

$zero_func = whw(); # Mnemonic for "What Have We ?"

 The MSDN docs recommend zeroing the buffer that has received the
 random bytes as soon as we no longer need it to hold those bytes.
 We should use SecureZeroMemory() to do that but, although that
 function is available on Microsoft and mingw64.sf compilers, it's
 missing on at least some mingw.org compilers. Therefore, we fall
 back to using ZeroMemory() if SecureZeroMemory() is unavailable.
 Should neither be available, then the buffer simply doesn't get
 zeroed.
 This function returns the name of the function that is being used
 to zero the buffer ("SecureZeroMemory" or "ZeroMemory"), or
 returns "None" if neither function is available.
 I suspect this zeroing is not relevant for (at least) most apps,
 but it has minimal impact upon the time taken for rgr() to run.

CONSTANTS

The following subroutines return the same value as that defined by
their name in wincrypt.h:
 PROV_FORTEZZA
 PROV_RSA_SCHANNEL
 PROV_DSS_DH
 PROV_SSL
 PROV_RSA_SIG
 PROV_DSS
 PROV_MS_EXCHANGE
 PROV_RSA_FULL
 PROV_RSA_AES
 PROV_DH_SCHANNEL
 CRYPT_VERIFYCONTEXT
 CRYPT_DELETEKEYSET
 CRYPT_NEWKEYSET
 CRYPT_MACHINE_KEYSET
 CRYPT_DEFAULT_CONTAINER_OPTIONAL
 CRYPT_SILENT

LICENSE

This program is free software; you may redistribute it and/or
modify it under the same terms as Perl itself.
Copyright 2014, 2018 Sisyphus

AUTHOR

Sisyphus <sisyphus at(@) cpan dot (.) org>