📄 asn1dump.java
字号:
package org.bouncycastle.asn1.util;import org.bouncycastle.asn1.ASN1OctetString;import org.bouncycastle.asn1.ASN1Sequence;import org.bouncycastle.asn1.ASN1Set;import org.bouncycastle.asn1.BERConstructedOctetString;import org.bouncycastle.asn1.BERConstructedSequence;import org.bouncycastle.asn1.BERSequence;import org.bouncycastle.asn1.BERSet;import org.bouncycastle.asn1.BERTaggedObject;import org.bouncycastle.asn1.DERBMPString;import org.bouncycastle.asn1.DERBitString;import org.bouncycastle.asn1.DERBoolean;import org.bouncycastle.asn1.DERConstructedSequence;import org.bouncycastle.asn1.DERConstructedSet;import org.bouncycastle.asn1.DEREncodable;import org.bouncycastle.asn1.DERGeneralizedTime;import org.bouncycastle.asn1.DERIA5String;import org.bouncycastle.asn1.DERInteger;import org.bouncycastle.asn1.DERNull;import org.bouncycastle.asn1.DERObject;import org.bouncycastle.asn1.DERObjectIdentifier;import org.bouncycastle.asn1.DEROctetString;import org.bouncycastle.asn1.DERPrintableString;import org.bouncycastle.asn1.DERSequence;import org.bouncycastle.asn1.DERSet;import org.bouncycastle.asn1.DERT61String;import org.bouncycastle.asn1.DERTaggedObject;import org.bouncycastle.asn1.DERUTCTime;import org.bouncycastle.asn1.DERUTF8String;import org.bouncycastle.asn1.DERUnknownTag;import org.bouncycastle.asn1.DERVisibleString;import org.bouncycastle.asn1.DERApplicationSpecific;import org.bouncycastle.asn1.DERTags;import org.bouncycastle.asn1.BERApplicationSpecific;import org.bouncycastle.util.encoders.Hex;import java.util.Enumeration;import java.io.IOException;public class ASN1Dump{ private static final String TAB = " "; private static final int SAMPLE_SIZE = 32; /** * dump a DER object as a formatted string with indentation * * @param obj the DERObject to be dumped out. */ static String _dumpAsString( String indent, boolean verbose, DERObject obj) { String nl = System.getProperty("line.separator"); if (obj instanceof ASN1Sequence) { StringBuffer buf = new StringBuffer(); Enumeration e = ((ASN1Sequence)obj).getObjects(); String tab = indent + TAB; buf.append(indent); if (obj instanceof BERConstructedSequence) { buf.append("BER ConstructedSequence"); } else if (obj instanceof DERConstructedSequence) { buf.append("DER ConstructedSequence"); } else if (obj instanceof BERSequence) { buf.append("BER Sequence"); } else if (obj instanceof DERSequence) { buf.append("DER Sequence"); } else { buf.append("Sequence"); } buf.append(nl); while (e.hasMoreElements()) { Object o = e.nextElement(); if (o == null || o.equals(new DERNull())) { buf.append(tab); buf.append("NULL"); buf.append(nl); } else if (o instanceof DERObject) { buf.append(_dumpAsString(tab, verbose, (DERObject)o)); } else { buf.append(_dumpAsString(tab, verbose, ((DEREncodable)o).getDERObject())); } } return buf.toString(); } else if (obj instanceof DERTaggedObject) { StringBuffer buf = new StringBuffer(); String tab = indent + TAB; buf.append(indent); if (obj instanceof BERTaggedObject) { buf.append("BER Tagged ["); } else { buf.append("Tagged ["); } DERTaggedObject o = (DERTaggedObject)obj; buf.append(Integer.toString(o.getTagNo())); buf.append(']'); if (!o.isExplicit()) { buf.append(" IMPLICIT "); } buf.append(nl); if (o.isEmpty()) { buf.append(tab); buf.append("EMPTY"); buf.append(nl); } else { buf.append(_dumpAsString(tab, verbose, o.getObject())); } return buf.toString(); } else if (obj instanceof DERConstructedSet) { StringBuffer buf = new StringBuffer(); Enumeration e = ((ASN1Set)obj).getObjects(); String tab = indent + TAB; buf.append(indent); buf.append("ConstructedSet"); buf.append(nl); while (e.hasMoreElements()) { Object o = e.nextElement(); if (o == null) { buf.append(tab); buf.append("NULL"); buf.append(nl); } else if (o instanceof DERObject) { buf.append(_dumpAsString(tab, verbose, (DERObject)o)); } else { buf.append(_dumpAsString(tab, verbose, ((DEREncodable)o).getDERObject())); } } return buf.toString(); } else if (obj instanceof BERSet) { StringBuffer buf = new StringBuffer(); Enumeration e = ((ASN1Set)obj).getObjects(); String tab = indent + TAB; buf.append(indent); buf.append("BER Set"); buf.append(nl); while (e.hasMoreElements()) { Object o = e.nextElement(); if (o == null) { buf.append(tab); buf.append("NULL"); buf.append(nl); } else if (o instanceof DERObject) { buf.append(_dumpAsString(tab, verbose, (DERObject)o)); } else { buf.append(_dumpAsString(tab, verbose, ((DEREncodable)o).getDERObject())); } } return buf.toString(); } else if (obj instanceof DERSet) { StringBuffer buf = new StringBuffer(); Enumeration e = ((ASN1Set)obj).getObjects(); String tab = indent + TAB; buf.append(indent); buf.append("DER Set"); buf.append(nl); while (e.hasMoreElements()) { Object o = e.nextElement(); if (o == null) { buf.append(tab); buf.append("NULL"); buf.append(nl); } else if (o instanceof DERObject) { buf.append(_dumpAsString(tab, verbose, (DERObject)o)); } else { buf.append(_dumpAsString(tab, verbose, ((DEREncodable)o).getDERObject())); } } return buf.toString(); } else if (obj instanceof DERObjectIdentifier) { return indent + "ObjectIdentifier(" + ((DERObjectIdentifier)obj).getId() + ")" + nl; } else if (obj instanceof DERBoolean) { return indent + "Boolean(" + ((DERBoolean)obj).isTrue() + ")" + nl; } else if (obj instanceof DERInteger) { return indent + "Integer(" + ((DERInteger)obj).getValue() + ")" + nl; } else if (obj instanceof BERConstructedOctetString) { ASN1OctetString oct = (ASN1OctetString)obj; if (verbose) { return indent + "BER Constructed Octet String" + "[" + oct.getOctets().length + "] " + dumpBinaryDataAsString(indent, oct.getOctets()) + nl; } return indent + "BER Constructed Octet String" + "[" + oct.getOctets().length + "] " + nl; } else if (obj instanceof DEROctetString) { ASN1OctetString oct = (ASN1OctetString)obj; if (verbose) { return indent + "DER Octet String" + "[" + oct.getOctets().length + "] " + dumpBinaryDataAsString(indent, oct.getOctets()) + nl; } return indent + "DER Octet String" + "[" + oct.getOctets().length + "] " + nl; } else if (obj instanceof DERBitString) { DERBitString bt = (DERBitString)obj; if (verbose) { return indent + "DER Bit String" + "[" + bt.getBytes().length + ", " + bt.getPadBits() + "] " + dumpBinaryDataAsString(indent, bt.getBytes()) + nl; } return indent + "DER Bit String" + "[" + bt.getBytes().length + ", " + bt.getPadBits() + "] " + nl; } else if (obj instanceof DERIA5String) { return indent + "IA5String(" + ((DERIA5String)obj).getString() + ") " + nl; } else if (obj instanceof DERUTF8String) { return indent + "UTF8String(" + ((DERUTF8String)obj).getString() + ") " + nl; } else if (obj instanceof DERPrintableString) { return indent + "PrintableString(" + ((DERPrintableString)obj).getString() + ") " + nl; } else if (obj instanceof DERVisibleString) { return indent + "VisibleString(" + ((DERVisibleString)obj).getString() + ") " + nl; } else if (obj instanceof DERBMPString) { return indent + "BMPString(" + ((DERBMPString)obj).getString() + ") " + nl; } else if (obj instanceof DERT61String) { return indent + "T61String(" + ((DERT61String)obj).getString() + ") " + nl; } else if (obj instanceof DERUTCTime) { return indent + "UTCTime(" + ((DERUTCTime)obj).getTime() + ") " + nl; } else if (obj instanceof DERGeneralizedTime) { return indent + "GeneralizedTime(" + ((DERGeneralizedTime)obj).getTime() + ") " + nl; } else if (obj instanceof DERUnknownTag) { return indent + "Unknown " + Integer.toString(((DERUnknownTag)obj).getTag(), 16) + " " + new String(Hex.encode(((DERUnknownTag)obj).getData())) + nl; } else if (obj instanceof BERApplicationSpecific) { return outputApplicationSpecific("BER", indent, verbose, obj, nl); } else if (obj instanceof DERApplicationSpecific) { return outputApplicationSpecific("DER", indent, verbose, obj, nl); } else { return indent + obj.toString() + nl; } } private static String outputApplicationSpecific(String type, String indent, boolean verbose, DERObject obj, String nl) { DERApplicationSpecific app = (DERApplicationSpecific)obj; StringBuffer buf = new StringBuffer(); if (app.isConstructed()) { try { ASN1Sequence s = ASN1Sequence.getInstance(app.getObject(DERTags.SEQUENCE)); buf.append(indent + type + " ApplicationSpecific[" + app.getApplicationTag() + "]" + nl); for (Enumeration e = s.getObjects(); e.hasMoreElements();) { buf.append(_dumpAsString(indent + TAB, verbose, (DERObject)e.nextElement())); } } catch (IOException e) { buf.append(e); } return buf.toString(); } return indent + type + " ApplicationSpecific[" + app.getApplicationTag() + "] (" + new String(Hex.encode(app.getContents())) + ")" + nl; } /** * dump out a DER object as a formatted string, in non-verbose mode. * * @param obj the DERObject to be dumped out. * @return the resulting string. */ public static String dumpAsString( Object obj) { return dumpAsString(obj, false); } /** * Dump out the object as a string. * * @param obj the object to be dumped * @param verbose if true, dump out the contents of octet and bit strings. * @return the resulting string. */ public static String dumpAsString( Object obj, boolean verbose) { if (obj instanceof DERObject) { return _dumpAsString("", verbose, (DERObject)obj); } else if (obj instanceof DEREncodable) { return _dumpAsString("", verbose, ((DEREncodable)obj).getDERObject()); } return "unknown object type " + obj.toString(); } private static String dumpBinaryDataAsString(String indent, byte[] bytes) { String nl = System.getProperty("line.separator"); StringBuffer buf = new StringBuffer(); indent += TAB; buf.append(nl); for (int i = 0; i < bytes.length; i += SAMPLE_SIZE) { if (bytes.length - i > SAMPLE_SIZE) { buf.append(indent); buf.append(new String(Hex.encode(bytes, i, SAMPLE_SIZE))); buf.append(TAB); buf.append(calculateAscString(bytes, i, SAMPLE_SIZE)); buf.append(nl); } else { buf.append(indent); buf.append(new String(Hex.encode(bytes, i, bytes.length - i))); for (int j = bytes.length - i; j != SAMPLE_SIZE; j++) { buf.append(" "); } buf.append(TAB); buf.append(calculateAscString(bytes, i, bytes.length - i)); buf.append(nl); } } return buf.toString(); } private static String calculateAscString(byte[] bytes, int off, int len) { StringBuffer buf = new StringBuffer(); for (int i = off; i != off + len; i++) { if (bytes[i] >= ' ' && bytes[i] <= '~') { buf.append((char)bytes[i]); } } return buf.toString(); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -