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