Guest User

OpenSSL crash - 32-bit Solaris 10

a guest
Nov 9th, 2016
938
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.20 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. #include "openssl/rsa.h"
  6. #include "openssl/pem.h"
  7. #include "openssl/err.h"
  8. #include "openssl/ssl.h"
  9. #include "openssl/rand.h"
  10.  
  11. int _ossl_err_printf_callback( const char *str, size_t len, void *u )
  12. /*******************************************************************/
  13. {
  14.     printf( "%s\n", str );
  15.     return 0;
  16. }
  17.  
  18. void _ossl_err_printf( void )
  19. /***************************/
  20. {
  21.     if( ERR_peek_error() > 0 ) {
  22.         printf( "OSSL error\n" );
  23.         ERR_print_errors_cb( _ossl_err_printf_callback, NULL );
  24.         printf( "End OSSL error\n" );
  25.     }
  26. }
  27.  
  28. const char *PUBLIC_KEY = "-----BEGIN RSA PUBLIC KEY-----\n"
  29.     "MIIBCgKCAQEAvg95SwHiiiN/ttddVS7nUR1Gtbg1xMgFdrPUTidgGmS2DM5k/y7B\n"
  30.     "VNCIp93gLjg5fKB3nqcuIhqppEDadDdWhlRFjImRqUlhppYjoIuP5t7tXHqzTwa8\n"
  31.     "QUHZ29Y8/CZXwtpud4C7o2vzJStFVXc1goehTD1lig9KXI5FAZDyKsGlzJPNm0+c\n"
  32.     "YrU7UNXA6DtRdKhVNynHuCRaoglkZ/5x4Qxk3O4yCeuuttTqcfo8hqOiM8TtQGgD\n"
  33.     "sOlOHgn26abs+rpAtgqyQIVogRVfQKm1pfatqK/PvVdw75/c9t88tglzPhTo3CHH\n"
  34.     "e5wv67m08Wy5TKiQL+SYZi9wQA/ktdUc5wIDAQAB\n"
  35.     "-----END RSA PUBLIC KEY-----";
  36. const char *PRIVATE_KEY = "-----BEGIN RSA PRIVATE KEY-----\n"
  37.     "MIIEoQIBAAKCAQEAvg95SwHiiiN/ttddVS7nUR1Gtbg1xMgFdrPUTidgGmS2DM5k\n"
  38.     "/y7BVNCIp93gLjg5fKB3nqcuIhqppEDadDdWhlRFjImRqUlhppYjoIuP5t7tXHqz\n"
  39.     "Twa8QUHZ29Y8/CZXwtpud4C7o2vzJStFVXc1goehTD1lig9KXI5FAZDyKsGlzJPN\n"
  40.     "m0+cYrU7UNXA6DtRdKhVNynHuCRaoglkZ/5x4Qxk3O4yCeuuttTqcfo8hqOiM8Tt\n"
  41.     "QGgDsOlOHgn26abs+rpAtgqyQIVogRVfQKm1pfatqK/PvVdw75/c9t88tglzPhTo\n"
  42.     "3CHHe5wv67m08Wy5TKiQL+SYZi9wQA/ktdUc5wIDAQABAoH/QtEt0zDWc7oHLECK\n"
  43.     "j2ft6pZgRYJ9ZLDtOs391XwCTUUau2XUG+JUFX06jclzBsy9aRMA+sXLcjHtcdFa\n"
  44.     "+4B46sC1srKqgtlJe0dNPyPRc1jsGZcJcr7rcAW2kZK/3eWc9OPV8i1PyiQpVuff\n"
  45.     "eCxwo3MLQcJT8DVv7xoVKHfMqzrNt6hbymGMklpw9Nwc/CqGq28jw1K1+h1Ekryt\n"
  46.     "hwqr4C0bDvIb/mJ+ipVbakOSFytNaVJeyB2vfS8sJ/2ojZieraloiLHSY6vCZPGC\n"
  47.     "w+DMHUIAHVCfHN23arZStHxAlqWjpgECRWB9Y5oHCRtZDcUx6eCfn9IIkTX4TdVK\n"
  48.     "LDhRAoGBAOleqXQM7nlOYavwWaClR75mVhT1wCf9hgq9hhlJbWS67xwWCAIQVp2x\n"
  49.     "G3M/iNPbDUBqfIsrS7h3lox5p/QijmBdwdchvc4a8EETr+0XSe/+E7p11RoWVBzd\n"
  50.     "LmUoAcM4yU/S5ro/WJ6+iyk1y3og0+TJ50Cx0Tk8Khpj7AdhL5GVAoGBANB9q45T\n"
  51.     "YwPsyCVAVvMxFxk2QboBhLh5sYbTbqsT/JMSowav/09vpL6+ZGvSz1DoD5NVusgw\n"
  52.     "LAgUt0ZczqCE8xRdl3RmfxRDeElgBQE2fXYIcNiKIpJNcr9bLfDusu3myAYiPWEH\n"
  53.     "xv68zmtMTdmlmB9dkkWIMMome0YsWDhWCo2LAoGAFFuKorICF5jr0kjsOKRSZtyc\n"
  54.     "g8WQVqy6BbPUv9306gWYmDWfyzZLqAPsJhiTwg9oz4a6iJVlTJk6C9UM/rIJA4UK\n"
  55.     "RM8PtKwK61JhVWhjrcjXRbvDtDvgaIgu5OohhTst7IW0VOjzvR1YHGcx8dxtP5cR\n"
  56.     "UkZwvvJtpdGzpE0pDiUCgYEAj/pZIN6BAFLiHKeD5EnAU87eMN+fke2oJR2ZzVbu\n"
  57.     "E3rJTnL38xl8QaUloDhiptK6/tozNM/feG0l69dncf6eBzBiySWHGK1HQhSnICFL\n"
  58.     "HtnRZBhwq2wElBUZcsrEkfnPpDy8+mbuizhDrGFzWZw7o11xB8d3OgK9GsbA3Za9\n"
  59.     "juUCgYA5t2LtfTEMye2YJs6IHb8cD3LlUAN8RO6Wju63PtDUfjuiBc9z8XcDkaBa\n"
  60.     "GCW5y6oKfchFUo6IN8VMY8LjsRX6rXsfvc8MPi6f0Z+CLL1/AqM27Wdn6SvhEy89\n"
  61.     "5q5blS0A+fTdcHPCGle5YROBWSEF5hbwl2E9AEkq8E4MbVPF+g==\n"
  62.     "-----END RSA PRIVATE KEY-----";
  63.  
  64. int main( int, char ** )
  65. /**********************/
  66. {
  67.     OpenSSL_add_all_algorithms();
  68.     RAND_poll();
  69.     SSL_load_error_strings();
  70.  
  71.     BIO *bio = BIO_new_mem_buf( (void*)PUBLIC_KEY, (int)strlen(PUBLIC_KEY) );
  72.     char *      name = NULL;
  73.     char *      header2 = NULL;
  74.     unsigned char * data = NULL;
  75.     long        len;
  76.     RSA *rsa;
  77.     EVP_PKEY *key;
  78.     size_t keylen;
  79.     int rsa_pad;
  80.     char *input;
  81.     size_t input_len;
  82.     char * output;
  83.     size_t output_len;
  84.     char *decrypted;
  85.  
  86.     int rc = PEM_read_bio( bio, &name, &header2, &data, &len );
  87.     if( rc != 1 ) {
  88.     fprintf( stderr, "PEM_read_bio returned %d\n", rc );
  89.     return 1;
  90.     }
  91.     BIO_free( bio );
  92.  
  93.     bio = BIO_new_mem_buf( (void*)data, (int)len );
  94.     rsa = d2i_RSAPublicKey_bio( bio, NULL );
  95.     if( rsa == NULL ) {
  96.     fprintf( stderr, "d2i_RSAPublicKey_bio failed\n" );
  97.     return 1;
  98.     }
  99.  
  100.     key = EVP_PKEY_new();
  101.     EVP_PKEY_assign_RSA( key, rsa );
  102.     BIO_free( bio );
  103.  
  104.     keylen = EVP_PKEY_size( key );
  105.    
  106.     rsa_pad = RSA_PKCS1_PADDING;
  107.  
  108.     input = new char[keylen-11];
  109.     input_len = keylen-11;
  110.     memset( input, 'a', keylen-11 );
  111.  
  112.     output = new char[keylen];
  113.     output_len = RSA_public_encrypt( (int)input_len, (unsigned char *)input,
  114.                         (unsigned char *)output, rsa,
  115.                         rsa_pad );
  116.     if( output_len == -1 ) {
  117.     _ossl_err_printf();
  118.     fprintf( stderr, "public_encrypt failed\n" );
  119.     return 1;
  120.     }
  121.  
  122.     // DECRYPT
  123.     bio = BIO_new_mem_buf( (void*)PRIVATE_KEY, (int)strlen(PRIVATE_KEY) );
  124.     rsa = PEM_read_bio_RSAPrivateKey( bio, NULL, NULL, NULL );
  125.     key = EVP_PKEY_new();
  126.     EVP_PKEY_assign_RSA( key, rsa );
  127.     BIO_free( bio );
  128.     keylen = EVP_PKEY_size( key );
  129.  
  130.     decrypted = new char[keylen];
  131.     output_len = RSA_private_decrypt( (int)output_len, (unsigned char *)output,
  132.                       (unsigned char *)decrypted,
  133.                       rsa, rsa_pad );
  134.     if( output_len == -1 ) {
  135.     _ossl_err_printf();
  136.     fprintf( stderr, "decrypt failed\n" );
  137.     return 1;
  138.     }
  139.     decrypted[output_len] = '\0';
  140.     printf( "Decrypted: %s\n", decrypted );
  141.  
  142.     RSA_free( rsa );
  143.     delete [] input;
  144.     delete [] output;
  145.     delete [] decrypted;
  146.  
  147.     return 0;
  148. }
Advertisement
Add Comment
Please, Sign In to add comment