Program: 80249
Project: 80249
Buggy source:
/** 
 * M&eacute;odo que genera una firma digital usando el sitema conocido como SignedData y que podr&aacute; ser con el contenido del fichero codificado o s&oacute;lo como referencia del fichero.
 * @param parameters Par&aacute;metros necesarios para obtener los datos de SignedData.
 * @param omitContent Par&aacute;metro qeu indica si en la firma va el contenido del fichero o s&oacute;lo va de forma referenciada.
 * @param policyIdentifier Url de la Politica aplicada.
 * @param policyQualifier OID de la pol&iacute;tica.
 * @param signingCertificateV2 <code>true</code> si se desea usar la versi&oacute;n 2 del atributo <i>Signing Certificate</i> <code>false</code> para usar la versi&oacute;n 1
 * @param keyEntry Entrada a la clave privada para firma.
 * @param messageDigest Hash a aplicar en la firma.
 * @return La firma generada codificada.
 * @throws java.security.NoSuchAlgorithmException Si no se soporta alguno de los algoritmos de firma o huella digital
 * @throws java.security.cert.CertificateException Si se produce alguna excepci&oacute;n con los certificados de firma.
 * @throws java.io.IOException Si ocurre alg&uacute;n problema leyendo o escribiendo los datos
 * @throws AOException Cuando ocurre un error durante el proceso de descifrado (formato o clave incorrecto,...) 
 */
public byte[] generateSignedData(final P7ContentSignerParameters parameters,final boolean omitContent,final String policyIdentifier,final String policyQualifier,final boolean signingCertificateV2,final PrivateKeyEntry keyEntry,byte[] messageDigest) throws NoSuchAlgorithmException, CertificateException, IOException, AOException {
  if (parameters == null) {
    throw new IllegalArgumentException("String_Node_Str");
  }
  final String signatureAlgorithm=parameters.getSignatureAlgorithm();
  final X509Certificate[] signerCertificateChain=parameters.getSignerCertificateChain();
  final byte[] content=(omitContent) ? null : parameters.getContent();
  if (omitContent && messageDigest == null && parameters.getContent() != null) {
    final MessageDigest md=MessageDigest.getInstance(AOSignConstants.getDigestAlgorithmName(signatureAlgorithm));
    md.update(parameters.getContent());
    messageDigest=md.digest();
  }
  final byte[] preSignature=CAdESTriPhaseSigner.preSign(AOSignConstants.getDigestAlgorithmName(signatureAlgorithm),content,signerCertificateChain,policyIdentifier,policyQualifier,signingCertificateV2,messageDigest);
  final byte[] signature=PKCS1ExternalizableSigner.sign(signatureAlgorithm,keyEntry,preSignature);
  return CAdESTriPhaseSigner.postSign(AOSignConstants.getDigestAlgorithmName(signatureAlgorithm),content,signerCertificateChain,policyIdentifier,policyQualifier,signingCertificateV2,messageDigest,signature);
}

Fixed version (ground truth):
/** 
 * M&eacute;odo que genera una firma digital usando el sitema conocido como SignedData y que podr&aacute; ser con el contenido del fichero codificado o s&oacute;lo como referencia del fichero.
 * @param parameters Par&aacute;metros necesarios para obtener los datos de SignedData.
 * @param omitContent Par&aacute;metro qeu indica si en la firma va el contenido del fichero o s&oacute;lo va de forma referenciada.
 * @param policyIdentifier Url de la Politica aplicada.
 * @param policyQualifier OID de la pol&iacute;tica.
 * @param signingCertificateV2 <code>true</code> si se desea usar la versi&oacute;n 2 del atributo <i>Signing Certificate</i> <code>false</code> para usar la versi&oacute;n 1
 * @param keyEntry Entrada a la clave privada para firma.
 * @param messageDigest Hash a aplicar en la firma.
 * @return La firma generada codificada.
 * @throws java.security.NoSuchAlgorithmException Si no se soporta alguno de los algoritmos de firma o huella digital
 * @throws java.security.cert.CertificateException Si se produce alguna excepci&oacute;n con los certificados de firma.
 * @throws java.io.IOException Si ocurre alg&uacute;n problema leyendo o escribiendo los datos
 * @throws AOException Cuando ocurre un error durante el proceso de descifrado (formato o clave incorrecto,...) 
 */
public byte[] generateSignedData(final P7ContentSignerParameters parameters,final boolean omitContent,final String policyIdentifier,final String policyQualifier,final boolean signingCertificateV2,final PrivateKeyEntry keyEntry,byte[] messageDigest) throws NoSuchAlgorithmException, CertificateException, IOException, AOException {
  if (parameters == null) {
    throw new IllegalArgumentException("String_Node_Str");
  }
  final String signatureAlgorithm=parameters.getSignatureAlgorithm();
  final X509Certificate[] signerCertificateChain=parameters.getSignerCertificateChain();
  final byte[] content=(omitContent) ? null : parameters.getContent();
  if (messageDigest == null && parameters.getContent() != null) {
    final MessageDigest md=MessageDigest.getInstance(AOSignConstants.getDigestAlgorithmName(signatureAlgorithm));
    md.update(parameters.getContent());
    messageDigest=md.digest();
  }
  final byte[] preSignature=CAdESTriPhaseSigner.preSign(AOSignConstants.getDigestAlgorithmName(signatureAlgorithm),content,signerCertificateChain,policyIdentifier,policyQualifier,signingCertificateV2,messageDigest);
  final byte[] signature=PKCS1ExternalizableSigner.sign(signatureAlgorithm,keyEntry,preSignature);
  return CAdESTriPhaseSigner.postSign(AOSignConstants.getDigestAlgorithmName(signatureAlgorithm),content,signerCertificateChain,signature,preSignature);
}