TbsCertificate.fromAsn1 constructor

TbsCertificate.fromAsn1(
  1. ASN1Sequence sequence
)

Creates a to-be-signed certificate from an ASN1Sequence.

The ASN.1 definition is:

TBSCertificate ::= SEQUENCE { version 0 EXPLICIT Version DEFAULT v1, serialNumber CertificateSerialNumber, signature AlgorithmIdentifier, issuer Name, validity Validity, subject Name, subjectPublicKeyInfo SubjectPublicKeyInfo, issuerUniqueID 1 IMPLICIT UniqueIdentifier OPTIONAL, -- If present, version MUST be v2 or v3 subjectUniqueID 2 IMPLICIT UniqueIdentifier OPTIONAL, -- If present, version MUST be v2 or v3 extensions 3 EXPLICIT Extensions OPTIONAL -- If present, version MUST be v3 }

Version ::= INTEGER { v1(0), v2(1), v3(2) }

CertificateSerialNumber ::= INTEGER

UniqueIdentifier ::= BIT STRING

Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension

Implementation

factory TbsCertificate.fromAsn1(ASN1Sequence sequence) {
  var elements = sequence.elements;
  var version = 1;
  if (elements.first.tag == 0xa0) {
    var e =
        ASN1Parser(elements.first.valueBytes()).nextObject() as ASN1Integer;
    version = e.valueAsBigInteger.toInt() + 1;
    elements = elements.skip(1).toList();
  }
  var optionals = elements.skip(6);
  Uint8List? iUid, sUid;
  List<Extension>? ex;
  for (var o in optionals) {
    if (o.tag >> 6 == 2) {
      // context
      switch (o.tag & 0x1f) {
        case 1:
          iUid = o.contentBytes();
          break;
        case 2:
          sUid = o.contentBytes();
          break;
        case 3:
          ex = (ASN1Parser(o.contentBytes()).nextObject() as ASN1Sequence)
              .elements
              .map((v) => Extension.fromAsn1(v as ASN1Sequence))
              .toList();
      }
    }
  }

  return TbsCertificate(
      version: version,
      serialNumber: (elements[0] as ASN1Integer).valueAsBigInteger.toInt(),
      signature: AlgorithmIdentifier.fromAsn1(elements[1] as ASN1Sequence),
      issuer: Name.fromAsn1(elements[2] as ASN1Sequence),
      validity: Validity.fromAsn1(elements[3] as ASN1Sequence),
      subject: Name.fromAsn1(elements[4] as ASN1Sequence),
      subjectPublicKeyInfo:
          SubjectPublicKeyInfo.fromAsn1(elements[5] as ASN1Sequence),
      issuerUniqueID: iUid,
      subjectUniqueID: sUid,
      extensions: ex);
}