Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions ext/openssl/ossl_pkcs7.c
Original file line number Diff line number Diff line change
Expand Up @@ -847,6 +847,25 @@ ossl_pkcs7_to_der(VALUE self)
return str;
}

static VALUE
ossl_pkcs7_to_text(VALUE self)
{
PKCS7 *pkcs7;
BIO *out;
VALUE str;

GetPKCS7(self, pkcs7);
if(!(out = BIO_new(BIO_s_mem())))
ossl_raise(ePKCS7Error, NULL);
if(!PKCS7_print_ctx(out, pkcs7, 0, NULL)) {
BIO_free(out);
ossl_raise(ePKCS7Error, NULL);
}
str = ossl_membio2str(out);

return str;
}

static VALUE
ossl_pkcs7_to_pem(VALUE self)
{
Expand Down Expand Up @@ -1056,6 +1075,7 @@ Init_ossl_pkcs7(void)
rb_define_method(cPKCS7, "to_pem", ossl_pkcs7_to_pem, 0);
rb_define_alias(cPKCS7, "to_s", "to_pem");
rb_define_method(cPKCS7, "to_der", ossl_pkcs7_to_der, 0);
rb_define_method(cPKCS7, "to_text", ossl_pkcs7_to_text, 0);

cPKCS7Signer = rb_define_class_under(cPKCS7, "SignerInfo", rb_cObject);
rb_define_const(cPKCS7, "Signer", cPKCS7Signer);
Expand Down
60 changes: 60 additions & 0 deletions ext/openssl/ossl_ts.c
Original file line number Diff line number Diff line change
Expand Up @@ -503,6 +503,25 @@ ossl_ts_req_to_der(VALUE self)
return asn1_to_der((void *)req, (int (*)(void *, unsigned char **))i2d_TS_REQ);
}

static VALUE
ossl_ts_req_to_text(VALUE self)
{
TS_REQ *req;
BIO *out;

GetTSRequest(self, req);

out = BIO_new(BIO_s_mem());
if (!out) ossl_raise(eTimestampError, NULL);

if (!TS_REQ_print_bio(out, req)) {
BIO_free(out);
ossl_raise(eTimestampError, NULL);
}

return ossl_membio2str(out);
}

static VALUE
ossl_ts_resp_alloc(VALUE klass)
{
Expand Down Expand Up @@ -757,6 +776,25 @@ ossl_ts_resp_to_der(VALUE self)
return asn1_to_der((void *)resp, (int (*)(void *, unsigned char **))i2d_TS_RESP);
}

static VALUE
ossl_ts_resp_to_text(VALUE self)
{
TS_RESP *resp;
BIO *out;

GetTSResponse(self, resp);

out = BIO_new(BIO_s_mem());
if (!out) ossl_raise(eTimestampError, NULL);

if (!TS_RESP_print_bio(out, resp)) {
BIO_free(out);
ossl_raise(eTimestampError, NULL);
}

return ossl_membio2str(out);
}

/*
* Verifies a timestamp token by checking the signature, validating the
* certificate chain implied by tsa_certificate and by checking conformance to
Expand Down Expand Up @@ -1073,6 +1111,25 @@ ossl_ts_token_info_to_der(VALUE self)
return asn1_to_der((void *)info, (int (*)(void *, unsigned char **))i2d_TS_TST_INFO);
}

static VALUE
ossl_ts_token_info_to_text(VALUE self)
{
TS_TST_INFO *info;
BIO *out;

GetTSTokenInfo(self, info);

out = BIO_new(BIO_s_mem());
if (!out) ossl_raise(eTimestampError, NULL);

if (!TS_TST_INFO_print_bio(out, info)) {
BIO_free(out);
ossl_raise(eTimestampError, NULL);
}

return ossl_membio2str(out);
}

static ASN1_INTEGER *
ossl_tsfac_serial_cb(struct TS_resp_ctx *ctx, void *data)
{
Expand Down Expand Up @@ -1356,6 +1413,7 @@ Init_ossl_ts(void)
rb_define_method(cTimestampResponse, "token_info", ossl_ts_resp_get_token_info, 0);
rb_define_method(cTimestampResponse, "tsa_certificate", ossl_ts_resp_get_tsa_certificate, 0);
rb_define_method(cTimestampResponse, "to_der", ossl_ts_resp_to_der, 0);
rb_define_method(cTimestampResponse, "to_text", ossl_ts_resp_to_text, 0);
rb_define_method(cTimestampResponse, "verify", ossl_ts_resp_verify, -1);

/* Document-class: OpenSSL::Timestamp::TokenInfo
Expand All @@ -1374,6 +1432,7 @@ Init_ossl_ts(void)
rb_define_method(cTimestampTokenInfo, "ordering", ossl_ts_token_info_get_ordering, 0);
rb_define_method(cTimestampTokenInfo, "nonce", ossl_ts_token_info_get_nonce, 0);
rb_define_method(cTimestampTokenInfo, "to_der", ossl_ts_token_info_to_der, 0);
rb_define_method(cTimestampTokenInfo, "to_text", ossl_ts_token_info_to_text, 0);

/* Document-class: OpenSSL::Timestamp::Request
* Allows to create timestamp requests or parse existing ones. A Request is
Expand All @@ -1399,6 +1458,7 @@ Init_ossl_ts(void)
rb_define_method(cTimestampRequest, "cert_requested=", ossl_ts_req_set_cert_requested, 1);
rb_define_method(cTimestampRequest, "cert_requested?", ossl_ts_req_get_cert_requested, 0);
rb_define_method(cTimestampRequest, "to_der", ossl_ts_req_to_der, 0);
rb_define_method(cTimestampRequest, "to_text", ossl_ts_req_to_text, 0);

/*
* Indicates a successful response. Equal to +0+.
Expand Down
6 changes: 6 additions & 0 deletions test/openssl/test_pkcs7.rb
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,12 @@ def test_smime
assert_equal(p7.to_der, OpenSSL::PKCS7.read_smime(smime).to_der)
end

def test_to_text
p7 = OpenSSL::PKCS7.new
p7.type = "signed"
assert_match(/signed/, p7.to_text)
end

def test_degenerate_pkcs7
ca_cert_pem = <<END
-----BEGIN CERTIFICATE-----
Expand Down
2 changes: 2 additions & 0 deletions test/openssl/test_ts.rb
Original file line number Diff line number Diff line change
Expand Up @@ -323,6 +323,8 @@ def test_response_default_policy
resp = fac.create_timestamp(ee_key, ts_cert_ee, req)
assert_equal(OpenSSL::Timestamp::Response::GRANTED, resp.status)
assert_equal("1.2.3.4.6", resp.token_info.policy_id)

assert_match(/1\.2\.3\.4\.6/, resp.to_text)
end

def test_response_bad_purpose
Expand Down