blob: 418d5ea6492dd10c65ea8c0e471cedc1271bff72 [file] [log] [blame]
Paul Bakker7bc05ff2011-08-09 10:30:36 +00001/*
2 * RSA simple decryption program
3 *
Bence Szépkúti1e148272020-08-07 13:07:28 +02004 * Copyright The Mbed TLS Contributors
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +02005 * 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.
Paul Bakker7bc05ff2011-08-09 10:30:36 +000018 */
19
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020020#if !defined(MBEDTLS_CONFIG_FILE)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000021#include "mbedtls/config.h"
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020022#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020023#include MBEDTLS_CONFIG_FILE
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020024#endif
Paul Bakker7bc05ff2011-08-09 10:30:36 +000025
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000026#include "mbedtls/platform.h"
Rich Evansf90016a2015-01-19 14:26:37 +000027
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020028#if defined(MBEDTLS_BIGNUM_C) && defined(MBEDTLS_RSA_C) && \
29 defined(MBEDTLS_FS_IO) && defined(MBEDTLS_ENTROPY_C) && \
30 defined(MBEDTLS_CTR_DRBG_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000031#include "mbedtls/rsa.h"
32#include "mbedtls/entropy.h"
33#include "mbedtls/ctr_drbg.h"
Paul Bakker7bc05ff2011-08-09 10:30:36 +000034
Rich Evans18b78c72015-02-11 14:06:19 +000035#include <string.h>
Simon Butcher6b46c622016-04-12 13:25:08 +010036
Rich Evans18b78c72015-02-11 14:06:19 +000037#endif
38
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020039#if !defined(MBEDTLS_BIGNUM_C) || !defined(MBEDTLS_RSA_C) || \
40 !defined(MBEDTLS_FS_IO) || !defined(MBEDTLS_ENTROPY_C) || \
41 !defined(MBEDTLS_CTR_DRBG_C)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010042int main(void)
Paul Bakker7bc05ff2011-08-09 10:30:36 +000043{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020044 mbedtls_printf("MBEDTLS_BIGNUM_C and/or MBEDTLS_RSA_C and/or "
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010045 "MBEDTLS_FS_IO and/or MBEDTLS_ENTROPY_C and/or "
46 "MBEDTLS_CTR_DRBG_C not defined.\n");
47 mbedtls_exit(0);
Paul Bakker7bc05ff2011-08-09 10:30:36 +000048}
49#else
Simon Butcher63cb97e2018-12-06 17:43:31 +000050
Simon Butcher63cb97e2018-12-06 17:43:31 +000051
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010052int main(int argc, char *argv[])
Paul Bakker7bc05ff2011-08-09 10:30:36 +000053{
54 FILE *f;
Andres Amaya Garcia7fe4edf2018-04-30 22:07:15 +010055 int ret = 1;
56 int exit_code = MBEDTLS_EXIT_FAILURE;
Gilles Peskinea5fc9392020-04-14 19:34:19 +020057 unsigned c;
Paul Bakker7bc05ff2011-08-09 10:30:36 +000058 size_t i;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020059 mbedtls_rsa_context rsa;
Hanno Beckerccef18c2017-08-23 06:46:45 +010060 mbedtls_mpi N, P, Q, D, E, DP, DQ, QP;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020061 mbedtls_entropy_context entropy;
62 mbedtls_ctr_drbg_context ctr_drbg;
Paul Bakker7bc05ff2011-08-09 10:30:36 +000063 unsigned char result[1024];
64 unsigned char buf[512];
Paul Bakker548957d2013-08-30 10:30:02 +020065 const char *pers = "rsa_decrypt";
Paul Bakker7bc05ff2011-08-09 10:30:36 +000066 ((void) argv);
67
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010068 memset(result, 0, sizeof(result));
Paul Bakker310c25e2011-12-04 17:06:56 +000069
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010070 if (argc != 1) {
71 mbedtls_printf("usage: rsa_decrypt\n");
Paul Bakker7bc05ff2011-08-09 10:30:36 +000072
Paul Bakkercce9d772011-11-18 14:26:47 +000073#if defined(_WIN32)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010074 mbedtls_printf("\n");
Paul Bakker7bc05ff2011-08-09 10:30:36 +000075#endif
76
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010077 mbedtls_exit(exit_code);
Paul Bakker7bc05ff2011-08-09 10:30:36 +000078 }
79
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010080 mbedtls_printf("\n . Seeding the random number generator...");
81 fflush(stdout);
Paul Bakker548957d2013-08-30 10:30:02 +020082
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010083 mbedtls_rsa_init(&rsa, MBEDTLS_RSA_PKCS_V15, 0);
84 mbedtls_ctr_drbg_init(&ctr_drbg);
85 mbedtls_entropy_init(&entropy);
86 mbedtls_mpi_init(&N); mbedtls_mpi_init(&P); mbedtls_mpi_init(&Q);
87 mbedtls_mpi_init(&D); mbedtls_mpi_init(&E); mbedtls_mpi_init(&DP);
88 mbedtls_mpi_init(&DQ); mbedtls_mpi_init(&QP);
Simon Butcher6b46c622016-04-12 13:25:08 +010089
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010090 ret = mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func,
91 &entropy, (const unsigned char *) pers,
92 strlen(pers));
93 if (ret != 0) {
94 mbedtls_printf(" failed\n ! mbedtls_ctr_drbg_seed returned %d\n",
95 ret);
Paul Bakker548957d2013-08-30 10:30:02 +020096 goto exit;
97 }
98
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010099 mbedtls_printf("\n . Reading private key from rsa_priv.txt");
100 fflush(stdout);
Paul Bakker7bc05ff2011-08-09 10:30:36 +0000101
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100102 if ((f = fopen("rsa_priv.txt", "rb")) == NULL) {
103 mbedtls_printf(" failed\n ! Could not open rsa_priv.txt\n" \
104 " ! Please run rsa_genkey first\n\n");
Paul Bakker7bc05ff2011-08-09 10:30:36 +0000105 goto exit;
106 }
107
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100108 if ((ret = mbedtls_mpi_read_file(&N, 16, f)) != 0 ||
109 (ret = mbedtls_mpi_read_file(&E, 16, f)) != 0 ||
110 (ret = mbedtls_mpi_read_file(&D, 16, f)) != 0 ||
111 (ret = mbedtls_mpi_read_file(&P, 16, f)) != 0 ||
112 (ret = mbedtls_mpi_read_file(&Q, 16, f)) != 0 ||
113 (ret = mbedtls_mpi_read_file(&DP, 16, f)) != 0 ||
114 (ret = mbedtls_mpi_read_file(&DQ, 16, f)) != 0 ||
115 (ret = mbedtls_mpi_read_file(&QP, 16, f)) != 0) {
116 mbedtls_printf(" failed\n ! mbedtls_mpi_read_file returned %d\n\n",
117 ret);
118 fclose(f);
Paul Bakker7bc05ff2011-08-09 10:30:36 +0000119 goto exit;
120 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100121 fclose(f);
Paul Bakker7bc05ff2011-08-09 10:30:36 +0000122
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100123 if ((ret = mbedtls_rsa_import(&rsa, &N, &P, &Q, &D, &E)) != 0) {
124 mbedtls_printf(" failed\n ! mbedtls_rsa_import returned %d\n\n",
125 ret);
Hanno Beckerccef18c2017-08-23 06:46:45 +0100126 goto exit;
127 }
128
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100129 if ((ret = mbedtls_rsa_complete(&rsa)) != 0) {
130 mbedtls_printf(" failed\n ! mbedtls_rsa_complete returned %d\n\n",
131 ret);
Hanno Beckerccef18c2017-08-23 06:46:45 +0100132 goto exit;
133 }
134
Paul Bakker7bc05ff2011-08-09 10:30:36 +0000135 /*
136 * Extract the RSA encrypted value from the text file
137 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100138 if ((f = fopen("result-enc.txt", "rb")) == NULL) {
139 mbedtls_printf("\n ! Could not open %s\n\n", "result-enc.txt");
Paul Bakker7bc05ff2011-08-09 10:30:36 +0000140 goto exit;
141 }
142
143 i = 0;
144
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100145 while (fscanf(f, "%02X", (unsigned int *) &c) > 0 &&
146 i < (int) sizeof(buf)) {
Paul Bakker7bc05ff2011-08-09 10:30:36 +0000147 buf[i++] = (unsigned char) c;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100148 }
Paul Bakker7bc05ff2011-08-09 10:30:36 +0000149
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100150 fclose(f);
Paul Bakker7bc05ff2011-08-09 10:30:36 +0000151
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100152 if (i != rsa.len) {
153 mbedtls_printf("\n ! Invalid RSA signature format\n\n");
Paul Bakker7bc05ff2011-08-09 10:30:36 +0000154 goto exit;
155 }
156
157 /*
158 * Decrypt the encrypted RSA data and print the result.
159 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100160 mbedtls_printf("\n . Decrypting the encrypted data");
161 fflush(stdout);
Paul Bakker7bc05ff2011-08-09 10:30:36 +0000162
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100163 ret = mbedtls_rsa_pkcs1_decrypt(&rsa, mbedtls_ctr_drbg_random,
164 &ctr_drbg, MBEDTLS_RSA_PRIVATE, &i,
165 buf, result, 1024);
166 if (ret != 0) {
167 mbedtls_printf(" failed\n ! mbedtls_rsa_pkcs1_decrypt returned %d\n\n",
168 ret);
Paul Bakker7bc05ff2011-08-09 10:30:36 +0000169 goto exit;
170 }
171
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100172 mbedtls_printf("\n . OK\n\n");
Paul Bakker7bc05ff2011-08-09 10:30:36 +0000173
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100174 mbedtls_printf("The decrypted result is: '%s'\n\n", result);
Paul Bakker7bc05ff2011-08-09 10:30:36 +0000175
Andres Amaya Garcia7fe4edf2018-04-30 22:07:15 +0100176 exit_code = MBEDTLS_EXIT_SUCCESS;
177
Paul Bakker7bc05ff2011-08-09 10:30:36 +0000178exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100179 mbedtls_ctr_drbg_free(&ctr_drbg);
180 mbedtls_entropy_free(&entropy);
181 mbedtls_rsa_free(&rsa);
182 mbedtls_mpi_free(&N); mbedtls_mpi_free(&P); mbedtls_mpi_free(&Q);
183 mbedtls_mpi_free(&D); mbedtls_mpi_free(&E); mbedtls_mpi_free(&DP);
184 mbedtls_mpi_free(&DQ); mbedtls_mpi_free(&QP);
Paul Bakker7bc05ff2011-08-09 10:30:36 +0000185
Paul Bakkercce9d772011-11-18 14:26:47 +0000186#if defined(_WIN32)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100187 mbedtls_printf(" + Press Enter to exit this program.\n");
188 fflush(stdout); getchar();
Paul Bakker7bc05ff2011-08-09 10:30:36 +0000189#endif
190
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100191 mbedtls_exit(exit_code);
Paul Bakker7bc05ff2011-08-09 10:30:36 +0000192}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200193#endif /* MBEDTLS_BIGNUM_C && MBEDTLS_RSA_C && MBEDTLS_FS_IO */