buildDetachedCms method

Future<Uint8List> buildDetachedCms({
  1. required Uint8List contentDigest,
  2. required Uint8List signerCertDer,
  3. List<Uint8List> extraCertsDer = const <Uint8List>[],
  4. DateTime? signingTime,
  5. String digestAlgorithmOid = '2.16.840.1.101.3.4.2.1',
  6. String signatureAlgorithmOid = '1.2.840.113549.1.1.1',
  7. required Future<Uint8List> signCallback(
    1. Uint8List signedAttrsDer,
    2. Uint8List signedAttrsDigest
    ),
  8. Future<Uint8List> timestampProvider(
    1. Uint8List signature
    )?,
})

Builds a detached CMS/PKCS#7 signature.

Implementation

Future<Uint8List> buildDetachedCms({
  required Uint8List contentDigest,
  required Uint8List signerCertDer,
  List<Uint8List> extraCertsDer = const <Uint8List>[],
  DateTime? signingTime,
  String digestAlgorithmOid = '2.16.840.1.101.3.4.2.1',
  String signatureAlgorithmOid = '1.2.840.113549.1.1.1',
  required Future<Uint8List> Function(
    Uint8List signedAttrsDer,
    Uint8List signedAttrsDigest,
  ) signCallback,
  Future<Uint8List> Function(Uint8List signature)? timestampProvider,
}) async {
  final signedAttrsDer = _buildSignedAttributesDer(
    contentDigest: contentDigest,
    signingTime: signingTime ?? DateTime.now().toUtc(),
    signerCertDer: signerCertDer,
  );
  final signedAttrsDigest = PdfCrypto.sha256(signedAttrsDer);

  final signature = await signCallback(signedAttrsDer, signedAttrsDigest);
  if (signature.isEmpty) {
    throw StateError('Assinatura externa retornou vazio.');
  }

  Uint8List? timestampToken;
  if (timestampProvider != null) {
    timestampToken = await timestampProvider(signature);
    if (timestampToken.isEmpty) {
      throw StateError('Timestamp retornou vazio.');
    }
  }

  return _buildCmsSignedData(
    contentDigest: contentDigest,
    signerCertDer: signerCertDer,
    extraCertsDer: extraCertsDer,
    signedAttrsDer: signedAttrsDer,
    signature: signature,
    timestampToken: timestampToken,
    digestAlgorithmOid: digestAlgorithmOid,
    signatureAlgorithmOid: signatureAlgorithmOid,
  );
}