@@ -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,60 @@ 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
109
+ X509Cert SignatureXAdES_LTA::ArchiveTimeStampCertificate () const
122
110
{
123
- try {
124
- return {unsignedSignatureProperties ()/ArchiveTimeStamp/EncapsulatedTimeStamp};
125
- } catch (const Exception &) {}
126
- return {};
111
+ if (auto list = ArchiveTimeStamps (); !list.empty ())
112
+ return list.back ().cert ;
113
+ return X509Cert ();
127
114
}
128
115
129
- X509Cert SignatureXAdES_LTA::ArchiveTimeStampCertificate () const
116
+ string SignatureXAdES_LTA::ArchiveTimeStampTime () const
130
117
{
131
- return tsaFromBase64 ().cert ();
118
+ if (auto list = ArchiveTimeStamps (); !list.empty ())
119
+ return list.back ().time ;
120
+ return {};
132
121
}
133
122
134
- string SignatureXAdES_LTA::ArchiveTimeStampTime () const
123
+ vector<TSAInfo> SignatureXAdES_LTA::ArchiveTimeStamps () const
135
124
{
136
- return date::to_string (tsaFromBase64 ().time ());
125
+ vector<TSAInfo> result;
126
+ for (auto ts = unsignedSignatureProperties ()/ArchiveTimeStamp; ts; ts++)
127
+ {
128
+ TS t (ts/EncapsulatedTimeStamp);
129
+ result.push_back ({t.cert (), util::date::to_string (t.time ())});
130
+ }
131
+ return result;
137
132
}
138
133
139
134
void SignatureXAdES_LTA::validate (const string &policy) const
@@ -157,9 +152,12 @@ void SignatureXAdES_LTA::validate(const string &policy) const
157
152
auto ts = unsignedSignatureProperties ()/ArchiveTimeStamp;
158
153
if (!ts)
159
154
THROW (" Missing ArchiveTimeStamp element" );
160
- verifyTS (ts, exception, [this ](const Digest &digest, string_view canonicalizationMethod) {
161
- calcArchiveDigest (digest, canonicalizationMethod);
162
- });
155
+ for (; ts; ts++)
156
+ {
157
+ verifyTS (ts, exception, [this , ts](const Digest &digest, string_view canonicalizationMethod) {
158
+ calcArchiveDigest (digest, canonicalizationMethod, ts);
159
+ });
160
+ }
163
161
} catch (const Exception &e) {
164
162
exception.addCause (e);
165
163
}
0 commit comments