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