• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)
main(void)34 int 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 
main(int argc,char * argv[])42 int 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 
110 cleanup:
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