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