[openssl-users] error making Private RSA

william estrada MrUmunhum at CruzIO.com
Thu Mar 9 23:01:16 UTC 2017


I have been tiring to keep my posting to a minim but I am not getting
across  what I am looking to
fix.   And I have been getting reports that my source code is not
viewable.  In my Apache logs I see that some people have be using the
wrong link, they are tiring to use
"http://mt-umunhum-wireless.net/mt-umunhum-wireless.net/Sources"
This is wrong! use:
"http://mt-umunhum-wireless.net/Sources/rsa"
or
"216.173.131.138/Sources/rsa"

The most recent attempt is the rsapost.c with the output rsapost.txt

What I am attempting to do is:
1) generate a RSA key pair, working but always the same keys.
2) remove the public key, working
3) create a RSA structure with the public key, 4 methods, all fail.
4) use the public key to encrypt a sting, don't get here.
5) use the RSA pair to decrypt the string.

The code is not clean but here it is:

#include <openssl/err.h>
#include <openssl/bio.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <termios.h>
#include <termio.h>

#define OFF               "\x1B[0;0;0m"
#define DEFAULT           "\x1B[0;0;0m"
#define RED               "\x1B[1;31;40m"
#define BLUE              "\x1B[1;34;40m"
#define GREEN             "\x1B[1;32;40m"
#define YELLOW            "\x1B[1;33;40m"
#define CLEAR_EOL         "\x1B[K"

void Dump( char *, int );
typedef unsigned char* UcharP;
typedef unsigned char  uchar;

#define Check_Key( Key, Action )                                     \
  if( RSA_check_key( Key ) != 1 )  {                                 \
     printf( RED "%d %s Make Key Failed!\n" OFF, __LINE__, "(Key)" );\
     printf( RED "%s\n",                                             \
             ERR_error_string( ERR_get_error(), NULL ) );            \
     Action ;  }                                                     \
  else  {                                                            \
    printf( BLUE "%d %s check key good\n" OFF , __LINE__, "Key" );  }

