1/** 2 * \brief Use and generate random data into a file via the CTR_DBRG based on AES 3 * 4 * Copyright The Mbed TLS Contributors 5 * SPDX-License-Identifier: Apache-2.0 6 * 7 * Licensed under the Apache License, Version 2.0 (the "License"); you may 8 * 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, WITHOUT 15 * 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#include "mbedtls/build_info.h" 21 22#include "mbedtls/platform.h" 23 24#if defined(MBEDTLS_CTR_DRBG_C) && defined(MBEDTLS_ENTROPY_C) && \ 25 defined(MBEDTLS_FS_IO) 26#include "mbedtls/entropy.h" 27#include "mbedtls/ctr_drbg.h" 28 29#include <stdio.h> 30#endif 31 32#if !defined(MBEDTLS_CTR_DRBG_C) || !defined(MBEDTLS_ENTROPY_C) || \ 33 !defined(MBEDTLS_FS_IO) 34int main(void) 35{ 36 mbedtls_printf("MBEDTLS_CTR_DRBG_C and/or MBEDTLS_ENTROPY_C and/or MBEDTLS_FS_IO not defined.\n"); 37 mbedtls_exit(0); 38} 39#else 40 41 42int main(int argc, char *argv[]) 43{ 44 FILE *f; 45 int i, k, ret = 1; 46 int exit_code = MBEDTLS_EXIT_FAILURE; 47 mbedtls_ctr_drbg_context ctr_drbg; 48 mbedtls_entropy_context entropy; 49 unsigned char buf[1024]; 50 51 mbedtls_ctr_drbg_init(&ctr_drbg); 52 53 if (argc < 2) { 54 mbedtls_fprintf(stderr, "usage: %s <output filename>\n", argv[0]); 55 mbedtls_exit(exit_code); 56 } 57 58 if ((f = fopen(argv[1], "wb+")) == NULL) { 59 mbedtls_printf("failed to open '%s' for writing.\n", argv[1]); 60 mbedtls_exit(exit_code); 61 } 62 63 mbedtls_entropy_init(&entropy); 64 ret = mbedtls_ctr_drbg_seed(&ctr_drbg, 65 mbedtls_entropy_func, 66 &entropy, 67 (const unsigned char *) "RANDOM_GEN", 68 10); 69 if (ret != 0) { 70 mbedtls_printf("failed in mbedtls_ctr_drbg_seed: %d\n", ret); 71 goto cleanup; 72 } 73 mbedtls_ctr_drbg_set_prediction_resistance(&ctr_drbg, MBEDTLS_CTR_DRBG_PR_OFF); 74 75#if defined(MBEDTLS_FS_IO) 76 ret = mbedtls_ctr_drbg_update_seed_file(&ctr_drbg, "seedfile"); 77 78 if (ret == MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR) { 79 mbedtls_printf("Failed to open seedfile. Generating one.\n"); 80 ret = mbedtls_ctr_drbg_write_seed_file(&ctr_drbg, "seedfile"); 81 if (ret != 0) { 82 mbedtls_printf("failed in mbedtls_ctr_drbg_write_seed_file: %d\n", ret); 83 goto cleanup; 84 } 85 } else if (ret != 0) { 86 mbedtls_printf("failed in mbedtls_ctr_drbg_update_seed_file: %d\n", ret); 87 goto cleanup; 88 } 89#endif 90 91 for (i = 0, k = 768; i < k; i++) { 92 ret = mbedtls_ctr_drbg_random(&ctr_drbg, buf, sizeof(buf)); 93 if (ret != 0) { 94 mbedtls_printf("failed!\n"); 95 goto cleanup; 96 } 97 98 fwrite(buf, 1, sizeof(buf), f); 99 100 mbedtls_printf("Generating %ldkb of data in file '%s'... %04.1f" \ 101 "%% done\r", 102 (long) (sizeof(buf) * k / 1024), 103 argv[1], 104 (100 * (float) (i + 1)) / k); 105 fflush(stdout); 106 } 107 108 exit_code = MBEDTLS_EXIT_SUCCESS; 109 110cleanup: 111 mbedtls_printf("\n"); 112 113 fclose(f); 114 mbedtls_ctr_drbg_free(&ctr_drbg); 115 mbedtls_entropy_free(&entropy); 116 117 mbedtls_exit(exit_code); 118} 119#endif /* MBEDTLS_CTR_DRBG_C && MBEDTLS_ENTROPY_C */ 120