1e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrompackage org.bouncycastle.cms;
2e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
3e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport java.io.IOException;
4e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport java.io.OutputStream;
5e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport java.util.Collections;
6e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport java.util.HashMap;
7e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport java.util.Map;
8e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
9e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.ASN1Encoding;
10e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.ASN1ObjectIdentifier;
11e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.ASN1Set;
12e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.DERObjectIdentifier;
13e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.DEROctetString;
14e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.DERSet;
15e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.cms.AttributeTable;
16e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.cms.SignerIdentifier;
17e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.cms.SignerInfo;
18e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.x509.AlgorithmIdentifier;
19e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.cert.X509CertificateHolder;
20e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.operator.ContentSigner;
21e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.operator.DefaultDigestAlgorithmIdentifierFinder;
22e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.operator.DigestAlgorithmIdentifierFinder;
23e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.operator.DigestCalculator;
24e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.operator.DigestCalculatorProvider;
25e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.operator.OperatorCreationException;
26e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.util.io.TeeOutputStream;
27e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
28e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrompublic class SignerInfoGenerator
29e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom{
30e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private final SignerIdentifier signerIdentifier;
31e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private final CMSAttributeTableGenerator sAttrGen;
32e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private final CMSAttributeTableGenerator unsAttrGen;
33e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private final ContentSigner signer;
34e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private final DigestCalculator digester;
35e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private final DigestAlgorithmIdentifierFinder digAlgFinder = new DefaultDigestAlgorithmIdentifierFinder();
36e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private final CMSSignatureEncryptionAlgorithmFinder sigEncAlgFinder;
37e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
38e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private byte[] calculatedDigest = null;
39e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private X509CertificateHolder certHolder;
40e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
41e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    SignerInfoGenerator(
42e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        SignerIdentifier signerIdentifier,
43e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        ContentSigner signer,
44e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        DigestCalculatorProvider digesterProvider,
45e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        CMSSignatureEncryptionAlgorithmFinder sigEncAlgFinder)
46e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        throws OperatorCreationException
47e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
48e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        this(signerIdentifier, signer, digesterProvider, sigEncAlgFinder, false);
49e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
50e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
51e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    SignerInfoGenerator(
52e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        SignerIdentifier signerIdentifier,
53e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        ContentSigner signer,
54e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        DigestCalculatorProvider digesterProvider,
55e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        CMSSignatureEncryptionAlgorithmFinder sigEncAlgFinder,
56e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        boolean isDirectSignature)
57e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        throws OperatorCreationException
58e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
59e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        this.signerIdentifier = signerIdentifier;
60e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        this.signer = signer;
61e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
62e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (digesterProvider != null)
63e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
64e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            this.digester = digesterProvider.get(digAlgFinder.find(signer.getAlgorithmIdentifier()));
65e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
66e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        else
67e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
68e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            this.digester = null;
69e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
70e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
71e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (isDirectSignature)
72e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
73e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            this.sAttrGen = null;
74e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            this.unsAttrGen = null;
75e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
76e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        else
77e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
78e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            this.sAttrGen = new DefaultSignedAttributeTableGenerator();
79e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            this.unsAttrGen = null;
80e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
81e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
82e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        this.sigEncAlgFinder = sigEncAlgFinder;
83e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
84e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
85e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public SignerInfoGenerator(
86e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        SignerInfoGenerator original,
87e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        CMSAttributeTableGenerator sAttrGen,
88e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        CMSAttributeTableGenerator unsAttrGen)
89e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
90e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        this.signerIdentifier = original.signerIdentifier;
91e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        this.signer = original.signer;
92e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        this.digester = original.digester;
93e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        this.sigEncAlgFinder = original.sigEncAlgFinder;
94e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        this.sAttrGen = sAttrGen;
95e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        this.unsAttrGen = unsAttrGen;
96e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
97e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
98e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    SignerInfoGenerator(
99e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        SignerIdentifier signerIdentifier,
100e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        ContentSigner signer,
101e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        DigestCalculatorProvider digesterProvider,
102e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        CMSSignatureEncryptionAlgorithmFinder sigEncAlgFinder,
103e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        CMSAttributeTableGenerator sAttrGen,
104e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        CMSAttributeTableGenerator unsAttrGen)
105e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        throws OperatorCreationException
106e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
107e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        this.signerIdentifier = signerIdentifier;
108e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        this.signer = signer;
109e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
110e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (digesterProvider != null)
111e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
112e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            this.digester = digesterProvider.get(digAlgFinder.find(signer.getAlgorithmIdentifier()));
113e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
114e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        else
115e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
116e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            this.digester = null;
117e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
118e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
119e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        this.sAttrGen = sAttrGen;
120e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        this.unsAttrGen = unsAttrGen;
121e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        this.sigEncAlgFinder = sigEncAlgFinder;
122e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
123e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
124e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public boolean hasAssociatedCertificate()
125e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
126e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return certHolder != null;
127e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
128e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
129e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public X509CertificateHolder getAssociatedCertificate()
130e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
131e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return certHolder;
132e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
133e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
134e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public AlgorithmIdentifier getDigestAlgorithm()
135e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
136e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (digester != null)
137e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
138e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            return digester.getAlgorithmIdentifier();
139e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
140e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
141e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return digAlgFinder.find(signer.getAlgorithmIdentifier());
142e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
143e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
144e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public OutputStream getCalculatingOutputStream()
145e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
146e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (digester != null)
147e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
148e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            if (sAttrGen == null)
149e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            {
150e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                return new TeeOutputStream(digester.getOutputStream(), signer.getOutputStream());
151e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            }
152e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            return digester.getOutputStream();
153e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
154e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        else
155e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
156e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            return signer.getOutputStream();
157e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
158e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
159e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
160e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public SignerInfo generate(ASN1ObjectIdentifier contentType)
161e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        throws CMSException
162e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
163e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        try
164e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
165e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            /* RFC 3852 5.4
166e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom             * The result of the message digest calculation process depends on
167e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom             * whether the signedAttrs field is present.  When the field is absent,
168e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom             * the result is just the message digest of the content as described
169e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom             *
170e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom             * above.  When the field is present, however, the result is the message
171e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom             * digest of the complete DER encoding of the SignedAttrs value
172e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom             * contained in the signedAttrs field.
173e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom             */
174e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            ASN1Set signedAttr = null;
175e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
176e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            AlgorithmIdentifier digestAlg = null;
177e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
178e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            if (sAttrGen != null)
179e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            {
180e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                digestAlg = digester.getAlgorithmIdentifier();
181e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                calculatedDigest = digester.getDigest();
182e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                Map parameters = getBaseParameters(contentType, digester.getAlgorithmIdentifier(), calculatedDigest);
183e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                AttributeTable signed = sAttrGen.getAttributes(Collections.unmodifiableMap(parameters));
184e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
185e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                signedAttr = getAttributeSet(signed);
186e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
187e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                // sig must be composed from the DER encoding.
188e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                OutputStream sOut = signer.getOutputStream();
189e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
190e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                sOut.write(signedAttr.getEncoded(ASN1Encoding.DER));
191e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
192e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                sOut.close();
193e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            }
194e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            else
195e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            {
196e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                if (digester != null)
197e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                {
198e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                    digestAlg = digester.getAlgorithmIdentifier();
199e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                    calculatedDigest = digester.getDigest();
200e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                }
201e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                else
202e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                {
203e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                    digestAlg = digAlgFinder.find(signer.getAlgorithmIdentifier());
204e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                    calculatedDigest = null;
205e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                }
206e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            }
207e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
208e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            byte[] sigBytes = signer.getSignature();
209e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
210e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            ASN1Set unsignedAttr = null;
211e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            if (unsAttrGen != null)
212e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            {
213e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                Map parameters = getBaseParameters(contentType, digestAlg, calculatedDigest);
214e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                parameters.put(CMSAttributeTableGenerator.SIGNATURE, sigBytes.clone());
215e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
216e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                AttributeTable unsigned = unsAttrGen.getAttributes(Collections.unmodifiableMap(parameters));
217e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
218e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                unsignedAttr = getAttributeSet(unsigned);
219e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            }
220e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
221e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            AlgorithmIdentifier digestEncryptionAlgorithm = sigEncAlgFinder.findEncryptionAlgorithm(signer.getAlgorithmIdentifier());
222e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
223e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            return new SignerInfo(signerIdentifier, digestAlg,
224e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                signedAttr, digestEncryptionAlgorithm, new DEROctetString(sigBytes), unsignedAttr);
225e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
226e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        catch (IOException e)
227e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
228e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            throw new CMSException("encoding error.", e);
229e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
230e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
231e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
232e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    void setAssociatedCertificate(X509CertificateHolder certHolder)
233e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
234e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        this.certHolder = certHolder;
235e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
236e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
237e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private ASN1Set getAttributeSet(
238e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        AttributeTable attr)
239e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
240e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (attr != null)
241e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
242e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            return new DERSet(attr.toASN1EncodableVector());
243e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
244e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
245e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return null;
246e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
247e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
248e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private Map getBaseParameters(DERObjectIdentifier contentType, AlgorithmIdentifier digAlgId, byte[] hash)
249e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
250e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        Map param = new HashMap();
251e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
252e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (contentType != null)
253e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
254e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            param.put(CMSAttributeTableGenerator.CONTENT_TYPE, contentType);
255e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
256e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
257e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        param.put(CMSAttributeTableGenerator.DIGEST_ALGORITHM_IDENTIFIER, digAlgId);
258e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        param.put(CMSAttributeTableGenerator.DIGEST,  hash.clone());
259e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return param;
260e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
261e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
262e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public byte[] getCalculatedDigest()
263e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
264e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (calculatedDigest != null)
265e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
266e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            return (byte[])calculatedDigest.clone();
267e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
268e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
269e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return null;
270e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
271e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
272e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public CMSAttributeTableGenerator getSignedAttributeTableGenerator()
273e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
274e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return sAttrGen;
275e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
276e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
277e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public CMSAttributeTableGenerator getUnsignedAttributeTableGenerator()
278e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
279e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return unsAttrGen;
280e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
281e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom}
282