ASN.1 Parser for Dart
Encodes & decodes ASN1 using BER encoding.
Samples
Encoding
import 'package:asn1lib/asn1lib.dart';
var s = ASN1Sequence();
s.add(ASN1Integer(23));
s.add(ASN1OctetString('This is a test'));
s.add(ASN1Boolean(true));
var bytes = s
.
encodedBytes;
Decoding
import 'package:asn1lib/asn1lib.dart';
var p = ASN1Parser(bytes);
var s2 = p.nextObject();
var p2 = ASN1Parser(bytes, relaxedParsing: true);
var s3 = p2.nextObject();
ASN1 Object classes
The library has been most thoroughly tested against ASN1 primitive class types, such as strings,
integers,
sequences and sets.
There is minimal support for ASN1 Application, Context-specific and Private classes. If the parser
encounters
these tags, it will wrap them in an a corresponding object ( ASN1Application, ASN1ContextSpecific,
ASN1Private). You
can force decode these to another type, by doing something like this:
var s = parser.nextObject();
expect(s, isA<ASN1ContextSpecific>());
expect(s, isA<ASN1Object>());
var sequence = ASN1Sequence.fromBytes(s.encodedBytes);
expect(sequence, isA<ASN1Sequence>());
Breaking Changes
As of 1.6, the default encoding of ASN1OctetString("some string") has changed. It now encodes
octets using utf8 encoding. This is different than Dart's default utf16 encoding.
If you need to encode to utf16, you should convert to bytes first:
var x = ASN1OctetString(Uint8List.fromList('some string'.codeUnits));
var y = x.utf16StringValue;
The getter ASN1OctetString.stringValue is deprecated. You should use ASN1OctetString.utf8StringValue or ASN1OctetString.utf16StringValue instead.
Issues
ASN1 parsing is complex, so bugs are expected. If you find a bug, please provide a test case
that demonstrates the issue, along with the
expected output. Bonus points if it is formatted as a dart test.
References
- https://letsencrypt.org/docs/a-warm-welcome-to-asn1-and-der/
- https://luca.ntop.org/Teaching/Appunti/asn1.html
- https://ldap.com/ldapv3-wire-protocol-reference-asn1-ber/