@@ -104,6 +104,61 @@ std::vector<TSAInfo> SignatureTST::ArchiveTimeStamps() const
104
104
return result;
105
105
}
106
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
+
107
162
X509Cert SignatureTST::TimeStampCertificate () const
108
163
{
109
164
return timestampToken->cert ();
0 commit comments