signDetachedSha256RsaFromPem static method

Uint8List signDetachedSha256RsaFromPem({
  1. required Uint8List contentDigest,
  2. required String privateKeyPem,
  3. required String certificatePem,
  4. List<String> chainPem = const <String>[],
  5. DateTime? signingTime,
})

Helper that builds a detached CMS using PEM materials.

Implementation

static Uint8List signDetachedSha256RsaFromPem({
  required Uint8List contentDigest,
  required String privateKeyPem,
  required String certificatePem,
  List<String> chainPem = const <String>[],
  DateTime? signingTime,
}) {
  final signerCertDer =
      PdfPemUtils.decodeFirstPem(certificatePem, 'CERTIFICATE');
  final extraCertsDer = <Uint8List>[];
  for (final pem in chainPem) {
    extraCertsDer.addAll(PdfPemUtils.decodePemBlocks(pem, 'CERTIFICATE'));
  }

  final cms = PdfCmsSigner();
  final signedAttrsDer = cms._buildSignedAttributesDer(
    contentDigest: contentDigest,
    signingTime: (signingTime ?? DateTime.now().toUtc()),
    signerCertDer: signerCertDer,
  );
  final signedAttrsDigest = PdfCrypto.sha256(signedAttrsDer);

  final key = PdfPemUtils.rsaPrivateKeyFromPem(privateKeyPem);
  final signature = _rsaSignDigestSha256(signedAttrsDigest, key);

  return cms._buildCmsSignedData(
    contentDigest: contentDigest,
    signerCertDer: signerCertDer,
    extraCertsDer: extraCertsDer,
    signedAttrsDer: signedAttrsDer,
    signature: signature,
    digestAlgorithmOid: '2.16.840.1.101.3.4.2.1',
    signatureAlgorithmOid: '1.2.840.113549.1.1.1',
  );
}