Skip to content

Instantly share code, notes, and snippets.

@fernandes
Created August 31, 2021 12:55
Show Gist options
  • Save fernandes/fd4db29d028f3282ea1478a72c1e8cad to your computer and use it in GitHub Desktop.
Save fernandes/fd4db29d028f3282ea1478a72c1e8cad to your computer and use it in GitHub Desktop.
How to decrypt a PKCS7 in Crystal using OpenSSL
# shard.yml
# dependencies:
# openssl_ext:
# github: spider-gazelle/openssl_ext
# version: ~> 2.0
require "openssl"
require "openssl_ext"
ciphertext = "-----BEGIN CERTIFICATE-----
MIIBiQYJKoZIhvcNAQcDoIIBejCCAXYCAQAxggEhMIIBHQIBAD
AFMAACAQEwDQYJKoZIhvcNAQEBBQAEggEAXW6UXSjJb2QBw4qqVF/CMHkeJE
t/J15ra2XRvlR09yICgof7r9B9pB1SlmZrgi5ar1NIkYwZ1h8dWNMkKthpQk
X57iJ+/+XO/UuK8qcuen/oUajcJZOs6o5udob0mrJsp5d4MZczSc4IrERAlJ
brNAsdnxp83U8AGxlBeKCnu+fetC1DAD2QZ2vf9qioH/7EKloA2bCIgrKe1U
EkhMR0i8DlfTVm+uYfA8o4u95Sc9UkpPlGwXXEJRDK+0WXh8xhmjmcfrOfWI
wvddTn9EQ8CHETCGPp8Hhr51TC1+voq6ODuDcrIdgWyjRsZWVsis9UVQ83lV
oKsyZt8KU3dnq7gTBMBgkqhkiG9w0BBwEwHQYJYIZIAWUDBAEqBBAEsrizxa
LubBPdDuVG6Fv/gCCOF+YlrZNFo3TaWpnQe4NCrSmLfHdVvkkaxgE1JLAYfA
==
-----END CERTIFICATE-----"
public_key = "./keys/public_key.pkcs7.pem"
private_key = "./keys/private_key.pkcs7.pem"
private_key_pem = File.read private_key
private_key_rsa = OpenSSL::PKey::RSA.new(private_key_pem)
public_key_pem = File.read public_key
public_key_x509 = OpenSSL::X509::Certificate.new(public_key_pem)
lib LibCrypto
type PKCS7 = Void*
fun pem_read_bio_pkcs7 = PEM_read_bio_PKCS7(bp : Bio*, x : PKCS7*, cb : PasswordCallback, u : Void*) : PKCS7
fun pkcs7_decrypt = PKCS7_decrypt(p7 : PKCS7, pkey : EvpPKey*, cert : X509, data : Bio*, flags : Int32) : Int32
end
class OpenSSL::PKCS7
def initialize(@ciphertext : String)
io = IO::Memory.new(@ciphertext)
bio = OpenSSL::GETS_BIO.new(io)
@pkcs7 = LibCrypto.pem_read_bio_pkcs7(bio, nil, nil, nil)
end
def decrypt(private_key_rsa : OpenSSL::PKey::RSA, public_key_x509 : OpenSSL::X509::Certificate)
key = private_key_rsa
x509 = public_key_x509
data = OpenSSL::MemBIO.new
flg = 0
ret_code = LibCrypto.pkcs7_decrypt(@pkcs7, key, x509, data, 0)
data.to_string
end
end
pkcs7 = OpenSSL::PKCS7.new(ciphertext)
puts pkcs7.decrypt(private_key_rsa, public_key_x509)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment