99#include <openssl/pem.h>
1010#include <openssl/x509v3.h>
1111#include <openssl/err.h>
12+ #include <openssl/rand.h>
1213
1314#include "ppport.h"
1415
@@ -36,7 +37,7 @@ typedef struct
3637} Crypt__OpenSSL__RSA ;
3738
3839#define PACKAGE_NAME "Crypt::OpenSSL::PKCS10"
39- #define PACKAGE_CROAK (p_message ) croak("%s:%d: %s ", (p_message))
40+ #define PACKAGE_CROAK (p_message ) croak("%s", (p_message))
4041#define CHECK_NEW (p_var , p_size , p_type ) \
4142 if (New(0, p_var, p_size, p_type) == NULL) \
4243 { PACKAGE_CROAK("unable to alloc buffer"); }
@@ -227,20 +228,23 @@ SV* make_pkcs10_obj(SV* p_proto, X509_REQ* p_req, EVP_PKEY* p_pk, STACK_OF(X509_
227228}
228229
229230/* stolen from OpenSSL.xs */
230- long bio_write_cb (struct bio_st * bm , int m , const char * ptr , int l , long x , long y ) {
231-
231+ #if OPENSSL_VERSION_NUMBER >= 0x30000000L
232+ long bio_write_cb (struct bio_st * bm , int m , const char * ptr , size_t len , int l , long x , int y , size_t * processed ) {
233+ #else
234+ long bio_write_cb (struct bio_st * bm , int m , const char * ptr , int len , long x , long y ) {
235+ #endif
232236 if (m == BIO_CB_WRITE ) {
233237 SV * sv = (SV * ) BIO_get_callback_arg (bm );
234- sv_catpvn (sv , ptr , l );
238+ sv_catpvn (sv , ptr , len );
235239 }
236240
237241 if (m == BIO_CB_PUTS ) {
238242 SV * sv = (SV * ) BIO_get_callback_arg (bm );
239- l = strlen (ptr );
240- sv_catpvn (sv , ptr , l );
243+ len = strlen (ptr );
244+ sv_catpvn (sv , ptr , len );
241245 }
242246
243- return l ;
247+ return len ;
244248}
245249
246250static BIO * sv_bio_create (void ) {
@@ -250,7 +254,11 @@ static BIO* sv_bio_create(void) {
250254 /* create an in-memory BIO abstraction and callbacks */
251255 BIO * bio = BIO_new (BIO_s_mem ());
252256
257+ #if OPENSSL_VERSION_NUMBER >= 0x30000000L
258+ BIO_set_callback_ex (bio , bio_write_cb );
259+ #else
253260 BIO_set_callback (bio , bio_write_cb );
261+ #endif
254262 BIO_set_callback_arg (bio , (void * )sv );
255263
256264 return bio ;
@@ -339,25 +347,48 @@ new(class, keylen = 1024)
339347 PREINIT :
340348 X509_REQ * x ;
341349 EVP_PKEY * pk ;
342- RSA * rsa = NULL ;
343-
350+ char * classname = SvPVutf8_nolen ( class ) ;
351+
344352 CODE :
345353 //CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
346-
347- if (( pk = EVP_PKEY_new ()) == NULL )
348- croak ( "%s - can't create PKEY" , class );
354+ if (! RAND_status ())
355+ printf ( "Warning: generating random key material may take a long time\n"
356+ "if the system has a poor entropy source\n" );
349357
350358 if ((x = X509_REQ_new ()) == NULL )
351- croak ("%s - can't create req" , class );
359+ croak ("%s - can't create req" , classname );
360+ #if OPENSSL_VERSION_NUMBER >= 0x30000000L
361+ pk = EVP_RSA_gen (keylen );
362+ #elif OPENSSL_VERSION_NUMBER <= 0x10000000L
363+ RSA * rsa ;
364+ if ((pk = EVP_PKEY_new ()) == NULL )
365+ croak ("%s - can't create PKEY" , classname );
352366
353367 rsa = RSA_generate_key (keylen , RSA_F4 , NULL , NULL );
354368 if (!EVP_PKEY_assign_RSA (pk ,rsa ))
355- croak ("%s - EVP_PKEY_assign_RSA" , class );
356-
369+ croak ("%s - EVP_PKEY_assign_RSA" , classname );
370+ #else
371+ RSA * rsa = RSA_new ();
372+ BIGNUM * bne = BN_new ();
373+ if (bne == NULL )
374+ croak ("%s - BN_new failed" , classname );
375+
376+ if (BN_set_word (bne , RSA_F4 ) != 1 )
377+ croak ("%s - BN_set_word failed" , classname );
378+
379+ if ((pk = EVP_PKEY_new ()) == NULL )
380+ croak ("%s - can't create PKEY" , classname );
381+
382+ if (!RSA_generate_key_ex (rsa , keylen , bne , NULL ))
383+ croak ("%s - RSA_generate_key_ex failed" , classname );
384+
385+ if (!EVP_PKEY_assign_RSA (pk ,rsa ))
386+ croak ("%s - EVP_PKEY_assign_RSA" , classname );
387+ #endif
357388 X509_REQ_set_pubkey (x ,pk );
358389 X509_REQ_set_version (x ,0L );
359390 if (!X509_REQ_sign (x ,pk ,EVP_sha256 ()))
360- croak ("%s - X509_REQ_sign" , class );
391+ croak ("%s - X509_REQ_sign failed " , classname );
361392
362393 RETVAL = make_pkcs10_obj (class , x , pk , NULL , NULL );
363394
@@ -382,32 +413,43 @@ DESTROY(pkcs10)
382413 BIO_free(bio_err);*/
383414
384415SV *
385- new_from_rsa (class , p_rsa )
416+ _new_from_rsa (class , p_rsa , priv )
386417 SV * class
387418 SV * p_rsa
419+ SV * priv
388420
389421 PREINIT :
390422 Crypt__OpenSSL__RSA * rsa ;
423+ char * keyString ;
424+ STRLEN keylen ;
425+ BIO * bio ;
391426 X509_REQ * x ;
392427 EVP_PKEY * pk ;
428+ char * classname = SvPVutf8_nolen (class );
393429
394430 CODE :
395- //CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
396-
397- if ((pk = EVP_PKEY_new ()) == NULL )
398- croak ("%s - can't create PKEY" , class );
431+
432+ // Get the private key and save it in memory
433+ keyString = SvPV (priv , keylen );
434+ bio = BIO_new_mem_buf (keyString , keylen );
435+ if (bio == NULL ) {
436+ croak ("Bio is null **** \n" );
437+ }
438+
439+ // Create the PrivateKey as EVP_PKEY
440+ pk = PEM_read_bio_PrivateKey (bio , NULL , 0 , NULL );
441+ if (pk == NULL ) {
442+ croak ("Failed operation error code %d\n" , errno );
443+ }
399444
400445 if ((x = X509_REQ_new ()) == NULL )
401- croak ("%s - can't create req" , class );
446+ croak ("%s - can't create req" , classname );
402447
403448 rsa = (Crypt__OpenSSL__RSA * ) SvIV (SvRV (p_rsa ));
404- if (!EVP_PKEY_assign_RSA (pk ,rsa -> rsa ))
405- croak ("%s - EVP_PKEY_assign_RSA" , class );
406-
407449 X509_REQ_set_pubkey (x ,pk );
408450 X509_REQ_set_version (x ,0L );
409451 if (!X509_REQ_sign (x ,pk ,EVP_sha256 ()))
410- croak ("%s - X509_REQ_sign" , class );
452+ croak ("%s - X509_REQ_sign" , classname );
411453
412454 RETVAL = make_pkcs10_obj (class , x , pk , NULL , & rsa -> rsa );
413455
@@ -452,16 +494,12 @@ get_pem_pubkey(pkcs10)
452494
453495 type = EVP_PKEY_base_id (pkey );
454496 if (type == EVP_PKEY_RSA ) {
455-
456- # PEM_write_bio_RSAPublicKey (bio, EVP_PKEY_get0_RSA(pkey));
457- PEM_write_bio_RSA_PUBKEY (bio , EVP_PKEY_get0_RSA (pkey ));
458-
497+ PEM_write_bio_PUBKEY (bio , pkey );
459498 } else if (type == EVP_PKEY_DSA ) {
460-
461- PEM_write_bio_DSA_PUBKEY (bio , EVP_PKEY_get0_DSA (pkey ));
499+ PEM_write_bio_PUBKEY (bio , pkey );
462500#ifndef OPENSSL_NO_EC
463501 } else if ( type == EVP_PKEY_EC ) {
464- PEM_write_bio_EC_PUBKEY (bio , EVP_PKEY_get0_EC_KEY ( pkey ) );
502+ PEM_write_bio_PUBKEY (bio , pkey );
465503#endif
466504 } else {
467505
@@ -562,7 +600,7 @@ get_pem_pk(pkcs10,...)
562600 /* get the certificate back out in a specified format. */
563601
564602 if (!PEM_write_bio_PrivateKey (bio ,pkcs10 -> pk ,NULL ,NULL ,0 ,NULL ,NULL ))
565- croak ("%s - PEM_write_bio_PrivateKey" , pkcs10 -> pk );
603+ croak ("%s - PEM_write_bio_PrivateKey" , ( char * ) pkcs10 -> pk );
566604
567605 RETVAL = sv_bio_final (bio );
568606
@@ -686,7 +724,7 @@ add_ext_final(pkcs10)
686724 if (pkcs10 -> exts )
687725 sk_X509_EXTENSION_pop_free (pkcs10 -> exts , X509_EXTENSION_free );
688726 } else {
689- RETVAL = NULL ;
727+ RETVAL = 0 ;
690728 }
691729
692730 OUTPUT :
@@ -741,8 +779,12 @@ accessor(pkcs10)
741779 name = X509_REQ_get_subject_name (pkcs10 -> req );
742780 X509_NAME_print_ex (bio , name , 0 , XN_FLAG_SEP_CPLUS_SPC );
743781 } else if (ix == 2 ) {
744- key = X509_REQ_extract_key (pkcs10 -> req );
782+ key = X509_REQ_get_pubkey (pkcs10 -> req );
783+ #if OPENSSL_VERSION_NUMBER >= 0x30000000L
784+ EVP_PKEY_print_public (bio , key , 0 , NULL );
785+ #else
745786 RSA_print (bio , EVP_PKEY_get1_RSA (key ), 0 );
787+ #endif
746788 }
747789 }
748790
0 commit comments