001: // CMP implementation copyright (c) 2003 NOVOSEC AG (http://www.novosec.com)
002: //
003: // Author: Maik Stohn
004: //
005: // Permission is hereby granted, free of charge, to any person obtaining a copy of this
006: // software and associated documentation files (the "Software"), to deal in the Software
007: // without restriction, including without limitation the rights to use, copy, modify, merge,
008: // publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
009: // to whom the Software is furnished to do so, subject to the following conditions:
010: //
011: // The above copyright notice and this permission notice shall be included in all copies or
012: // substantial portions of the Software.
013: //
014: // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
015: // BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
016: // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
017: // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
018: // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
019:
020: package com.novosec.pkix.asn1.cmp;
021:
022: import java.util.Enumeration;
023: import java.util.Vector;
024:
025: import org.bouncycastle.asn1.ASN1EncodableVector;
026: import org.bouncycastle.asn1.ASN1Sequence;
027: import org.bouncycastle.asn1.ASN1TaggedObject;
028: import org.bouncycastle.asn1.DEREncodable;
029: import org.bouncycastle.asn1.DERObject;
030: import org.bouncycastle.asn1.DERSequence;
031: import org.bouncycastle.asn1.DERTaggedObject;
032: import org.bouncycastle.asn1.x509.CertificateList;
033:
034: import com.novosec.pkix.asn1.crmf.CertId;
035:
036: /**
037: * ASN.1 structure DER En/DeCoder.
038: *
039: * <pre>
040: * RevRepContent ::= SEQUENCE {
041: * status SEQUENCE SIZE (1..MAX) OF PKIStatusInfo, -- in same order as was sent in RevReqContent
042: * revCerts [0] SEQUENCE SIZE (1..MAX) OF CertId OPTIONAL, -- IDs for which revocation was requested (same order as status)
043: * crls [1] SEQUENCE SIZE (1..MAX) OF CertificateList OPTIONAL -- the resulting CRLs (there may be more than one)
044: * }
045: *
046: * </pre>
047: */
048:
049: public class RevRepContent implements DEREncodable {
050: Vector status = new Vector();
051: Vector revCerts = new Vector();
052: Vector crls = new Vector();
053:
054: public static RevRepContent getInstance(ASN1TaggedObject obj,
055: boolean explicit) {
056: return getInstance(ASN1Sequence.getInstance(obj, explicit));
057: }
058:
059: public static RevRepContent getInstance(Object obj) {
060: if (obj instanceof RevRepContent) {
061: return (RevRepContent) obj;
062: } else if (obj instanceof ASN1Sequence) {
063: return new RevRepContent((ASN1Sequence) obj);
064: }
065:
066: throw new IllegalArgumentException("unknown object in factory");
067: }
068:
069: public RevRepContent(ASN1Sequence seq) {
070: Enumeration e = seq.getObjects();
071:
072: Enumeration estatus = ((ASN1Sequence) e.nextElement())
073: .getObjects();
074: while (estatus.hasMoreElements()) {
075: status.addElement(PKIStatusInfo.getInstance(estatus
076: .nextElement()));
077: }
078:
079: while (e.hasMoreElements()) {
080: DERTaggedObject obj = (DERTaggedObject) e.nextElement();
081:
082: switch (obj.getTagNo()) {
083: case 0:
084: // Enumeration erevcerts = ((ASN1Sequence)e.nextElement()).getObjects();
085: Enumeration erevcerts = ((ASN1Sequence) obj.getObject())
086: .getObjects();
087: while (erevcerts.hasMoreElements()) {
088: revCerts.addElement(CertId.getInstance(erevcerts
089: .nextElement()));
090: }
091: break;
092: case 1:
093: // Enumeration ecrls = ((ASN1Sequence)e.nextElement()).getObjects();
094: Enumeration ecrls = ((ASN1Sequence) obj.getObject())
095: .getObjects();
096: while (ecrls.hasMoreElements()) {
097: crls.addElement(CertificateList.getInstance(ecrls
098: .nextElement()));
099: }
100: break;
101: }
102: }
103: }
104:
105: public RevRepContent(PKIStatusInfo pKIStatusInfo) {
106: status.clear();
107: status.addElement(pKIStatusInfo);
108: revCerts.clear();
109: crls.clear();
110: }
111:
112: public void addPKIStatusInfo(PKIStatusInfo pKIStatusInfo) {
113: status.addElement(pKIStatusInfo);
114: }
115:
116: public PKIStatusInfo getPKIStatusInfo(int nr) {
117: if (status.size() > nr)
118: return (PKIStatusInfo) status.elementAt(nr);
119:
120: return null;
121: }
122:
123: public void addRevCert(CertId certId) {
124: revCerts.addElement(certId);
125: }
126:
127: public CertId getRevCert(int nr) {
128: if (revCerts.size() > nr)
129: return (CertId) revCerts.elementAt(nr);
130:
131: return null;
132: }
133:
134: public void addCrl(CertificateList crl) {
135: crls.addElement(crl);
136: }
137:
138: public CertificateList getCrl(int nr) {
139: if (crls.size() > nr)
140: return (CertificateList) crls.elementAt(nr);
141:
142: return null;
143: }
144:
145: public DERObject getDERObject() {
146: ASN1EncodableVector v = new ASN1EncodableVector();
147:
148: ASN1EncodableVector statv = new ASN1EncodableVector();
149: for (int i = 0; i < status.size(); i++)
150: statv.add((PKIStatusInfo) status.elementAt(i));
151: v.add(new DERSequence(statv));
152:
153: if (revCerts.size() > 0) {
154: ASN1EncodableVector revcv = new ASN1EncodableVector();
155: for (int i = 0; i < revCerts.size(); i++)
156: revcv.add((CertId) revCerts.elementAt(i));
157: v.add(new DERSequence(revcv));
158: }
159:
160: if (crls.size() > 0) {
161: ASN1EncodableVector crlsv = new ASN1EncodableVector();
162: for (int i = 0; i < crls.size(); i++)
163: crlsv.add((CertificateList) crls.elementAt(i));
164: v.add(new DERSequence(crlsv));
165: }
166:
167: return new DERSequence(v);
168: }
169:
170: public String toString() {
171: String s = "RevRepContent: (";
172:
173: if (status.size() > 0) {
174: s += "status: (";
175:
176: for (int i = 0; i < status.size(); i++)
177: s += (PKIStatusInfo) status.elementAt(i);
178:
179: s += "), ";
180: }
181:
182: if (revCerts.size() > 0) {
183: s += "revCerts: (";
184:
185: for (int i = 0; i < revCerts.size(); i++)
186: s += (CertId) revCerts.elementAt(i);
187:
188: s += "), ";
189: }
190:
191: if (crls.size() > 0) {
192: s += "crls: (";
193:
194: for (int i = 0; i < crls.size(); i++)
195: s += (CertificateList) crls.elementAt(i);
196:
197: s += ")";
198: }
199:
200: s += ")";
201:
202: return s;
203: }
204: }
|