OpenSSL-iOS swift : Getting PEM_read_bio_PrivateKey nil

Viewed 210

I am using Openssl library in ios swift and want to decrypt the encrypted private key using @srsa supplied. Here srsa is passphrase. PEM_read_bio_PrivateKey getting nil here. Please check below code snippet.

"encrypted_private_key" : "-----BEGIN ENCRYPTED PRIVATE KEY-----\r\nMIIFHzBJBgkqhkiG9w0BBQ0wPDAbBgkqhkiG9w0BBQwwDgQIysWhJMC/TvkCAggA\r\nMB0GCWCGSAFlAwQBKgQQgttwCnv0IFah3/+zjXLYIQSCBNAtaLd4WOtNgQoI3Xpz\r\nKAQfdBrh0V25lRoaFZJ6BLD4UqD62zTT1TlGko9/XG5XAuONjwr9YOL0VWcdDyeD\r\nASzgUrmd5QN3mMuiVPld2rb2RSvgWSxUKA6yWguZTA2lh7hwFyVz4igjJ5zMlph7\r\n2cdbodDrTf+0K9orgRn3BV3UJyY70JZIr9Uj9DRfiBW8MByA6ChgEt25YrbOImol\r\nEVKQ1JoOxAI89EMpfKrN8h2ujf63674cviA5KxYwRaAdMVGr+C9ipMC/mk17THQl\r\nFj2+pYJRHdWl0vH72tAVsuYlDHNI55Yqg2+H6ZlStdlG0rybWAkCNIIwWsj86fo3\r\n/i/rDi/CFXhcHT2MpaznbPOoPn85nYGfHZHRlQUM61Ipp+Vg8ftI4ekI/dWiPjMv\r\nh2MRCa9pVJ4hjIkS3Z/7yEzRzA1Xj+qckJeFYstZXaAOvh80QxjE2bAn16F9AWCW\r\nMFHxH/Y3XPBci/kfwg4qYLQKVplnlRtPknqV+1JDj+1OPBWgjYeuWNzgxc4mJs0H\r\n+UeCMvFgDEUDZXMC+KsK7OCav2eTP9sjdkvjOT7RY0BIxaO9hqgilYcVPBtqRQPO\r\n7ctJIfzUOo/7abQpGillMTGXOIue1dEnXuoYCEPpEtxzKrQSGE8ORqxZogYaIuyI\r\nHC82fAlr9Aoo1dnBw3H2cdt56RnmZsASoj8/ZsNrcgaldBlyM4ImKt9vd28neNdy\r\n2jVVWjlXZYFTunpPhJrIHO2TeC9szg3cZ3NLZhP5nEz6WOsd1n5jify4LR2ici2e\r\nsUFWfPE1JtOXy4Yd1C5+mtg7I1bkROzZOxYC69aQBygggtp1nXavuq4ECrKk/gj7\r\nOsLkC0Jh91cj45lYwnt9SO8lSVwpFspQCwalG7cAyLVD3jeLH5nbs3fEP3BXE8in\r\ntSgTXFjbwyBD6nJ0cxKYMQ+yzr9dDQI55n1mKdyFgEWMBD2MWTEdXCBzreXBcYWD\r\ngDRarxKbQaWd9ANCT1Us1nBc08OvxQiLIo8dhDd/qcIx+kWS+o1Uxc0eY9HRYhX+\r\nYPmA0Jzf6dCxHPc+1+ib/wIGlhgA1xc/HkILy7k/Q5c7s5ogDuyNeFfncjlmidaW\r\nPqhHN+EhqIbmPbogiewXUovZ6OmSmAkG4x4ZO6qn9myWtSEwz70bDrKIA2sJWK/k\r\nFccmW5l5dHmSPKc7fLnA6U0wRgUoE/iiE7gl5ROjEevM/G9AZhjdiL+6/U8yYOwF\r\ntbB87qQUvI27UtSWoEE0LdVcmUDKlJN7Gw+Vkk/szueKFYCVBlJVcba0TrLYUq6H\r\nnQttGvyWKqysI/JHvd2QcHywufF90I0WYBCZ+JnHBchKfZNcfIFv38GemfeOwWu5\r\nadK+ivkHOjq3Q/WLCcegjvE5/ZqkG8RVZVZJ/4oH1bQPP5nVP7FJ7cMSx1ZszkD8\r\nuhc3FltRpS5238otTnO0WNbwmNbVYe/j6on4bvrzlzKq3CTe0Tn0HA31DXt7Rw2y\r\nIINtnOjgUQZRhsfdMT3NDsmhRgxFbmda4nmBatRqWt1WPKz8rwio3WWzFiOgE8DV\r\nLtx+DF9h7EpowL4IA3eusOtrOProizjyFZVvgsLbwFBNMckvmiwcq/V6iaN52ZxX\r\nNO9XbQrKd3VsrvPEE9YqyQAsHQ==\r\n-----END ENCRYPTED PRIVATE KEY-----\r\n"

