| /*############################################################################ |
| # Copyright 2016 Intel Corporation |
| # |
| # 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 EPID_COMMON_SRC_MEMORY_H_ |
| #define EPID_COMMON_SRC_MEMORY_H_ |
| |
| #include <stdlib.h> |
| #include <string.h> |
| |
| /*! |
| * \file |
| * \brief Memory access interface. |
| * \addtogroup EpidCommon |
| * @{ |
| */ |
| |
| /// When enabled secrets are wiped out from the memory by EpidFree |
| #define EPID_ENABLE_EPID_ZERO_MEMORY_ON_FREE |
| |
| /// Clear information stored in block of memory pointer to by ptr |
| /*! |
| |
| \warning |
| This function may be optimized away by some compilers. If it is, you |
| should consider using a compiler or operating system specific memory |
| sanitization function (e.g. memcpy_s or SecureZeroMemory). |
| |
| \param[in] ptr |
| pointer to memory block |
| \param[in] size |
| number of bytes to clear |
| */ |
| void EpidZeroMemory(void* ptr, size_t size); |
| |
| /// Allocates memory of size bytes |
| /*! |
| The content of memory is initialized with zeros. |
| Memory must be freed with EpidFree function. |
| |
| \param[in] size |
| number of bytes to allocate |
| |
| \returns pointer to allocated memory. |
| */ |
| void* EpidAlloc(size_t size); |
| |
| /// Reallocates memory allocated by EpidAlloc |
| /*! |
| In case of error NULL pointer is returned and input memory block |
| is not changed. |
| Memory must be freed with EpidFree function. |
| |
| \param[in] ptr |
| pointer to memory block to reallocate |
| \param[in] new_size |
| number of bytes to reallocate for |
| |
| \returns pointer to allocated memory. |
| */ |
| void* EpidRealloc(void* ptr, size_t new_size); |
| |
| /// Frees memory allocated by EpidAlloc |
| /*! |
| Clears information stored in the block of memory. |
| |
| \param[in] ptr |
| pointer to allocated memory block |
| */ |
| void EpidFree(void* ptr); |
| |
| #if !defined(SAFE_ALLOC) |
| /// Allocates zero initalized block of memory |
| #define SAFE_ALLOC(size) EpidAlloc(size); |
| #endif // !defined(SAFE_ALLOC) |
| #if !defined(SAFE_FREE) |
| /// Deallocates space allocated by SAFE_ALLOC() and nulls pointer |
| #define SAFE_FREE(ptr) \ |
| { \ |
| if (NULL != (ptr)) { \ |
| EpidFree(ptr); \ |
| (ptr) = NULL; \ |
| } \ |
| } |
| #endif // !defined(SAFE_FREE) |
| |
| #if !defined(SAFE_REALLOC) |
| /// Changes the size of the memory block pointed to by ptr |
| #define SAFE_REALLOC(ptr, size) EpidRealloc((ptr), (size)) |
| #endif // !defined(SAFE_REALLOC) |
| |
| /// Copies bytes between buffers with security ehancements |
| /*! |
| Copies count bytes from src to dest. If the source and destination |
| overlap, the behavior is undefined. |
| |
| \param[out] dest |
| pointer to the object to copy to |
| \param[in] destsz |
| max number of bytes to modify in the destination (typically the size |
| of the destination object) |
| \param[in] src |
| pointer to the object to copy from |
| \param[in] count |
| number of bytes to copy |
| |
| \returns zero on success and non-zero value on error. |
| */ |
| int memcpy_S(void* dest, size_t destsz, void const* src, size_t count); |
| |
| /*! @} */ |
| #endif // EPID_COMMON_SRC_MEMORY_H_ |