3939using namespace digidoc ;
4040using namespace std ;
4141
42+ constexpr const char * TST_MIMETYPE {" application/vnd.etsi.timestamp-token" };
43+
4244struct SignatureTST ::Data {
4345 string name, mime, data;
4446 unique_ptr<map<string, vector<unsigned char >>> cache = make_unique<map<string, vector<unsigned char >>>();
@@ -59,7 +61,7 @@ struct SignatureTST::Data {
5961 if (auto it = cache->find (method); it != cache->cend ()) {
6062 return it->second ;
6163 }
62- return (*cache)[std::move (method)] = digest ({ method} ).result ();
64+ return (*cache)[std::move (method)] = digest (Digest ( method) ).result ();
6365 }
6466};
6567
@@ -94,7 +96,7 @@ SignatureTST::SignatureTST(bool manifest, const ZipSerialize &z, ASiC_S *asicSDo
9496 }
9597 }
9698 }
97- metadata.emplace_back (" META-INF/timestamp.tst" , " application/vnd.etsi.timestamp-token " , std::move (data));
99+ metadata.emplace_back (" META-INF/timestamp.tst" , TST_MIMETYPE , std::move (data));
98100}
99101
100102SignatureTST::SignatureTST (ASiC_S *asicSDoc, Signer *signer)
@@ -105,7 +107,7 @@ SignatureTST::SignatureTST(ASiC_S *asicSDoc, Signer *signer)
105107 dataFile->digest (digest);
106108 timestampToken = make_unique<TS>(digest, signer->userAgent ());
107109 vector<unsigned char > der = *timestampToken;
108- metadata.emplace_back (" META-INF/timestamp.tst" , " application/vnd.etsi.timestamp-token " , string{der.cbegin (), der.cend ()});
110+ metadata.emplace_back (" META-INF/timestamp.tst" , TST_MIMETYPE , string{der.cbegin (), der.cend ()});
109111}
110112
111113SignatureTST::~SignatureTST () = default ;
@@ -127,9 +129,9 @@ string SignatureTST::ArchiveTimeStampTime() const
127129vector<TSAInfo> SignatureTST::ArchiveTimeStamps () const
128130{
129131 vector<TSAInfo> result;
130- for (auto i = metadata.crbegin (), end = next ( metadata.crend (), 1 ); i != end; ++i)
132+ for (auto i = next ( metadata.crbegin ()) , end = metadata.crend (); i != end; ++i)
131133 {
132- if (i->mime != " application/vnd.etsi.timestamp-token " )
134+ if (i->mime != TST_MIMETYPE )
133135 continue ;
134136 TS ts ((const unsigned char *)i->data .data (), i->data .size ());
135137 result.push_back ({ts.cert (), util::date::to_string (ts.time ())});
@@ -149,7 +151,7 @@ void SignatureTST::extendSignatureProfile(Signer *signer)
149151 string tstName = nextName (" META-INF/timestamp%03zu.tst" );
150152 auto doc = XMLDocument::create (" ASiCManifest" , ASiContainer::ASIC_NS, " asic" );
151153 auto ref = doc + " SigReference" ;
152- ref.setProperty (" MimeType" , " application/vnd.etsi.timestamp-token " );
154+ ref.setProperty (" MimeType" , TST_MIMETYPE );
153155 ref.setProperty (" URI" , tstName);
154156
155157 auto addRef = [&doc](const string &name, string_view mime, bool root, const Digest &digest) {
@@ -185,7 +187,7 @@ void SignatureTST::extendSignatureProfile(Signer *signer)
185187 }, true );
186188 auto i = metadata.insert (metadata.cbegin (), {" META-INF/ASiCArchiveManifest.xml" , " text/xml" , std::move (data)});
187189 vector<unsigned char > der = TS (i->digest (), signer->userAgent ());
188- metadata.insert (next (i), {tstName, " application/vnd.etsi.timestamp-token " , string{der.cbegin (), der.cend ()}});
190+ metadata.insert (next (i), {tstName, TST_MIMETYPE , string{der.cbegin (), der.cend ()}});
189191}
190192
191193X509Cert SignatureTST::TimeStampCertificate () const
@@ -278,6 +280,17 @@ void SignatureTST::validate() const
278280 if (vector<unsigned char > digestValue = ref/DigestValue; digest != digestValue)
279281 THROW (" Reference '%s' digest does not match" , uri.c_str ());
280282 }
283+ if (auto sigRef = doc/" SigReference" ; sigRef[" MimeType" ] == TST_MIMETYPE)
284+ {
285+ const auto &uri = add.emplace_back (util::File::fromUriPath (sigRef[" URI" ]));
286+ auto j = find_if (metadata.cbegin (), metadata.cend (), [uri](const auto &d) { return d.name == uri; });
287+ if (j == metadata.cend ())
288+ THROW (" SigReference %s is missing" , uri.c_str ());
289+ TS ts ((const unsigned char *)j->data .data (), j->data .size ());
290+ ts.verify (i->digestCache (ts.digestMethod ()));
291+ }
292+ else
293+ THROW (" SigReference is missing" );
281294 // Check if all files in previous scope are present
282295 for (const string &uri: list)
283296 {
0 commit comments