"srsa" = "x8SBIvL/L0h3GUsVtYz8Mk69KwEe9ibZxw62UT0Vy5k4"

let beginning = "-----BEGIN ENCRYPTED PRIVATE KEY-----"
                        let tail = "-----END ENCRYPTED PRIVATE KEY-----"
                        let certificateString = encrypted_private_key.replacingOccurrences(of: beginning, with: "")
                                                           .replacingOccurrences(of: tail, with: "")
                                                           .replacingOccurrences(of: "\n", with: "")
                                                           .replacingOccurrences(of: " ", with: "")
                                                            .replacingOccurrences(of: "\r", with: "")

guard let data = Data(base64Encoded: certificateString!) else {
print("Unable to cast string to data")
    return nil }

let boi = BIO_new_mem_buf(data.bytes, Int32(data.count))
let passPhrase = UnsafeMutablePointer(mutating: (self.srsa as NSString).utf8String
let privateKey = PEM_read_bio_PrivateKey(boi, nil, nil, passPhrase)

getting privateKey nil here...Please help Thanks in advance.

1 Answers

The key you've pasted hasn't been parsed properly, you missed the occurrences of \/ which is an escaped / character.

This is your key after the replacements you make:

MIIFHzBJBgkqhkiG9w0BBQ0wPDAbBgkqhkiG9w0BBQwwDgQIysWhJMC\/TvkCAggA
MB0GCWCGSAFlAwQBKgQQgttwCnv0IFah3\/+zjXLYIQSCBNAtaLd4WOtNgQoI3Xpz
KAQfdBrh0V25lRoaFZJ6BLD4UqD62zTT1TlGko9\/XG5XAuONjwr9YOL0VWcdDyeD
ASzgUrmd5QN3mMuiVPld2rb2RSvgWSxUKA6yWguZTA2lh7hwFyVz4igjJ5zMlph7
2cdbodDrTf+0K9orgRn3BV3UJyY70JZIr9Uj9DRfiBW8MByA6ChgEt25YrbOImol
EVKQ1JoOxAI89EMpfKrN8h2ujf63674cviA5KxYwRaAdMVGr+C9ipMC\/mk17THQl
Fj2+pYJRHdWl0vH72tAVsuYlDHNI55Yqg2+H6ZlStdlG0rybWAkCNIIwWsj86fo3
\/i\/rDi\/CFXhcHT2MpaznbPOoPn85nYGfHZHRlQUM61Ipp+Vg8ftI4ekI\/dWiPjMv
h2MRCa9pVJ4hjIkS3Z\/7yEzRzA1Xj+qckJeFYstZXaAOvh80QxjE2bAn16F9AWCW
MFHxH\/Y3XPBci\/kfwg4qYLQKVplnlRtPknqV+1JDj+1OPBWgjYeuWNzgxc4mJs0H
+UeCMvFgDEUDZXMC+KsK7OCav2eTP9sjdkvjOT7RY0BIxaO9hqgilYcVPBtqRQPO
7ctJIfzUOo\/7abQpGillMTGXOIue1dEnXuoYCEPpEtxzKrQSGE8ORqxZogYaIuyI
HC82fAlr9Aoo1dnBw3H2cdt56RnmZsASoj8\/ZsNrcgaldBlyM4ImKt9vd28neNdy
2jVVWjlXZYFTunpPhJrIHO2TeC9szg3cZ3NLZhP5nEz6WOsd1n5jify4LR2ici2e
sUFWfPE1JtOXy4Yd1C5+mtg7I1bkROzZOxYC69aQBygggtp1nXavuq4ECrKk\/gj7
OsLkC0Jh91cj45lYwnt9SO8lSVwpFspQCwalG7cAyLVD3jeLH5nbs3fEP3BXE8in
tSgTXFjbwyBD6nJ0cxKYMQ+yzr9dDQI55n1mKdyFgEWMBD2MWTEdXCBzreXBcYWD
gDRarxKbQaWd9ANCT1Us1nBc08OvxQiLIo8dhDd\/qcIx+kWS+o1Uxc0eY9HRYhX+
YPmA0Jzf6dCxHPc+1+ib\/wIGlhgA1xc\/HkILy7k\/Q5c7s5ogDuyNeFfncjlmidaW
PqhHN+EhqIbmPbogiewXUovZ6OmSmAkG4x4ZO6qn9myWtSEwz70bDrKIA2sJWK\/k
FccmW5l5dHmSPKc7fLnA6U0wRgUoE\/iiE7gl5ROjEevM\/G9AZhjdiL+6\/U8yYOwF
tbB87qQUvI27UtSWoEE0LdVcmUDKlJN7Gw+Vkk\/szueKFYCVBlJVcba0TrLYUq6H
nQttGvyWKqysI\/JHvd2QcHywufF90I0WYBCZ+JnHBchKfZNcfIFv38GemfeOwWu5
adK+ivkHOjq3Q\/WLCcegjvE5\/ZqkG8RVZVZJ\/4oH1bQPP5nVP7FJ7cMSx1ZszkD8
uhc3FltRpS5238otTnO0WNbwmNbVYe\/j6on4bvrzlzKq3CTe0Tn0HA31DXt7Rw2y
IINtnOjgUQZRhsfdMT3NDsmhRgxFbmda4nmBatRqWt1WPKz8rwio3WWzFiOgE8DV
Ltx+DF9h7EpowL4IA3eusOtrOProizjyFZVvgsLbwFBNMckvmiwcq\/V6iaN52ZxX
NO9XbQrKd3VsrvPEE9YqyQAsHQ==

Notice the uneven padding, which is due to uneven line length, which should always be 64 characters. This is the fixed key:

MIIFHzBJBgkqhkiG9w0BBQ0wPDAbBgkqhkiG9w0BBQwwDgQIysWhJMC/TvkCAggA
MB0GCWCGSAFlAwQBKgQQgttwCnv0IFah3/+zjXLYIQSCBNAtaLd4WOtNgQoI3Xpz
KAQfdBrh0V25lRoaFZJ6BLD4UqD62zTT1TlGko9/XG5XAuONjwr9YOL0VWcdDyeD
ASzgUrmd5QN3mMuiVPld2rb2RSvgWSxUKA6yWguZTA2lh7hwFyVz4igjJ5zMlph7
2cdbodDrTf+0K9orgRn3BV3UJyY70JZIr9Uj9DRfiBW8MByA6ChgEt25YrbOImol
EVKQ1JoOxAI89EMpfKrN8h2ujf63674cviA5KxYwRaAdMVGr+C9ipMC/mk17THQl
Fj2+pYJRHdWl0vH72tAVsuYlDHNI55Yqg2+H6ZlStdlG0rybWAkCNIIwWsj86fo3
/i/rDi/CFXhcHT2MpaznbPOoPn85nYGfHZHRlQUM61Ipp+Vg8ftI4ekI/dWiPjMv
h2MRCa9pVJ4hjIkS3Z/7yEzRzA1Xj+qckJeFYstZXaAOvh80QxjE2bAn16F9AWCW
MFHxH/Y3XPBci/kfwg4qYLQKVplnlRtPknqV+1JDj+1OPBWgjYeuWNzgxc4mJs0H
+UeCMvFgDEUDZXMC+KsK7OCav2eTP9sjdkvjOT7RY0BIxaO9hqgilYcVPBtqRQPO
7ctJIfzUOo/7abQpGillMTGXOIue1dEnXuoYCEPpEtxzKrQSGE8ORqxZogYaIuyI
HC82fAlr9Aoo1dnBw3H2cdt56RnmZsASoj8/ZsNrcgaldBlyM4ImKt9vd28neNdy
2jVVWjlXZYFTunpPhJrIHO2TeC9szg3cZ3NLZhP5nEz6WOsd1n5jify4LR2ici2e
sUFWfPE1JtOXy4Yd1C5+mtg7I1bkROzZOxYC69aQBygggtp1nXavuq4ECrKk/gj7
OsLkC0Jh91cj45lYwnt9SO8lSVwpFspQCwalG7cAyLVD3jeLH5nbs3fEP3BXE8in
tSgTXFjbwyBD6nJ0cxKYMQ+yzr9dDQI55n1mKdyFgEWMBD2MWTEdXCBzreXBcYWD
gDRarxKbQaWd9ANCT1Us1nBc08OvxQiLIo8dhDd/qcIx+kWS+o1Uxc0eY9HRYhX+
YPmA0Jzf6dCxHPc+1+ib/wIGlhgA1xc/HkILy7k/Q5c7s5ogDuyNeFfncjlmidaW
PqhHN+EhqIbmPbogiewXUovZ6OmSmAkG4x4ZO6qn9myWtSEwz70bDrKIA2sJWK/k
FccmW5l5dHmSPKc7fLnA6U0wRgUoE/iiE7gl5ROjEevM/G9AZhjdiL+6/U8yYOwF
tbB87qQUvI27UtSWoEE0LdVcmUDKlJN7Gw+Vkk/szueKFYCVBlJVcba0TrLYUq6H
nQttGvyWKqysI/JHvd2QcHywufF90I0WYBCZ+JnHBchKfZNcfIFv38GemfeOwWu5
adK+ivkHOjq3Q/WLCcegjvE5/ZqkG8RVZVZJ/4oH1bQPP5nVP7FJ7cMSx1ZszkD8
uhc3FltRpS5238otTnO0WNbwmNbVYe/j6on4bvrzlzKq3CTe0Tn0HA31DXt7Rw2y
IINtnOjgUQZRhsfdMT3NDsmhRgxFbmda4nmBatRqWt1WPKz8rwio3WWzFiOgE8DV
Ltx+DF9h7EpowL4IA3eusOtrOProizjyFZVvgsLbwFBNMckvmiwcq/V6iaN52ZxX
NO9XbQrKd3VsrvPEE9YqyQAsHQ==

P.S. I hope this private key isn't the one you plan on using in production or for any security since you willingly gave away the password.

Related