CryptXMLVerifySignature возвращает CRYPT_XML_E_TRANSFORM
У меня возникают проблемы при проверке подписи в C++ с помощью функции CryptXmlVerifySignature. Я могу проверить подпись в php, но кажется, что вся работа, которую я делаю в php, скрыта в этой функции C++, которая не позволяет мне устранять неполадки.
hr = CryptXmlVerifySignature(pDoc->rgpSignature[signatureToValidate]->hSignature, hPublicKey, 0);
Строка выше устанавливает для hr значение CRYPT_XML_E_TRANSFORM, что, по-видимому, означает "указанное преобразование не поддерживается".
Соответствующий XML:
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
<ds:Reference URI="#id4842225024375674286716997">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="xs" />
</ds:Transform>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
<ds:DigestValue>m20udGjm1LrD64y0xhQp89HeBGRk5OK156wm6fsMXpc=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>NPsj6oqH0nSKXPpEj/MlCNC18wuh08DSgDXD+HYPzMEifvyDmQCB3QTOhU9Ur9gqgmClSo9Oqe8OX5nmvjmSlKpqzDOEvwWqvqjJcADP/Q4CO/MfOVBgE3dxN9tRrK2vZLhyfv7Ytd6NbVeYmI65S4ZTIonSfIllUxSQUxXsbztwQrX16XICRkd6u5mnDUfs1DeUSVwRUHpEbiHYFN7GUbXz+UEraNVzzywVWUg8BJT6h4JUYj2Rm+Ku+60Acj+9vA7nX4p4hNICcnHp/XpEdDdKIB2zRjv91WCEGlafROtt4C29rT2ku5E3bYuwoePGY4hKFiH00lKJ4cwcushv/w==</ds:SignatureValue>
Сертификат x509 это:
MIIDpDCCAoygAwIBAgIGAVyqFlFgMA0GCSqGSIb3DQEBCwUAMIGSMQswCQYDVQQGEwJVUzETMBEG
A1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzENMAsGA1UECgwET2t0YTEU
MBIGA1UECwwLU1NPUHJvdmlkZXIxEzARBgNVBAMMCmRldi0zNjM0ODIxHDAaBgkqhkiG9w0BCQEW
DWluZm9Ab2t0YS5jb20wHhcNMTcwNjE1MDQ0OTA4WhcNMjcwNjE1MDQ1MDA4WjCBkjELMAkGA1UE
BhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xDTALBgNV
BAoMBE9rdGExFDASBgNVBAsMC1NTT1Byb3ZpZGVyMRMwEQYDVQQDDApkZXYtMzYzNDgyMRwwGgYJ
KoZIhvcNAQkBFg1pbmZvQG9rdGEuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
iO3YHACAdWkG2pGZQuwtAPTLq7TUOWB0ZgC2vSVBgYWZ5juuUeIji4wh+zfaHMXiZe/wfFgC4l6f
Pb40Lw7f5Sur39J1vEb8EiF3qUwvMbRIFoxPsFwrgcfDoKYBcTx4VQHU/rig02VS+njzaqBL9e0R
nyVoi5Ub1yeWTSq728V7NDHULm3gYHMaLqzN/z7IP64XqqSMpEE2lyeecijt2JdYkSp85al5o3wQ
R5j8Vr6RcBtd12koggicdLqK9Rbvg4uljSk9gGuFYvNw+2SEP+k7dbuT+uiie8mwLFkwhcOGLZWY
DmGPru76ZxTpuSPAenIXMRbeTIujmuGz+qZcCwIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQBXMN2m
KMcVDVxic9zi0LYDJIMzZkR0jQ20ksrKSvo+dFtAmAFsI29vYY2Wva/sdwbVCKHqfHKLS51CIVFw
PLxzmqtZeR7WTAac23WeFtJTSl824BvWgW1zr5EYRXr4JvEZFc0kwgCldzQT0NwZG40eWX2Id0nZ
mjIxfNNuuH7lVXMK6yXCxa8/jF/EuowaE6DS+ZH12/INdl8O8u2Zi2v23tovNrMEs4a7dOINHWqh
8vPgxKFkT2Dpcz4ry3vS4ad+9kyFK6yvtFPxM8YqHFT2ojjdVJ3IAJv8OPIi22jwMBu+M/Xl68Ib
YIJ3PXmxSXsDx904T0iQSnyi+G2klY5l
Этот код на самом деле работает с другим XML, и единственное отличие, которое я вижу, - это тег. У успешного XML его нет. Что-то особенное, что я должен сделать, чтобы справиться с этим?
Следующий php указывает на "Хороший" результат. Так что я могу проверить подпись с помощью php.
$canonicalizedSignedinfo = '<ds:SignedInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"><ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></ds:CanonicalizationMethod><ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"></ds:SignatureMethod><ds:Reference URI="#id4842225024375674286716997"><ds:Transforms><ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></ds:Transform><ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"><ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="xs"></ec:InclusiveNamespaces></ds:Transform></ds:Transforms><ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"></ds:DigestMethod><ds:DigestValue>m20udGjm1LrD64y0xhQp89HeBGRk5OK156wm6fsMXpc=</ds:DigestValue></ds:Reference></ds:SignedInfo>';
$signature = 'NPsj6oqH0nSKXPpEj/MlCNC18wuh08DSgDXD+HYPzMEifvyDmQCB3QTOhU9Ur9gqgmClSo9Oqe8OX5nmvjmSlKpqzDOEvwWqvqjJcADP/Q4CO/MfOVBgE3dxN9tRrK2vZLhyfv7Ytd6NbVeYmI65S4ZTIonSfIllUxSQUxXsbztwQrX16XICRkd6u5mnDUfs1DeUSVwRUHpEbiHYFN7GUbXz+UEraNVzzywVWUg8BJT6h4JUYj2Rm+Ku+60Acj+9vA7nX4p4hNICcnHp/XpEdDdKIB2zRjv91WCEGlafROtt4C29rT2ku5E3bYuwoePGY4hKFiH00lKJ4cwcushv/w==';
$cert = "-----BEGIN CERTIFICATE-----\nMIIDpDCCAoygAwIBAgIGAVyqFlFgMA0GCSqGSIb3DQEBCwUAMIGSMQswCQYDVQQGEwJVUzETMBEG A1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzENMAsGA1UECgwET2t0YTEU MBIGA1UECwwLU1NPUHJvdmlkZXIxEzARBgNVBAMMCmRldi0zNjM0ODIxHDAaBgkqhkiG9w0BCQEW DWluZm9Ab2t0YS5jb20wHhcNMTcwNjE1MDQ0OTA4WhcNMjcwNjE1MDQ1MDA4WjCBkjELMAkGA1UE BhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xDTALBgNV BAoMBE9rdGExFDASBgNVBAsMC1NTT1Byb3ZpZGVyMRMwEQYDVQQDDApkZXYtMzYzNDgyMRwwGgYJ KoZIhvcNAQkBFg1pbmZvQG9rdGEuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA iO3YHACAdWkG2pGZQuwtAPTLq7TUOWB0ZgC2vSVBgYWZ5juuUeIji4wh+zfaHMXiZe/wfFgC4l6f Pb40Lw7f5Sur39J1vEb8EiF3qUwvMbRIFoxPsFwrgcfDoKYBcTx4VQHU/rig02VS+njzaqBL9e0R nyVoi5Ub1yeWTSq728V7NDHULm3gYHMaLqzN/z7IP64XqqSMpEE2lyeecijt2JdYkSp85al5o3wQ R5j8Vr6RcBtd12koggicdLqK9Rbvg4uljSk9gGuFYvNw+2SEP+k7dbuT+uiie8mwLFkwhcOGLZWY DmGPru76ZxTpuSPAenIXMRbeTIujmuGz+qZcCwIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQBXMN2m KMcVDVxic9zi0LYDJIMzZkR0jQ20ksrKSvo+dFtAmAFsI29vYY2Wva/sdwbVCKHqfHKLS51CIVFw PLxzmqtZeR7WTAac23WeFtJTSl824BvWgW1zr5EYRXr4JvEZFc0kwgCldzQT0NwZG40eWX2Id0nZ mjIxfNNuuH7lVXMK6yXCxa8/jF/EuowaE6DS+ZH12/INdl8O8u2Zi2v23tovNrMEs4a7dOINHWqh 8vPgxKFkT2Dpcz4ry3vS4ad+9kyFK6yvtFPxM8YqHFT2ojjdVJ3IAJv8OPIi22jwMBu+M/Xl68Ib YIJ3PXmxSXsDx904T0iQSnyi+G2klY5l\n-----END CERTIFICATE----- ";
print(openssl_verify($canonicalizedSignedinfo, base64_decode($signature), $cert, 'SHA256')===1 ? 'Good' : 'Bad');