@@ -91,6 +91,74 @@ SignatureTST::SignatureTST(ASiC_S *asicSDoc, Signer *signer)
9191
9292SignatureTST::~SignatureTST () = default ;
9393
94+ std::vector<SignatureTST::TSAInfo> SignatureTST::ArchiveTimeStamps () const
95+ {
96+ std::vector<TSAInfo> result;
97+ for (auto i = metadata.cbegin () + 1 ; i != metadata.cend (); ++i)
98+ {
99+ if (i->mime != " application/vnd.etsi.timestamp-token" )
100+ continue ;
101+ TS ts ((const unsigned char *)i->data .data (), i->data .size ());
102+ result.push_back ({ts.cert (), util::date::to_string (ts.time ())});
103+ }
104+ return result;
105+ }
106+
107+ void SignatureTST::extendSignatureProfile (Signer *signer)
108+ {
109+
110+ string tstName = " META-INF/timestamp001.tst" ;
111+ for (size_t i = 1 ;
112+ any_of (metadata, [&tstName](const auto &f) { return f.name == tstName; });
113+ tstName = Log::format (" META-INF/timestamp%03zu.tst" , ++i));
114+
115+ auto doc = XMLDocument::create (" ASiCManifest" , ASiContainer::ASIC_NS , " asic" );
116+ auto ref = doc + " SigReference" ;
117+ ref.setProperty (" MimeType" , " application/vnd.etsi.timestamp-token" );
118+ ref.setProperty (" URI" , tstName);
119+
120+ auto addRef = [&doc](const string &name, string_view mime, bool root, const Digest &digest) {
121+ auto ref = doc + " DataObjectReference" ;
122+ ref.setProperty (" MimeType" , mime);
123+ ref.setProperty (" URI" , util::File::toUriPath (name));
124+ if (root)
125+ ref.setProperty (" Rootfile" , " true" );
126+ auto method = ref + DigestMethod;
127+ method.setNS (method.addNS (DSIG_NS , " ds" ));
128+ method.setProperty (" Algorithm" , digest.uri ());
129+ auto value = ref + DigestValue;
130+ value.setNS (value.addNS (DSIG_NS , " ds" ));
131+ value = digest.result ();
132+ };
133+
134+ DataFile *file = asicSDoc->dataFiles ().front ();
135+ Digest digest;
136+ static_cast <DataFilePrivate*>(file)->digest (digest);
137+ addRef (file->fileName (), file->mediaType (), false , digest);
138+ for (auto &data: metadata)
139+ {
140+ if (data.name == " META-INF/ASiCArchiveManifest.xml" )
141+ {
142+ string mfsName = " META-INF/ASiCArchiveManifest001.xml" ;
143+ for (size_t i = 0 ;
144+ any_of (metadata, [&mfsName](const auto &f) { return f.name == mfsName; });
145+ mfsName = Log::format (" META-INF/ASiCArchiveManifest%03zu.xml" , ++i));
146+ data.name = mfsName;
147+ data.root = true ;
148+ }
149+ addRef (data.name , data.mime , data.root , data.digest ());
150+ }
151+
152+ string data;
153+ doc.save ([&data](const char *buf, size_t size) {
154+ data.append (buf, size);
155+ return size;
156+ }, true );
157+ metadata.push_back ({" META-INF/ASiCArchiveManifest.xml" , " text/xml" , std::move (data)});
158+ vector<unsigned char > der = TS (metadata.back ().digest (), signer->userAgent ());
159+ metadata.push_back ({tstName, " application/vnd.etsi.timestamp-token" , {der.cbegin (), der.cend ()}});
160+ }
161+
94162X509Cert SignatureTST::TimeStampCertificate () const
95163{
96164 return timestampToken->cert ();
0 commit comments