1e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrompackage org.bouncycastle.asn1.cms; 2e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 3e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport java.util.Enumeration; 4e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 5e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.ASN1EncodableVector; 6e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.ASN1Integer; 7e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.ASN1Object; 8e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.ASN1OctetString; 9e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.ASN1Primitive; 10e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.ASN1Sequence; 11e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.ASN1Set; 12e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.ASN1TaggedObject; 13e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.DEROctetString; 14e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.DERSequence; 15e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.DERTaggedObject; 16e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.x509.AlgorithmIdentifier; 17e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 18e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrompublic class SignerInfo 19e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom extends ASN1Object 20e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom{ 21e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom private ASN1Integer version; 22e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom private SignerIdentifier sid; 23e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom private AlgorithmIdentifier digAlgorithm; 24e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom private ASN1Set authenticatedAttributes; 25e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom private AlgorithmIdentifier digEncryptionAlgorithm; 26e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom private ASN1OctetString encryptedDigest; 27e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom private ASN1Set unauthenticatedAttributes; 28e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 29e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom public static SignerInfo getInstance( 30e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom Object o) 31e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom throws IllegalArgumentException 32e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 33e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom if (o == null || o instanceof SignerInfo) 34e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 35e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom return (SignerInfo)o; 36e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 37e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom else if (o instanceof ASN1Sequence) 38e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 39e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom return new SignerInfo((ASN1Sequence)o); 40e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 41e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 42e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom throw new IllegalArgumentException("unknown object in factory: " + o.getClass().getName()); 43e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 44e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 45e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom public SignerInfo( 46e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom SignerIdentifier sid, 47e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom AlgorithmIdentifier digAlgorithm, 48e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom ASN1Set authenticatedAttributes, 49e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom AlgorithmIdentifier digEncryptionAlgorithm, 50e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom ASN1OctetString encryptedDigest, 51e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom ASN1Set unauthenticatedAttributes) 52e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 53e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom if (sid.isTagged()) 54e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 55e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom this.version = new ASN1Integer(3); 56e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 57e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom else 58e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 59e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom this.version = new ASN1Integer(1); 60e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 61e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 62e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom this.sid = sid; 63e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom this.digAlgorithm = digAlgorithm; 64e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom this.authenticatedAttributes = authenticatedAttributes; 65e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom this.digEncryptionAlgorithm = digEncryptionAlgorithm; 66e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom this.encryptedDigest = encryptedDigest; 67e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom this.unauthenticatedAttributes = unauthenticatedAttributes; 68e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 69e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 70e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom public SignerInfo( 71a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom SignerIdentifier sid, 72a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom AlgorithmIdentifier digAlgorithm, 73a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom Attributes authenticatedAttributes, 74a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom AlgorithmIdentifier digEncryptionAlgorithm, 75a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom ASN1OctetString encryptedDigest, 76a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom Attributes unauthenticatedAttributes) 77a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom { 78a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom if (sid.isTagged()) 79a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom { 80a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom this.version = new ASN1Integer(3); 81a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom } 82a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom else 83a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom { 84a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom this.version = new ASN1Integer(1); 85a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom } 86a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom 87a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom this.sid = sid; 88a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom this.digAlgorithm = digAlgorithm; 89a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom this.authenticatedAttributes = ASN1Set.getInstance(authenticatedAttributes); 90a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom this.digEncryptionAlgorithm = digEncryptionAlgorithm; 91a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom this.encryptedDigest = encryptedDigest; 92a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom this.unauthenticatedAttributes = ASN1Set.getInstance(unauthenticatedAttributes); 93a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom } 94a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom 95a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom /** 96a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom * @deprecated use getInstance() method. 97a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom */ 98a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom public SignerInfo( 99e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom ASN1Sequence seq) 100e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 101e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom Enumeration e = seq.getObjects(); 102e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 103e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom version = (ASN1Integer)e.nextElement(); 104e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom sid = SignerIdentifier.getInstance(e.nextElement()); 105e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom digAlgorithm = AlgorithmIdentifier.getInstance(e.nextElement()); 106e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 107e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom Object obj = e.nextElement(); 108e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 109e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom if (obj instanceof ASN1TaggedObject) 110e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 111e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom authenticatedAttributes = ASN1Set.getInstance((ASN1TaggedObject)obj, false); 112e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 113e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom digEncryptionAlgorithm = AlgorithmIdentifier.getInstance(e.nextElement()); 114e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 115e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom else 116e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 117e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom authenticatedAttributes = null; 118e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom digEncryptionAlgorithm = AlgorithmIdentifier.getInstance(obj); 119e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 120e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 121e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom encryptedDigest = DEROctetString.getInstance(e.nextElement()); 122e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 123e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom if (e.hasMoreElements()) 124e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 125e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom unauthenticatedAttributes = ASN1Set.getInstance((ASN1TaggedObject)e.nextElement(), false); 126e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 127e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom else 128e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 129e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom unauthenticatedAttributes = null; 130e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 131e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 132e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 133e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom public ASN1Integer getVersion() 134e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 135e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom return version; 136e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 137e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 138e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom public SignerIdentifier getSID() 139e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 140e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom return sid; 141e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 142e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 143e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom public ASN1Set getAuthenticatedAttributes() 144e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 145e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom return authenticatedAttributes; 146e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 147e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 148e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom public AlgorithmIdentifier getDigestAlgorithm() 149e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 150e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom return digAlgorithm; 151e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 152e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 153e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom public ASN1OctetString getEncryptedDigest() 154e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 155e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom return encryptedDigest; 156e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 157e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 158e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom public AlgorithmIdentifier getDigestEncryptionAlgorithm() 159e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 160e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom return digEncryptionAlgorithm; 161e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 162e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 163e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom public ASN1Set getUnauthenticatedAttributes() 164e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 165e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom return unauthenticatedAttributes; 166e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 167e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 168e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom /** 169e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * Produce an object suitable for an ASN1OutputStream. 170e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * <pre> 171e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * SignerInfo ::= SEQUENCE { 172e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * version Version, 173e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * SignerIdentifier sid, 174e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * digestAlgorithm DigestAlgorithmIdentifier, 175e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * authenticatedAttributes [0] IMPLICIT Attributes OPTIONAL, 176e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * digestEncryptionAlgorithm DigestEncryptionAlgorithmIdentifier, 177e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * encryptedDigest EncryptedDigest, 178e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * unauthenticatedAttributes [1] IMPLICIT Attributes OPTIONAL 179e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * } 180e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * 181e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * EncryptedDigest ::= OCTET STRING 182e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * 183e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * DigestAlgorithmIdentifier ::= AlgorithmIdentifier 184e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * 185e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * DigestEncryptionAlgorithmIdentifier ::= AlgorithmIdentifier 186e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * </pre> 187e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom */ 188e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom public ASN1Primitive toASN1Primitive() 189e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 190e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom ASN1EncodableVector v = new ASN1EncodableVector(); 191e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 192e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom v.add(version); 193e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom v.add(sid); 194e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom v.add(digAlgorithm); 195e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 196e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom if (authenticatedAttributes != null) 197e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 198e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom v.add(new DERTaggedObject(false, 0, authenticatedAttributes)); 199e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 200e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 201e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom v.add(digEncryptionAlgorithm); 202e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom v.add(encryptedDigest); 203e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 204e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom if (unauthenticatedAttributes != null) 205e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 206e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom v.add(new DERTaggedObject(false, 1, unauthenticatedAttributes)); 207e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 208e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 209e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom return new DERSequence(v); 210e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 211e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom} 212