搜索分类、插件与代码仓

插件详情v1.6.8

asn1lib

适用于 Dart 的 ASN1 解析器库。将 ASN1 对象编码/解码为 BER 字节

AndroidiOSWebmacOSWindowsLinux
近 30 天下载
234万
喜欢数
27
Pub 分数
150

安装插件

flutter pub add asn1lib

插件介绍

基于插件公开信息、社区数据与项目使用情况整理的选型参考。

asn1lib 是一个 Dart 库,用于使用 BER(基本编码规则)解析和生成 ASN.1(抽象语法表示法一)数据结构。它能够将 ASN.1 对象编码和解码为二进制 BER 字节流,适用于依赖 ASN.1 的协议,例如 X.509 证书、LDAP 和 SNMP。该库支持所有主要平台,包括 Android、iOS、Web、macOS、Windows 和 Linux。它提供了一个简洁且类型安全的 API,用于处理复杂的嵌套 ASN.1 结构。

适合场景

  • 解析 X.509 证书
  • 处理 LDAP 数据
  • 实现SNMP客户端
  • 处理加密数据格式
  • 与旧系统互操作

主要特点

  • BER 编码/解码
  • 对嵌套的 ASN.1 结构的支持
  • 跨平台兼容性
  • 类型安全的对象映射
  • 轻量且依赖极少

适合对象

  • 开发人员在使用加密标准
  • 处理基于ASN.1协议的系统集成商
  • 需要安全数据交换的应用程序

使用建议

  • 需要了解 ASN.1 和 BER
  • 不适合简单的 JSON 类型数据
  • 与主流库相比,文档有限

原始 README

以下为关联源码仓库的 README 原文快照,最新内容请访问源码仓库。

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));

// GET the BER Stream
var bytes = s
.
encodedBytes;
Decoding
import 'package:asn1lib/asn1lib.dart';

// e.g. bytes from the Encoding Example
var p = ASN1Parser(bytes);
var s2 = p.nextObject();
// s2 is a sequence...


// relaxed parsing, returning a generic ASN1Object from (yet) unsupported structures, instead of throwing
var p2 = ASN1Parser(bytes, relaxedParsing: true);
var s3 = p2.nextObject();
// s3 is a sequence...

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();
    // We expect this is a context-specific class
    expect(s, isA<ASN1ContextSpecific>());
    // which is also an ASN1Object...
    expect(s, isA<ASN1Object>());
    // We expect this is a sequence, so "recast" to a sequence type
    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));
// new getter
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/

所属分类

源码仓库

使用此插件的项目