@@ -39,7 +39,7 @@ namespace digidoc
39
39
constexpr XMLName ArchiveTimeStamp {" ArchiveTimeStamp" , XADESv141_NS};
40
40
}
41
41
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
43
43
{
44
44
for (auto ref = signature/" SignedInfo" /" Reference" ; ref; ref++)
45
45
{
@@ -64,7 +64,7 @@ void SignatureXAdES_LTA::calcArchiveDigest(const Digest &digest, string_view can
64
64
if (file == files.cend ())
65
65
THROW (" Filed to find reference URI in container" );
66
66
67
- static_cast <const DataFilePrivate*>(*file)->digest (digest);
67
+ dynamic_cast <const DataFilePrivate*>(*file)->digest (digest);
68
68
}
69
69
70
70
for (const auto *name: {" SignedInfo" , " SignatureValue" , " KeyInfo" })
@@ -75,65 +75,46 @@ void SignatureXAdES_LTA::calcArchiveDigest(const Digest &digest, string_view can
75
75
DEBUG (" Element %s not found" , name);
76
76
}
77
77
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 ())
90
79
{
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 ;
98
82
signatures->c14n (digest, canonicalizationMethod, elem);
99
- else
100
- DEBUG (" Element TimeStampValidationData not found" );
83
+ }
101
84
// ds:Object
102
85
}
103
86
104
87
void SignatureXAdES_LTA::extendSignatureProfile (const string &profile)
105
88
{
106
- SignatureXAdES_LT::extendSignatureProfile (profile);
89
+ if (SignatureXAdES_LTA::profile ().find (ASiC_E::ASIC_TS_PROFILE) == string::npos)
90
+ SignatureXAdES_LT::extendSignatureProfile (profile);
107
91
if (profile != ASiC_E::ASIC_TSA_PROFILE)
108
92
return ;
93
+
94
+ int i = 0 ;
95
+ for (auto ts = unsignedSignatureProperties ()/ArchiveTimeStamp; ts; ts++, ++i);
96
+
109
97
Digest calc;
110
98
auto method = canonicalizationMethod ();
111
- calcArchiveDigest (calc, method);
99
+ calcArchiveDigest (calc, method, {} );
112
100
113
101
TS tsa (CONF (TSUrl), calc);
114
102
auto ts = unsignedSignatureProperties () + ArchiveTimeStamp;
115
103
ts.setNS (ts.addNS (XADESv141_NS, " xades141" ));
116
- ts.setProperty (" Id" , id () + " -A0 " );
104
+ ts.setProperty (" Id" , id () + " -A " + to_string (i) );
117
105
(ts + CanonicalizationMethod).setProperty (" Algorithm" , method);
118
106
ts + EncapsulatedTimeStamp = tsa;
119
107
}
120
108
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
135
110
{
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;
137
118
}
138
119
139
120
void SignatureXAdES_LTA::validate (const string &policy) const
@@ -157,9 +138,12 @@ void SignatureXAdES_LTA::validate(const string &policy) const
157
138
auto ts = unsignedSignatureProperties ()/ArchiveTimeStamp;
158
139
if (!ts)
159
140
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
+ }
163
147
} catch (const Exception &e) {
164
148
exception.addCause (e);
165
149
}
0 commit comments