package gnu.java.security.x509;
import java.io.InputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.security.cert.CRLException;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
import gnu.java.io.ASN1ParsingException;
import gnu.java.security.OID;
import gnu.java.security.der.DERReader;
import gnu.java.security.der.DERValue;
import gnu.java.security.der.DERWriter;
class X509CRLEntry extends java.security.cert.X509CRLEntry
{
private byte[] encoded;
private BigInteger serialNo;
private Date revocationDate;
private HashMap extensions;
private HashSet critOids;
private HashSet nonCritOids;
X509CRLEntry(int version, InputStream encoded)
throws CRLException, IOException
{
super();
extensions = new HashMap();
critOids = new HashSet();
nonCritOids = new HashSet();
try
{
parse(version, encoded);
}
catch (IOException ioe)
{
throw ioe;
}
catch (Exception x)
{
throw new CRLException(x.toString());
}
}
public boolean equals(Object o)
{
return ((X509CRLEntry) o).serialNo.equals(serialNo) &&
((X509CRLEntry) o).revocationDate.equals(revocationDate);
}
public int hashCode()
{
return serialNo.hashCode();
}
public byte[] getEncoded() throws CRLException
{
return (byte[]) encoded.clone();
}
public BigInteger getSerialNumber()
{
return serialNo;
}
public Date getRevocationDate()
{
return (Date) revocationDate.clone();
}
public boolean hasExtensions()
{
return ! extensions.isEmpty();
}
public String toString()
{
return "X509CRLEntry serial=" + serialNo + " revocation date="
+ revocationDate + " critExt=" + critOids + " ext=" + nonCritOids;
}
public boolean hasUnsupportedCriticalExtension()
{
return false; }
public Set getCriticalExtensionOIDs()
{
return Collections.unmodifiableSet(critOids);
}
public Set getNonCriticalExtensionOIDs()
{
return Collections.unmodifiableSet(nonCritOids);
}
public byte[] getExtensionValue(String oid)
{
byte[] ext = (byte[]) extensions.get(oid);
if (ext != null)
return (byte[]) ext.clone();
return null;
}
private void parse(int version, InputStream in) throws Exception
{
DERReader der = new DERReader(in);
DERValue entry = der.read();
if (!entry.isConstructed())
throw new ASN1ParsingException("malformed revokedCertificate");
encoded = entry.getEncoded();
int len = 0;
DERValue val = der.read();
serialNo = (BigInteger) val.getValue();
len += DERWriter.definiteEncodingSize(val.getLength())
+ val.getLength() + 1;
val = der.read();
revocationDate = (Date) val.getValue();
len += DERWriter.definiteEncodingSize(val.getLength())
+ val.getLength() + 1;
if (len < entry.getLength())
{
if (version < 2)
throw new ASN1ParsingException("extra data in CRL entry");
while (len < entry.getLength())
{
val = der.read();
if (!val.isConstructed())
throw new ASN1ParsingException("malformed Extension");
OID extOid = (OID) der.read().getValue();
Boolean critical = Boolean.valueOf(false);
DERValue val2 = der.read();
if (val2.getValue() instanceof Boolean)
{
critical = (Boolean) val2.getValue();
val2 = der.read();
}
byte[] ext = (byte[]) val2.getValue();
extensions.put(extOid.toString(), ext);
if (critical.booleanValue())
critOids.add(extOid.toString());
else
nonCritOids.add(extOid.toString());
len += val.getEncodedLength();
}
}
}
}