• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Simple MPI demonstration program
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_BIGNUM_C) && defined(MBEDTLS_FS_IO)
25 #include "mbedtls/bignum.h"
26 
27 #include <stdio.h>
28 #endif
29 
30 #if !defined(MBEDTLS_BIGNUM_C) || !defined(MBEDTLS_FS_IO)
main(void)31 int main(void)
32 {
33     mbedtls_printf("MBEDTLS_BIGNUM_C and/or MBEDTLS_FS_IO not defined.\n");
34     mbedtls_exit(0);
35 }
36 #else
37 
38 
main(void)39 int main(void)
40 {
41     int ret = 1;
42     int exit_code = MBEDTLS_EXIT_FAILURE;
43     mbedtls_mpi E, P, Q, N, H, D, X, Y, Z;
44 
45     mbedtls_mpi_init(&E); mbedtls_mpi_init(&P); mbedtls_mpi_init(&Q); mbedtls_mpi_init(&N);
46     mbedtls_mpi_init(&H); mbedtls_mpi_init(&D); mbedtls_mpi_init(&X); mbedtls_mpi_init(&Y);
47     mbedtls_mpi_init(&Z);
48 
49     MBEDTLS_MPI_CHK(mbedtls_mpi_read_string(&P, 10, "2789"));
50     MBEDTLS_MPI_CHK(mbedtls_mpi_read_string(&Q, 10, "3203"));
51     MBEDTLS_MPI_CHK(mbedtls_mpi_read_string(&E, 10,  "257"));
52     MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&N, &P, &Q));
53 
54     mbedtls_printf("\n  Public key:\n\n");
55     MBEDTLS_MPI_CHK(mbedtls_mpi_write_file("  N = ", &N, 10, NULL));
56     MBEDTLS_MPI_CHK(mbedtls_mpi_write_file("  E = ", &E, 10, NULL));
57 
58     mbedtls_printf("\n  Private key:\n\n");
59     MBEDTLS_MPI_CHK(mbedtls_mpi_write_file("  P = ", &P, 10, NULL));
60     MBEDTLS_MPI_CHK(mbedtls_mpi_write_file("  Q = ", &Q, 10, NULL));
61 
62 #if defined(MBEDTLS_GENPRIME)
63     MBEDTLS_MPI_CHK(mbedtls_mpi_sub_int(&P, &P, 1));
64     MBEDTLS_MPI_CHK(mbedtls_mpi_sub_int(&Q, &Q, 1));
65     MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&H, &P, &Q));
66     MBEDTLS_MPI_CHK(mbedtls_mpi_inv_mod(&D, &E, &H));
67 
68     mbedtls_mpi_write_file("  D = E^-1 mod (P-1)*(Q-1) = ",
69                            &D, 10, NULL);
70 #else
71     mbedtls_printf("\nTest skipped (MBEDTLS_GENPRIME not defined).\n\n");
72 #endif
73     MBEDTLS_MPI_CHK(mbedtls_mpi_read_string(&X, 10, "55555"));
74     MBEDTLS_MPI_CHK(mbedtls_mpi_exp_mod(&Y, &X, &E, &N, NULL));
75     MBEDTLS_MPI_CHK(mbedtls_mpi_exp_mod(&Z, &Y, &D, &N, NULL));
76 
77     mbedtls_printf("\n  RSA operation:\n\n");
78     MBEDTLS_MPI_CHK(mbedtls_mpi_write_file("  X (plaintext)  = ", &X, 10, NULL));
79     MBEDTLS_MPI_CHK(mbedtls_mpi_write_file("  Y (ciphertext) = X^E mod N = ", &Y, 10, NULL));
80     MBEDTLS_MPI_CHK(mbedtls_mpi_write_file("  Z (decrypted)  = Y^D mod N = ", &Z, 10, NULL));
81     mbedtls_printf("\n");
82 
83     exit_code = MBEDTLS_EXIT_SUCCESS;
84 
85 cleanup:
86     mbedtls_mpi_free(&E); mbedtls_mpi_free(&P); mbedtls_mpi_free(&Q); mbedtls_mpi_free(&N);
87     mbedtls_mpi_free(&H); mbedtls_mpi_free(&D); mbedtls_mpi_free(&X); mbedtls_mpi_free(&Y);
88     mbedtls_mpi_free(&Z);
89 
90     if (exit_code != MBEDTLS_EXIT_SUCCESS) {
91         mbedtls_printf("\nAn error occurred.\n");
92     }
93 
94     mbedtls_exit(exit_code);
95 }
96 #endif /* MBEDTLS_BIGNUM_C && MBEDTLS_FS_IO */
97