public void testSignAttachmentOnly() throws Exception {
    MimeMessage m = loadMessage("attachonly.eml");

    List certList = new ArrayList();

    certList.add(_signCert);
    certList.add(_origCert);

    Store certs = new JcaCertStore(certList);

    ASN1EncodableVector signedAttrs = generateSignedAttributes();

    SMIMESignedGenerator gen = new SMIMESignedGenerator("binary");

    gen.addSignerInfoGenerator(
        new JcaSimpleSignerInfoGeneratorBuilder()
            .setProvider(BC)
            .setSignedAttributeGenerator(new AttributeTable(signedAttrs))
            .build("SHA1withRSA", _signKP.getPrivate(), _signCert));
    gen.addCertificates(certs);

    MimeMultipart mm = gen.generate(m);

    SMIMESigned s = new SMIMESigned(mm);

    verifySigners(s.getCertificates(), s.getSignerInfos());

    SMIMESignedParser sp =
        new SMIMESignedParser(new JcaDigestCalculatorProviderBuilder().setProvider(BC).build(), mm);

    verifySigners(sp.getCertificates(), sp.getSignerInfos());
  }
  public void testSHA224WithRSAParserEncryptedWithDES() throws Exception {
    List certList = new ArrayList();

    certList.add(_signCert);
    certList.add(_origCert);

    Store certs = new JcaCertStore(certList);

    ASN1EncodableVector signedAttrs = generateSignedAttributes();

    SMIMESignedGenerator gen = new SMIMESignedGenerator();

    gen.addSignerInfoGenerator(
        new JcaSimpleSignerInfoGeneratorBuilder()
            .setProvider(BC)
            .setSignedAttributeGenerator(
                new DefaultSignedAttributeTableGenerator(new AttributeTable(signedAttrs)))
            .build("SHA224withRSA", _signKP.getPrivate(), _signCert));
    gen.addCertificates(certs);

    MimeMultipart smm = gen.generate(msg);
    SMIMESignedParser s =
        new SMIMESignedParser(
            new JcaDigestCalculatorProviderBuilder().setProvider(BC).build(), smm);

    certs = s.getCertificates();

    assertEquals(getDigestOid(s.getSignerInfos()), NISTObjectIdentifiers.id_sha224.toString());

    verifyMessageBytes(msg, s.getContent());

    verifySigners(certs, s.getSignerInfos());
  }
  public void testMimeMultipartBinaryParserGetMimeContent() throws Exception {
    MimeBodyPart m = createMultipartMessage();

    List certList = new ArrayList();

    certList.add(_signCert);
    certList.add(_origCert);

    Store certs = new JcaCertStore(certList);

    ASN1EncodableVector signedAttrs = generateSignedAttributes();

    SMIMESignedGenerator gen = new SMIMESignedGenerator("binary");

    gen.addSignerInfoGenerator(
        new JcaSimpleSignerInfoGeneratorBuilder()
            .setProvider(BC)
            .setSignedAttributeGenerator(new AttributeTable(signedAttrs))
            .build("SHA1withRSA", _signKP.getPrivate(), _signCert));
    gen.addCertificates(certs);

    MimeMultipart mm = gen.generate(m);

    SMIMESignedParser s =
        new SMIMESignedParser(
            new JcaDigestCalculatorProviderBuilder().setProvider(BC).build(), mm, "binary");

    verifySigners(s.getCertificates(), s.getSignerInfos());

    MimeMessage bp = s.getContentAsMimeMessage(Session.getDefaultInstance(new Properties()));
  }
  public void testRawAS2Parser() throws Exception {
    MimeMessage message = loadMessage("rawAS2.message");

    SMIMESignedParser s =
        new SMIMESignedParser(
            new JcaDigestCalculatorProviderBuilder().setProvider(BC).build(),
            (MimeMultipart) message.getContent());

    verifySigners(s.getCertificates(), s.getSignerInfos());
  }
  public void testSHA256WithRSABinaryWithParser() throws Exception {
    MimeBodyPart msg = generateBinaryPart();
    MimeMultipart smm =
        generateMultiPartRsa("SHA256withRSA", msg, SMIMESignedGenerator.RFC3851_MICALGS);
    SMIMESignedParser s =
        new SMIMESignedParser(
            new JcaDigestCalculatorProviderBuilder().setProvider(BC).build(), smm);

    verifyMessageBytes(msg, s.getContent());

    verifySigners(s.getCertificates(), s.getSignerInfos());
  }
  private void rsaPSSTest(String digest, String digestOID) throws Exception {
    MimeMultipart smm = generateMultiPartRsaPSS(digest, msg, null);
    SMIMESignedParser s =
        new SMIMESignedParser(
            new JcaDigestCalculatorProviderBuilder().setProvider(BC).build(), smm);
    Store certs = s.getCertificates();

    assertEquals(getDigestOid(s.getSignerInfos()), digestOID);

    verifyMessageBytes(msg, s.getContent());

    verifySigners(certs, s.getSignerInfos());
  }
  public void testSHA224WithRSAParser() throws Exception {
    MimeMultipart smm =
        generateMultiPartRsa("SHA224withRSA", msg, SMIMESignedGenerator.RFC3851_MICALGS);
    SMIMESignedParser s =
        new SMIMESignedParser(
            new JcaDigestCalculatorProviderBuilder().setProvider(BC).build(), smm);
    Store certs = s.getCertificates();

    assertEquals(getDigestOid(s.getSignerInfos()), NISTObjectIdentifiers.id_sha224.toString());

    verifyMessageBytes(msg, s.getContent());

    verifySigners(certs, s.getSignerInfos());
  }
  public void testSHA1WithRSAEncapsulatedParser() throws Exception {
    MimeBodyPart res = generateEncapsulatedRsa("SHA1withRSA", msg);
    SMIMESignedParser s =
        new SMIMESignedParser(
            new JcaDigestCalculatorProviderBuilder().setProvider(BC).build(), res);

    FileBackedMimeBodyPart content = (FileBackedMimeBodyPart) s.getContent();

    verifyMessageBytes(msg, content);

    content.dispose();

    verifySigners(s.getCertificates(), s.getSignerInfos());

    s.close();
  }
  public void testSHA1WithRSAEncapsulatedParserAndFile() throws Exception {
    File tmp = File.createTempFile("bcTest", ".mime");
    MimeBodyPart res = generateEncapsulatedRsa("SHA1withRSA", msg);
    SMIMESignedParser s =
        new SMIMESignedParser(
            new JcaDigestCalculatorProviderBuilder().setProvider(BC).build(), res, tmp);
    FileBackedMimeBodyPart content = (FileBackedMimeBodyPart) s.getContent();

    verifyMessageBytes(msg, s.getContent());

    verifySigners(s.getCertificates(), s.getSignerInfos());

    assertTrue(tmp.exists());

    s.close();

    content.dispose();

    assertFalse(tmp.exists());
  }