2020-06-15 00:08:23 +00:00
|
|
|
import 'dart:typed_data';
|
|
|
|
|
|
|
|
import 'x509_certificate.dart';
|
|
|
|
|
|
|
|
import 'asn1_identifier.dart';
|
|
|
|
import 'oid.dart';
|
|
|
|
|
|
|
|
class ASN1Object {
|
|
|
|
/// This property contains the DER encoded object
|
|
|
|
Uint8List encoded;
|
|
|
|
|
|
|
|
/// This property contains the decoded Swift object whenever is possible
|
|
|
|
dynamic value;
|
|
|
|
|
|
|
|
ASN1Identifier identifier;
|
|
|
|
|
|
|
|
List<ASN1Object> sub;
|
|
|
|
|
|
|
|
ASN1Object parent;
|
|
|
|
|
|
|
|
ASN1Object subAtIndex(int index) {
|
|
|
|
if (sub != null && index >= 0 && index < sub.length) {
|
|
|
|
return sub[index];
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2020-06-15 22:25:29 +00:00
|
|
|
ASN1Object firstSub() {
|
|
|
|
if (subCount() > 0) {
|
|
|
|
return sub.first;
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
ASN1Object lastSub() {
|
|
|
|
if (subCount() > 0) {
|
|
|
|
return sub.last;
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2020-06-15 00:08:23 +00:00
|
|
|
int subCount() {
|
|
|
|
return sub?.length ?? 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
ASN1Object findOid({OID oid, String oidValue}) {
|
|
|
|
oidValue = oid != null ? oid.toValue() : oidValue;
|
|
|
|
for (var child in (sub ?? <ASN1Object>[])) {
|
|
|
|
if (child.identifier?.tagNumber() == ASN1IdentifierTagNumber.OBJECT_IDENTIFIER) {
|
|
|
|
if (child.value == oidValue) {
|
|
|
|
return child;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
var result = child.findOid(oidValue: oidValue);
|
|
|
|
if (result != null) {
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
String get description {
|
|
|
|
return printAsn1();
|
|
|
|
}
|
|
|
|
|
|
|
|
String printAsn1({insets = ""}) {
|
|
|
|
var output = insets;
|
|
|
|
output += identifier?.description?.toUpperCase() ?? "";
|
|
|
|
output += (value != null ? ": $value" : "");
|
|
|
|
if (identifier?.typeClass() == ASN1IdentifierClass.UNIVERSAL && identifier?.tagNumber() == ASN1IdentifierTagNumber.OBJECT_IDENTIFIER) {
|
|
|
|
var descr = OID.fromValue(value?.toString() ?? "")?.name();
|
|
|
|
if (descr != null) {
|
|
|
|
output += " ($descr)";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
output += sub != null && sub.length > 0 ? " {" : "";
|
|
|
|
output += "\n";
|
|
|
|
for (var item in (sub ?? <ASN1Object>[])) {
|
|
|
|
output += item.printAsn1(insets: insets + " ");
|
|
|
|
}
|
|
|
|
output += sub != null && sub.length > 0 ? "}\n" : "";
|
|
|
|
return output;
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
String toString() {
|
|
|
|
return description;
|
|
|
|
}
|
|
|
|
|
|
|
|
ASN1Object atIndex(X509BlockPosition x509blockPosition) {
|
|
|
|
if (sub != null && x509blockPosition.index < sub.length) {
|
|
|
|
return sub[x509blockPosition.index];
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|