65 lines
1.6 KiB
Dart
65 lines
1.6 KiB
Dart
import 'dart:typed_data';
|
|
|
|
import 'package:pointycastle/asn1.dart';
|
|
|
|
///
|
|
///
|
|
/// ```
|
|
/// ContentInfo ::= SEQUENCE {
|
|
/// contentType ContentType,
|
|
/// content
|
|
/// [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL }
|
|
/// ```
|
|
///
|
|
class ASN1ContentInfo extends ASN1Object {
|
|
late ASN1ObjectIdentifier contentType;
|
|
ASN1Object? content;
|
|
|
|
ASN1ContentInfo(this.contentType, {this.content});
|
|
|
|
ASN1ContentInfo.fromSequence(ASN1Sequence seq) {
|
|
contentType = seq.elements!.elementAt(0) as ASN1ObjectIdentifier;
|
|
if (seq.elements!.length == 2) {
|
|
var el = seq.elements!.elementAt(1);
|
|
if (el.tag == 0xA0) {
|
|
content = ASN1Parser(el.valueBytes).nextObject();
|
|
} else {
|
|
content = el;
|
|
}
|
|
}
|
|
}
|
|
|
|
ASN1ContentInfo.forData(this.content) {
|
|
contentType =
|
|
ASN1ObjectIdentifier.fromIdentifierString('1.2.840.113549.1.7.1');
|
|
}
|
|
|
|
ASN1ContentInfo.forEncryptedData(this.content) {
|
|
contentType =
|
|
ASN1ObjectIdentifier.fromIdentifierString('1.2.840.113549.1.7.6');
|
|
}
|
|
|
|
@override
|
|
Uint8List encode(
|
|
{ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) {
|
|
var wrapper = _getWrapper();
|
|
var tmp = ASN1Sequence(elements: [
|
|
contentType,
|
|
wrapper,
|
|
]);
|
|
return tmp.encode(encodingRule: encodingRule);
|
|
}
|
|
|
|
ASN1Object _getWrapper() {
|
|
var wrapper = ASN1Object(tag: 0xA0);
|
|
if (content != null) {
|
|
var contentBytes = content!.encode();
|
|
wrapper.valueBytes = contentBytes;
|
|
wrapper.valueByteLength = contentBytes.length;
|
|
} else {
|
|
wrapper.valueBytes = Uint8List(0);
|
|
wrapper.valueByteLength = 0;
|
|
}
|
|
return wrapper;
|
|
}
|
|
}
|