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