blob: d6e1ee8f5d83517cbed5b1ba72dc308638c3e943 [file] [log] [blame]
package org.bouncycastle.mime.smime;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import org.bouncycastle.cms.CMSEnvelopedDataParser;
import org.bouncycastle.cms.CMSException;
import org.bouncycastle.cms.CMSSignedData;
import org.bouncycastle.cms.OriginatorInformation;
import org.bouncycastle.cms.RecipientInformationStore;
import org.bouncycastle.cms.SignerInformationStore;
import org.bouncycastle.mime.ConstantMimeContext;
import org.bouncycastle.mime.Headers;
import org.bouncycastle.mime.MimeContext;
import org.bouncycastle.mime.MimeIOException;
import org.bouncycastle.mime.MimeParserContext;
import org.bouncycastle.mime.MimeParserListener;
import org.bouncycastle.operator.DigestCalculator;
import org.bouncycastle.util.Store;
import org.bouncycastle.util.io.Streams;
public abstract class SMimeParserListener
implements MimeParserListener
{
private DigestCalculator[] digestCalculators;
private SMimeMultipartContext parent;
public MimeContext createContext(MimeParserContext parserContext, Headers headers)
{
if (headers.isMultipart())
{
parent = new SMimeMultipartContext(parserContext, headers);
this.digestCalculators = parent.getDigestCalculators();
return parent;
}
else
{
return new ConstantMimeContext();
}
}
public void object(MimeParserContext parserContext, Headers headers, InputStream inputStream)
throws IOException
{
try
{
if (headers.getContentType().equals("application/pkcs7-signature")
|| headers.getContentType().equals("application/x-pkcs7-signature"))
{
Map<ASN1ObjectIdentifier, byte[]> hashes = new HashMap<ASN1ObjectIdentifier, byte[]>();
for (int i = 0; i != digestCalculators.length; i++)
{
digestCalculators[i].getOutputStream().close();
hashes.put(digestCalculators[i].getAlgorithmIdentifier().getAlgorithm(), digestCalculators[i].getDigest());
}
byte[] sigBlock = Streams.readAll(inputStream);
CMSSignedData signedData = new CMSSignedData(hashes, sigBlock);
signedData(parserContext, headers, signedData.getCertificates(), signedData.getCRLs(), signedData.getAttributeCertificates(), signedData.getSignerInfos());
}
else if (headers.getContentType().equals("application/pkcs7-mime")
|| headers.getContentType().equals("application/x-pkcs7-mime"))
{
CMSEnvelopedDataParser envelopedDataParser = new CMSEnvelopedDataParser(inputStream);
envelopedData(parserContext, headers, envelopedDataParser.getOriginatorInfo(), envelopedDataParser.getRecipientInfos());
envelopedDataParser.close();
}
else
{
content(parserContext, headers, inputStream);
}
}
catch (CMSException e)
{
throw new MimeIOException("CMS failure: " + e.getMessage(), e);
}
}
public void content(MimeParserContext parserContext, Headers headers, InputStream inputStream)
throws IOException
{
throw new IllegalStateException("content handling not implemented");
}
public void signedData(MimeParserContext parserContext, Headers headers, Store certificates, Store CRLs, Store attributeCertificates, SignerInformationStore signers)
throws IOException, CMSException
{
throw new IllegalStateException("signedData handling not implemented");
}
public void envelopedData(MimeParserContext parserContext, Headers headers, OriginatorInformation originatorInformation, RecipientInformationStore recipients)
throws IOException, CMSException
{
throw new IllegalStateException("envelopedData handling not implemented");
}
}