parsePrivateKeyFromPem method

RSAPrivateKey parsePrivateKeyFromPem(
  1. dynamic pemString
)

Decode Private key from PEM Format

Given a base64 encoded PEM String with correct headers and footers, return a RSAPrivateKey

Implementation

RSAPrivateKey parsePrivateKeyFromPem(pemString) {
  List<int> privateKeyDER = decodePEM(pemString);
  var asn1Parser = new ASN1Parser(privateKeyDER as Uint8List);
  var topLevelSeq = asn1Parser.nextObject() as ASN1Sequence;

  var modulus, privateExponent, p, q;
  //Use either PKCS1 or PKCS8 depending on the number of ELEMENTS
  if (topLevelSeq.elements.length == 3) {
    var privateKey = topLevelSeq.elements[2];

    asn1Parser = new ASN1Parser(privateKey.contentBytes()!);
    var pkSeq = asn1Parser.nextObject() as ASN1Sequence;

    modulus = pkSeq.elements[1] as ASN1Integer;
    privateExponent = pkSeq.elements[3] as ASN1Integer;
    p = pkSeq.elements[4] as ASN1Integer;
    q = pkSeq.elements[5] as ASN1Integer;
  } else {
    modulus = topLevelSeq.elements[1] as ASN1Integer;
    privateExponent = topLevelSeq.elements[3] as ASN1Integer;
    p = topLevelSeq.elements[4] as ASN1Integer;
    q = topLevelSeq.elements[5] as ASN1Integer;
  }

  RSAPrivateKey rsaPrivateKey = RSAPrivateKey(
      modulus.valueAsBigInteger,
      privateExponent.valueAsBigInteger,
      p.valueAsBigInteger,
      q.valueAsBigInteger);

  return rsaPrivateKey;
}