diff --git a/components/expat/component.mk b/components/expat/component.mk index 5cd890ef4e..851f6a8c38 100644 --- a/components/expat/component.mk +++ b/components/expat/component.mk @@ -5,7 +5,7 @@ COMPONENT_ADD_INCLUDEDIRS := expat/expat/lib port/include COMPONENT_SRCDIRS := expat/expat/lib port -CFLAGS += -DHAVE_EXPAT_CONFIG_H -DXML_POOR_ENTROPY +CFLAGS += -DHAVE_EXPAT_CONFIG_H -DHAVE_GETRANDOM # Temporary suppress "fallthrough" warnings until they are fixed in expat repo CFLAGS += -Wno-implicit-fallthrough diff --git a/components/newlib/platform_include/sys/random.h b/components/newlib/platform_include/sys/random.h new file mode 100644 index 0000000000..afbf4dfd03 --- /dev/null +++ b/components/newlib/platform_include/sys/random.h @@ -0,0 +1,30 @@ +// Copyright 2018 Espressif Systems (Shanghai) PTE LTD +// +// 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. + +#ifndef __SYS_RANDOM__ +#define __SYS_RANDOM__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +ssize_t getrandom(void *buf, size_t buflen, unsigned int flags); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif //__SYS_RANDOM__ diff --git a/components/newlib/random.c b/components/newlib/random.c new file mode 100644 index 0000000000..47ebb23ca8 --- /dev/null +++ b/components/newlib/random.c @@ -0,0 +1,52 @@ +// Copyright 2018 Espressif Systems (Shanghai) PTE LTD +// +// 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 +#include +#include +#include +#include +#include "esp_system.h" +#include "esp_log.h" + +static const char *TAG = "RANDOM"; + +ssize_t getrandom(void *buf, size_t buflen, unsigned int flags) +{ + // Flags are ignored because: + // - esp_random is non-blocking so it works for both blocking and non-blocking calls, + // - don't have opportunity so set som other source of entropy. + + ESP_LOGD(TAG, "getrandom(buf=0x%x, buflen=%d, flags=%u)", (int) buf, buflen, flags); + + if (buf == NULL) { + errno = EFAULT; + ESP_LOGD(TAG, "getrandom returns -1 (EFAULT)"); + return -1; + } + + uint8_t *dst = (uint8_t *) buf; + ssize_t ret = 0; + + while (ret < buflen) { + const uint32_t random = esp_random(); + const int needed = buflen - ret; + const int copy_len = MIN(sizeof(random), needed); + memcpy(dst + ret, &random, copy_len); + ret += copy_len; + } + + ESP_LOGD(TAG, "getrandom returns %d", ret); + return ret; +}