12 #define NewPKCS7(klass) \ 13 TypedData_Wrap_Struct((klass), &ossl_pkcs7_type, 0) 14 #define SetPKCS7(obj, pkcs7) do { \ 16 ossl_raise(rb_eRuntimeError, "PKCS7 wasn't initialized."); \ 18 RTYPEDDATA_DATA(obj) = (pkcs7); \ 20 #define GetPKCS7(obj, pkcs7) do { \ 21 TypedData_Get_Struct((obj), PKCS7, &ossl_pkcs7_type, (pkcs7)); \ 23 ossl_raise(rb_eRuntimeError, "PKCS7 wasn't initialized."); \ 26 #define SafeGetPKCS7(obj, pkcs7) do { \ 27 OSSL_Check_Kind((obj), cPKCS7); \ 28 GetPKCS7((obj), (pkcs7)); \ 31 #define NewPKCS7si(klass) \ 32 TypedData_Wrap_Struct((klass), &ossl_pkcs7_signer_info_type, 0) 33 #define SetPKCS7si(obj, p7si) do { \ 35 ossl_raise(rb_eRuntimeError, "PKCS7si wasn't initialized."); \ 37 RTYPEDDATA_DATA(obj) = (p7si); \ 39 #define GetPKCS7si(obj, p7si) do { \ 40 TypedData_Get_Struct((obj), PKCS7_SIGNER_INFO, &ossl_pkcs7_signer_info_type, (p7si)); \ 42 ossl_raise(rb_eRuntimeError, "PKCS7si wasn't initialized."); \ 45 #define SafeGetPKCS7si(obj, p7si) do { \ 46 OSSL_Check_Kind((obj), cPKCS7Signer); \ 47 GetPKCS7si((obj), (p7si)); \ 50 #define NewPKCS7ri(klass) \ 51 TypedData_Wrap_Struct((klass), &ossl_pkcs7_recip_info_type, 0) 52 #define SetPKCS7ri(obj, p7ri) do { \ 54 ossl_raise(rb_eRuntimeError, "PKCS7ri wasn't initialized."); \ 56 RTYPEDDATA_DATA(obj) = (p7ri); \ 58 #define GetPKCS7ri(obj, p7ri) do { \ 59 TypedData_Get_Struct((obj), PKCS7_RECIP_INFO, &ossl_pkcs7_recip_info_type, (p7ri)); \ 61 ossl_raise(rb_eRuntimeError, "PKCS7ri wasn't initialized."); \ 64 #define SafeGetPKCS7ri(obj, p7ri) do { \ 65 OSSL_Check_Kind((obj), cPKCS7Recipient); \ 66 GetPKCS7ri((obj), (p7ri)); \ 69 #define numberof(ary) (int)(sizeof(ary)/sizeof((ary)[0])) 71 #define ossl_pkcs7_set_data(o,v) rb_iv_set((o), "@data", (v)) 72 #define ossl_pkcs7_get_data(o) rb_iv_get((o), "@data") 73 #define ossl_pkcs7_set_err_string(o,v) rb_iv_set((o), "@error_string", (v)) 74 #define ossl_pkcs7_get_err_string(o) rb_iv_get((o), "@error_string") 101 PKCS7_SIGNER_INFO_free(ptr);
105 "OpenSSL/PKCS7/SIGNER_INFO",
115 PKCS7_RECIP_INFO_free(ptr);
119 "OpenSSL/PKCS7/RECIP_INFO",
130 static PKCS7_SIGNER_INFO *
133 return (PKCS7_SIGNER_INFO *)ASN1_dup((i2d_of_void *)i2d_PKCS7_SIGNER_INFO,
134 (d2i_of_void *)d2i_PKCS7_SIGNER_INFO,
138 static PKCS7_RECIP_INFO *
141 return (PKCS7_RECIP_INFO *)ASN1_dup((i2d_of_void *)i2d_PKCS7_RECIP_INFO,
142 (d2i_of_void *)d2i_PKCS7_RECIP_INFO,
149 PKCS7_SIGNER_INFO *pkcs7;
160 static PKCS7_SIGNER_INFO *
163 PKCS7_SIGNER_INFO *p7si, *pkcs7;
176 PKCS7_RECIP_INFO *pkcs7;
187 static PKCS7_RECIP_INFO *
190 PKCS7_RECIP_INFO *p7ri, *pkcs7;
214 pkcs7 = SMIME_read_PKCS7(in, &out);
232 VALUE pkcs7, data, flags;
242 if(!
NIL_P(data) && PKCS7_is_detached(p7))
243 flg |= PKCS7_DETACHED;
245 if(!(out = BIO_new(BIO_s_mem()))){
249 if(!SMIME_write_PKCS7(out, p7, in, flg)){
267 VALUE cert,
key, data, certs, flags;
276 rb_scan_args(argc, argv,
"32", &cert, &key, &data, &certs, &flags);
284 x509s = ossl_protect_x509_ary2sk(certs, &status);
290 if(!(pkcs7 = PKCS7_sign(x509, pkey, x509s, in, flg))){
292 sk_X509_pop_free(x509s, X509_free);
299 sk_X509_pop_free(x509s, X509_free);
311 VALUE certs, data, cipher, flags;
314 const EVP_CIPHER *ciph;
319 rb_scan_args(argc, argv,
"22", &certs, &data, &cipher, &flags);
321 #if !defined(OPENSSL_NO_RC2) 322 ciph = EVP_rc2_40_cbc();
323 #elif !defined(OPENSSL_NO_DES) 324 ciph = EVP_des_ede3_cbc();
325 #elif !defined(OPENSSL_NO_RC2) 326 ciph = EVP_rc2_40_cbc();
327 #elif !defined(OPENSSL_NO_AES) 328 ciph = EVP_EVP_aes_128_cbc();
338 x509s = ossl_protect_x509_ary2sk(certs, &status);
343 if(!(p7 = PKCS7_encrypt(x509s, in, (EVP_CIPHER*)ciph, flg))){
345 sk_X509_pop_free(x509s, X509_free);
351 sk_X509_pop_free(x509s, X509_free);
363 if (!(pkcs7 = PKCS7_new())) {
389 p7 = PEM_read_bio_PKCS7(in, &pkcs,
NULL,
NULL);
392 p7 = d2i_PKCS7_bio(in, &pkcs);
411 PKCS7 *a, *b, *pkcs7;
414 if (
self == other)
return self;
419 pkcs7 = PKCS7_dup(b);
436 static const struct {
440 {
"signed", NID_pkcs7_signed },
441 {
"data", NID_pkcs7_data },
442 {
"signedAndEnveloped", NID_pkcs7_signedAndEnveloped },
443 {
"enveloped", NID_pkcs7_enveloped },
444 {
"encrypted", NID_pkcs7_encrypted },
445 {
"digest", NID_pkcs7_digest },
455 if(
strlen(p7_type_tab[i].
name) != l)
continue;
456 if(strcmp(p7_type_tab[i].name, s) == 0){
457 ret = p7_type_tab[i].nid;
491 if(PKCS7_type_is_signed(p7))
493 if(PKCS7_type_is_encrypted(p7))
495 if(PKCS7_type_is_enveloped(p7))
497 if(PKCS7_type_is_signedAndEnveloped(p7))
499 if(PKCS7_type_is_data(p7))
512 if(!PKCS7_set_detached(p7, flag ==
Qtrue ? 1 : 0))
551 PKCS7_SIGNER_INFO *p7si;
555 if (!PKCS7_add_signer(pkcs7, p7si)) {
556 PKCS7_SIGNER_INFO_free(p7si);
559 if (PKCS7_type_is_signed(pkcs7)){
560 PKCS7_add_signed_attribute(p7si, NID_pkcs9_contentType,
561 V_ASN1_OBJECT, OBJ_nid2obj(NID_pkcs7_data));
572 PKCS7_SIGNER_INFO *si;
577 if (!(sk = PKCS7_get_signer_info(pkcs7))) {
578 OSSL_Debug(
"OpenSSL::PKCS7#get_signer_info == NULL!");
581 if ((num = sk_PKCS7_SIGNER_INFO_num(sk)) < 0) {
585 for (i=0; i<num; i++) {
586 si = sk_PKCS7_SIGNER_INFO_value(sk, i);
597 PKCS7_RECIP_INFO *ri;
601 if (!PKCS7_add_recipient_info(pkcs7, ri)) {
602 PKCS7_RECIP_INFO_free(ri);
614 PKCS7_RECIP_INFO *si;
619 if (PKCS7_type_is_enveloped(pkcs7))
620 sk = pkcs7->d.enveloped->recipientinfo;
621 else if (PKCS7_type_is_signedAndEnveloped(pkcs7))
622 sk = pkcs7->d.signed_and_enveloped->recipientinfo;
625 if ((num = sk_PKCS7_RECIP_INFO_num(sk)) < 0) {
629 for (i=0; i<num; i++) {
630 si = sk_PKCS7_RECIP_INFO_value(sk, i);
645 if (!PKCS7_add_certificate(pkcs7, x509)){
653 pkcs7_get_certs(
VALUE self)
660 i = OBJ_obj2nid(pkcs7->type);
662 case NID_pkcs7_signed:
663 certs = pkcs7->d.sign->cert;
665 case NID_pkcs7_signedAndEnveloped:
666 certs = pkcs7->d.signed_and_enveloped->cert;
676 pkcs7_get_crls(
VALUE self)
683 i = OBJ_obj2nid(pkcs7->type);
685 case NID_pkcs7_signed:
686 crls = pkcs7->d.sign->crl;
688 case NID_pkcs7_signedAndEnveloped:
689 crls = pkcs7->d.signed_and_enveloped->crl;
710 certs = pkcs7_get_certs(
self);
711 while((cert = sk_X509_pop(certs))) X509_free(cert);
731 if (!PKCS7_add_crl(pkcs7, x509crl)) {
750 crls = pkcs7_get_crls(
self);
751 while((crl = sk_X509_CRL_pop(crls))) X509_CRL_free(crl);
766 VALUE certs, store, indata, flags;
769 int flg, ok, status = 0;
776 rb_scan_args(argc, argv,
"22", &certs, &store, &indata, &flags);
783 x509s = ossl_protect_x509_ary2sk(certs, &status);
789 if(!(out = BIO_new(BIO_s_mem()))){
791 sk_X509_pop_free(x509s, X509_free);
794 ok = PKCS7_verify(p7, x509s, x509st, in, out, flg);
796 sk_X509_pop_free(x509s, X509_free);
798 msg = ERR_reason_error_string(ERR_peek_error());
810 VALUE pkey, cert, flags;
823 if(!(out = BIO_new(BIO_s_mem())))
825 if(!PKCS7_decrypt(p7, key, x509, out, flg)){
843 if(PKCS7_type_is_signed(pkcs7)){
844 if(!PKCS7_content_new(pkcs7, NID_pkcs7_data))
848 if(!(out = PKCS7_dataInit(pkcs7,
NULL)))
goto err;
850 if((len = BIO_read(in, buf,
sizeof(buf))) <= 0)
852 if(BIO_write(out, buf, len) != len)
855 if(!PKCS7_dataFinal(pkcs7, out))
goto err;
861 if(ERR_peek_error()){
877 if((len = i2d_PKCS7(pkcs7,
NULL)) <= 0)
881 if(i2d_PKCS7(pkcs7, &p) <= 0)
896 if (!(out = BIO_new(BIO_s_mem()))) {
899 if (!PEM_write_bio_PKCS7(out, pkcs7)) {
914 PKCS7_SIGNER_INFO *p7si;
918 if (!(p7si = PKCS7_SIGNER_INFO_new())) {
929 PKCS7_SIGNER_INFO *p7si;
938 if (!(PKCS7_SIGNER_INFO_set(p7si, x509, pkey, (EVP_MD*)md))) {
948 PKCS7_SIGNER_INFO *p7si;
958 PKCS7_SIGNER_INFO *p7si;
968 PKCS7_SIGNER_INFO *p7si;
973 if (!(asn1obj = PKCS7_get_signed_attribute(p7si, NID_pkcs9_signingTime))) {
976 if (asn1obj->type == V_ASN1_UTCTIME) {
994 PKCS7_RECIP_INFO *p7ri;
998 if (!(p7ri = PKCS7_RECIP_INFO_new())) {
1009 PKCS7_RECIP_INFO *p7ri;
1014 if (!PKCS7_RECIP_INFO_set(p7ri, x509)) {
1024 PKCS7_RECIP_INFO *p7ri;
1034 PKCS7_RECIP_INFO *p7ri;
1044 PKCS7_RECIP_INFO *p7ri;
1113 #define DefPKCS7Const(x) rb_define_const(cPKCS7, #x, INT2NUM(PKCS7_##x)) static VALUE ossl_pkcs7_set_certs_i(RB_BLOCK_CALL_FUNC_ARGLIST(i, arg))
int *VALUE ossl_x509_sk2ary(const STACK_OF(X509) *certs)
static VALUE ossl_pkcs7ri_initialize(VALUE self, VALUE cert)
#define RUBY_TYPED_FREE_IMMEDIATELY
size_t strlen(const char *)
#define SafeGetPKCS7si(obj, p7si)
void rb_define_singleton_method(VALUE obj, const char *name, VALUE(*func)(ANYARGS), int argc)
Defines a singleton method for obj.
static PKCS7_SIGNER_INFO * ossl_PKCS7_SIGNER_INFO_dup(const PKCS7_SIGNER_INFO *si)
static void ossl_pkcs7_recip_info_free(void *ptr)
static const rb_data_type_t ossl_pkcs7_signer_info_type
static VALUE ossl_pkcs7si_get_serial(VALUE self)
static VALUE ossl_pkcs7_verify(int argc, VALUE *argv, VALUE self)
EVP_PKEY * GetPrivPKeyPtr(VALUE obj)
#define ossl_str_adjust(str, p)
static VALUE ossl_pkcs7_add_data(VALUE self, VALUE data)
static VALUE ossl_pkcs7_set_type(VALUE self, VALUE type)
static VALUE ossl_pkcs7si_alloc(VALUE klass)
static VALUE ossl_pkcs7_s_write_smime(int argc, VALUE *argv, VALUE klass)
#define ossl_pkcs7_set_data(o, v)
static VALUE ossl_pkcs7_add_certificate(VALUE self, VALUE cert)
VALUE rb_ary_push(VALUE ary, VALUE item)
BIO * ossl_obj2bio(volatile VALUE *pobj)
VALUE rb_define_class_under(VALUE outer, const char *name, VALUE super)
Defines a class under the namespace of outer.
#define RSTRING_GETMEM(str, ptrvar, lenvar)
void rb_define_alloc_func(VALUE, rb_alloc_func_t)
VALUE rb_block_call(VALUE, ID, int, const VALUE *, rb_block_call_func_t, VALUE)
static VALUE ossl_pkcs7ri_new(PKCS7_RECIP_INFO *p7ri)
static VALUE ossl_pkcs7ri_get_issuer(VALUE self)
VALUE asn1integer_to_num(const ASN1_INTEGER *ai)
#define ossl_pkcs7_set_err_string(o, v)
VALUE ossl_membio2str(BIO *bio)
static VALUE ossl_pkcs7si_initialize(VALUE self, VALUE cert, VALUE key, VALUE digest)
static VALUE ossl_pkcs7_set_certificates(VALUE self, VALUE ary)
#define RB_BLOCK_CALL_FUNC_ARGLIST(yielded_arg, callback_arg)
#define rb_define_copy_func(klass, func)
X509 * GetX509CertPtr(VALUE)
static VALUE ossl_pkcs7ri_alloc(VALUE klass)
VALUE ossl_to_der_if_possible(VALUE obj)
void ossl_clear_error(void)
#define NewPKCS7si(klass)
static VALUE ossl_pkcs7_get_signer(VALUE self)
RUBY_EXTERN VALUE rb_cObject
void rb_attr(VALUE, ID, int, int, int)
static PKCS7_SIGNER_INFO * DupPKCS7SignerPtr(VALUE obj)
static VALUE ossl_pkcs7_set_detached(VALUE self, VALUE flag)
static VALUE ossl_pkcs7_get_recipient(VALUE self)
#define OSSL_BIO_reset(bio)
static const rb_data_type_t ossl_pkcs7_type
#define SetPKCS7si(obj, p7si)
const EVP_MD * GetDigestPtr(VALUE obj)
#define GetPKCS7(obj, pkcs7)
#define SetPKCS7(obj, pkcs7)
static VALUE ossl_pkcs7_to_der(VALUE self)
static VALUE ossl_pkcs7_add_recipient(VALUE self, VALUE recip)
void rb_define_const(VALUE, const char *, VALUE)
const EVP_CIPHER * GetCipherPtr(VALUE obj)
static VALUE ossl_pkcs7_add_signer(VALUE self, VALUE signer)
static VALUE ossl_pkcs7_copy(VALUE self, VALUE other)
static VALUE ossl_pkcs7_alloc(VALUE klass)
void rb_define_alias(VALUE klass, const char *name1, const char *name2)
Defines an alias of a method.
VALUE ossl_x509crl_sk2ary(const STACK_OF(X509_CRL) *crl)
static VALUE ossl_pkcs7_get_detached(VALUE self)
#define SetPKCS7ri(obj, p7ri)
static PKCS7_RECIP_INFO * DupPKCS7RecipientPtr(VALUE obj)
static VALUE ossl_pkcs7_get_certificates(VALUE self)
int rb_scan_args(int argc, const VALUE *argv, const char *fmt,...)
unsigned char buf[MIME_BUF_SIZE]
static void ossl_pkcs7_free(void *ptr)
static VALUE ossl_pkcs7_detached_p(VALUE self)
void rb_jump_tag(int tag)
static VALUE ossl_pkcs7_set_cipher(VALUE self, VALUE cipher)
X509_STORE * GetX509StorePtr(VALUE)
#define GetPKCS7ri(obj, p7ri)
static VALUE ossl_pkcs7_s_sign(int argc, VALUE *argv, VALUE klass)
register unsigned int len
static VALUE ossl_pkcs7_to_pem(VALUE self)
VALUE asn1str_to_str(const ASN1_STRING *str)
#define SafeGetPKCS7(obj, pkcs7)
#define GetPKCS7si(obj, p7si)
static VALUE ossl_pkcs7_set_crls(VALUE self, VALUE ary)
static VALUE ossl_pkcs7_decrypt(int argc, VALUE *argv, VALUE self)
static VALUE ossl_pkcs7_s_encrypt(int argc, VALUE *argv, VALUE klass)
VALUE asn1time_to_time(const ASN1_TIME *time)
static VALUE ossl_pkcs7_get_type(VALUE self)
static VALUE ossl_pkcs7si_get_signed_time(VALUE self)
static VALUE ossl_pkcs7_add_crl(VALUE self, VALUE crl)
void ossl_raise(VALUE exc, const char *fmt,...)
#define ossl_pkcs7_get_data(o)
static VALUE ossl_pkcs7si_new(PKCS7_SIGNER_INFO *p7si)
static VALUE ossl_pkcs7_get_crls(VALUE self)
static int ossl_pkcs7_sym2typeid(VALUE sym)
#define NewPKCS7ri(klass)
static VALUE ossl_pkcs7ri_get_serial(VALUE self)
void Init_ossl_pkcs7(void)
VALUE ossl_x509name_new(X509_NAME *)
#define rb_check_frozen(obj)
VALUE rb_define_module(const char *name)
X509_CRL * GetX509CRLPtr(VALUE)
void rb_define_method(VALUE klass, const char *name, VALUE(*func)(ANYARGS), int argc)
static VALUE ossl_pkcs7_initialize(int argc, VALUE *argv, VALUE self)
static VALUE ossl_pkcs7_set_crls_i(RB_BLOCK_CALL_FUNC_ARGLIST(i, arg))
static VALUE ossl_pkcs7si_get_issuer(VALUE self)
#define SafeGetPKCS7ri(obj, p7ri)
static VALUE ossl_pkcs7_s_read_smime(VALUE klass, VALUE arg)
static VALUE ossl_pkcs7ri_get_enc_key(VALUE self)
static PKCS7_RECIP_INFO * ossl_PKCS7_RECIP_INFO_dup(const PKCS7_RECIP_INFO *si)
VALUE rb_str_new(const char *, long)
static void ossl_pkcs7_signer_info_free(void *ptr)
static const rb_data_type_t ossl_pkcs7_recip_info_type