diff --git a/Source/NSUUID.m b/Source/NSUUID.m index 3cbed96cf..23e39fdbd 100644 --- a/Source/NSUUID.m +++ b/Source/NSUUID.m @@ -27,7 +27,11 @@ #import "Foundation/NSCoder.h" #import "Foundation/NSUUID.h" +#if defined(__MINGW32__) +#include +#else #include +#endif static int uuid_from_string(const char *string, unsigned char *uuid); static void string_from_uuid(const unsigned char *uuid, char *string); @@ -256,8 +260,6 @@ static void string_from_uuid(const unsigned char *uuid, char *string) static int random_uuid(unsigned char *uuid) { - int devUrandom; - ssize_t bytesRead; unsigned char timeByte; unsigned char sequenceByte; @@ -265,6 +267,29 @@ static int random_uuid(unsigned char *uuid) * consistent with Apple. Other variants suffer from privacy * problems (and are more work...) */ + +#if defined(__MINGW32__) + + HCRYPTPROV hProvider = 0; + + if (!CryptAcquireContextW(&hProvider, 0, 0, + PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) + { + return -1; + } + + if (!CryptGenRandom(hProvider, kUUIDByteCount, uuid)) + { + CryptReleaseContext(hProvider, 0); + return -1; + } + + CryptReleaseContext(hProvider, 0); +#else + + int devUrandom; + ssize_t bytesRead; + devUrandom = open("/dev/urandom", O_RDONLY); if (devUrandom == -1) { @@ -276,6 +301,8 @@ static int random_uuid(unsigned char *uuid) { return -1; } +#endif + /* as required by the RFC, bits 48-51 should contain 0b0100 (4) * and bits 64-65 should contain 0b01 (1) */