TbsCertificate.fromAsn1 constructor
- 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);
var iUid, sUid;
var 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);
}