Skip to content

Commit 5d0dfb4

Browse files
authored
Make digest to movable object cleanup usage (#632)
IB-8236 Signed-off-by: Raul Metsma <[email protected]>
1 parent 826d8a2 commit 5d0dfb4

14 files changed

+70
-69
lines changed

src/DataFile.cpp

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
#include "util/File.h"
2424
#include "util/log.h"
2525

26-
#include <array>
2726
#include <fstream>
2827

2928
using namespace digidoc;
@@ -96,19 +95,18 @@ DataFilePrivate::DataFilePrivate(unique_ptr<istream> &&is, string filename, stri
9695
m_size = pos < 0 ? 0 : (unsigned long)pos;
9796
}
9897

99-
vector<unsigned char> DataFilePrivate::calcDigest(const string &method) const
98+
void DataFilePrivate::digest(const Digest &digest) const
10099
{
101-
Digest digest(method);
102-
array<unsigned char, 10240> buf{};
103100
m_is->clear();
104101
m_is->seekg(0);
105-
while(*m_is)
106-
{
107-
m_is->read((char*)buf.data(), streamsize(buf.size()));
108-
if(m_is->gcount() > 0)
109-
digest.update(buf.data(), size_t(m_is->gcount()));
110-
}
111-
return digest.result();
102+
digest.update(*m_is);
103+
}
104+
105+
vector<unsigned char> DataFilePrivate::calcDigest(const string &method) const
106+
{
107+
Digest d(method);
108+
digest(d);
109+
return d.result();
112110
}
113111

114112
void DataFilePrivate::saveAs(const string& path) const

src/DataFile_p.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
namespace digidoc
2828
{
29+
class Digest;
2930

3031
class DataFilePrivate final: public DataFile
3132
{
@@ -37,6 +38,7 @@ class DataFilePrivate final: public DataFile
3738
unsigned long fileSize() const final { return m_size; }
3839
std::string mediaType() const final { return m_mediatype; }
3940

41+
void digest(const Digest &method) const;
4042
std::vector<unsigned char> calcDigest(const std::string &method) const final;
4143
void saveAs(std::ostream &os) const final;
4244
void saveAs(const std::string& path) const final;

src/SiVaContainer.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ void SignatureSiVa::validate(const string &policy) const
112112
for(const Exception &exception: _exceptions)
113113
e.addCause(exception);
114114
if(!Exception::hasWarningIgnore(Exception::SignatureDigestWeak) &&
115-
(_signatureMethod == URI_RSA_SHA1 || _signatureMethod == URI_ECDSA_SHA1))
115+
Digest::isWeakDigest(_signatureMethod))
116116
{
117117
Exception ex(EXCEPTION_PARAMS("Signature digest weak"));
118118
ex.setCode(Exception::SignatureDigestWeak);
@@ -362,7 +362,7 @@ unique_ptr<istream> SiVaContainer::parseDDoc(bool useHashCode)
362362
if(!useHashCode)
363363
continue;
364364
Digest calc(URI_SHA1);
365-
doc.c14n(&calc, XMLDocument::C14D_ID_1_0, dataFile);
365+
doc.c14n(calc, XMLDocument::C14D_ID_1_0, dataFile);
366366
dataFile.setProperty("ContentType", "HASHCODE");
367367
dataFile.setProperty("DigestType", "sha1");
368368
dataFile.setProperty("DigestValue", to_base64(calc.result()));

src/SignatureTST.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,8 @@ void SignatureTST::validate() const
9696
const auto *dataFile = static_cast<const DataFilePrivate*>(asicSDoc->dataFiles().front());
9797
timestampToken->verify(dataFile->calcDigest(digestMethod));
9898

99-
if(digestMethod == URI_SHA1 &&
100-
!Exception::hasWarningIgnore(Exception::ReferenceDigestWeak))
99+
if(!Exception::hasWarningIgnore(Exception::ReferenceDigestWeak) &&
100+
Digest::isWeakDigest(digestMethod))
101101
{
102102
Exception e(EXCEPTION_PARAMS("TimeStamp '%s' digest weak", digestMethod.c_str()));
103103
e.setCode(Exception::ReferenceDigestWeak);

src/SignatureXAdES_B.cpp

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ SignatureXAdES_B::SignatureXAdES_B(unsigned int id, ASiContainer *container, Sig
284284
}
285285

286286
Digest calc(digestMethod);
287-
signatures->c14n(&calc, canonMethod, signedProperties);
287+
signatures->c14n(calc, canonMethod, signedProperties);
288288
addReference("#" + nr + "-SignedProperties", calc.uri(), calc.result(), REF_TYPE, canonMethod);
289289
}
290290

@@ -417,9 +417,8 @@ void SignatureXAdES_B::validate(const string &policy) const
417417
// It'll be only thrown in case we have a reason (cause).
418418
Exception exception(EXCEPTION_PARAMS("Signature validation"));
419419

420-
if(auto method = signatureMethod();
421-
!Exception::hasWarningIgnore(Exception::SignatureDigestWeak) &&
422-
(method == URI_RSA_SHA1 || method == URI_ECDSA_SHA1))
420+
if(!Exception::hasWarningIgnore(Exception::SignatureDigestWeak) &&
421+
Digest::isWeakDigest(signatureMethod()))
423422
{
424423
Exception e(EXCEPTION_PARAMS("Signature digest weak"));
425424
e.setCode(Exception::SignatureDigestWeak);
@@ -496,9 +495,8 @@ void SignatureXAdES_B::validate(const string &policy) const
496495
continue;
497496
}
498497

499-
if(auto algo = (ref/DigestMethod)["Algorithm"];
500-
!Exception::hasWarningIgnore(Exception::ReferenceDigestWeak) &&
501-
(algo == URI_SHA1 || algo == URI_SHA224))
498+
if(!Exception::hasWarningIgnore(Exception::ReferenceDigestWeak) &&
499+
Digest::isWeakDigest((ref/DigestMethod)["Algorithm"]))
502500
{
503501
Exception e(EXCEPTION_PARAMS("Reference '%.*s' digest weak", int(uri.size()), uri.data()));
504502
e.setCode(Exception::ReferenceDigestWeak);
@@ -566,7 +564,7 @@ vector<unsigned char> SignatureXAdES_B::dataToSign() const
566564
{
567565
Digest calc(signatureMethod());
568566
auto signedInfo = signature/"SignedInfo";
569-
signatures->c14n(&calc, (signedInfo/CanonicalizationMethod)["Algorithm"], signedInfo);
567+
signatures->c14n(calc, (signedInfo/CanonicalizationMethod)["Algorithm"], signedInfo);
570568
return calc.result();
571569
}
572570

src/SignatureXAdES_LTA.cpp

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
#include "util/File.h"
3030

3131
#include <algorithm>
32-
#include <array>
3332

3433
using namespace digidoc;
3534
using namespace digidoc::util;
@@ -40,8 +39,7 @@ namespace digidoc
4039
constexpr XMLName ArchiveTimeStamp {"ArchiveTimeStamp", XADESv141_NS};
4140
}
4241

43-
void SignatureXAdES_LTA::calcArchiveDigest(Digest *digest,
44-
string_view canonicalizationMethod) const
42+
void SignatureXAdES_LTA::calcArchiveDigest(const Digest &digest, string_view canonicalizationMethod) const
4543
{
4644
for(auto ref = signature/"SignedInfo"/"Reference"; ref; ref++)
4745
{
@@ -66,16 +64,7 @@ void SignatureXAdES_LTA::calcArchiveDigest(Digest *digest,
6664
if(file == files.cend())
6765
THROW("Filed to find reference URI in container");
6866

69-
std::istream *is = static_cast<const DataFilePrivate*>(*file)->m_is.get();
70-
array<unsigned char, 10240> buf{};
71-
is->clear();
72-
is->seekg(0);
73-
while(*is)
74-
{
75-
is->read((char*)buf.data(), streamsize(buf.size()));
76-
if(is->gcount() > 0)
77-
digest->update(buf.data(), size_t(is->gcount()));
78-
}
67+
static_cast<const DataFilePrivate*>(*file)->digest(digest);
7968
}
8069

8170
for(const auto *name: {"SignedInfo", "SignatureValue", "KeyInfo"})
@@ -119,7 +108,7 @@ void SignatureXAdES_LTA::extendSignatureProfile(const string &profile)
119108
return;
120109
Digest calc;
121110
auto method = canonicalizationMethod();
122-
calcArchiveDigest(&calc, method);
111+
calcArchiveDigest(calc, method);
123112

124113
TS tsa(CONF(TSUrl), calc);
125114
auto ts = unsignedSignatureProperties() + ArchiveTimeStamp;
@@ -168,7 +157,7 @@ void SignatureXAdES_LTA::validate(const string &policy) const
168157
auto ts = unsignedSignatureProperties()/ArchiveTimeStamp;
169158
if(!ts)
170159
THROW("Missing ArchiveTimeStamp element");
171-
verifyTS(ts, exception, [this](Digest *digest, string_view canonicalizationMethod) {
160+
verifyTS(ts, exception, [this](const Digest &digest, string_view canonicalizationMethod) {
172161
calcArchiveDigest(digest, canonicalizationMethod);
173162
});
174163
} catch(const Exception &e) {

src/SignatureXAdES_LTA.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,7 @@ class SignatureXAdES_LTA final: public SignatureXAdES_LT
3737
private:
3838
DISABLE_COPY(SignatureXAdES_LTA);
3939

40-
void calcArchiveDigest(Digest *digest,
41-
std::string_view canonicalizationMethod) const;
40+
void calcArchiveDigest(const Digest &digest, std::string_view canonicalizationMethod) const;
4241
TS tsaFromBase64() const;
4342
};
4443

src/SignatureXAdES_T.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ void SignatureXAdES_T::extendSignatureProfile(const std::string &profile)
7070

7171
Digest calc;
7272
auto method = canonicalizationMethod();
73-
signatures->c14n(&calc, method, signatureValue());
73+
signatures->c14n(calc, method, signatureValue());
7474

7575
TS tsa(CONF(TSUrl), calc);
7676
auto ts = usp + "SignatureTimeStamp";
@@ -109,7 +109,7 @@ void SignatureXAdES_T::validate(const std::string &policy) const
109109
if(ts + 1)
110110
THROW("More than one SignatureTimeStamp is not supported");
111111

112-
TS tsa = verifyTS(ts, exception, [this](Digest *digest, string_view canonicalizationMethod) {
112+
TS tsa = verifyTS(ts, exception, [this](const Digest &digest, string_view canonicalizationMethod) {
113113
signatures->c14n(digest, canonicalizationMethod, signatureValue());
114114
});
115115

@@ -163,7 +163,7 @@ void SignatureXAdES_T::validate(const std::string &policy) const
163163

164164
for(auto sigAndRefsTS = usp/"SigAndRefsTimeStamp"; sigAndRefsTS; sigAndRefsTS++)
165165
{
166-
verifyTS(sigAndRefsTS, exception, [this, usp](Digest *digest, string_view canonicalizationMethod) {
166+
verifyTS(sigAndRefsTS, exception, [this, usp](const Digest &digest, string_view canonicalizationMethod) {
167167
signatures->c14n(digest, canonicalizationMethod, signatureValue());
168168
for(const auto *name: {
169169
"SignatureTimeStamp",
@@ -195,7 +195,7 @@ XMLNode SignatureXAdES_T::unsignedSignatureProperties() const
195195
}
196196

197197
TS SignatureXAdES_T::verifyTS(XMLNode timestamp, digidoc::Exception &exception,
198-
std::function<void (Digest *, std::string_view)> &&calcDigest)
198+
std::function<void (const Digest &, std::string_view)> &&calcDigest)
199199
{
200200
auto ets = timestamp/EncapsulatedTimeStamp;
201201
if(!ets)
@@ -205,11 +205,11 @@ TS SignatureXAdES_T::verifyTS(XMLNode timestamp, digidoc::Exception &exception,
205205

206206
TS ts(ets);
207207
Digest calc(ts.digestMethod());
208-
calcDigest(&calc, (timestamp/CanonicalizationMethod)["Algorithm"]);
208+
calcDigest(calc, (timestamp/CanonicalizationMethod)["Algorithm"]);
209209
ts.verify(calc.result());
210210

211-
if(ts.digestMethod() == URI_SHA1 &&
212-
!Exception::hasWarningIgnore(Exception::ReferenceDigestWeak))
211+
if(!Exception::hasWarningIgnore(Exception::ReferenceDigestWeak) &&
212+
Digest::isWeakDigest(ts.digestMethod()))
213213
{
214214
Exception e(EXCEPTION_PARAMS("TimeStamp '%s' digest weak", ts.digestMethod().c_str()));
215215
e.setCode(Exception::ReferenceDigestWeak);

src/SignatureXAdES_T.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class SignatureXAdES_T: public SignatureXAdES_B
4747
TS TimeStamp() const;
4848

4949
static TS verifyTS(XMLNode timestamp, Exception &exception,
50-
std::function<void (Digest *, std::string_view)> &&calcDigest);
50+
std::function<void (const Digest &, std::string_view)> &&calcDigest);
5151

5252
private:
5353
DISABLE_COPY(SignatureXAdES_T);

src/XMLDocument.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ struct XMLDocument: public unique_xml_t<decltype(xmlFreeDoc)>, public XMLNode
355355
return doc;
356356
}
357357

358-
void c14n(Digest *digest, std::string_view algo, XMLNode node)
358+
void c14n(const Digest &digest, std::string_view algo, XMLNode node)
359359
{
360360
xmlC14NMode mode = XML_C14N_1_0;
361361
int with_comments = 0;
@@ -383,7 +383,7 @@ struct XMLDocument: public unique_xml_t<decltype(xmlFreeDoc)>, public XMLNode
383383
auto *digest = static_cast<Digest *>(context);
384384
digest->update(pcxmlChar(buffer), size_t(len));
385385
return len;
386-
}, nullptr, digest, nullptr), xmlOutputBufferClose);
386+
}, nullptr, const_cast<Digest*>(&digest), nullptr), xmlOutputBufferClose);
387387
int size = xmlC14NExecute(get(), [](void *root, xmlNodePtr node, xmlNodePtr parent) constexpr noexcept {
388388
if(root == node)
389389
return 1;

0 commit comments

Comments
 (0)