001package org.apache.commons.ssl.org.bouncycastle.asn1.ocsp; 002 003import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector; 004import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object; 005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive; 006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence; 007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject; 008import org.apache.commons.ssl.org.bouncycastle.asn1.DERBitString; 009import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence; 010import org.apache.commons.ssl.org.bouncycastle.asn1.DERTaggedObject; 011import org.apache.commons.ssl.org.bouncycastle.asn1.x509.AlgorithmIdentifier; 012 013public class Signature 014 extends ASN1Object 015{ 016 AlgorithmIdentifier signatureAlgorithm; 017 DERBitString signature; 018 ASN1Sequence certs; 019 020 public Signature( 021 AlgorithmIdentifier signatureAlgorithm, 022 DERBitString signature) 023 { 024 this.signatureAlgorithm = signatureAlgorithm; 025 this.signature = signature; 026 } 027 028 public Signature( 029 AlgorithmIdentifier signatureAlgorithm, 030 DERBitString signature, 031 ASN1Sequence certs) 032 { 033 this.signatureAlgorithm = signatureAlgorithm; 034 this.signature = signature; 035 this.certs = certs; 036 } 037 038 private Signature( 039 ASN1Sequence seq) 040 { 041 signatureAlgorithm = AlgorithmIdentifier.getInstance(seq.getObjectAt(0)); 042 signature = (DERBitString)seq.getObjectAt(1); 043 044 if (seq.size() == 3) 045 { 046 certs = ASN1Sequence.getInstance( 047 (ASN1TaggedObject)seq.getObjectAt(2), true); 048 } 049 } 050 051 public static Signature getInstance( 052 ASN1TaggedObject obj, 053 boolean explicit) 054 { 055 return getInstance(ASN1Sequence.getInstance(obj, explicit)); 056 } 057 058 public static Signature getInstance( 059 Object obj) 060 { 061 if (obj instanceof Signature) 062 { 063 return (Signature)obj; 064 } 065 else if (obj != null) 066 { 067 return new Signature(ASN1Sequence.getInstance(obj)); 068 } 069 070 return null; 071 } 072 073 public AlgorithmIdentifier getSignatureAlgorithm() 074 { 075 return signatureAlgorithm; 076 } 077 078 public DERBitString getSignature() 079 { 080 return signature; 081 } 082 083 public ASN1Sequence getCerts() 084 { 085 return certs; 086 } 087 088 /** 089 * Produce an object suitable for an ASN1OutputStream. 090 * <pre> 091 * Signature ::= SEQUENCE { 092 * signatureAlgorithm AlgorithmIdentifier, 093 * signature BIT STRING, 094 * certs [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL} 095 * </pre> 096 */ 097 public ASN1Primitive toASN1Primitive() 098 { 099 ASN1EncodableVector v = new ASN1EncodableVector(); 100 101 v.add(signatureAlgorithm); 102 v.add(signature); 103 104 if (certs != null) 105 { 106 v.add(new DERTaggedObject(true, 0, certs)); 107 } 108 109 return new DERSequence(v); 110 } 111}