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) 31int 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 39int 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 85cleanup: 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