aboutsummaryrefslogtreecommitdiff
path: root/security/p5-Crypt-OpenSSL-RSA/files/patch-RSA.xs
diff options
context:
space:
mode:
Diffstat (limited to 'security/p5-Crypt-OpenSSL-RSA/files/patch-RSA.xs')
-rw-r--r--security/p5-Crypt-OpenSSL-RSA/files/patch-RSA.xs109
1 files changed, 109 insertions, 0 deletions
diff --git a/security/p5-Crypt-OpenSSL-RSA/files/patch-RSA.xs b/security/p5-Crypt-OpenSSL-RSA/files/patch-RSA.xs
new file mode 100644
index 000000000000..3e16d7c4b48d
--- /dev/null
+++ b/security/p5-Crypt-OpenSSL-RSA/files/patch-RSA.xs
@@ -0,0 +1,109 @@
+--- RSA.xs.orig 2017-06-19 18:08:26 UTC
++++ RSA.xs
+@@ -179,6 +179,30 @@ RSA* _load_rsa_key(SV* p_keyStringSv,
+ return rsa;
+ }
+
++
++RSA* _load_enc_rsa_key(SV* p_keyStringSv,
++ RSA*(*p_loader)(BIO*, RSA**, pem_password_cb*, void*), char* password)
++{
++ STRLEN keyStringLength;
++ char* keyString;
++
++ RSA* rsa;
++ BIO* stringBIO;
++
++ keyString = SvPV(p_keyStringSv, keyStringLength);
++
++ CHECK_OPEN_SSL(stringBIO = BIO_new_mem_buf(keyString, keyStringLength));
++
++ rsa = p_loader(stringBIO, NULL, NULL, password);
++
++ CHECK_OPEN_SSL(BIO_set_close(stringBIO, BIO_CLOSE) == 1);
++ BIO_free(stringBIO);
++
++ CHECK_OPEN_SSL(rsa);
++ return rsa;
++}
++
++
+ SV* rsa_crypt(rsaData* p_rsa, SV* p_from,
+ int (*p_crypt)(int, const unsigned char*, unsigned char*, RSA*, int))
+ {
+@@ -214,7 +238,7 @@ BOOT:
+ ERR_load_crypto_strings();
+
+ SV*
+-new_private_key(proto, key_string_SV)
++_new_private_key(proto, key_string_SV)
+ SV* proto;
+ SV* key_string_SV;
+ CODE:
+@@ -223,7 +247,24 @@ new_private_key(proto, key_string_SV)
+ OUTPUT:
+ RETVAL
+
++
+ SV*
++_new_enc_private_key(proto, key_string_SV, password_SV)
++ SV* proto;
++ SV* key_string_SV;
++ SV* password_SV;
++ PREINIT:
++ char* password;
++ CODE:
++ password = SvPV_nolen(password_SV);
++
++ RETVAL = make_rsa_obj(
++ proto, _load_enc_rsa_key(key_string_SV, PEM_read_bio_RSAPrivateKey, password));
++ OUTPUT:
++ RETVAL
++
++
++SV*
+ _new_public_key_pkcs1(proto, key_string_SV)
+ SV* proto;
+ SV* key_string_SV;
+@@ -251,7 +292,7 @@ DESTROY(p_rsa)
+ Safefree(p_rsa);
+
+ SV*
+-get_private_key_string(p_rsa)
++_get_private_key_string(p_rsa)
+ rsaData* p_rsa;
+ PREINIT:
+ BIO* stringBIO;
+@@ -259,6 +300,32 @@ get_private_key_string(p_rsa)
+ CHECK_OPEN_SSL(stringBIO = BIO_new(BIO_s_mem()));
+ PEM_write_bio_RSAPrivateKey(
+ stringBIO, p_rsa->rsa, NULL, NULL, 0, NULL, NULL);
++ RETVAL = extractBioString(stringBIO);
++
++ OUTPUT:
++ RETVAL
++
++
++SV*
++_get_enc_private_key_string(p_rsa, passout_SV, cipher_SV)
++ rsaData* p_rsa;
++ SV* passout_SV;
++ SV* cipher_SV;
++ PREINIT:
++ char* passout;
++ char* cipher;
++
++ BIO* stringBIO;
++ const EVP_CIPHER *enc;
++ CODE:
++ passout = SvPV_nolen(passout_SV);
++ cipher = SvPV_nolen(cipher_SV);
++
++ CHECK_OPEN_SSL(stringBIO = BIO_new(BIO_s_mem()));
++ enc = EVP_get_cipherbyname(cipher);
++ if (enc == NULL) { enc = EVP_get_cipherbyname("DES3"); }
++ PEM_write_bio_RSAPrivateKey(
++ stringBIO, p_rsa->rsa, enc, NULL, 0, NULL, passout);
+ RETVAL = extractBioString(stringBIO);
+
+ OUTPUT: