sign method

  1. @override
Future<void> sign(
  1. PdfObject<PdfDataType> object,
  2. PdfStream os,
  3. PdfDict<PdfDataType> params,
  4. int? offsetStart,
  5. int? offsetEnd,
)
override

Computes the ByteRange digest, builds CMS, and embeds /Contents.

Implementation

@override

/// Computes the ByteRange digest, builds CMS, and embeds /Contents.
Future<void> sign(
  PdfObject object,
  PdfStream os,
  PdfDict params,
  int? offsetStart,
  int? offsetEnd,
) async {
  if (offsetStart == null || offsetEnd == null) {
    throw StateError('Offsets de assinatura inválidos.');
  }

  final bytes = os.output();
  final contentsRange =
      findContentsRangeInWindow(bytes, offsetStart, offsetEnd);
  final byteRange = <int>[
    0,
    contentsRange.lt,
    contentsRange.gt + 1,
    bytes.length - (contentsRange.gt + 1),
  ];

  writeByteRangeInWindow(bytes, offsetStart, offsetEnd, byteRange);

  final contentDigest = computeByteRangeDigest(bytes, byteRange);

  final signerCerts = externalSigner.certificates;
  if (signerCerts.isEmpty) {
    throw StateError('Nenhum certificado fornecido pelo signer externo.');
  }

  final cms = await cmsSigner.buildDetachedCms(
    contentDigest: contentDigest,
    signerCertDer: signerCerts.first,
    extraCertsDer: signerCerts.skip(1).toList(growable: false),
    signingTime: signingTime,
    signCallback: (signedAttrsDer, signedAttrsDigest) async {
      return externalSigner.signDigest(signedAttrsDigest);
    },
  );

  embedSignatureHex(bytes, contentsRange.start, contentsRange.end, cms);

  os.setBytes(0, bytes);
}