| 54 | } BCryptContext; |
| 55 | |
| 56 | void CCrypto::Init() |
| 57 | { |
| 58 | // Init one time init. This is threadsafe if we assume C++11 compliance |
| 59 | static bool once = [](){ |
| 60 | ULONG garbage; |
| 61 | |
| 62 | VPROF_BUDGET( "CCrypto::Init", VPROF_BUDGETGROUP_ENCRYPTION ); |
| 63 | |
| 64 | BCryptOpenAlgorithmProvider( |
| 65 | &hAlgRandom, |
| 66 | BCRYPT_RNG_ALGORITHM, |
| 67 | nullptr, |
| 68 | 0 |
| 69 | ); |
| 70 | AssertFatal( hAlgRandom != INVALID_HANDLE_VALUE ); |
| 71 | |
| 72 | BCryptOpenAlgorithmProvider( |
| 73 | &hAlgSHA256, |
| 74 | BCRYPT_SHA256_ALGORITHM, |
| 75 | nullptr, |
| 76 | 0 |
| 77 | ); |
| 78 | AssertFatal( hAlgSHA256 != INVALID_HANDLE_VALUE ); |
| 79 | BCryptGetProperty(hAlgSHA256, BCRYPT_OBJECT_LENGTH, (PUCHAR)&cbBufferSHA256, sizeof(cbBufferSHA256), &garbage, 0 ); |
| 80 | AssertFatal( cbBufferSHA256 > 0 && cbBufferSHA256 < 16 * 1024 * 1024 ); |
| 81 | |
| 82 | BCryptOpenAlgorithmProvider( |
| 83 | &hAlgHMACSHA256, |
| 84 | BCRYPT_SHA256_ALGORITHM, |
| 85 | nullptr, |
| 86 | BCRYPT_ALG_HANDLE_HMAC_FLAG |
| 87 | ); |
| 88 | AssertFatal( hAlgHMACSHA256 != INVALID_HANDLE_VALUE ); |
| 89 | BCryptGetProperty(hAlgHMACSHA256, BCRYPT_OBJECT_LENGTH, (PUCHAR)&cbBufferHMACSHA256, sizeof(cbBufferHMACSHA256), &garbage, 0 ); |
| 90 | AssertFatal( cbBufferHMACSHA256 > 0 && cbBufferHMACSHA256 < 16 * 1024 * 1024 ); |
| 91 | |
| 92 | BCryptOpenAlgorithmProvider( |
| 93 | &hAlgHMACSHA1, |
| 94 | BCRYPT_SHA1_ALGORITHM, |
| 95 | nullptr, |
| 96 | BCRYPT_ALG_HANDLE_HMAC_FLAG |
| 97 | ); |
| 98 | AssertFatal( hAlgHMACSHA1 != INVALID_HANDLE_VALUE ); |
| 99 | BCryptGetProperty(hAlgHMACSHA1, BCRYPT_OBJECT_LENGTH, (PUCHAR)&cbBufferHMACSHA1, sizeof(cbBufferHMACSHA1), &garbage, 0 ); |
| 100 | AssertFatal( cbBufferHMACSHA1 > 0 && cbBufferHMACSHA1 < 16 * 1024 * 1024 ); |
| 101 | |
| 102 | BCryptOpenAlgorithmProvider( |
| 103 | &hAlgMD5, |
| 104 | BCRYPT_MD5_ALGORITHM, |
| 105 | nullptr, |
| 106 | 0 |
| 107 | ); |
| 108 | AssertFatal( hAlgMD5 != INVALID_HANDLE_VALUE ); |
| 109 | BCryptGetProperty(hAlgMD5, BCRYPT_OBJECT_LENGTH, (PUCHAR)&cbBufferMD5, sizeof(cbBufferMD5), &garbage, 0 ); |
| 110 | AssertFatal( cbBufferMD5 > 0 && cbBufferMD5 < 16 * 1024 * 1024 ); |
| 111 | |
| 112 | return true; |
| 113 | }(); |
no outgoing calls