| // Copyright 2017 The Cobalt Authors. All Rights Reserved. | 
 | // | 
 | // Licensed under the Apache License, Version 2.0 (the "License"); | 
 | // you may not use this file except in compliance with the License. | 
 | // You may obtain a copy of the License at | 
 | // | 
 | //     http://www.apache.org/licenses/LICENSE-2.0 | 
 | // | 
 | // Unless required by applicable law or agreed to in writing, software | 
 | // distributed under the License is distributed on an "AS IS" BASIS, | 
 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 | // See the License for the specific language governing permissions and | 
 | // limitations under the License. | 
 |  | 
 | #include "starboard/system.h" | 
 |  | 
 | #include <windows.h> | 
 |  | 
 | // This must be included after windows.h | 
 | #include <bcrypt.h> | 
 |  | 
 | #include "starboard/common/log.h" | 
 | #include "starboard/shared/win32/error_utils.h" | 
 |  | 
 | namespace sbwin32 = starboard::shared::win32; | 
 |  | 
 | void SbSystemGetRandomData(void* out_buffer, int buffer_size) { | 
 |   // Note: this might not be secure before Windows 10, as | 
 |   // BCRYPT_RNG_DUAL_EC_ALGORITHM might be used.  See: | 
 |   // https://msdn.microsoft.com/en-us/library/windows/desktop/aa375534%28v=vs.85%29.aspx | 
 |   // "Windows 10:  Beginning with Windows 10, the dual elliptic curve random | 
 |   // number generator algorithm has been removed. Existing uses of this | 
 |   // algorithm will continue to work; however, the random number generator is | 
 |   // based on the AES counter mode specified in the NIST SP 800-90 standard. New | 
 |   // code should use BCRYPT_RNG_ALGORITHM, and it is recommended that existing | 
 |   // code be changed to use BCRYPT_RNG_ALGORITHM." | 
 |   NTSTATUS status = | 
 |       BCryptGenRandom(nullptr, reinterpret_cast<PUCHAR>(out_buffer), | 
 |                       buffer_size, BCRYPT_USE_SYSTEM_PREFERRED_RNG); | 
 |   SB_DCHECK(status == 0) << "Error while calling CryptGenRandom: " | 
 |                          << sbwin32::Win32ErrorCode(GetLastError()); | 
 | } |