blob: f3a40a88a5798d55a9c1801b4ce24e158ec98665 [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
Dave Rodgman7ff79652023-11-03 12:04:52 +00005 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
Paul Bakker7bc05ff2011-08-09 10:30:36 +00006 */
7
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008#if !defined(MBEDTLS_CONFIG_FILE)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +00009#include "mbedtls/config.h"
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020010#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020011#include MBEDTLS_CONFIG_FILE
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020012#endif
Paul Bakker7bc05ff2011-08-09 10:30:36 +000013
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000014#include "mbedtls/platform.h"
Rich Evansf90016a2015-01-19 14:26:37 +000015
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020016#if defined(MBEDTLS_BIGNUM_C) && defined(MBEDTLS_RSA_C) && \
17 defined(MBEDTLS_FS_IO) && defined(MBEDTLS_ENTROPY_C) && \
18 defined(MBEDTLS_CTR_DRBG_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000019#include "mbedtls/rsa.h"
20#include "mbedtls/entropy.h"
21#include "mbedtls/ctr_drbg.h"
Paul Bakker7bc05ff2011-08-09 10:30:36 +000022
Rich Evans18b78c72015-02-11 14:06:19 +000023#include <string.h>
Simon Butcher6b46c622016-04-12 13:25:08 +010024
Rich Evans18b78c72015-02-11 14:06:19 +000025#endif
26
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020027#if !defined(MBEDTLS_BIGNUM_C) || !defined(MBEDTLS_RSA_C) || \
28 !defined(MBEDTLS_FS_IO) || !defined(MBEDTLS_ENTROPY_C) || \
29 !defined(MBEDTLS_CTR_DRBG_C)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010030int main(void)
Paul Bakker7bc05ff2011-08-09 10:30:36 +000031{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020032 mbedtls_printf("MBEDTLS_BIGNUM_C and/or MBEDTLS_RSA_C and/or "
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010033 "MBEDTLS_FS_IO and/or MBEDTLS_ENTROPY_C and/or "
34 "MBEDTLS_CTR_DRBG_C not defined.\n");
35 mbedtls_exit(0);
Paul Bakker7bc05ff2011-08-09 10:30:36 +000036}
37#else
Simon Butcher63cb97e2018-12-06 17:43:31 +000038
Simon Butcher63cb97e2018-12-06 17:43:31 +000039
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010040int main(int argc, char *argv[])
Paul Bakker7bc05ff2011-08-09 10:30:36 +000041{
42 FILE *f;
Andres Amaya Garcia7fe4edf2018-04-30 22:07:15 +010043 int ret = 1;
44 int exit_code = MBEDTLS_EXIT_FAILURE;
Gilles Peskinea5fc9392020-04-14 19:34:19 +020045 unsigned c;
Paul Bakker7bc05ff2011-08-09 10:30:36 +000046 size_t i;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020047 mbedtls_rsa_context rsa;
Hanno Beckerccef18c2017-08-23 06:46:45 +010048 mbedtls_mpi N, P, Q, D, E, DP, DQ, QP;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020049 mbedtls_entropy_context entropy;
50 mbedtls_ctr_drbg_context ctr_drbg;
Paul Bakker7bc05ff2011-08-09 10:30:36 +000051 unsigned char result[1024];
52 unsigned char buf[512];
Paul Bakker548957d2013-08-30 10:30:02 +020053 const char *pers = "rsa_decrypt";
Paul Bakker7bc05ff2011-08-09 10:30:36 +000054 ((void) argv);
55
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010056 memset(result, 0, sizeof(result));
Paul Bakker310c25e2011-12-04 17:06:56 +000057
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010058 if (argc != 1) {
59 mbedtls_printf("usage: rsa_decrypt\n");
Paul Bakker7bc05ff2011-08-09 10:30:36 +000060
Paul Bakkercce9d772011-11-18 14:26:47 +000061#if defined(_WIN32)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010062 mbedtls_printf("\n");
Paul Bakker7bc05ff2011-08-09 10:30:36 +000063#endif
64
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010065 mbedtls_exit(exit_code);
Paul Bakker7bc05ff2011-08-09 10:30:36 +000066 }
67
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010068 mbedtls_printf("\n . Seeding the random number generator...");
69 fflush(stdout);
Paul Bakker548957d2013-08-30 10:30:02 +020070
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010071 mbedtls_rsa_init(&rsa, MBEDTLS_RSA_PKCS_V15, 0);
72 mbedtls_ctr_drbg_init(&ctr_drbg);
73 mbedtls_entropy_init(&entropy);
74 mbedtls_mpi_init(&N); mbedtls_mpi_init(&P); mbedtls_mpi_init(&Q);
75 mbedtls_mpi_init(&D); mbedtls_mpi_init(&E); mbedtls_mpi_init(&DP);
76 mbedtls_mpi_init(&DQ); mbedtls_mpi_init(&QP);
Simon Butcher6b46c622016-04-12 13:25:08 +010077
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010078 ret = mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func,
79 &entropy, (const unsigned char *) pers,
80 strlen(pers));
81 if (ret != 0) {
82 mbedtls_printf(" failed\n ! mbedtls_ctr_drbg_seed returned %d\n",
83 ret);
Paul Bakker548957d2013-08-30 10:30:02 +020084 goto exit;
85 }
86
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010087 mbedtls_printf("\n . Reading private key from rsa_priv.txt");
88 fflush(stdout);
Paul Bakker7bc05ff2011-08-09 10:30:36 +000089
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010090 if ((f = fopen("rsa_priv.txt", "rb")) == NULL) {
91 mbedtls_printf(" failed\n ! Could not open rsa_priv.txt\n" \
92 " ! Please run rsa_genkey first\n\n");
Paul Bakker7bc05ff2011-08-09 10:30:36 +000093 goto exit;
94 }
95
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010096 if ((ret = mbedtls_mpi_read_file(&N, 16, f)) != 0 ||
97 (ret = mbedtls_mpi_read_file(&E, 16, f)) != 0 ||
98 (ret = mbedtls_mpi_read_file(&D, 16, f)) != 0 ||
99 (ret = mbedtls_mpi_read_file(&P, 16, f)) != 0 ||
100 (ret = mbedtls_mpi_read_file(&Q, 16, f)) != 0 ||
101 (ret = mbedtls_mpi_read_file(&DP, 16, f)) != 0 ||
102 (ret = mbedtls_mpi_read_file(&DQ, 16, f)) != 0 ||
103 (ret = mbedtls_mpi_read_file(&QP, 16, f)) != 0) {
104 mbedtls_printf(" failed\n ! mbedtls_mpi_read_file returned %d\n\n",
105 ret);
106 fclose(f);
Paul Bakker7bc05ff2011-08-09 10:30:36 +0000107 goto exit;
108 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100109 fclose(f);
Paul Bakker7bc05ff2011-08-09 10:30:36 +0000110
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100111 if ((ret = mbedtls_rsa_import(&rsa, &N, &P, &Q, &D, &E)) != 0) {
112 mbedtls_printf(" failed\n ! mbedtls_rsa_import returned %d\n\n",
113 ret);
Hanno Beckerccef18c2017-08-23 06:46:45 +0100114 goto exit;
115 }
116
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100117 if ((ret = mbedtls_rsa_complete(&rsa)) != 0) {
118 mbedtls_printf(" failed\n ! mbedtls_rsa_complete returned %d\n\n",
119 ret);
Hanno Beckerccef18c2017-08-23 06:46:45 +0100120 goto exit;
121 }
122
Paul Bakker7bc05ff2011-08-09 10:30:36 +0000123 /*
124 * Extract the RSA encrypted value from the text file
125 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100126 if ((f = fopen("result-enc.txt", "rb")) == NULL) {
127 mbedtls_printf("\n ! Could not open %s\n\n", "result-enc.txt");
Paul Bakker7bc05ff2011-08-09 10:30:36 +0000128 goto exit;
129 }
130
131 i = 0;
132
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100133 while (fscanf(f, "%02X", (unsigned int *) &c) > 0 &&
134 i < (int) sizeof(buf)) {
Paul Bakker7bc05ff2011-08-09 10:30:36 +0000135 buf[i++] = (unsigned char) c;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100136 }
Paul Bakker7bc05ff2011-08-09 10:30:36 +0000137
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100138 fclose(f);
Paul Bakker7bc05ff2011-08-09 10:30:36 +0000139
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100140 if (i != rsa.len) {
141 mbedtls_printf("\n ! Invalid RSA signature format\n\n");
Paul Bakker7bc05ff2011-08-09 10:30:36 +0000142 goto exit;
143 }
144
145 /*
146 * Decrypt the encrypted RSA data and print the result.
147 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100148 mbedtls_printf("\n . Decrypting the encrypted data");
149 fflush(stdout);
Paul Bakker7bc05ff2011-08-09 10:30:36 +0000150
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100151 ret = mbedtls_rsa_pkcs1_decrypt(&rsa, mbedtls_ctr_drbg_random,
152 &ctr_drbg, MBEDTLS_RSA_PRIVATE, &i,
153 buf, result, 1024);
154 if (ret != 0) {
155 mbedtls_printf(" failed\n ! mbedtls_rsa_pkcs1_decrypt returned %d\n\n",
156 ret);
Paul Bakker7bc05ff2011-08-09 10:30:36 +0000157 goto exit;
158 }
159
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100160 mbedtls_printf("\n . OK\n\n");
Paul Bakker7bc05ff2011-08-09 10:30:36 +0000161
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100162 mbedtls_printf("The decrypted result is: '%s'\n\n", result);
Paul Bakker7bc05ff2011-08-09 10:30:36 +0000163
Andres Amaya Garcia7fe4edf2018-04-30 22:07:15 +0100164 exit_code = MBEDTLS_EXIT_SUCCESS;
165
Paul Bakker7bc05ff2011-08-09 10:30:36 +0000166exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100167 mbedtls_ctr_drbg_free(&ctr_drbg);
168 mbedtls_entropy_free(&entropy);
169 mbedtls_rsa_free(&rsa);
170 mbedtls_mpi_free(&N); mbedtls_mpi_free(&P); mbedtls_mpi_free(&Q);
171 mbedtls_mpi_free(&D); mbedtls_mpi_free(&E); mbedtls_mpi_free(&DP);
172 mbedtls_mpi_free(&DQ); mbedtls_mpi_free(&QP);
Paul Bakker7bc05ff2011-08-09 10:30:36 +0000173
Paul Bakkercce9d772011-11-18 14:26:47 +0000174#if defined(_WIN32)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100175 mbedtls_printf(" + Press Enter to exit this program.\n");
176 fflush(stdout); getchar();
Paul Bakker7bc05ff2011-08-09 10:30:36 +0000177#endif
178
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100179 mbedtls_exit(exit_code);
Paul Bakker7bc05ff2011-08-09 10:30:36 +0000180}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200181#endif /* MBEDTLS_BIGNUM_C && MBEDTLS_RSA_C && MBEDTLS_FS_IO */