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