93 lines
2.7 KiB
Dart
93 lines
2.7 KiB
Dart
import 'dart:typed_data';
|
|
|
|
import 'package:pointycastle/asn1.dart';
|
|
|
|
///
|
|
///```
|
|
/// SafeBag ::= SEQUENCE {
|
|
/// bagId BAG-TYPE.&id ({PKCS12BagSet})
|
|
/// bagValue [0] EXPLICIT BAG-TYPE.&Type({PKCS12BagSet}{@bagId}),
|
|
/// bagAttributes SET OF PKCS12Attribute OPTIONAL
|
|
/// }
|
|
///```
|
|
///
|
|
class ASN1SafeBag extends ASN1Object {
|
|
///
|
|
/// Describes the bag type. Possible objectIdentifier :
|
|
///
|
|
/// * 1.2.840.113549.1.12.10.1.1 (keyBag)
|
|
/// * 1.2.840.113549.1.12.10.1.2 (pkcs-8ShroudedKeyBag)
|
|
/// * 1.2.840.113549.1.12.10.1.3 (certBag)
|
|
/// * 1.2.840.113549.1.12.10.1.4 (crlBag)
|
|
/// * 1.2.840.113549.1.12.10.1.5 (secretBag)
|
|
/// * 1.2.840.113549.1.12.10.1.6 (safeContentsBag)
|
|
///
|
|
late ASN1ObjectIdentifier bagId;
|
|
late ASN1Object bagValue;
|
|
ASN1Set? bagAttributes;
|
|
|
|
ASN1SafeBag(this.bagId, this.bagValue, {this.bagAttributes});
|
|
|
|
///
|
|
/// Constructor to create the SafeBag for a pkcs-8ShroudedKeyBag.
|
|
///
|
|
ASN1SafeBag.forPkcs8ShroudedKeyBag(this.bagValue, {this.bagAttributes}) {
|
|
bagId =
|
|
ASN1ObjectIdentifier.fromIdentifierString('1.2.840.113549.1.12.10.1.2');
|
|
}
|
|
|
|
///
|
|
/// Constructor to create the SafeBag for a certBag.
|
|
///
|
|
ASN1SafeBag.forCertBag(this.bagValue, {this.bagAttributes}) {
|
|
bagId =
|
|
ASN1ObjectIdentifier.fromIdentifierString('1.2.840.113549.1.12.10.1.3');
|
|
}
|
|
|
|
///
|
|
/// Constructor to create the SafeBag for a [KeyBag] holding a [PrivateKeyInfo].
|
|
///
|
|
ASN1SafeBag.forKeyBag(this.bagValue, {this.bagAttributes}) {
|
|
bagId =
|
|
ASN1ObjectIdentifier.fromIdentifierString('1.2.840.113549.1.12.10.1.1');
|
|
}
|
|
|
|
///
|
|
/// Creates a SafeBag object from the given sequence consisting of up to three elements :
|
|
/// * [ASN1ObjectIdentifier]
|
|
/// * [EncryptedPrivateKeyInfo] or [CertBag]
|
|
/// * [ASN1Set] (OPTIONAL)
|
|
///
|
|
ASN1SafeBag.fromSequence(ASN1Sequence seq) {
|
|
bagId = seq.elements!.elementAt(0) as ASN1ObjectIdentifier;
|
|
if (seq.elements!.length >= 2) {
|
|
var el = seq.elements!.elementAt(1);
|
|
if (el.tag == 0xA0) {
|
|
bagValue = ASN1Parser(el.valueBytes).nextObject();
|
|
} else {
|
|
bagValue = el;
|
|
}
|
|
}
|
|
if (seq.elements!.length == 3) {
|
|
bagAttributes = seq.elements!.elementAt(2) as ASN1Set;
|
|
}
|
|
}
|
|
|
|
@override
|
|
Uint8List encode(
|
|
{ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) {
|
|
var tmp = ASN1Sequence(elements: [bagId, _getWrapper()]);
|
|
if (bagAttributes != null) {
|
|
tmp.add(bagAttributes!);
|
|
}
|
|
return tmp.encode(encodingRule: encodingRule);
|
|
}
|
|
|
|
ASN1Object _getWrapper() {
|
|
var wrapper = ASN1Object(tag: 0xA0);
|
|
var contentBytes = bagValue.encode();
|
|
wrapper.valueBytes = contentBytes;
|
|
wrapper.valueByteLength = contentBytes.length;
|
|
return wrapper;
|
|
}
|
|
}
|