Skip to content

Commit

Permalink
Change to class method and add basic test.
Browse files Browse the repository at this point in the history
  • Loading branch information
ioquatix committed May 13, 2021
1 parent 04441bb commit d5b5ccf
Show file tree
Hide file tree
Showing 4 changed files with 128 additions and 35 deletions.
95 changes: 60 additions & 35 deletions ext/openssl/ossl_x509cert.c
Original file line number Diff line number Diff line change
Expand Up @@ -704,57 +704,81 @@ ossl_x509_eq(VALUE self, VALUE other)
return !X509_cmp(a, b) ? Qtrue : Qfalse;
}

/*
* call-seq:
* cert.load_chained_cert_from_file(path) -> [certs...]
*
* Read the chained certificates from specified file path.
*/
static VALUE
ossl_x509_load_chained_cert_from_file(VALUE self, VALUE path)
{
BIO *in;
X509 *x509;
VALUE ary = rb_ary_new();
VALUE cert;
load_chained_certificates(VALUE _io) {
BIO *in = (BIO*)_io;
VALUE certificates = rb_ary_new();

in = BIO_new(BIO_s_file());
if (in == NULL)
ossl_raise(eX509CertError, NULL);
X509 *x509 = NULL;

if (BIO_read_filename(in, StringValueCStr(path)) <= 0)
ossl_raise(eX509CertError, NULL);

/* check the certificate format is PEM or DER */
// Check the certificate format is PEM or DER:

// Case 1: certificate format is PEM:
if ((x509 = PEM_read_bio_X509(in, NULL, NULL, NULL)) != NULL) {
/* case 1: certificate format is PEM */
do {
cert = ossl_x509_new(x509);
rb_ary_push(ary, cert);
rb_ary_push(certificates, ossl_x509_new(x509));
X509_free(x509);
} while ((x509 = PEM_read_bio_X509(in, NULL, NULL, NULL)) != NULL);
} while (!BIO_eof(in) && (x509 = PEM_read_bio_X509(in, NULL, NULL, NULL)) != NULL);

BIO_free(in);
return ary;
if (ERR_GET_REASON(ERR_peek_last_error()) == PEM_R_NO_START_LINE) {
ERR_clear_error();
}

return certificates;
}

/* certificate format is not PEM */
OSSL_BIO_reset(in);

// Case 2: certificate format is DER:
if ((x509 = d2i_X509_bio(in, NULL)) != NULL) {
/* case 2: certificate format is DER */
do {
cert = ossl_x509_new(x509);
rb_ary_push(ary, cert);
rb_ary_push(certificates, ossl_x509_new(x509));
X509_free(x509);
} while ((x509 = d2i_X509_bio(in, NULL)) != NULL);
} while (!BIO_eof(in) && (x509 = d2i_X509_bio(in, NULL)) != NULL);

BIO_free(in);
return ary;
return certificates;
}

/* error: certificate format is not both PEM or DER */
// If we got to the end of the file, we are done:
if (BIO_eof(in)) {
ERR_clear_error();
return certificates;
} else {
// Otherwise we couldn't read everything so fail:
ossl_raise(eX509CertError, NULL);
}
}

static VALUE
load_chained_certificates_ensure(VALUE _io) {
BIO *in = (BIO*)_io;
BIO_free(in);
ossl_raise(eX509CertError, NULL);

return Qnil;
}

/*
* call-seq:
* OpenSSL::X509::Certificate.load(path) -> [certs...]
*
* Read the chained certificates from specified file path.
*/
static VALUE
ossl_x509_load_chained_certificates(VALUE klass, VALUE path)
{
ERR_clear_error();

BIO *in = BIO_new(BIO_s_file());

if (in == NULL)
ossl_raise(eX509CertError, NULL);

if (BIO_read_filename(in, StringValueCStr(path)) <= 0) {
BIO_free(in);
ossl_raise(eX509CertError, NULL);
}

return rb_ensure(load_chained_certificates, (VALUE)in, load_chained_certificates_ensure, (VALUE)in);
}


Expand Down Expand Up @@ -866,6 +890,8 @@ Init_ossl_x509cert(void)
*/
cX509Cert = rb_define_class_under(mX509, "Certificate", rb_cObject);

rb_define_singleton_method(cX509Cert, "load", ossl_x509_load_chained_certificates, 1);

