/**
  * Generates an X.509 certificate object and initializes it with the data read from the input
  * stream <code>is</code>.
  *
  * @param is an input stream with the certificate data.
  * @return an X.509 certificate object initialized with the data from the input stream.
  * @exception CertificateException on parsing errors.
  */
 public Certificate engineGenerateCertificate(InputStream is) throws CertificateException {
   if (is == null) {
     // clear the caches (for debugging)
     certCache.clear();
     X509CertificatePair.clearCache();
     throw new CertificateException("Missing input stream");
   }
   try {
     byte[] encoding = readOneBlock(is);
     if (encoding != null) {
       X509CertImpl cert = getFromCache(certCache, encoding);
       if (cert != null) {
         return cert;
       }
       cert = new X509CertImpl(encoding);
       addToCache(certCache, cert.getEncodedInternal(), cert);
       return cert;
     } else {
       throw new IOException("Empty input");
     }
   } catch (IOException ioe) {
     throw (CertificateException)
         new CertificateException("Could not parse certificate: " + ioe.toString()).initCause(ioe);
   }
 }
 /**
  * Generates an X.509 certificate revocation list (CRL) object and initializes it with the data
  * read from the given input stream <code>is</code>.
  *
  * @param is an input stream with the CRL data.
  * @return an X.509 CRL object initialized with the data from the input stream.
  * @exception CRLException on parsing errors.
  */
 public CRL engineGenerateCRL(InputStream is) throws CRLException {
   if (is == null) {
     // clear the cache (for debugging)
     crlCache.clear();
     throw new CRLException("Missing input stream");
   }
   try {
     byte[] encoding = readOneBlock(is);
     if (encoding != null) {
       X509CRLImpl crl = getFromCache(crlCache, encoding);
       if (crl != null) {
         return crl;
       }
       crl = new X509CRLImpl(encoding);
       addToCache(crlCache, crl.getEncodedInternal(), crl);
       return crl;
     } else {
       throw new IOException("Empty input");
     }
   } catch (IOException ioe) {
     throw new CRLException(ioe.getMessage());
   }
 }
 /** Clear the cache for debugging. */
 public static synchronized void clearCache() {
   cache.clear();
 }