diff --git a/programs/pkey/rsa_sign_pss.c b/programs/pkey/rsa_sign_pss.c new file mode 100644 index 000000000..05fa1c489 --- /dev/null +++ b/programs/pkey/rsa_sign_pss.c @@ -0,0 +1,125 @@ +/* + * RSASSA-PSS/SHA-1 signature creation 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/havege.h" +#include "polarssl/md.h" +#include "polarssl/rsa.h" +#include "polarssl/sha1.h" +#include "polarssl/x509.h" + +int main( int argc, char *argv[] ) +{ + FILE *f; + int ret; + rsa_context rsa; + havege_state hs; + unsigned char hash[20]; + unsigned char buf[512]; + char filename[512]; + + ret = 1; + + if( argc != 3 ) + { + printf( "usage: rsa_sign_pss \n" ); + +#ifdef WIN32 + printf( "\n" ); +#endif + + goto exit; + } + + printf( "\n . Reading private key from '%s'", argv[1] ); + fflush( stdout ); + + havege_init( &hs ); + rsa_init( &rsa, RSA_PKCS_V21, POLARSSL_MD_SHA1 ); + + if( ( ret = x509parse_keyfile( &rsa, argv[1], "" ) ) != 0 ) + { + ret = 1; + printf( " failed\n ! Could not open '%s'\n", argv[1] ); + goto exit; + } + + /* + * Compute the SHA-1 hash of the input file, + * then calculate the RSA signature of the hash. + */ + printf( "\n . Generating the RSA/SHA-1 signature" ); + fflush( stdout ); + + if( ( ret = sha1_file( argv[2], hash ) ) != 0 ) + { + printf( " failed\n ! Could not open or read %s\n\n", argv[2] ); + goto exit; + } + + if( ( ret = rsa_pkcs1_sign( &rsa, havege_rand, &hs, RSA_PRIVATE, SIG_RSA_SHA1, + 20, hash, buf ) ) != 0 ) + { + printf( " failed\n ! rsa_pkcs1_sign returned %d\n\n", ret ); + goto exit; + } + + /* + * Write the signature into -sig.txt + */ + snprintf( filename, 512, "%s.sig", argv[2] ); + + if( ( f = fopen( filename, "wb+" ) ) == NULL ) + { + ret = 1; + printf( " failed\n ! Could not create %s\n\n", filename ); + goto exit; + } + + if( fwrite( buf, 1, rsa.len, f ) != (size_t) rsa.len ) + { + printf( "failed\n ! fwrite failed\n\n" ); + goto exit; + } + + fclose( f ); + + printf( "\n . Done (created \"%s\")\n\n", filename ); + +exit: + +#ifdef WIN32 + printf( " + Press Enter to exit this program.\n" ); + fflush( stdout ); getchar(); +#endif + + return( ret ); +} diff --git a/programs/pkey/rsa_verify_pss.c b/programs/pkey/rsa_verify_pss.c new file mode 100644 index 000000000..1fb20d8ed --- /dev/null +++ b/programs/pkey/rsa_verify_pss.c @@ -0,0 +1,125 @@ +/* + * RSASSA-PSS/SHA-1 signature verification 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/md.h" +#include "polarssl/pem.h" +#include "polarssl/rsa.h" +#include "polarssl/sha1.h" +#include "polarssl/x509.h" + +int main( int argc, char *argv[] ) +{ + FILE *f; + int ret, i; + rsa_context rsa; + unsigned char hash[20]; + unsigned char buf[512]; + char filename[512]; + + ret = 1; + if( argc != 3 ) + { + printf( "usage: rsa_verify_pss \n" ); + +#ifdef WIN32 + printf( "\n" ); +#endif + + goto exit; + } + + printf( "\n . Reading public key from '%s'", argv[1] ); + fflush( stdout ); + + rsa_init( &rsa, RSA_PKCS_V21, POLARSSL_MD_SHA1 ); + + if( ( ret = x509parse_public_keyfile( &rsa, argv[1] ) ) != 0 ) + { + printf( " failed\n ! x509parse_public_key returned %d\n\n", ret ); + goto exit; + } + + /* + * Extract the RSA signature from the text file + */ + ret = 1; + snprintf( filename, 512, "%s.sig", argv[2] ); + + if( ( f = fopen( filename, "rb" ) ) == NULL ) + { + printf( "\n ! Could not open %s\n\n", filename ); + goto exit; + } + + i = fread( buf, 1, rsa.len, f ); + + fclose( f ); + + if( i != rsa.len ) + { + printf( "\n ! Invalid RSA signature format\n\n" ); + goto exit; + } + + /* + * Compute the SHA-1 hash of the input file and compare + * it with the hash decrypted from the RSA signature. + */ + printf( "\n . Verifying the RSA/SHA-1 signature" ); + fflush( stdout ); + + if( ( ret = sha1_file( argv[2], hash ) ) != 0 ) + { + printf( " failed\n ! Could not open or read %s\n\n", argv[2] ); + goto exit; + } + + if( ( ret = rsa_pkcs1_verify( &rsa, RSA_PUBLIC, SIG_RSA_SHA1, + 20, hash, buf ) ) != 0 ) + { + printf( " failed\n ! rsa_pkcs1_verify returned %d\n\n", ret ); + goto exit; + } + + printf( "\n . OK (the decrypted SHA-1 hash matches)\n\n" ); + + ret = 0; + +exit: + +#ifdef WIN32 + printf( " + Press Enter to exit this program.\n" ); + fflush( stdout ); getchar(); +#endif + + return( ret ); +}