Skip to content

Commit a3773cb

Browse files
committed
Support multiple signatures in single XML
IB-7602 Signed-off-by: Raul Metsma <[email protected]>
1 parent 6b8880d commit a3773cb

14 files changed

+230
-191
lines changed

src/ASiC_E.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333

3434
#include <xercesc/util/OutOfMemoryException.hpp>
3535

36-
#include <fstream>
3736
#include <set>
3837

3938
using namespace digidoc;
@@ -119,7 +118,7 @@ void ASiC_E::save(const string &path)
119118
SignatureXAdES_B *signature = static_cast<SignatureXAdES_B*>(iter);
120119

121120
stringstream ofs;
122-
signature->saveToXml(ofs);
121+
signature->signatures->save(ofs);
123122
s.addFile(file, ofs, zproperty(file));
124123
}
125124
}
@@ -138,7 +137,7 @@ unique_ptr<Container> ASiC_E::createInternal(const string &path)
138137
* @param sigdata signature, which is added to the container.
139138
* @throws Exception throws exception if there are no documents in container.
140139
*/
141-
void ASiC_E::addAdESSignature(istream &sigdata)
140+
void ASiC_E::addAdESSignature(istream &data)
142141
{
143142
if(dataFiles().empty())
144143
THROW("No documents in container, can not add signature.");
@@ -147,7 +146,9 @@ void ASiC_E::addAdESSignature(istream &sigdata)
147146

148147
try
149148
{
150-
addSignature(make_unique<SignatureXAdES_LTA>(sigdata, this));
149+
auto signatures = make_shared<Signatures>(data, this);
150+
for(size_t i = 0, count = signatures->count(); i < count; ++i)
151+
addSignature(make_unique<SignatureXAdES_LTA>(signatures, i, this));
151152
}
152153
catch(const Exception &e)
153154
{
@@ -287,7 +288,9 @@ void ASiC_E::parseManifestAndLoadFiles(const ZipSerialize &z)
287288
{
288289
stringstream data;
289290
z.extract(file, data);
290-
addSignature(make_unique<SignatureXAdES_LTA>(data, this, true));
291+
auto signatures = make_shared<Signatures>(data, this);
292+
for(size_t i = 0, count = signatures->count(); i < count; ++i)
293+
addSignature(make_unique<SignatureXAdES_LTA>(signatures, i, this));
291294
}
292295
catch(const Exception &e)
293296
{
@@ -354,7 +357,7 @@ Signature* ASiC_E::prepareSignature(Signer *signer)
354357

355358
Signature *ASiC_E::sign(Signer* signer)
356359
{
357-
SignatureXAdES_LTA *s = static_cast<SignatureXAdES_LTA*>(prepareSignature(signer));
360+
auto *s = static_cast<SignatureXAdES_LTA*>(prepareSignature(signer));
358361
try
359362
{
360363
s->setSignatureValue(signer->sign(s->signatureMethod(), s->dataToSign()));

src/ASiC_E.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ namespace digidoc
4646
void save(const std::string &path = {}) final;
4747
std::vector<DataFile*> metaFiles() const;
4848

49-
void addAdESSignature(std::istream &sigdata) final;
49+
void addAdESSignature(std::istream &data) final;
5050
Signature* prepareSignature(Signer *signer) final;
5151
Signature* sign(Signer* signer) final;
5252

src/ASiC_S.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,9 @@ ASiC_S::ASiC_S(const string &path): ASiContainer(MIMETYPE_ASIC_S)
6565
THROW("Can not add signature to ASiC-S container which already contains a signature.");
6666
stringstream data;
6767
z->extract(file, data);
68-
addSignature(make_unique<SignatureXAdES_LTA>(data, this, true));
68+
auto signatures = make_shared<Signatures>(data, this);
69+
for(size_t i = 0, count = signatures->count(); i < count; ++i)
70+
addSignature(make_unique<SignatureXAdES_LTA>(signatures, i, this));
6971
}
7072
continue;
7173
}

src/SiVaContainer.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -152,14 +152,14 @@ SiVaContainer::SiVaContainer(const string &path, const string &ext, bool useHash
152152
if(ext == "ddoc")
153153
{
154154
d->mediaType = "application/x-ddoc";
155-
d->ddoc = move(ifs);
155+
d->ddoc = std::move(ifs);
156156
ifs = parseDDoc(useHashCode);
157157
is = ifs.get();
158158
}
159159
else
160160
{
161161
d->mediaType = "application/pdf";
162-
d->dataFiles.push_back(new DataFilePrivate(move(ifs), fileName, "application/pdf"));
162+
d->dataFiles.push_back(new DataFilePrivate(std::move(ifs), fileName, "application/pdf"));
163163
}
164164

165165
array<XMLByte, 48*100> buf{};
@@ -182,7 +182,7 @@ SiVaContainer::SiVaContainer(const string &path, const string &ext, bool useHash
182182

183183
string req = json({
184184
{"filename", fileName},
185-
{"document", move(b64)},
185+
{"document", std::move(b64)},
186186
{"signaturePolicy", "POLv4"}
187187
}).dump();
188188
Connect::Result r = Connect(CONF(verifyServiceUri), "POST", 0, CONF(verifyServiceCerts)).exec({
@@ -357,7 +357,7 @@ unique_ptr<istream> SiVaContainer::parseDDoc(bool useHashCode)
357357
if(!useHashCode)
358358
continue;
359359
Digest calc(URI_SHA1);
360-
SecureDOMParser::calcDigestOnNode(&calc, "http://www.w3.org/TR/2001/REC-xml-c14n-20010315", dom.get(), item);
360+
SecureDOMParser::calcDigestOnNode(&calc, "http://www.w3.org/TR/2001/REC-xml-c14n-20010315", item);
361361
vector<unsigned char> digest = calc.result();
362362
XMLSize_t size = 0;
363363
if(XMLByte *out = Base64::encode(digest.data(), XMLSize_t(digest.size()), &size))

0 commit comments

Comments
 (0)