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