diff options
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | libqpdf/SecureRandomDataProvider.cc | 35 |
2 files changed, 37 insertions, 2 deletions
@@ -1,5 +1,9 @@ 2015-05-24 Jay Berkenbilt <ejb@ql.org> + * Handle Microsoft crypt provider initialization properly for case + where no keys have been previously created, such as in a fresh + Windows installation. + * Include time.h in QUtil.hh for time_t 2015-02-21 Jay Berkenbilt <ejb@ql.org> diff --git a/libqpdf/SecureRandomDataProvider.cc b/libqpdf/SecureRandomDataProvider.cc index 2870ab98..0b0b6c73 100644 --- a/libqpdf/SecureRandomDataProvider.cc +++ b/libqpdf/SecureRandomDataProvider.cc @@ -42,9 +42,40 @@ class WindowsCryptProvider public: WindowsCryptProvider() { - if (! CryptAcquireContext(&crypt_prov, NULL, NULL, PROV_RSA_FULL, 0)) + if (!CryptAcquireContext(&crypt_prov, + "Container", + NULL, + PROV_RSA_FULL, + 0)) { - throw std::runtime_error("unable to acquire crypt context"); +#ifdef __GNUC__ +# if ((__GNUC__ * 100) + __GNUC_MINOR__) >= 406 +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wold-style-cast" +# pragma GCC diagnostic ignored "-Wsign-compare" +# endif +#endif + if (GetLastError() == NTE_BAD_KEYSET) +#ifdef __GNUC__ +# if ((__GNUC__ * 100) + __GNUC_MINOR__) >= 406 +# pragma GCC diagnostic pop +# endif +#endif + { + if (! CryptAcquireContext(&crypt_prov, + "Container", + NULL, + PROV_RSA_FULL, + CRYPT_NEWKEYSET)) + { + throw std::runtime_error( + "unable to acquire crypt context with new keyset"); + } + } + else + { + throw std::runtime_error("unable to acquire crypt context"); + } } } ~WindowsCryptProvider() |