blob: 1a57de939305989ade3da82920aca4af051e256b [file] [log] [blame]
Andres Amaya Garcia614d9c02017-10-24 21:27:43 +01001/*
Andres Amaya Garcia904e1ef2018-04-17 09:16:30 -05002 * Common and shared functions used by multiple modules in the Mbed TLS
3 * library.
Andres Amaya Garcia614d9c02017-10-24 21:27:43 +01004 *
Andres Amaya Garcia757cd722018-03-08 21:25:25 +00005 * Copyright (C) 2018, Arm Limited, All Rights Reserved
Andres Amaya Garcia614d9c02017-10-24 21:27:43 +01006 * SPDX-License-Identifier: Apache-2.0
7 *
8 * Licensed under the Apache License, Version 2.0 (the "License"); you may
9 * not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
16 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 *
Andres Amaya Garcia757cd722018-03-08 21:25:25 +000020 * This file is part of Mbed TLS (https://tls.mbed.org)
Andres Amaya Garcia614d9c02017-10-24 21:27:43 +010021 */
22
Andres Amaya Garciab1262a32017-10-25 09:51:14 +010023#if !defined(MBEDTLS_CONFIG_FILE)
24#include "mbedtls/config.h"
25#else
26#include MBEDTLS_CONFIG_FILE
27#endif
28
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050029#include "mbedtls/platform_util.h"
Andres Amaya Garcia614d9c02017-10-24 21:27:43 +010030
31#include <stddef.h>
Andres Amaya Garciaecd18912017-10-26 22:43:41 +010032#include <string.h>
Andres Amaya Garcia614d9c02017-10-24 21:27:43 +010033
Andres Amaya Garcia904e1ef2018-04-17 09:16:30 -050034#if !defined(MBEDTLS_PLATFORM_ZEROIZE_ALT)
Andres Amaya Garciaecd18912017-10-26 22:43:41 +010035/*
36 * This implementation should never be optimized out by the compiler
37 *
Andres Amaya Garcia904e1ef2018-04-17 09:16:30 -050038 * This implementation for mbedtls_platform_zeroize() was inspired from Colin
39 * Percival's blog article at:
Andres Amaya Garcia1e8ea5f2018-03-08 20:46:39 +000040 *
41 * http://www.daemonology.net/blog/2014-09-04-how-to-zero-a-buffer.html
42 *
43 * It uses a volatile function pointer to the standard memset(). Because the
44 * pointer is volatile the compiler expects it to change at
45 * any time and will not optimize out the call that could potentially perform
46 * other operations on the input buffer instead of just setting it to 0.
47 * Nevertheless, as pointed out by davidtgoldblatt on Hacker News
48 * (refer to http://www.daemonology.net/blog/2014-09-05-erratum.html for
49 * details), optimizations of the following form are still possible:
Andres Amaya Garciaecd18912017-10-26 22:43:41 +010050 *
51 * if( memset_func != memset )
52 * memset_func( buf, 0, len );
53 *
Andres Amaya Garcia904e1ef2018-04-17 09:16:30 -050054 * Note that it is extremely difficult to guarantee that
55 * mbedtls_platform_zeroize() will not be optimized out by aggressive compilers
56 * in a portable way. For this reason, Mbed TLS also provides the configuration
57 * option MBEDTLS_PLATFORM_ZEROIZE_ALT, which allows users to configure
58 * mbedtls_platform_zeroize() to use a suitable implementation for their
59 * platform and needs.
Andres Amaya Garciaecd18912017-10-26 22:43:41 +010060 */
61static void * (* const volatile memset_func)( void *, int, size_t ) = memset;
62
Andres Amaya Garcia904e1ef2018-04-17 09:16:30 -050063void mbedtls_platform_zeroize( void *buf, size_t len )
Andres Amaya Garcia614d9c02017-10-24 21:27:43 +010064{
Andres Amaya Garciaecd18912017-10-26 22:43:41 +010065 memset_func( buf, 0, len );
Andres Amaya Garcia614d9c02017-10-24 21:27:43 +010066}
Andres Amaya Garcia904e1ef2018-04-17 09:16:30 -050067#endif /* MBEDTLS_PLATFORM_ZEROIZE_ALT */