Skip to content

Commit 9f14163

Browse files
committed
ASiC-S LTA extending support
IB-8182 Signed-off-by: Raul Metsma <[email protected]>
1 parent 24eeef4 commit 9f14163

File tree

2 files changed

+56
-0
lines changed

2 files changed

+56
-0
lines changed

src/SignatureTST.cpp

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,61 @@ std::vector<TSAInfo> SignatureTST::ArchiveTimeStamps() const
103103
return result;
104104
}
105105

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+
106161
X509Cert SignatureTST::TimeStampCertificate() const
107162
{
108163
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)