Skip to content

Commit fc7103f

Browse files
committed
Support multiple openssl versions without deprecated warnings
1 parent 998ffa5 commit fc7103f

File tree

3 files changed

+92
-37
lines changed

3 files changed

+92
-37
lines changed

Makefile.PL

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ print "Installed OpenSSL: $major.$minor.$patch\n";
1313
$args{INC} = openssl_inc_paths();
1414
$args{LIBS} = [openssl_lib_paths() . ' -lssl -lcrypto'];
1515

16-
my $cc_option_flags = $major ge 3 ? ' -DOPENSSL_API_COMPAT=30000' : ' -DOPENSSL_API_COMPAT=10100';
16+
my $cc_option_flags;
17+
#my $cc_option_flags = $major ge 3 ? ' -DOPENSSL_API_COMPAT=30000' : ' -DOPENSSL_API_COMPAT=10100';
18+
#my $cc_option_flags = $major ge 3 ? ' -DOPENSSL_API_COMPAT=10100' : ' -DOPENSSL_API_COMPAT=10100';
1719

1820
if ($Config::Config{cc} =~ /gcc/i) {
1921
$cc_option_flags .= $ENV{AUTHOR_TESTING} ? ' -Wall -Werror' : ' -Wall';

PKCS10.pm

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,15 @@ XSLoader::load('Crypt::OpenSSL::PKCS10', $VERSION);
3737

3838
# Preloaded methods go here.
3939

40+
sub new_from_rsa {
41+
my $self = shift;
42+
my $rsa = shift;
43+
44+
my $priv = $rsa->get_private_key_string();
45+
$self->_new_from_rsa($rsa, $priv);
46+
47+
}
48+
4049
1;
4150
__END__
4251
@@ -86,6 +95,8 @@ Create a new Crypt::OpenSSL::PKCS10 object by using key information from a Crypt
8695
my $rsa = Crypt::OpenSSL::RSA->generate_key(512);
8796
my $req = Crypt::OpenSSL::PKCS10->new_from_rsa($rsa);
8897
98+
OpenSSL 3.0 has deprecated the RSA object which Crypt::OpenSSL::RSA creates. new_from_rsa() is now a perl sub which obtains the private key as a string that is also passed to the _new_from_rsa() XS function.
99+
89100
=item new_from_file( $filename )
90101
91102
Create a new Crypt::OpenSSL::PKCS10 object by reading the request and key information from a PEM formatted file. Here is an example:

PKCS10.xs

Lines changed: 78 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
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

246250
static 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

384415
SV*
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

Comments
 (0)