Skip to content

Commit 1fd3f69

Browse files
committed
Added initial support for multiple digests.
1 parent 1738d51 commit 1fd3f69

File tree

2 files changed

+30
-7
lines changed

2 files changed

+30
-7
lines changed

pkix/src/main/java/org/bouncycastle/mime/smime/SMimeMultipartContext.java

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.bouncycastle.operator.DigestCalculator;
1515
import org.bouncycastle.operator.OperatorCreationException;
1616
import org.bouncycastle.util.io.TeeInputStream;
17+
import org.bouncycastle.util.io.TeeOutputStream;
1718

1819
public class SMimeMultipartContext
1920
implements MimeMultipartContext
@@ -24,15 +25,34 @@ public class SMimeMultipartContext
2425
public SMimeMultipartContext(MimeParserContext parserContext, Headers headers)
2526
{
2627
this.parserContext = (SMimeParserContext)parserContext;
27-
this.calculators = createDigestCalculators();
28+
this.calculators = createDigestCalculators(headers);
2829
}
2930

3031
DigestCalculator[] getDigestCalculators()
3132
{
3233
return calculators;
3334
}
3435

35-
private DigestCalculator[] createDigestCalculators()
36+
OutputStream getDigestOutputStream()
37+
{
38+
if (calculators.length == 1)
39+
{
40+
return calculators[0].getOutputStream();
41+
}
42+
else
43+
{
44+
OutputStream compoundStream = calculators[0].getOutputStream();
45+
46+
for (int i = 1; i < calculators.length; i++)
47+
{
48+
compoundStream = new TeeOutputStream(calculators[i].getOutputStream(), compoundStream);
49+
}
50+
51+
return compoundStream;
52+
}
53+
}
54+
55+
private DigestCalculator[] createDigestCalculators(Headers headers)
3656
{
3757
try
3858
{
@@ -56,7 +76,7 @@ public InputStream applyContext(Headers headers, InputStream contentStream)
5676
{
5777
if (partNo == 0)
5878
{
59-
OutputStream digestOut = SMimeMultipartContext.this.getDigestCalculators()[0].getOutputStream();
79+
OutputStream digestOut = getDigestOutputStream();
6080

6181
headers.dumpHeaders(digestOut);
6282

pkix/src/main/java/org/bouncycastle/mime/smime/SMimeParserListener.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,15 @@
2424
public abstract class SMimeParserListener
2525
implements MimeParserListener
2626
{
27-
private DigestCalculator digestCalculator;
27+
private DigestCalculator[] digestCalculators;
2828
private SMimeMultipartContext parent;
2929

3030
public MimeContext createContext(MimeParserContext parserContext, Headers headers)
3131
{
3232
if (headers.isMultipart())
3333
{
3434
parent = new SMimeMultipartContext(parserContext, headers);
35-
this.digestCalculator = parent.getDigestCalculators()[0];
35+
this.digestCalculators = parent.getDigestCalculators();
3636
return parent;
3737
}
3838
else
@@ -50,9 +50,12 @@ public void object(MimeParserContext parserContext, Headers headers, InputStream
5050
{
5151
Map<ASN1ObjectIdentifier, byte[]> hashes = new HashMap<ASN1ObjectIdentifier, byte[]>();
5252

53-
digestCalculator.getOutputStream().close();
53+
for (int i = 0; i != digestCalculators.length; i++)
54+
{
55+
digestCalculators[i].getOutputStream().close();
5456

55-
hashes.put(digestCalculator.getAlgorithmIdentifier().getAlgorithm(), digestCalculator.getDigest());
57+
hashes.put(digestCalculators[i].getAlgorithmIdentifier().getAlgorithm(), digestCalculators[i].getDigest());
58+
}
5659

5760
CMSSignedData signedData = new CMSSignedData(hashes, Streams.readAll(inputStream));
5861

0 commit comments

Comments
 (0)