From 7bc05ff4a6e039171de5fae45177c7353b354de7 Mon Sep 17 00:00:00 2001 From: Paul Bakker Date: Tue, 9 Aug 2011 10:30:36 +0000 Subject: [PATCH] - Added rsa_encrypt and rsa_decrypt example programs --- ChangeLog | 1 + programs/Makefile | 9 +++ programs/pkey/CMakeLists.txt | 8 +- programs/pkey/rsa_decrypt.c | 144 +++++++++++++++++++++++++++++++++ programs/pkey/rsa_encrypt.c | 150 +++++++++++++++++++++++++++++++++++ 5 files changed, 311 insertions(+), 1 deletion(-) create mode 100644 programs/pkey/rsa_decrypt.c create mode 100644 programs/pkey/rsa_encrypt.c diff --git a/ChangeLog b/ChangeLog index fc4b612cd..2a18a341a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,7 @@ PolarSSL ChangeLog = Version 1.0.0 released on 2011-07-27 Features * Expanded cipher layer with support for CFB128 and CTR mode + * Added rsa_encrypt and rsa_decrypt simple example programs. Changes * The generic cipher and message digest layer now have normal error diff --git a/programs/Makefile b/programs/Makefile index c6db5b15e..ceb06229b 100644 --- a/programs/Makefile +++ b/programs/Makefile @@ -14,6 +14,7 @@ APPS = aes/aescrypt2 aes/crypt_and_hash \ pkey/dh_genprime pkey/dh_server \ pkey/key_app \ pkey/mpi_demo pkey/rsa_genkey \ + pkey/rsa_decrypt pkey/rsa_encrypt \ pkey/rsa_sign pkey/rsa_verify \ pkey/rsa_sign_pss pkey/rsa_verify_pss \ ssl/ssl_client1 ssl/ssl_client2 \ @@ -95,6 +96,14 @@ pkey/rsa_verify_pss: pkey/rsa_verify_pss.c ../library/libpolarssl.a echo " CC pkey/rsa_verify_pss.c" $(CC) $(CFLAGS) $(OFLAGS) pkey/rsa_verify_pss.c $(LDFLAGS) -o $@ +pkey/rsa_decrypt: pkey/rsa_decrypt.c ../library/libpolarssl.a + echo " CC pkey/rsa_decrypt.c" + $(CC) $(CFLAGS) $(OFLAGS) pkey/rsa_decrypt.c $(LDFLAGS) -o $@ + +pkey/rsa_encrypt: pkey/rsa_encrypt.c ../library/libpolarssl.a + echo " CC pkey/rsa_encrypt.c" + $(CC) $(CFLAGS) $(OFLAGS) pkey/rsa_encrypt.c $(LDFLAGS) -o $@ + random/gen_random: random/gen_random.c ../library/libpolarssl.a echo " CC random/gen_random.c" $(CC) $(CFLAGS) $(OFLAGS) random/gen_random.c $(LDFLAGS) -o $@ diff --git a/programs/pkey/CMakeLists.txt b/programs/pkey/CMakeLists.txt index 5fc89f76b..124b197eb 100644 --- a/programs/pkey/CMakeLists.txt +++ b/programs/pkey/CMakeLists.txt @@ -28,6 +28,12 @@ target_link_libraries(rsa_sign_pss polarssl) add_executable(rsa_verify_pss rsa_verify_pss.c) target_link_libraries(rsa_verify_pss polarssl) -INSTALL(TARGETS dh_client dh_genprime dh_server key_app mpi_demo rsa_genkey rsa_sign rsa_verify +add_executable(rsa_encrypt rsa_encrypt.c) +target_link_libraries(rsa_encrypt polarssl) + +add_executable(rsa_decrypt rsa_decrypt.c) +target_link_libraries(rsa_decrypt polarssl) + +INSTALL(TARGETS dh_client dh_genprime dh_server key_app mpi_demo rsa_genkey rsa_sign rsa_verify rsa_encrypt rsa_decrypt DESTINATION "bin" PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) diff --git a/programs/pkey/rsa_decrypt.c b/programs/pkey/rsa_decrypt.c new file mode 100644 index 000000000..d00cdaae7 --- /dev/null +++ b/programs/pkey/rsa_decrypt.c @@ -0,0 +1,144 @@ +/* + * RSA simple decryption program + * + * Copyright (C) 2006-2010, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef _CRT_SECURE_NO_DEPRECATE +#define _CRT_SECURE_NO_DEPRECATE 1 +#endif + +#include +#include + +#include "polarssl/config.h" + +#include "polarssl/rsa.h" + +#if !defined(POLARSSL_BIGNUM_C) || !defined(POLARSSL_RSA_C) || \ + !defined(POLARSSL_FS_IO) +int main( void ) +{ + printf("POLARSSL_BIGNUM_C and/or POLARSSL_RSA_C and/or " + "POLARSSL_FS_IO not defined.\n"); + return( 0 ); +} +#else +int main( int argc, char *argv[] ) +{ + FILE *f; + int ret, c; + size_t i; + rsa_context rsa; + unsigned char result[1024]; + unsigned char buf[512]; + ((void) argv); + + ret = 1; + if( argc != 1 ) + { + printf( "usage: rsa_decrypt\n" ); + +#ifdef WIN32 + printf( "\n" ); +#endif + + goto exit; + } + + printf( "\n . Reading public key from rsa_pub.txt" ); + fflush( stdout ); + + if( ( f = fopen( "rsa_pub.txt", "rb" ) ) == NULL ) + { + printf( " failed\n ! Could not open rsa_pub.txt\n" \ + " ! Please run rsa_genkey first\n\n" ); + goto exit; + } + + rsa_init( &rsa, RSA_PKCS_V15, 0 ); + + if( ( ret = mpi_read_file( &rsa.N, 16, f ) ) != 0 || + ( ret = mpi_read_file( &rsa.E, 16, f ) ) != 0 ) + { + printf( " failed\n ! mpi_read_file returned %d\n\n", ret ); + goto exit; + } + + rsa.len = ( mpi_msb( &rsa.N ) + 7 ) >> 3; + + fclose( f ); + + /* + * Extract the RSA encrypted value from the text file + */ + ret = 1; + + if( ( f = fopen( "result-enc.txt", "rb" ) ) == NULL ) + { + printf( "\n ! Could not open %s\n\n", "result-enc.txt" ); + goto exit; + } + + i = 0; + + while( fscanf( f, "%02X", &c ) > 0 && + i < (int) sizeof( buf ) ) + buf[i++] = (unsigned char) c; + + fclose( f ); + + if( i != rsa.len ) + { + printf( "\n ! Invalid RSA signature format\n\n" ); + goto exit; + } + + /* + * Decrypt the encrypted RSA data and print the result. + */ + printf( "\n . Decrypting the encrypted data" ); + fflush( stdout ); + + if( ( ret = rsa_pkcs1_decrypt( &rsa, RSA_PUBLIC, &i, buf, result, + 1024 ) ) != 0 ) + { + printf( " failed\n ! rsa_pkcs1_decrypt returned %d\n\n", ret ); + goto exit; + } + + printf( "\n . OK\n\n" ); + + printf( "The decrypted result is: '%s'\n\n", result ); + + ret = 0; + +exit: + +#ifdef WIN32 + printf( " + Press Enter to exit this program.\n" ); + fflush( stdout ); getchar(); +#endif + + return( ret ); +} +#endif /* POLARSSL_BIGNUM_C && POLARSSL_RSA_C && POLARSSL_FS_IO */ diff --git a/programs/pkey/rsa_encrypt.c b/programs/pkey/rsa_encrypt.c new file mode 100644 index 000000000..71d7ea869 --- /dev/null +++ b/programs/pkey/rsa_encrypt.c @@ -0,0 +1,150 @@ +/* + * RSA simple data encryption program + * + * Copyright (C) 2006-2010, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef _CRT_SECURE_NO_DEPRECATE +#define _CRT_SECURE_NO_DEPRECATE 1 +#endif + +#include +#include + +#include "polarssl/config.h" + +#include "polarssl/rsa.h" +#include "polarssl/havege.h" + +#if !defined(POLARSSL_BIGNUM_C) || !defined(POLARSSL_RSA_C) || \ + !defined(POLARSSL_HAVEGE_C) || !defined(POLARSSL_FS_IO) +int main( void ) +{ + printf("POLARSSL_BIGNUM_C and/or POLARSSL_RSA_C and/or " + "POLARSSL_HAVEGE_C and/or POLARSSL_FS_IO not defined.\n"); + return( 0 ); +} +#else +int main( int argc, char *argv[] ) +{ + FILE *f; + int ret; + size_t i; + rsa_context rsa; + havege_state hs; + unsigned char input[1024]; + unsigned char buf[512]; + + havege_init( &hs ); + + ret = 1; + + if( argc != 2 ) + { + printf( "usage: rsa_encrypt \n" ); + +#ifdef WIN32 + printf( "\n" ); +#endif + + goto exit; + } + + printf( "\n . Reading private key from rsa_priv.txt" ); + fflush( stdout ); + + if( ( f = fopen( "rsa_priv.txt", "rb" ) ) == NULL ) + { + ret = 1; + printf( " failed\n ! Could not open rsa_priv.txt\n" \ + " ! Please run rsa_genkey first\n\n" ); + goto exit; + } + + rsa_init( &rsa, RSA_PKCS_V15, 0 ); + + if( ( ret = mpi_read_file( &rsa.N , 16, f ) ) != 0 || + ( ret = mpi_read_file( &rsa.E , 16, f ) ) != 0 || + ( ret = mpi_read_file( &rsa.D , 16, f ) ) != 0 || + ( ret = mpi_read_file( &rsa.P , 16, f ) ) != 0 || + ( ret = mpi_read_file( &rsa.Q , 16, f ) ) != 0 || + ( ret = mpi_read_file( &rsa.DP, 16, f ) ) != 0 || + ( ret = mpi_read_file( &rsa.DQ, 16, f ) ) != 0 || + ( ret = mpi_read_file( &rsa.QP, 16, f ) ) != 0 ) + { + printf( " failed\n ! mpi_read_file returned %d\n\n", ret ); + goto exit; + } + + rsa.len = ( mpi_msb( &rsa.N ) + 7 ) >> 3; + + fclose( f ); + + if( strlen( argv[1] ) > 100 ) + { + printf( " Input data larger than 100 characters.\n\n" ); + goto exit; + } + + memcpy( input, argv[1], strlen( argv[1] ) ); + + /* + * Calculate the RSA encryption of the hash. + */ + printf( "\n . Generating the RSA encrypted value" ); + fflush( stdout ); + + if( ( ret = rsa_pkcs1_encrypt( &rsa, havege_rand, &hs, RSA_PRIVATE, strlen( argv[1] ), input, buf ) ) != 0 ) + { + printf( " failed\n ! rsa_pkcs1_encrypt returned %d\n\n", ret ); + goto exit; + } + + /* + * Write the signature into result-enc.txt + */ + if( ( f = fopen( "result-enc.txt", "wb+" ) ) == NULL ) + { + ret = 1; + printf( " failed\n ! Could not create %s\n\n", "result-enc.txt" ); + goto exit; + } + + for( i = 0; i < rsa.len; i++ ) + fprintf( f, "%02X%s", buf[i], + ( i + 1 ) % 16 == 0 ? "\r\n" : " " ); + + fclose( f ); + + printf( "\n . Done (created \"%s\")\n\n", "result-enc.txt" ); + +exit: + +#ifdef WIN32 + printf( " + Press Enter to exit this program.\n" ); + fflush( stdout ); getchar(); +#endif + + return( ret ); +} +#endif /* POLARSSL_BIGNUM_C && POLARSSL_RSA_C && POLARSSL_HAVEGE_C && + POLARSSL_FS_IO */