---
name: "SMIME::JA"
section: "3pm"
platform: "linux"
package: "libcrypt-smime-perl"
version: "0.31-1"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/SMIME::JA"
---

# SMIME::JA(3pm)

S/MIMEの署名、検証、暗号化、復号

## NAME

Crypt::SMIME::JA - S/MIMEの署名、検証、暗号化、復号

## 概要

```
  use Crypt::SMIME;
  my $plain = <<'EOF';
  From: alice@example.org
  To: bob@example.com
  Subject: Crypt::SMIME test
  This is a test mail. Please ignore...
  EOF
  my $smime = Crypt::SMIME->new();
  $smime->setPrivateKey($privkey, $crt);
  # $smime->setPublicKey([$icacert]); # if need be.
  my $signed = $smime->sign($plain);
  print $signed;
```

## 説明

S/MIMEの署名、検証、暗号化、復号を行うクラス。 libcrypto (\<http://www.openssl.org\>) が必要。

## エクスポート

既定でエクスポートされるシンボルは無いが、次のシンボルはエクスポート可能である。

- "NO\_CHECK\_CERTIFICATE"

  "**check()**" を参照。

- "FORMAT\_SMIME"

  - "FORMAT\_ASN1"

  - "FORMAT\_PEM"

  "**extractCertificates()**" を参照。

- ":constants"

  上記のもの全てをエクスポートする。

## メソッド

- **new()**

  ```
    my $smime = Crypt::SMIME->new();
  ```

  引数無し

- **setPrivateKey()**

  ```
    $smime->setPrivateKey($key, $crt);
    $smime->setPrivateKey($key, $crt, $password);
  ```

  秘密鍵を設定する。ここで設定された秘密鍵は署名と復号の際に用いられる。 ファイル名ではなく、鍵本体を渡す。

  対応しているフォーマットは PEM のみ。鍵の読み込みに失敗した場合はdieする。

- **setPrivateKeyPkcs12()**

  ```
    $smime->setPrivateKeyPkcs12($key, $pkcs12);
    $smime->setPrivateKeyPkcs12($key, $pkcs12, $password);
  ```

  秘密鍵およびその X.509 証明書を PKCS#12 から読み込んで設定する。秘密鍵は署名と復号の際に用いられる。 読み込みに失敗した場合は die する。

- **setPublicKey()**

  ```
    $smime->setPublicKey($crt);
    $smime->setPublicKey([$crt1, $crt2, ...]);
  ```

  公開鍵を設定する。ここで設定された公開鍵は署名への添付、署名の検証、 そして暗号化の際に用いられる。

  対応しているフォーマットは PEM のみ。鍵の読み込みに失敗した場合はdieする。

- **setPublicKeyStore()**

  ```
    $smime->setPublicKeyStore($path, ...);
  ```

  信頼している証明書 (複数可) が入ったファイルやディレクトリのパス (複数可) を設定する。ここで設定された証明書ストアは、署名の検証の際に用いられる。

  証明書ストアの読み込みに失敗した場合はdieする。

- **sign()**

  ```
    $signed_mime = $smime->sign($raw_mime);
  ```

  署名を行い、MIMEメッセージを返す。可能な署名はクリア署名のみ。

  `"Content-*"`, `"MIME-*"` 及び `"Subject"` を除いたヘッダは multipartのトップレベルに移される。 `"Subject"` はS/MIMEを認識できないメーラのために, multipartの トップレベルと保護されるメッセージの両側に配置される。

  元の MIME メッセージ、秘密鍵、またはその証明書のいずれかが汚染されている (tainted) ならば、署名されたメッセージも汚染される。

- **signonly()**

  ```
    $sign = $smime->signonly($prepared_mime);
  ```

  署名の計算を行う。 `$sign` はBASE64でエンコードされて返る。 `$prepared_mime` には, "prepareSmimeMessage" で返される値を渡す。

  元の MIME メッセージ、秘密鍵、またはその証明書のいずれかが汚染されている (tainted) ならば、生成された署名も汚染される。

- **prepareSmimeMessage()**

  ```
    ($prepared_mime, $outer_header)
        = $smime->prepareSmimeMessage($source_mime);
  ```

  署名用のメッセージを準備する。 `$prepared_mime` には署名用に修正されたMIMEメッセージを返す。 `$outer_header` は、S/MIMEの外側に付与するヘッダを返す。

  `$prepared_mime` の本文は`$source_mime`と同じ物となるが、 ヘッダに関しては`"Content-*"`, `"MIME-*"`, `"Subject"` を除く全てが 取り除かれる。取り除かれたヘッダは `$outer_header` に返される。 S/MIMEメッセージを構築する際にはこれをS/MIMEメッセージのヘッダに追加する。 `"Subject"` ヘッダのみは `$prepared_mime` と `$outer_header` の両方に 現れる点に注意。

- **check()**

  ```
    use Crypt::SMIME qw(:constants);
    $source_mime = $smime->check($signed_mime);
    $source_mime = $smime->check($signed_mime, $flags);
  ```

  検証を行う。検証に失敗した場合はその理由と共にdieする。

  `$flags` として `"Crypt::SMIME::NO_CHECK_CERTIFICATE"` オプションを指定した場合には、署名者の証明書チェーンを検証しない。 `$flags` のデフォルト値は `0` であり、この場合には全ての整合性についての検証を行う。

  元の S/MIME メッセージ, `$flags`, 検証時刻 ("setAtTime"), または 公開鍵の少なくとも一つが汚染されている(tainted) ならば、検証されたメッセージも汚染される。

- **encrypt()**

  ```
    $encrypted_mime = $smime->encrypt($raw_mime);
  ```

  暗号化を行う。

  `"Content-*"`, `"MIME-*"` 及び `"Subject"` を除いたヘッダは multipartのトップレベルにコピーされる。 `"Subject"` はS/MIMEを認識できないメーラのために, multipartの トップレベルと保護されるメッセージの両側に配置される。

  元の MIME メッセージ、または公開鍵の少なくとも一つが汚染されている (tainted) ならば、暗号化されたメッセージも汚染される。

- **decrypt()**

  ```
    $decrypted_mime = $smime->decrypt($encrypted_mime);
  ```

  復号を行う。復号に失敗した場合はその理由と共にdieする。

  元の S/MIME メッセージ、秘密鍵、またはその証明書のいずれかが汚染されている (tainted) ならば、復号されたメッセージも汚染される。

- **isSigned()**

  ```
    $is_signed = $smime->isSigned($mime);
  ```

  渡されたMIMEメッセージがS/MIMEで署名されたものなら真を返す。 クリア署名かどうかは問わない。 署名後に暗号化したメッセージを渡した場合は、署名が直接見えない為、 偽を返す事に注意。

- **isEncrypted()**

  ```
    $is_encrypted = $smime->isEncrypted($mime);
  ```

  渡されたMIMEメッセージがS/MIMEで暗号化されたものなら真を返す。 暗号化後に署名したメッセージを渡した場合は、暗号文が直接見えない為、 偽を返す事に注意。

- **setAtTime()**

  ```
    $yesterday = time - (60*60*24);
    $smime->setAtTime($yesterday);
  ```

  検証時に用いる時刻を設定する。デフォルトは現在時刻。 UNIX epoch 形式でなければならない。

## 関数

- **extractCertificates()**

  ```
    use Crypt::SMIME qw(:constants);
    @certs = @{Crypt::SMIME::extractCertificates($data)};
    @certs = @{Crypt::SMIME::extractCertificates($data, FORMAT_SMIME)};
  ```

  \<S/MIMEメッセージまたはPKCS#7オブジェクトに含まれるX.509証明書 (や証明書失効リスト) をすべて取得する。 オプションの `$type` パラメータでデータの種類を指定できる。 `"Crypt::SMIME::FORMAT_SMIME"` (初期値) はS/MIMEメッセージ、 `"Crypt::SMIME::FORMAT_ASN1"`はバイナリ形式、 `"Crypt::SMIME::FORMAT_PEM"`はPEM形式。

- **getSigners()**

  ```
    @certs = @{Crypt::SMIME::getSigners($data)};
    @certs = @{Crypt::SMIME::getSigners($data, $type)};
  ```

  S/MIMEメッセージまたはPKCS#7オブジェクトに含まれる、署名者の X.509証明書を取得する。オプションの$typeパラメータでデータの種類を指定できる。

  この関数が返す公開鍵は検証されていないことに注意。 公開鍵が有効であることを確かめるにはcheck()を実行すること。

## 著者

Copyright 2006-2014 YMIRLINK Inc. All Rights Reserved.

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself

Bug reports and comments to: tl@tripletail.jp
