Fix for x86_64 build fail
[platform/upstream/connectedhomeip.git] / src / platform / ESP32 / Entropy.cpp
1 /*
2  *
3  *    Copyright (c) 2020 Project CHIP Authors
4  *    Copyright (c) 2018 Nest Labs, Inc.
5  *    All rights reserved.
6  *
7  *    Licensed under the Apache License, Version 2.0 (the "License");
8  *    you may not use this file except in compliance with the License.
9  *    You may obtain a copy of the License at
10  *
11  *        http://www.apache.org/licenses/LICENSE-2.0
12  *
13  *    Unless required by applicable law or agreed to in writing, software
14  *    distributed under the License is distributed on an "AS IS" BASIS,
15  *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  *    See the License for the specific language governing permissions and
17  *    limitations under the License.
18  */
19
20 /**
21  *    @file
22  *          Provides implementations for the CHIP entropy sourcing functions
23  *          on the ESP32 platform.
24  */
25 /* this file behaves like a config.h, comes first */
26 #include <platform/internal/CHIPDeviceLayerInternal.h>
27
28 #include <support/crypto/CHIPRNG.h>
29
30 #include "esp_log.h"
31
32 using namespace ::chip;
33
34 namespace chip {
35 namespace DeviceLayer {
36 namespace Internal {
37
38 namespace {
39
40 int GetEntropy_ESP32(uint8_t * buf, size_t bufSize)
41 {
42     while (bufSize > 0)
43     {
44         union
45         {
46             uint32_t asInt;
47             uint8_t asBytes[sizeof(asInt)];
48         } rnd;
49
50         rnd.asInt = esp_random();
51
52         size_t n = chip::min(bufSize, sizeof(rnd.asBytes));
53
54         memcpy(buf, rnd.asBytes, n);
55
56         buf += n;
57         bufSize -= n;
58     }
59
60     return 0;
61 }
62
63 } // unnamed namespace
64
65 CHIP_ERROR InitEntropy()
66 {
67     CHIP_ERROR err;
68     unsigned int seed;
69
70     // Initialize the source used by Chip to get secure random data.
71     err = ::chip::Platform::Security::InitSecureRandomDataSource(GetEntropy_ESP32, 64, NULL, 0);
72     SuccessOrExit(err);
73
74     // Seed the standard rand() pseudo-random generator with data from the secure random source.
75     err = ::chip::Platform::Security::GetSecureRandomData((uint8_t *) &seed, sizeof(seed));
76     SuccessOrExit(err);
77     srand(seed);
78     ESP_LOGI(TAG, "srand seed set: %u", seed);
79
80 exit:
81     if (err != CHIP_NO_ERROR)
82     {
83         ESP_LOGE(TAG, "InitEntropy() failed: %s", ErrorStr(err));
84     }
85     return err;
86 }
87
88 } // namespace Internal
89 } // namespace DeviceLayer
90 } // namespace chip