private byte[] getextensionbytes(string oid) {
    extensions exts = c.gettbscertificate().getextensions();

    if (exts != null) {
      extension ext = exts.getextension(new asn1objectidentifier(oid));
      if (ext != null) {
        return ext.getextnvalue().getoctets();
      }
    }

    return null;
  }
  public byte[] getextensionvalue(string oid) {
    extensions exts = c.gettbscertificate().getextensions();

    if (exts != null) {
      extension ext = exts.getextension(new asn1objectidentifier(oid));

      if (ext != null) {
        try {
          return ext.getextnvalue().getencoded();
        } catch (exception e) {
          throw new illegalstateexception("error parsing " + e.tostring());
        }
      }
    }

    return null;
  }
  public set getnoncriticalextensionoids() {
    if (this.getversion() == 3) {
      set set = new hashset();
      extensions extensions = c.gettbscertificate().getextensions();

      if (extensions != null) {
        enumeration e = extensions.oids();

        while (e.hasmoreelements()) {
          asn1objectidentifier oid = (asn1objectidentifier) e.nextelement();
          extension ext = extensions.getextension(oid);

          if (!ext.iscritical()) {
            set.add(oid.getid());
          }
        }

        return set;
      }
    }

    return null;
  }
  public boolean hasunsupportedcriticalextension() {
    if (this.getversion() == 3) {
      extensions extensions = c.gettbscertificate().getextensions();

      if (extensions != null) {
        enumeration e = extensions.oids();

        while (e.hasmoreelements()) {
          asn1objectidentifier oid = (asn1objectidentifier) e.nextelement();
          string oidid = oid.getid();

          if (oidid.equals(rfc3280certpathutilities.key_usage)
              || oidid.equals(rfc3280certpathutilities.certificate_policies)
              || oidid.equals(rfc3280certpathutilities.policy_mappings)
              || oidid.equals(rfc3280certpathutilities.inhibit_any_policy)
              || oidid.equals(rfc3280certpathutilities.crl_distribution_points)
              || oidid.equals(rfc3280certpathutilities.issuing_distribution_point)
              || oidid.equals(rfc3280certpathutilities.delta_crl_indicator)
              || oidid.equals(rfc3280certpathutilities.policy_constraints)
              || oidid.equals(rfc3280certpathutilities.basic_constraints)
              || oidid.equals(rfc3280certpathutilities.subject_alternative_name)
              || oidid.equals(rfc3280certpathutilities.name_constraints)) {
            continue;
          }

          extension ext = extensions.getextension(oid);

          if (ext.iscritical()) {
            return true;
          }
        }
      }
    }

    return false;
  }
  public string tostring() {
    stringbuffer buf = new stringbuffer();
    string nl = system.getproperty("line.separator");

    buf.append("  [0]         version: ").append(this.getversion()).append(nl);
    buf.append("         serialnumber: ").append(this.getserialnumber()).append(nl);
    buf.append("             issuerdn: ").append(this.getissuerdn()).append(nl);
    buf.append("           start date: ").append(this.getnotbefore()).append(nl);
    buf.append("           final date: ").append(this.getnotafter()).append(nl);
    buf.append("            subjectdn: ").append(this.getsubjectdn()).append(nl);
    buf.append("           public key: ").append(this.getpublickey()).append(nl);
    buf.append("  signature algorithm: ").append(this.getsigalgname()).append(nl);

    byte[] sig = this.getsignature();

    buf.append("            signature: ").append(new string(hex.encode(sig, 0, 20))).append(nl);
    for (int i = 20; i < sig.length; i += 20) {
      if (i < sig.length - 20) {
        buf.append("                       ").append(new string(hex.encode(sig, i, 20))).append(nl);
      } else {
        buf.append("                       ")
            .append(new string(hex.encode(sig, i, sig.length - i)))
            .append(nl);
      }
    }

    extensions extensions = c.gettbscertificate().getextensions();

    if (extensions != null) {
      enumeration e = extensions.oids();

      if (e.hasmoreelements()) {
        buf.append("       extensions: \n");
      }

      while (e.hasmoreelements()) {
        asn1objectidentifier oid = (asn1objectidentifier) e.nextelement();
        extension ext = extensions.getextension(oid);

        if (ext.getextnvalue() != null) {
          byte[] octs = ext.getextnvalue().getoctets();
          asn1inputstream din = new asn1inputstream(octs);
          buf.append("                       critical(").append(ext.iscritical()).append(") ");
          try {
            if (oid.equals(extension.basicconstraints)) {
              buf.append(basicconstraints.getinstance(din.readobject())).append(nl);
            } else if (oid.equals(extension.keyusage)) {
              buf.append(keyusage.getinstance(din.readobject())).append(nl);
            } else if (oid.equals(miscobjectidentifiers.netscapecerttype)) {
              buf.append(new netscapecerttype((derbitstring) din.readobject())).append(nl);
            } else if (oid.equals(miscobjectidentifiers.netscaperevocationurl)) {
              buf.append(new netscaperevocationurl((deria5string) din.readobject())).append(nl);
            } else if (oid.equals(miscobjectidentifiers.verisignczagextension)) {
              buf.append(new verisignczagextension((deria5string) din.readobject())).append(nl);
            } else {
              buf.append(oid.getid());
              buf.append(" value = ").append(asn1dump.dumpasstring(din.readobject())).append(nl);
              // buf.append(" value = ").append("*****").append(nl);
            }
          } catch (exception ex) {
            buf.append(oid.getid());
            //     buf.append(" value = ").append(new
            // string(hex.encode(ext.getextnvalue().getoctets()))).append(nl);
            buf.append(" value = ").append("*****").append(nl);
          }
        } else {
          buf.append(nl);
        }
      }
    }

    return buf.tostring();
  }