int main() {  // main()

  ERR_load_ERR_strings();

  RSA *My_RSA  = RSA_new();

  char Str[] = "1234567890";
  unsigned  char Out[1024];
  unsigned  char In[ 1024];
  int       RC, L, RSA_Len;

  unsigned long Error = ERR_get_error();
  char  *MSG          = ERR_error_string( Error, NULL);
  const  char *MSG2   = ERR_reason_error_string( Error );
  char  *ErrStr[100];

  BIGNUM *bne = BN_new();
  BN_set_word( bne, RSA_F4 );

  RC = RSA_generate_key_ex( My_RSA, 2048, bne, NULL );
  BN_free( bne );

  Check_Key( My_RSA, "return 1" );

  L = strlen( Str );
  printf ( BLUE "String: %s" OFF, Str );
  Dump( Str, L );

  RSA *Pub_RSA = RSA_new();

  // Extract Key from RSA Key pair
  BIO * Key_Bio = BIO_new( BIO_s_mem() );

  RC = PEM_write_bio_RSAPublicKey(  Key_Bio, My_RSA );

  printf( BLUE  "%d RC: %d\n" OFF, __LINE__ );

  size_t Key_Len = BIO_pending( Key_Bio               );
  char  *Key     = malloc(      Key_Len + 1           );
  RC             = BIO_read(    Key_Bio, Key, Key_Len );
  Key[ Key_Len ] = '\0';

  printf( BLUE  "%d RC: %d, Len: %d\n" OFF, __LINE__, RC, Key_Len );

  // Let's see the data
  printf( BLUE  "\nKey type %s\n" OFF, "Public" );
  Dump( (char*) Key, -Key_Len );

  // Now try to fill in to RSA using the BIO method
  BIO* bio = BIO_new( BIO_s_mem() );
       bio = BIO_new_mem_buf( (void*)Key, -1 ) ;

  // Load the RSA key from the BIO
  printf( "Method 1\n" );
  RSA* RSA1 = NULL;
  RSA1 = PEM_read_bio_RSA_PUBKEY( bio, NULL, NULL, NULL ) ;
  if( !RSA1 )
    printf( RED
	    " ERROR: Could not load PUBLIC KEY!\n"
	    " PEM_read_bio_RSA_PUBKEY FAILED:\n %s\n" OFF,
	    ERR_error_string( ERR_get_error(), NULL ) ) ;

  else Check_Key( RSA1, ";" );

  printf( "Method 2\n" );
  RSA *RSA2 = RSA_new();
  BIO_new_mem_buf( (void*)Key, -1 ) ;
  RC = PEM_write_bio_RSA_PUBKEY( bio, RSA2 ) ;
  if( !RSA2 )
    printf( RED
	    " ERROR: Could not load PUBLIC KEY!\n"
	    " PEM_write_bio_RSA_PUBKEY FAILED:\n %s\n" OFF,
	    ERR_error_string( ERR_get_error(), NULL ) ) ;

  else Check_Key( RSA2, ";" );

  // Try Bio method 3
  printf( OFF "Method 3\n" );
  RSA *RSA3  = RSA_new();
  BIO* Pem = BIO_new( BIO_s_mem() );
  BIO_puts( Pem, Key );
  ERR_print_errors( Pem );

  if( RSA3 )  Check_Key( RSA3, ";" );

  RC = PEM_write_bio_RSA_PUBKEY(  Pem, RSA3 );
  printf( OFF "BIO RC: %d\n", RC );

  if( RSA3 )  Check_Key( RSA3, ";" );

  // Now try to fill in to RSA using the EVP method

  printf( OFF "Method 4\n" );

  RSA *RSA4  = RSA_new();

  EVP_PKEY* EVP_PEM_Key;

  EVP_PKEY* EVP_Pub_Key = d2i_PUBKEY_bio( Pem, NULL);

  ERR_print_errors( Pem );

  if( EVP_Pub_Key == NULL ) {
     Error = ERR_get_error( );
     MSG   = (char*) ERR_reason_error_string( Error );
     printf( RED "EVP Error: %s" OFF "\n", MSG );  }
  else {
     RSA4 = EVP_PKEY_get1_RSA( EVP_Pub_Key );  }

  Check_Key( RSA4, "return 1;" );

  while(1)  {
    if( RSA1  &&  RSA_check_key( RSA1 ) == 1 )  {
       Pub_RSA = RSA1;break;  }
    if( RSA2  &&  RSA_check_key( RSA2 ) == 1 )  {
       Pub_RSA = RSA2;break;  }
    if( RSA3  &&  RSA_check_key( RSA3 ) == 1 )  {
       Pub_RSA = RSA3;break;  }
    if( RSA4  &&  RSA_check_key( RSA4 ) == 1 )  {
       Pub_RSA = RSA4;break;  }
    printf( BLUE " No usable RSA structures, quiting\n" OFF );
    return 1;  }

  // Free used memory
  BIO_free( Key_Bio );
  BIO_free( Pem     );

  int In_Len;
  In_Len = RSA_public_encrypt(  L,
				(uchar*) Str,
				(uchar*) In,
				Pub_RSA,
				RSA_PKCS1_OAEP_PADDING );

  printf( BLUE "Encrypted: %d" OFF, In_Len );
  Dump( In, In_Len );

  int Out_Len;
  Out_Len = RSA_private_decrypt( RSA_Len,
				 (uchar*) In,
				 (uchar*) Out,
				 My_RSA,
				 RSA_PKCS1_OAEP_PADDING );

  printf( BLUE  "Decrypted: %d" OFF, Out_Len );
  Dump( Out, Out_Len );

  if( !memcmp( (char *)Key, (char *)Out, Out_Len ) )  {
     printf( "Ecrypt/Decrypt failed\n" );    }
  else {
     printf( "Ecrypt/Decrypt Passed\n" );    }

  return 0;  }

/* -------------------------------------------------------------- */

