Skip Menu |

This queue is for tickets about the Crypt-SMIME CPAN distribution.

Report information
The Basics
Id: 97955
Status: resolved
Priority: 0/
Queue: Crypt-SMIME

People
Owner: Nobody in particular
Requestors: hatuka [...] nezumi.nu
Cc:
AdminCc:

Bug Information
Severity: Wishlist
Broken in: (no value)
Fixed in: (no value)



Subject: Adding certificate stores
こんにちは。 必要な証明書をいちいちsetPublicKey()で設定するのが大変なので、opensslの-CAfileや-CApathにあたるものを設定できるようにしてみました。 パッチを添付します。
Subject: Crypt-SMIME-0.14-publickeystore-20140812.patch
diff -ur Crypt-SMIME-0.14.orig/SMIME.mlpod Crypt-SMIME-0.14/SMIME.mlpod --- Crypt-SMIME-0.14.orig/SMIME.mlpod 2014-08-04 15:38:46.000000000 +0900 +++ Crypt-SMIME-0.14/SMIME.mlpod 2014-08-12 11:26:17.000000000 +0900 @@ -84,6 +84,23 @@ 対応しているフォーマットは PEM のみ。鍵の読み込みに失敗した場合はdieする。 >> +=item setPublicKeyStore() + + $smime->setPublicKeyStore($path, ...); + +Set the paths of file or directory containing trusted certificates. +The certificate stores will be used for verification. +J<< ja; +信頼している証明書 (複数可) +が入ったファイルやディレクトリのパス (複数可) +を設定する。ここで設定された証明書ストアは、署名の検証の際に用いられる。 +>> + +The method dies if it fails to load the certificate stores. +J<< ja; +証明書ストアの読み込みに失敗した場合はdieする。 +>> + =item sign() $signed_mime = $smime->sign($raw_mime); diff -ur Crypt-SMIME-0.14.orig/SMIME.pod Crypt-SMIME-0.14/SMIME.pod --- Crypt-SMIME-0.14.orig/SMIME.pod 2014-08-04 15:41:54.000000000 +0900 +++ Crypt-SMIME-0.14/SMIME.pod 2014-08-12 11:26:21.000000000 +0900 @@ -68,6 +68,17 @@ load the certificates. +=item setPublicKeyStore() + + $smime->setPublicKeyStore($path, ...); + +Set the paths of file or directory containing trusted certificates. +The certificate stores will be used for verification. + + +The method dies if it fails to load the certificate stores. + + =item sign() $signed_mime = $smime->sign($raw_mime); diff -ur Crypt-SMIME-0.14.orig/SMIME.xs Crypt-SMIME-0.14/SMIME.xs --- Crypt-SMIME-0.14.orig/SMIME.xs 2014-08-04 15:40:12.000000000 +0900 +++ Crypt-SMIME-0.14/SMIME.xs 2014-08-12 11:14:52.000000000 +0900 @@ -11,6 +11,8 @@ #if defined(HAVE_TIME_H) # include <time.h> #endif +#include <sys/types.h> +#include <sys/stat.h> #include "EXTERN.h" #include "perl.h" @@ -485,7 +487,7 @@ this->pubkeys_store = X509_STORE_new(); if (this->pubkeys_store == NULL) { - croak("Crypt::SMIME#new: failed to allocate X509_STORE"); + croak("Crypt::SMIME#setPublicKey: failed to allocate X509_STORE"); } /* 何故STACK_OF(X509)とX509_STOREの二つを使う必要があるのか。 */ @@ -599,6 +601,95 @@ this->pubkeys_are_tainted = SvTAINTED(ST(1)); SV* +setPublicKeyStore(Crypt_SMIME this, ...) + INIT: + X509_STORE* store; + X509* pub_cert; + X509_LOOKUP *lookup_file, *lookup_path; + int i, has_file = 0, has_path = 0; + char* pathname; + struct stat bufstat; + CODE: + /* 古い証明書ストアがあったら消す */ + if (this->pubkeys_store) { + X509_STORE_free(this->pubkeys_store); + this->pubkeys_store = NULL; + } + + store = X509_STORE_new(); + if (store == NULL) { + croak("Crypt::SMIME#setPublicKeyStore: failed to allocate X509_STORE"); + } + + /* setPublicKey()で設定した証明書があれば追加する */ + for (i = 0; i < sk_X509_num(this->pubkeys_stack); i++) { + pub_cert = sk_X509_value(this->pubkeys_stack, i); + if (pub_cert == NULL || X509_STORE_add_cert(store, pub_cert) == 0) { + X509_STORE_free(store); + croak("Crypt::SMIME#setPublicKeyStore: failed to store the public cert"); + } + } + + /* 引数があれば証明書ストアとして追加する */ + lookup_file = X509_STORE_add_lookup(store, X509_LOOKUP_file()); + if (lookup_file == NULL) { + X509_STORE_free(store); + croak("Crypt::SMIME#setPublicKeyStore: failed to allocate X509_LOOKUP"); + } + lookup_path = X509_STORE_add_lookup(store, X509_LOOKUP_hash_dir()); + if (lookup_path == NULL) { + X509_STORE_free(store); + croak("Crypt::SMIME#setPublicKeyStore: failed to allocate X509_LOOKUP"); + } + for (i = 1; i < items; i++) { + if (ST(i) == NULL) { + continue; /* 多分起こらないが… */ + } + if (!is_string(ST(i))) { + X509_STORE_free(store); + croak("Crypt::SMIME#setPublicKeyStore: ARG[%d] is non-string value", i); + } + + pathname = (char *)SvPV_nolen(ST(i)); + if (stat(pathname, &bufstat) != 0) { + X509_STORE_free(store); + croak("Crypt::SMIME#setPublicKeyStore: cannot stat %s", + pathname); + } else if (bufstat.st_mode & S_IFDIR) { + if (!X509_LOOKUP_add_dir(lookup_path, pathname, + X509_FILETYPE_PEM)) { + X509_STORE_free(store); + croak("Crypt::SMIME#setPublicKeyStore: failed to add ARG[%d] as store", i); + } + has_path = 1; + } else { + if (!X509_LOOKUP_load_file(lookup_file, pathname, + X509_FILETYPE_PEM)) { + X509_STORE_free(store); + croak("Crypt::SMIME#setPublicKeyStore: failed to add ARG[%d] as store", i); + } + has_file = 1; + } + } + + /* 引数がなければ初期値の場所のストアを (存在すれば) 追加する */ + if (!has_file) { + X509_LOOKUP_load_file(lookup_file, NULL, X509_FILETYPE_DEFAULT); + } + if (!has_path) { + X509_LOOKUP_add_dir(lookup_path, NULL, X509_FILETYPE_DEFAULT); + } + + ERR_clear_error(); + this->pubkeys_store = store; + + SvREFCNT_inc(ST(0)); + RETVAL = ST(0); + + OUTPUT: + RETVAL + +SV* _sign(Crypt_SMIME this, char* plaintext) CODE: /* 秘密鍵がまだセットされていなければエラー */ diff -ur Crypt-SMIME-0.14.orig/lib/SMIME/JA.pod Crypt-SMIME-0.14/lib/SMIME/JA.pod --- Crypt-SMIME-0.14.orig/lib/SMIME/JA.pod 2014-08-04 15:41:54.000000000 +0900 +++ Crypt-SMIME-0.14/lib/SMIME/JA.pod 2014-08-12 11:26:21.000000000 +0900 @@ -58,6 +58,16 @@ 対応しているフォーマットは PEM のみ。鍵の読み込みに失敗した場合はdieする。 +=item setPublicKeyStore() + + $smime->setPublicKeyStore($path, ...); + +信頼している証明書 (複数可) +が入ったファイルやディレクトリのパス (複数可) +を設定する。ここで設定された証明書ストアは、署名の検証の際に用いられる。 + +証明書ストアの読み込みに失敗した場合はdieする。 + =item sign() $signed_mime = $smime->sign($raw_mime); diff -ur Crypt-SMIME-0.14.orig/lib/SMIME.pm Crypt-SMIME-0.14/lib/SMIME.pm --- Crypt-SMIME-0.14.orig/lib/SMIME.pm 2014-08-04 15:41:54.000000000 +0900 +++ Crypt-SMIME-0.14/lib/SMIME.pm 2014-08-12 11:26:21.000000000 +0900 @@ -247,6 +247,17 @@ load the certificates. +=item setPublicKeyStore() + + $smime->setPublicKeyStore($path, ...); + +Set the paths of file or directory containing trusted certificates. +The certificate stores will be used for verification. + + +The method dies if it fails to load the certificate stores. + + =item sign() $signed_mime = $smime->sign($raw_mime);
パッチのご提供ありがとうございます. 取り込んだものを 0.15 としてリリースしました. http://search.cpan.org/~mikage/Crypt-SMIME-0.15/