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( 71e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom ASN1Sequence seq) 72e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 73e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom Enumeration e = seq.getObjects(); 74e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 75e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom version = (ASN1Integer)e.nextElement(); 76e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom sid = SignerIdentifier.getInstance(e.nextElement()); 77e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom digAlgorithm = AlgorithmIdentifier.getInstance(e.nextElement()); 78e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 79e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom Object obj = e.nextElement(); 80e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 81e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom if (obj instanceof ASN1TaggedObject) 82e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 83e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom authenticatedAttributes = ASN1Set.getInstance((ASN1TaggedObject)obj, false); 84e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 85e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom digEncryptionAlgorithm = AlgorithmIdentifier.getInstance(e.nextElement()); 86e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 87e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom else 88e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 89e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom authenticatedAttributes = null; 90e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom digEncryptionAlgorithm = AlgorithmIdentifier.getInstance(obj); 91e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 92e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 93e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom encryptedDigest = DEROctetString.getInstance(e.nextElement()); 94e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 95e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom if (e.hasMoreElements()) 96e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 97e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom unauthenticatedAttributes = ASN1Set.getInstance((ASN1TaggedObject)e.nextElement(), false); 98e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 99e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom else 100e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 101e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom unauthenticatedAttributes = null; 102e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 103e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 104e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 105e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom public ASN1Integer getVersion() 106e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 107e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom return version; 108e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 109e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 110e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom public SignerIdentifier getSID() 111e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 112e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom return sid; 113e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 114e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 115e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom public ASN1Set getAuthenticatedAttributes() 116e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 117e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom return authenticatedAttributes; 118e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 119e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 120e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom public AlgorithmIdentifier getDigestAlgorithm() 121e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 122e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom return digAlgorithm; 123e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 124e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 125e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom public ASN1OctetString getEncryptedDigest() 126e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 127e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom return encryptedDigest; 128e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 129e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 130e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom public AlgorithmIdentifier getDigestEncryptionAlgorithm() 131e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 132e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom return digEncryptionAlgorithm; 133e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 134e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 135e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom public ASN1Set getUnauthenticatedAttributes() 136e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 137e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom return unauthenticatedAttributes; 138e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 139e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 140e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom /** 141e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * Produce an object suitable for an ASN1OutputStream. 142e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * <pre> 143e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * SignerInfo ::= SEQUENCE { 144e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * version Version, 145e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * SignerIdentifier sid, 146e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * digestAlgorithm DigestAlgorithmIdentifier, 147e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * authenticatedAttributes [0] IMPLICIT Attributes OPTIONAL, 148e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * digestEncryptionAlgorithm DigestEncryptionAlgorithmIdentifier, 149e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * encryptedDigest EncryptedDigest, 150e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * unauthenticatedAttributes [1] IMPLICIT Attributes OPTIONAL 151e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * } 152e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * 153e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * EncryptedDigest ::= OCTET STRING 154e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * 155e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * DigestAlgorithmIdentifier ::= AlgorithmIdentifier 156e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * 157e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * DigestEncryptionAlgorithmIdentifier ::= AlgorithmIdentifier 158e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * </pre> 159e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom */ 160e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom public ASN1Primitive toASN1Primitive() 161e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 162e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom ASN1EncodableVector v = new ASN1EncodableVector(); 163e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 164e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom v.add(version); 165e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom v.add(sid); 166e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom v.add(digAlgorithm); 167e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 168e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom if (authenticatedAttributes != null) 169e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 170e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom v.add(new DERTaggedObject(false, 0, authenticatedAttributes)); 171e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 172e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 173e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom v.add(digEncryptionAlgorithm); 174e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom v.add(encryptedDigest); 175e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 176e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom if (unauthenticatedAttributes != null) 177e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 178e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom v.add(new DERTaggedObject(false, 1, unauthenticatedAttributes)); 179e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 180e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 181e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom return new DERSequence(v); 182e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 183e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom} 184