- std::call_once(flag, [&] {
- PCHECK(CryptAcquireContext(&cryptoProv, nullptr, nullptr,
- PROV_RSA_FULL, 0));
+ folly::call_once(flag, [&] {
+ if (!CryptAcquireContext(
+ &cryptoProv,
+ nullptr,
+ nullptr,
+ PROV_RSA_FULL,
+ CRYPT_VERIFYCONTEXT)) {
+ if (GetLastError() == NTE_BAD_KEYSET) {
+ // Mostly likely cause of this is that no key container
+ // exists yet, so try to create one.
+ PCHECK(CryptAcquireContext(
+ &cryptoProv, nullptr, nullptr, PROV_RSA_FULL, CRYPT_NEWKEYSET));
+ } else {
+ LOG(FATAL) << "Failed to acquire the default crypto context.";
+ }
+ }