PdfDigitalSignatureIdentity.fromFiles constructor

PdfDigitalSignatureIdentity.fromFiles({
  1. required Uint8List privateKey,
  2. required List<Uint8List> certificates,
})

Implementation

factory PdfDigitalSignatureIdentity.fromFiles({
  required Uint8List privateKey,
  required List<Uint8List> certificates,
}) {
  if (certificates.isEmpty) {
    throw const PdfSignatureIdentityException(
      PdfSignatureIdentityError.noCertificateSelected,
      'Select at least one X.509 certificate.',
    );
  }
  final key = _parsePrivateKey(privateKey);
  final ders = _parseCertificates(certificates);
  final parsed = <X509Certificate>[];
  for (var i = 0; i < ders.length; i++) {
    try {
      parsed.add(X509Certificate.parse(ders[i]));
    } catch (_) {
      throw PdfSignatureIdentityException(
        PdfSignatureIdentityError.invalidCertificate,
        'Certificate ${i + 1} is not valid X.509.',
        certificateIndex: i + 1,
      );
    }
  }

  var signerIndex = -1;
  for (var i = 0; i < parsed.length; i++) {
    final publicKey = parsed[i].publicKey;
    if (publicKey is RsaPublicKey &&
        publicKey.modulus == key.modulus &&
        publicKey.exponent == key.publicExponent) {
      signerIndex = i;
      break;
    }
  }
  if (signerIndex < 0) {
    throw const PdfSignatureIdentityException(
      PdfSignatureIdentityError.keyCertificateMismatch,
      'The private key does not match any selected RSA certificate.',
    );
  }

  final ordered = <Uint8List>[
    ders[signerIndex],
    for (var i = 0; i < ders.length; i++)
      if (i != signerIndex) ders[i],
  ];
  return PdfDigitalSignatureIdentity._(
    key,
    List.unmodifiable(ordered),
    parsed[signerIndex],
  );
}