sign method
Future<void>
sign(
- PdfObject<
PdfDataType> object, - PdfStream os,
- PdfDict<
PdfDataType> params, - int? offsetStart,
- 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);
}