void
Dump( char *P, int Len ) {  // Dump()

  int   I, E, C, L, Done, Min, Max;
  char  Buf[20], S[100];

  unsigned char  D;

  unsigned char  Hex[20] = "0123456789ABCDEF";

  if( Len < 0 )  {
     Len = abs( Len );
     Min = .20 *Len;
     Max = Len-Min;  }
  else  {
     Min = Len;
     Max = 0;   }

  int Note;
  Done  = 0, Note = 0;

  printf( "\n" );
  for( C = 0; C < Len ; C += 16,Done += L )  {  // For()

     //    printf( "C: %d, Min: %d, Max: %d\n", C, Min, Max );
     if( C > Min  &&  C < Max )  {
        if( Note == 0 )
	   printf( RED ".    .     "  "Output trimed.\n" OFF );
	Note = 1;
        continue;  }

     if( (L = Len -C) > 16 ) L = 16;
     if( L < 1 ) break;

     strcpy( Buf, "                " );
     strcpy( S,   "                                     " );
     E = 0;
     for( I = 0; I < L; I++ )  {

        D = P[ ( I +Done ) ];

	if( isprint( D ) ) {  Buf[I] = D;    }
	else               {  Buf[I] = '.';  }

	if( I  &&  !(I % 4) )  {  S[E++] = ' ';  }

	S[E++] = Hex[ D >> 4 ];
	S[E++] = Hex[ D & 15 ];  }

     printf( "%4.4d %4.4x  %-35s" BLUE "/*" YELLOW " %16.16s" BLUE " */\n"
              OFF , Done, Done, S, Buf ); fflush(stdout);

  }

     printf( BLUE "End of block - %3d bytes"
	     YELLOW " --------------------- "
	     BLUE  " /* "
	     YELLOW "---------------- "
	     BLUE "*/\n" OFF, Done );
     printf( OFF ); fflush(NULL);
   return;  }

This outputs:

5 Key check key good
String: 1234567890
0000 0000  31323334 35363738 3930               /* 1234567890       */
End of block -  10 bytes ---------------------  /* ---------------- */
68 RC: -141075560
75 RC: 426, Len: 426

Key type Public

0000 0000  2D2D2D2D 2D424547 494E2052 53412050  /* -----BEGIN RSA P */
0016 0010  55424C49 43204B45 592D2D2D 2D2D0A4D  /* UBLIC KEY-----.M */
0032 0020  49494243 674B4341 5145416F 7142344D  /* IIBCgKCAQEAoqB4M */
0048 0030  32307751 467A4972 634E4E39 31454364  /* 20wQFzIrcNN91ECd */
0064 0040  5344505A 31723259 38346355 43457961  /* SDPZ1r2Y84cUCEya */
0080 0050  394B585A 6C45475A 516B4245 445A6E0A  /* 9KXZlEGZQkBEDZn. */
.    .     Output trimed.
0352 0160  2B494F0A 6F636748 486A6F44 67746A45  /* +IO.ocgHHjoDgtjE */
0368 0170  58677779 646A6D31 725A4369 5459722B  /* Xgwydjm1rZCiTYr+ */
0384 0180  3270506F 6C774944 41514142 0A2D2D2D  /* 2pPolwIDAQAB.--- */
0400 0190  2D2D454E 44205253 41205055 424C4943  /* --END RSA PUBLIC */
0416 01a0  204B4559 2D2D2D2D 2D0A               /*  KEY-----.       */
End of block - 426 bytes ---------------------  /* ---------------- */
Method 1
 ERROR: Could not load PUBLIC KEY!
 PEM_read_bio_RSA_PUBKEY FAILED:
 error:0906D06C:PEM routines:func(109):reason(108)
Method 2
107 (Key) Make Key Failed!
error:2007507E:BIO routines:func(117):reason(126)
Method 3
116 (Key) Make Key Failed!
error:0407B093:rsa routines:func(123):reason(147)
BIO RC: 1
121 (Key) Make Key Failed!
error:0407B093:rsa routines:func(123):reason(147)
Method 4
EVP Error: (null)
142 (Key) Make Key Failed!
error:0407B093:rsa routines:func(123):reason(147)
 No usable RSA structures, quiting

Hope this clarifies what I am attempting to do?

Appreciate any help, thanks for your time.

-- 
William Estrada
Mt Umunhum, CA, USA, Earth
HTTP:// Mt-Umunhum-Wireless.net
Skype: MrUmunhum



More information about the openssl-users mailing list