1e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrompackage org.bouncycastle.cms;
2e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
3e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport java.util.Date;
4e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport java.util.Hashtable;
5e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport java.util.Map;
6e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
770c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstromimport org.bouncycastle.asn1.ASN1ObjectIdentifier;
8e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.DEROctetString;
9e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.DERSet;
10e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.cms.Attribute;
11e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.cms.AttributeTable;
12e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.cms.CMSAttributes;
13e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.cms.Time;
14e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
15e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom/**
16e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * Default signed attributes generator.
17e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom */
18e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrompublic class DefaultSignedAttributeTableGenerator
19e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    implements CMSAttributeTableGenerator
20e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom{
21e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private final Hashtable table;
22e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
23e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    /**
24e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * Initialise to use all defaults
25e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     */
26e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public DefaultSignedAttributeTableGenerator()
27e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
28e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        table = new Hashtable();
29e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
30e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
31e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    /**
32e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * Initialise with some extra attributes or overrides.
33e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *
34e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * @param attributeTable initial attribute table to use.
35e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     */
36e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public DefaultSignedAttributeTableGenerator(
37e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        AttributeTable attributeTable)
38e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
39e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (attributeTable != null)
40e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
41e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            table = attributeTable.toHashtable();
42e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
43e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        else
44e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
45e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            table = new Hashtable();
46e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
47e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
48e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
49e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    /**
50e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * Create a standard attribute table from the passed in parameters - this will
51e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * normally include contentType, signingTime, and messageDigest. If the constructor
52e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * using an AttributeTable was used, entries in it for contentType, signingTime, and
53e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * messageDigest will override the generated ones.
54e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *
55e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * @param parameters source parameters for table generation.
56e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *
57e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * @return a filled in Hashtable of attributes.
58e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     */
59e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    protected Hashtable createStandardAttributeTable(
60e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        Map parameters)
61e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
62e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        Hashtable std = (Hashtable)table.clone();
63e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
64e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (!std.containsKey(CMSAttributes.contentType))
65e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
6670c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom            ASN1ObjectIdentifier contentType = ASN1ObjectIdentifier.getInstance(
6770c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom                parameters.get(CMSAttributeTableGenerator.CONTENT_TYPE));
68e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
69e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            // contentType will be null if we're trying to generate a counter signature.
70e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            if (contentType != null)
71e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            {
72e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                Attribute attr = new Attribute(CMSAttributes.contentType,
73e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                    new DERSet(contentType));
74e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                std.put(attr.getAttrType(), attr);
75e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            }
76e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
77e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
78e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (!std.containsKey(CMSAttributes.signingTime))
79e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
80e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            Date signingTime = new Date();
81e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            Attribute attr = new Attribute(CMSAttributes.signingTime,
82e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                new DERSet(new Time(signingTime)));
83e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            std.put(attr.getAttrType(), attr);
84e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
85e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
86e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (!std.containsKey(CMSAttributes.messageDigest))
87e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
88e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            byte[] messageDigest = (byte[])parameters.get(
89e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                CMSAttributeTableGenerator.DIGEST);
90e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            Attribute attr = new Attribute(CMSAttributes.messageDigest,
91e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                new DERSet(new DEROctetString(messageDigest)));
92e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            std.put(attr.getAttrType(), attr);
93e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
94e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
95e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return std;
96e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
97e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
98e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    /**
99e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * @param parameters source parameters
100e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * @return the populated attribute table
101e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     */
102e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public AttributeTable getAttributes(Map parameters)
103e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
104e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return new AttributeTable(createStandardAttributeTable(parameters));
105e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
106e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom}
107