Skip to content

Commit a99f64d

Browse files
committed
ASiC-S LTA extending support
IB-8182 Signed-off-by: Raul Metsma <[email protected]>
1 parent 8f34452 commit a99f64d

File tree

2 files changed

+57
-0
lines changed

2 files changed

+57
-0
lines changed

src/SignatureTST.cpp

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "crypto/Signer.h"
2828
#include "crypto/TS.h"
2929
#include "crypto/X509Cert.h"
30+
#include "util/algorithm.h"
3031
#include "util/DateTime.h"
3132
#include "util/File.h"
3233
#include "util/log.h"
@@ -103,6 +104,61 @@ std::vector<TSAInfo> SignatureTST::ArchiveTimeStamps() const
103104
return result;
104105
}
105106

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+
106162
X509Cert SignatureTST::TimeStampCertificate() const
107163
{
108164
return timestampToken->cert();

src/SignatureTST.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ class SignatureTST final: public Signature
5050
void validate() const final;
5151
std::vector<unsigned char> dataToSign() const final;
5252
void setSignatureValue(const std::vector<unsigned char> &signatureValue) final;
53+
void extendSignatureProfile(Signer *signer) final;
5354

5455
// Xades properties
5556
std::string profile() const final;

0 commit comments

Comments
 (0)