rb_define_alloc_func(cX509Cert, ossl_x509_alloc);
rb_define_method(cX509Cert, "initialize", ossl_x509_initialize, -1);
rb_define_method(cX509Cert, "initialize_copy", ossl_x509_copy, 1);
Expand Down Expand Up @@ -897,5 +923,4 @@ Init_ossl_x509cert(void)
rb_define_method(cX509Cert, "add_extension", ossl_x509_add_extension, 1);
rb_define_method(cX509Cert, "inspect", ossl_x509_inspect, 0);
rb_define_method(cX509Cert, "==", ossl_x509_eq, 1);
rb_define_method(cX509Cert, "load_chained_cert_from_file", ossl_x509_load_chained_cert_from_file, 1);
}
Empty file.
56 changes: 56 additions & 0 deletions test/openssl/fixtures/pkey/fullchain.pem
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
-----BEGIN CERTIFICATE-----
MIIFKTCCBBGgAwIBAgISBFspP+tJfRaC6xprreB4Rp9KMA0GCSqGSIb3DQEBCwUA
MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD
EwJSMzAeFw0yMTA0MTcwMjQzMTlaFw0yMTA3MTYwMjQzMTlaMBwxGjAYBgNVBAMT
EXd3dy5jb2Rlb3Rha3UuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
AQEAx6h5vNPfkkrtYWxn1PWDDLRAwrGmZbkYPttjHBRSwTcd7rsIX4PcSzw9fWxm
K4vIkAYoKAElIvsSE3xRUjyzMrACfdhK5J8rG25fq94iVyoYaNBQV0WMJkO6X47s
hGeIKkK91ohR5b2tMw3/z9zELP0TVo2TPG7rYsBZm34myldqDA8yVEBEOa+Qdpda
9xewPhkkdpAU55qgWTrD21m7vGq9WpsBz4wNKnwVsaugtkRH82VPIfaL4ZI9kox6
QoPWe/tHUBdlDkuT7ud77eLAWnC/5Clg28/9GU/Z8Nj8SrrKuXL6WUXmxxaAhWUR
Qx4VblZeuIpwd0nHyP0hz4CWKQIDAQABo4ICTTCCAkkwDgYDVR0PAQH/BAQDAgWg
MB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMBAf8EAjAAMB0G
A1UdDgQWBBTKiSGZuLFSIG2JPbFSZa9TxMu5WTAfBgNVHSMEGDAWgBQULrMXt1hW
y65QCUDmH6+dixTCxjBVBggrBgEFBQcBAQRJMEcwIQYIKwYBBQUHMAGGFWh0dHA6
Ly9yMy5vLmxlbmNyLm9yZzAiBggrBgEFBQcwAoYWaHR0cDovL3IzLmkubGVuY3Iu
b3JnLzAcBgNVHREEFTATghF3d3cuY29kZW90YWt1LmNvbTBMBgNVHSAERTBDMAgG
BmeBDAECATA3BgsrBgEEAYLfEwEBATAoMCYGCCsGAQUFBwIBFhpodHRwOi8vY3Bz
LmxldHNlbmNyeXB0Lm9yZzCCAQUGCisGAQQB1nkCBAIEgfYEgfMA8QB3AJQgvB6O
1Y1siHMfgosiLA3R2k1ebE+UPWHbTi9YTaLCAAABeN3s/lgAAAQDAEgwRgIhAKFY
Q+vBe3zyeBazxp8kVN7oLvcQ6Y9PPz199tVhYnEbAiEAhU/xdbQaY/6b93h+7NTF
sPG7X4lq/3UoNgoXcAVGZgoAdgD2XJQv0XcwIhRUGAgwlFaO400TGTO/3wwvIAvM
TvFk4wAAAXjd7P5OAAAEAwBHMEUCIQDWd79+jWaGuf3acm5/yV95jL2KvzeGFfdU
HZlKIeWFmAIgDSZ6ug7AyhYNKjzFV4ZSICln+L4yI92EpOa+8gDG6/0wDQYJKoZI
hvcNAQELBQADggEBAHIhMYm06lLFmJL+cfIg5fFEmFNdHmmZn88Hypv4/MtmqTKv
5asF/z3TvhW4hX2+TY+NdcqGT7cZFo/ZF/tS6oBXPgmBYM1dEfp2FAdnGNOySC5Y
7RC4Uk9TUpP2g101YBmj6dQKQluAwIQk+gO4MSlHE0J0U/lMpjvrLWcuHbV4/xWJ
IdM+iPq8GeYt5epYmNc7XeRIgv7V3RxDQdBv2OVM5mtPVerdiO0ISrdbe5mvz2+Z
rhSg+EJNHlmMwcq5HqtMwS8M8Ax+vLmWCOkPWXhyV8wQaQcFjZJfpIGUvCnMTqsh
kSIYXq2CbSDUUFRFssNN6EdVms0KnmW3BUu0xAk=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEZTCCA02gAwIBAgIQQAF1BIMUpMghjISpDBbN3zANBgkqhkiG9w0BAQsFADA/
MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
DkRTVCBSb290IENBIFgzMB4XDTIwMTAwNzE5MjE0MFoXDTIxMDkyOTE5MjE0MFow
MjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxCzAJBgNVBAMT
AlIzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuwIVKMz2oJTTDxLs
jVWSw/iC8ZmmekKIp10mqrUrucVMsa+Oa/l1yKPXD0eUFFU1V4yeqKI5GfWCPEKp
Tm71O8Mu243AsFzzWTjn7c9p8FoLG77AlCQlh/o3cbMT5xys4Zvv2+Q7RVJFlqnB
U840yFLuta7tj95gcOKlVKu2bQ6XpUA0ayvTvGbrZjR8+muLj1cpmfgwF126cm/7
gcWt0oZYPRfH5wm78Sv3htzB2nFd1EbjzK0lwYi8YGd1ZrPxGPeiXOZT/zqItkel
/xMY6pgJdz+dU/nPAeX1pnAXFK9jpP+Zs5Od3FOnBv5IhR2haa4ldbsTzFID9e1R
oYvbFQIDAQABo4IBaDCCAWQwEgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8E
BAMCAYYwSwYIKwYBBQUHAQEEPzA9MDsGCCsGAQUFBzAChi9odHRwOi8vYXBwcy5p
ZGVudHJ1c3QuY29tL3Jvb3RzL2RzdHJvb3RjYXgzLnA3YzAfBgNVHSMEGDAWgBTE
p7Gkeyxx+tvhS5B1/8QVYIWJEDBUBgNVHSAETTBLMAgGBmeBDAECATA/BgsrBgEE
AYLfEwEBATAwMC4GCCsGAQUFBwIBFiJodHRwOi8vY3BzLnJvb3QteDEubGV0c2Vu
Y3J5cHQub3JnMDwGA1UdHwQ1MDMwMaAvoC2GK2h0dHA6Ly9jcmwuaWRlbnRydXN0
LmNvbS9EU1RST09UQ0FYM0NSTC5jcmwwHQYDVR0OBBYEFBQusxe3WFbLrlAJQOYf
r52LFMLGMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjANBgkqhkiG9w0B
AQsFAAOCAQEA2UzgyfWEiDcx27sT4rP8i2tiEmxYt0l+PAK3qB8oYevO4C5z70kH
ejWEHx2taPDY/laBL21/WKZuNTYQHHPD5b1tXgHXbnL7KqC401dk5VvCadTQsvd8
S8MXjohyc9z9/G2948kLjmE6Flh9dDYrVYA9x2O+hEPGOaEOa1eePynBgPayvUfL
qjBstzLhWVQLGAkXXmNs+5ZnPBxzDJOLxhF2JIbeQAcH5H0tZrUlo5ZYyOqA7s9p
O5b85o3AM/OJ+CktFBQtfvBhcJVd9wvlwPsk+uyOy2HI7mNxKKgsBTt375teA2Tw
UdHkhVNcsAKX1H7GNNLOEADksd86wuoXvg==
-----END CERTIFICATE-----
12 changes: 12 additions & 0 deletions test/openssl/test_x509cert.rb
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,18 @@ def test_marshal
assert_equal cert.to_der, deserialized.to_der
end

def test_load_empty
empty_path = Fixtures.file_path("pkey", "empty.pem")
certificates = OpenSSL::X509::Certificate.load(empty_path)
assert_equal 0, certificates.size
end

def test_load_fullchain
fullchain_path = Fixtures.file_path("pkey", "fullchain.pem")
certificates = OpenSSL::X509::Certificate.load(fullchain_path)
assert_equal 2, certificates.size
end

private

def certificate_error_returns_false
Expand Down

0 comments on commit d5b5ccf

Please sign in to comment.