|
27 | 27 | #include "crypto/Signer.h"
|
28 | 28 | #include "crypto/TS.h"
|
29 | 29 | #include "crypto/X509Cert.h"
|
| 30 | +#include "util/algorithm.h" |
30 | 31 | #include "util/DateTime.h"
|
31 | 32 | #include "util/File.h"
|
32 | 33 | #include "util/log.h"
|
@@ -103,6 +104,61 @@ std::vector<TSAInfo> SignatureTST::ArchiveTimeStamps() const
|
103 | 104 | return result;
|
104 | 105 | }
|
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 | + |
106 | 162 | X509Cert SignatureTST::TimeStampCertificate() const
|
107 | 163 | {
|
108 | 164 | return timestampToken->cert();
|
|
0 commit comments