@@ -39,7 +39,7 @@ namespace digidoc
3939constexpr XMLName ArchiveTimeStamp {" ArchiveTimeStamp" , XADESv141_NS};
4040}
4141
42- void SignatureXAdES_LTA::calcArchiveDigest (const Digest &digest, string_view canonicalizationMethod) const
42+ void SignatureXAdES_LTA::calcArchiveDigest (const Digest &digest, string_view canonicalizationMethod, XMLNode ts ) const
4343{
4444 for (auto ref = signature/" SignedInfo" /" Reference" ; ref; ref++)
4545 {
@@ -64,7 +64,7 @@ void SignatureXAdES_LTA::calcArchiveDigest(const Digest &digest, string_view can
6464 if (file == files.cend ())
6565 THROW (" Filed to find reference URI in container" );
6666
67- static_cast <const DataFilePrivate*>(*file)->digest (digest);
67+ dynamic_cast <const DataFilePrivate*>(*file)->digest (digest);
6868 }
6969
7070 for (const auto *name: {" SignedInfo" , " SignatureValue" , " KeyInfo" })
@@ -75,65 +75,46 @@ void SignatureXAdES_LTA::calcArchiveDigest(const Digest &digest, string_view can
7575 DEBUG (" Element %s not found" , name);
7676 }
7777
78- auto usp = unsignedSignatureProperties ();
79- for (const auto *name: {
80- " SignatureTimeStamp" ,
81- " CounterSignature" ,
82- " CompleteCertificateRefs" ,
83- " CompleteRevocationRefs" ,
84- " AttributeCertificateRefs" ,
85- " AttributeRevocationRefs" ,
86- " CertificateValues" ,
87- " RevocationValues" ,
88- " SigAndRefsTimeStamp" ,
89- " RefsOnlyTimeStamp" })
78+ for (auto elem: unsignedSignatureProperties ())
9079 {
91- if (auto elem = usp/name)
92- signatures->c14n (digest, canonicalizationMethod, elem);
93- else
94- DEBUG (" Element %s not found" , name);
95- }
96-
97- if (auto elem = usp/XMLName{" TimeStampValidationData" , XADESv141_NS})
80+ if (elem == ts)
81+ break ;
9882 signatures->c14n (digest, canonicalizationMethod, elem);
99- else
100- DEBUG (" Element TimeStampValidationData not found" );
83+ }
10184 // ds:Object
10285}
10386
10487void SignatureXAdES_LTA::extendSignatureProfile (const string &profile)
10588{
106- SignatureXAdES_LT::extendSignatureProfile (profile);
89+ if (SignatureXAdES_LTA::profile ().find (ASiC_E::ASIC_TS_PROFILE) == string::npos)
90+ SignatureXAdES_LT::extendSignatureProfile (profile);
10791 if (profile != ASiC_E::ASIC_TSA_PROFILE)
10892 return ;
93+
94+ int i = 0 ;
95+ for (auto ts = unsignedSignatureProperties ()/ArchiveTimeStamp; ts; ts++, ++i);
96+
10997 Digest calc;
11098 auto method = canonicalizationMethod ();
111- calcArchiveDigest (calc, method);
99+ calcArchiveDigest (calc, method, {} );
112100
113101 TS tsa (CONF (TSUrl), calc);
114102 auto ts = unsignedSignatureProperties () + ArchiveTimeStamp;
115103 ts.setNS (ts.addNS (XADESv141_NS, " xades141" ));
116- ts.setProperty (" Id" , id () + " -A0 " );
104+ ts.setProperty (" Id" , id () + " -A " + to_string (i) );
117105 (ts + CanonicalizationMethod).setProperty (" Algorithm" , method);
118106 ts + EncapsulatedTimeStamp = tsa;
119107}
120108
121- TS SignatureXAdES_LTA::tsaFromBase64 () const
122- {
123- try {
124- return {unsignedSignatureProperties ()/ArchiveTimeStamp/EncapsulatedTimeStamp};
125- } catch (const Exception &) {}
126- return {};
127- }
128-
129- X509Cert SignatureXAdES_LTA::ArchiveTimeStampCertificate () const
130- {
131- return tsaFromBase64 ().cert ();
132- }
133-
134- string SignatureXAdES_LTA::ArchiveTimeStampTime () const
109+ vector<TSAInfo> SignatureXAdES_LTA::ArchiveTimeStamps () const
135110{
136- return date::to_string (tsaFromBase64 ().time ());
111+ vector<TSAInfo> result;
112+ for (auto ts = unsignedSignatureProperties ()/ArchiveTimeStamp; ts; ts++)
113+ {
114+ TS t (ts/EncapsulatedTimeStamp);
115+ result.push_back ({t.cert (), util::date::to_string (t.time ())});
116+ }
117+ return result;
137118}
138119
139120void SignatureXAdES_LTA::validate (const string &policy) const
@@ -157,9 +138,12 @@ void SignatureXAdES_LTA::validate(const string &policy) const
157138 auto ts = unsignedSignatureProperties ()/ArchiveTimeStamp;
158139 if (!ts)
159140 THROW (" Missing ArchiveTimeStamp element" );
160- verifyTS (ts, exception, [this ](const Digest &digest, string_view canonicalizationMethod) {
161- calcArchiveDigest (digest, canonicalizationMethod);
162- });
141+ for (; ts; ts++)
142+ {
143+ verifyTS (ts, exception, [this , ts](const Digest &digest, string_view canonicalizationMethod) {
144+ calcArchiveDigest (digest, canonicalizationMethod, ts);
145+ });
146+ }
163147 } catch (const Exception &e) {
164148 exception.addCause (e);
165149 }
0 commit comments