es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Verificar firma de archivo sin contenido utilizando BouncyCastle.

Tengo un problema al verificar la firma desvinculada de un archivo de longitud cero. Estoy usando BouncyCastle (bc-csharp).

Cuando intento verificar la firma para un archivo de longitud cero, obtengo una excepción:

‘Message:’valor de atributo de resumen de mensaje no coincide con el valor calculado ‘
StackTrace:
en Org.BouncyCastle.Cms.SignerInformation.DoVerify (AsymmetricKeyParameter key)
en Org.BouncyCastle.Cms.SignerInformation.Verify (AsymmetricKeyParameter pubKey)
en myProject.Controllers.Controller.VerifyDetachedSignature (Byte [] fileRawBytes, String sign) …

En otros casos funciona bien.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La excepción “el valor del atributo de resumen de mensaje no coincide con el valor calculado” ocurre al intentar verificar la firma desvinculada de un archivo de longitud cero utilizando BouncyCastle (bc-csharp). Este problema puede deberse al hecho de que el constructor CmsProcessableByteArray no acepta una matriz de bytes vacía.

    Una posible solución a este problema es agregar una verificación para los archivos de longitud cero antes de llamar al constructor CmsProcessableByteArray. Si la matriz fileRawBytes está vacía, cree un nuevo objeto ByteArrayOutputStream vacío en su lugar. Aquí hay un ejemplo de cómo modificar el código:

    private static bool VerifyDetachedSignature(byte[] fileRawBytes, string sign)
    {
        try
        {
            var signatureFileRawBytes = Convert.FromBase64String(sign);
    
            CmsProcessable msg;
            if (fileRawBytes.Length == 0)
            {
                msg = new CmsProcessableByteArray(new byte[0]);
            }
            else
            {
                msg = new CmsProcessableByteArray(fileRawBytes);
            }
    
            var cms = new CmsSignedData(msg, signatureFileRawBytes);
            var signers = cms.GetSignerInfos();
    
            var certificates = cms.GetCertificates("Collection");
            var signerInfos = signers.GetSigners();
            foreach (SignerInformation signer in signerInfos)
            {
                var certList = new ArrayList(certificates.GetMatches(signer.SignerID));
                var cert = (X509Certificate)certList[0];
                if (cert == null) throw new NullReferenceException();
    
                var publicKey = cert.GetPublicKey();
    
                signer.Verify(publicKey);
            }
    
            return true;
        }
        catch (Exception exception)
        {
            return false;
        }
    }
    

    Con esta modificación, el método debería poder verificar la firma de archivos de longitud cero.

Comments are closed.