How to parse the ASN1 data by using bouncycastle
bouncycastle, java
Solution
You should be able to use the classes in org.bouncycastle.asn1, beginning with ASN1InputStream, to read the ASN.1 structure from an InputStream or byte[]. It's a little bit difficult to follow your example code, but something like this might help you get started:
byte[] data = null; // obviously need to supply real data here
ASN1InputStream input = new ASN1InputStream(data);
ASN1Primitive p;
while ((p = input.readObject()) != null) {
ASN1Sequence asn1 = ASN1Sequence.getInstance(p);
DERUTF8String nameData = DERUTF8String.getInstance(asn1.getObjectAt(0));
ASN1OctetString octstr = ASN1OctetString.getInstance(asn1.getObjectAt(1));
ASN1Sequence asn2 = ASN1Sequence.getInstance(ASN1Primitive.fromByteArray(octstr.getOctets()));
// ... and so on
}
If you find the structure of the data hard to understand, perhaps the org.bouncycastle.asn1.util.ASN1Dump class will be helpful:
byte[] data = null; // obviously need to supply real data here
ASN1InputStream input = new ASN1InputStream(data);
ASN1Primitive p;
while ((p = input.readObject()) != null) {
System.out.println(ASN1Dump.dumpAsString(p));
}
Problem
I have the byte array which is in the form of asn1 format..now i want to parse this data to get required information..Here is the code they have written for c++..now i want to do the same in java.could any one help on this. ASN1 asn1(in); ``` int startPos = in.tellg(); asn1.enterObject(asn1.getTag()); int endPos = asn1.getCurrentLength() + in.tellg(); ubytearray acctId, valData; while (in.tellg() < endPos) { asn1.enterObject(0x30); //0x30 TAG_SEQ // read the name ubytearray nameData = asn1.getContent(ASN1_TAG_UTF8_STRING); ubytearray octstr = asn1.getContent(ASN1_TAG_OCTET_STRING); ``` ASN1 asn2(octstr); asn2.enterObject(0x30); ustring urlstr(asn2.getContent(ASN1_TAG_UTF8_STRING)); ustring nameStr(asn2.getContent(ASN1_TAG_UTF8_STRING)); asn2.enterObject(0x30); ubytearray certs = asn2.getContent(ASN1_TAG_OCTET_STRING); ``` if ((urlstr.length() > 0) && (nameStr.length() > 0) && (certs.length() > 0)) { printf("url %s\n", urlstr.c_str()); printf("name %s\n", nameStr.c_str()); printf("certs len:%d\n", certs.length()); ``` } }