@@ -544,11 +544,8 @@ void SignatureXAdES_B::validate(const string &policy) const
544544 if (!signatureref.empty ())
545545 EXCEPTION_ADD (exception, " Manifest references and signature references do not match" );
546546
547- try { checkKeyInfo (); }
548- catch (const Exception& e) { exception.addCause (e); }
549-
550- try { checkSigningCertificate (policy == POLv1); }
551- catch (const Exception& e) { exception.addCause (e); }
547+ auto signingCertificate = checkSigningCertificate (policy == POLv1);
548+ checkKeyInfo (signingCertificate);
552549 } catch (const Exception &e) {
553550 exception.addCause (e);
554551 } catch (...) {
@@ -595,9 +592,8 @@ void SignatureXAdES_B::checkDigest(XMLNode digest, const vector<unsigned char> &
595592 * Verify if SigningCertificate matches with
596593 * XAdES::SigningCertificate/SigningCertificateV2 Digest and IssuerSerial info
597594 */
598- void SignatureXAdES_B::checkKeyInfo () const
595+ void SignatureXAdES_B::checkKeyInfo (const X509Cert &x509 ) const
599596{
600- X509Cert x509 = signingCertificate ();
601597 if (auto sigCert = signedSignatureProperties ()/" SigningCertificate" )
602598 {
603599 if (auto certs = sigCert/" Cert" ; certs || !(certs + 1 ))
@@ -626,21 +622,30 @@ void SignatureXAdES_B::checkKeyInfo() const
626622 * Check if signing certificate was issued by trusted party.
627623 * @throws Exception on a problem with signing certificate
628624 */
629- void SignatureXAdES_B::checkSigningCertificate (bool noqscd) const
625+ X509Cert SignatureXAdES_B::checkSigningCertificate (bool noqscd, tm validation_time ) const
630626{
631- try
627+ X509Cert signingCertificate;
628+ vector<X509Cert> untrusted;
629+ for (auto x509Data = signature/" KeyInfo" /" X509Data" ; x509Data; x509Data++)
632630 {
633- X509Cert signingCert = signingCertificate ();
634- vector<X509Cert::KeyUsage> usage = signingCert. keyUsage ();
635- if (! contains (usage, X509Cert::NonRepudiation))
636- THROW ( " Signing certificate does not contain NonRepudiation key usage flag " );
637- if (! signingCertificate (). verify (noqscd))
638- THROW ( " Unable to verify signing certificate " );
639- }
640- catch ( const Exception &e)
641- {
642- THROW_CAUSE ( e, " Unable to verify signing certificate " );
631+ for ( auto x509Cert = x509Data/ " X509Certificate " ; x509Cert; x509Cert++)
632+ {
633+ vector< unsigned char > cert = x509Cert;
634+ if (cert. empty ())
635+ continue ;
636+ if (!signingCertificate)
637+ signingCertificate = X509Cert (cert);
638+ else
639+ untrusted. emplace_back (cert);
640+ }
643641 }
642+ if (!signingCertificate)
643+ THROW (" Signature does not contain signer certificate" );
644+ if (!contains (signingCertificate.keyUsage (), X509Cert::NonRepudiation))
645+ THROW (" Signing certificate does not contain NonRepudiation key usage flag" );
646+ if (!signingCertificate.verify (noqscd, validation_time, untrusted))
647+ THROW (" Unable to verify signing certificate" );
648+ return signingCertificate;
644649}
645650
646651void SignatureXAdES_B::addDataObjectFormat (const string &uri, const string &mime)
0 commit comments