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