csrFromPem static method

Parses the given CSR pem to CertificateSigningRequestData object

Implementation

static CertificateSigningRequestData csrFromPem(String pem) {
  var bytes = CryptoUtils.getBytesFromPEMString(pem);
  var asn1Parser = ASN1Parser(bytes);
  var topLevelSeq = asn1Parser.nextObject() as ASN1Sequence;

  var infoSeq = topLevelSeq.elements!.elementAt(0) as ASN1Sequence;
  var sigSeq = topLevelSeq.elements!.elementAt(1) as ASN1Sequence;
  var sig = topLevelSeq.elements!.elementAt(2) as ASN1BitString;

  // CertificationRequestInfo
  var certificationRequestInfo =
      _getCertificateSigningRequestDataFromSeq(infoSeq);

  // Signature Algorithm
  var pubKeyOid = sigSeq.elements!.elementAt(0) as ASN1ObjectIdentifier;
  int? saltLength;
  String? pssDigest;
  if (pubKeyOid.objectIdentifierAsString == '1.2.840.113549.1.1.10' &&
      sigSeq.elements!.length == 2) {
    pubKeyOid.readableName = 'rsaPSS';
    // We have RSA PSS, check for salt length
    var parameterSeq = sigSeq.elements!.elementAt(1) as ASN1Sequence;
    if (parameterSeq.elements!.length == 3) {
      // Get Digest
      var digestWrapper = parameterSeq.elements!.elementAt(0);
      var digestSeq = ASN1Sequence.fromBytes(digestWrapper.valueBytes!);
      var digestOi = digestSeq.elements!.elementAt(0) as ASN1ObjectIdentifier;
      digestOi.readableName = 'SHA-256'; // TODO REMOVE LATER
      pssDigest = digestOi.readableName;
      // Get Salt
      var el = parameterSeq.elements!.elementAt(2);
      var aInteger = ASN1Integer.fromBytes(el.valueBytes!);
      saltLength = aInteger.integer!.toInt();
    }
  }

  // Signature
  var sigAsString = _bytesAsString(sig.valueBytes!);

  return CertificateSigningRequestData(
    version: certificationRequestInfo.version,
    subject: certificationRequestInfo.subject,
    signatureAlgorithm: pubKeyOid.objectIdentifierAsString,
    signatureAlgorithmReadableName: pubKeyOid.readableName,
    signature: sigAsString,
    publicKeyInfo: certificationRequestInfo.publicKeyInfo,
    saltLength: saltLength,
    pssDigest: pssDigest,
    plain: pem,
    extensions: certificationRequestInfo.extensions,
    certificationRequestInfo: certificationRequestInfo,
    certificationRequestInfoSeq: base64.encode(infoSeq.encode()),
  );
}