Skip to content

Commit 7dc3ce9

Browse files
authored
Add unicode issuer name compare test (#561)
* Increase minimum iOS and macOS supported versions - use more std::filesystem IB-7483 Signed-off-by: Raul Metsma <[email protected]> * Add unicode issuer name compare test IB-7810 Signed-off-by: Raul Metsma <[email protected]> --------- Signed-off-by: Raul Metsma <[email protected]>
1 parent 15d3142 commit 7dc3ce9

File tree

4 files changed

+68
-66
lines changed

4 files changed

+68
-66
lines changed

test/data/gencerts.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,6 @@ done
2323
openssl req -out signerEC.req -new -newkey ec:<(openssl ecparam -name secp384r1) -nodes -keyout signerEC.key -subj "/C=EE/CN=signer EC"
2424
openssl x509 -req -in signerEC.req -out signerEC.crt -CA inter.crt -CAkey inter.key -CAserial interserial.txt -extfile openssl.conf -extensions v3_usr -days 3650
2525
openssl pkcs12 -export -nodes -in signerEC.crt -inkey signerEC.key -out signerEC.p12 -password pass:signerEC
26+
27+
openssl req -out unicode.req -new -newkey ec:<(openssl ecparam -name secp384r1) -nodes -keyout unicode.key -subj "/C=EE/CN=unicodeöäüõ" -utf8
28+
openssl x509 -req -in unicode.req -out unicode.crt -signkey unicode.key -days 365

test/data/unicode.crt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIBhzCCAQwCFHwlKK7JnqHZRCECmbJz/7VNRNMEMAoGCCqGSM49BAMCMCcxCzAJ
3+
BgNVBAYTAkVFMRgwFgYDVQQDDA91bmljb2Rlw7bDpMO8w7UwHhcNMjMxMDA0MTM0
4+
MTM4WhcNMjQxMDAzMTM0MTM4WjAnMQswCQYDVQQGEwJFRTEYMBYGA1UEAwwPdW5p
5+
Y29kZcO2w6TDvMO1MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE6Sx6tkRnC2b/J91s
6+
mmL5VhrywL/kGcxJV+bX4ThM+zY3+P59VULwuhCFV3ShjC8Xt8I4iBIhMZQmBfIa
7+
s6jDI7oHxRQWUIG9BCAjnyEUDJIb7PvLRKmf2CsJhmfC+94yMAoGCCqGSM49BAMC
8+
A2kAMGYCMQD4jHmeKWn6YJ0D8S6+2TdFdkeawlD6yoL1HtOVxYxHmVu/wtbSAVM+
9+
R8uJeR8tg6oCMQDt43YaOQEKgX1T3kBn2Fna8ovhwOVBJUYlVWDW88Sm5qi+ilOn
10+
KRRV6XxGYDbwpRU=
11+
-----END CERTIFICATE-----

test/libdigidocpp_boost.cpp

Lines changed: 50 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@
3030
#include <crypto/X509Crypto.h>
3131
#include <util/DateTime.h>
3232

33-
#include <openssl/opensslv.h>
34-
3533
namespace digidoc
3634
{
3735

@@ -41,7 +39,7 @@ class TestFixture: public DigiDocPPFixture
4139
TestFixture()
4240
{
4341
copyTSL("EE_T-good.xml");
44-
digidoc::initialize("untitestboost");
42+
initialize("untitestboost");
4543
}
4644
};
4745

@@ -123,9 +121,9 @@ BOOST_AUTO_TEST_SUITE_END()
123121
BOOST_AUTO_TEST_SUITE(X509CertSuite)
124122
BOOST_AUTO_TEST_CASE(parameters)
125123
{
126-
auto signer1 = make_unique<PKCS12Signer>("signer1.p12", "signer1");
127-
X509Cert c = signer1->cert();
128-
BOOST_CHECK_EQUAL(c, signer1->cert());
124+
PKCS12Signer signer1("signer1.p12", "signer1");
125+
X509Cert c = signer1.cert();
126+
BOOST_CHECK_EQUAL(c, signer1.cert());
129127
BOOST_CHECK_EQUAL(!c, false);
130128
BOOST_CHECK_EQUAL(c, true);
131129

@@ -143,27 +141,30 @@ BOOST_AUTO_TEST_CASE(parameters)
143141
}
144142
BOOST_AUTO_TEST_SUITE_END()
145143

146-
BOOST_AUTO_TEST_SUITE(X509Crypto)
144+
BOOST_AUTO_TEST_SUITE(X509CryptoSuite)
147145
BOOST_AUTO_TEST_CASE(parameters)
148146
{
149147
X509Cert cert("47101010033.cer", X509Cert::Pem);
150-
digidoc::X509Crypto crypto(cert);
148+
X509Crypto crypto(cert);
151149
BOOST_CHECK_EQUAL(crypto.isRSAKey(), true);
152150
BOOST_CHECK_EQUAL(crypto.compareIssuerToString(cert.issuerName()), 0);
153151
BOOST_CHECK_EQUAL(crypto.compareIssuerToString("[email protected],CN=TEST of ESTEID-SK 2015,O=AS Sertifitseerimiskeskus,C=EE"), -1);
154152
BOOST_CHECK_EQUAL(crypto.compareIssuerToString("[email protected],CN=TEST of EST\\45ID-SK 2015,O=AS Sertifitseerimiskeskus,C=EE"), -1);
155153
BOOST_CHECK_EQUAL(crypto.compareIssuerToString(cert.issuerName()+"EE"), -1);
156154

157-
digidoc::X509Crypto test(X509Cert("test.crt", X509Cert::Pem));
155+
X509Cert cert1("unicode.crt", X509Cert::Pem);
156+
BOOST_CHECK_EQUAL(X509Crypto(cert1).compareIssuerToString(cert1.issuerName()), 0);
157+
158+
X509Crypto test(X509Cert("test.crt", X509Cert::Pem));
158159
BOOST_CHECK_EQUAL(test.compareIssuerToString("CN=\\\"test\\\""), 0);
159160

160-
auto signer1 = make_unique<PKCS12Signer>("signer1.p12", "signer1");
161+
PKCS12Signer signer1("signer1.p12", "signer1");
161162
const vector<unsigned char> data{'H','e','l','l','o',' ','w','o','r','l','d'};
162163
vector<unsigned char> digest = Digest(URI_SHA256).result(data);
163-
vector<unsigned char> signature = signer1->sign(URI_SHA256, digest);
164-
BOOST_CHECK_EQUAL(digidoc::X509Crypto(signer1->cert()).verify(URI_SHA256, digest, signature), true);
164+
vector<unsigned char> signature = signer1.sign(URI_SHA256, digest);
165+
BOOST_CHECK_EQUAL(X509Crypto(signer1.cert()).verify(URI_SHA256, digest, signature), true);
165166
digest[0] += 1;
166-
BOOST_CHECK_EQUAL(digidoc::X509Crypto(signer1->cert()).verify(URI_SHA256, digest, signature), false);
167+
BOOST_CHECK_EQUAL(X509Crypto(signer1.cert()).verify(URI_SHA256, digest, signature), false);
167168
}
168169
BOOST_AUTO_TEST_SUITE_END()
169170

@@ -291,17 +292,17 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(signature, Doc, DocTypes)
291292

292293
BOOST_CHECK_THROW(d->removeSignature(0U), Exception);
293294

294-
auto signer1 = make_unique<PKCS12Signer>("signer1.p12", "signer1");
295-
signer1->setProfile("time-stamp");
296-
BOOST_CHECK_THROW(d->sign(signer1.get()), Exception);
295+
PKCS12Signer signer1("signer1.p12", "signer1");
296+
signer1.setProfile("time-stamp");
297+
BOOST_CHECK_THROW(d->sign(&signer1), Exception);
297298

298299
// Add first Signature
299300
BOOST_CHECK_NO_THROW(d->addDataFile("test1.txt", "text/plain"));
300-
BOOST_CHECK_NO_THROW(d->sign(signer1.get()));
301+
BOOST_CHECK_NO_THROW(d->sign(&signer1));
301302
BOOST_CHECK_EQUAL(d->signatures().size(), 1U);
302303
if(d->signatures().size() == 1)
303304
{
304-
BOOST_CHECK_EQUAL(d->signatures().at(0)->signingCertificate(), signer1->cert());
305+
BOOST_CHECK_EQUAL(d->signatures().at(0)->signingCertificate(), signer1.cert());
305306
BOOST_CHECK_NO_THROW(d->signatures().at(0)->validate());
306307
}
307308
BOOST_CHECK_NO_THROW(d->save(Doc::EXT + ".tmp"));
@@ -311,12 +312,12 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(signature, Doc, DocTypes)
311312
BOOST_CHECK_THROW(d->removeDataFile(0U), Exception);
312313

313314
// Add second Signature
314-
auto signer2 = make_unique<PKCS12Signer>("signer2.p12", "signer2");
315-
BOOST_CHECK_NO_THROW(d->sign(signer2.get()));
315+
PKCS12Signer signer2("signer2.p12", "signer2");
316+
BOOST_CHECK_NO_THROW(d->sign(&signer2));
316317
BOOST_CHECK_EQUAL(d->signatures().size(), 2U);
317318
if(d->signatures().size() == 2)
318319
{
319-
BOOST_CHECK_EQUAL(d->signatures().at(1)->signingCertificate(), signer2->cert());
320+
BOOST_CHECK_EQUAL(d->signatures().at(1)->signingCertificate(), signer2.cert());
320321
BOOST_CHECK_NO_THROW(d->signatures().at(1)->validate());
321322
}
322323
BOOST_CHECK_NO_THROW(d->save());
@@ -325,28 +326,28 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(signature, Doc, DocTypes)
325326
BOOST_CHECK_NO_THROW(d->removeSignature(0U));
326327
BOOST_CHECK_EQUAL(d->signatures().size(), 1U);
327328
if(d->signatures().size() == 1)
328-
BOOST_CHECK_EQUAL(d->signatures().at(0)->signingCertificate(), signer2->cert());
329+
BOOST_CHECK_EQUAL(d->signatures().at(0)->signingCertificate(), signer2.cert());
329330

330331
if(d->mediaType() == ASiCE::TYPE)
331332
{
332-
auto signer3 = make_unique<PKCS12Signer>("signerEC.p12", "signerEC");
333+
PKCS12Signer signer3("signerEC.p12", "signerEC");
333334
Signature *s3 = nullptr;
334-
BOOST_CHECK_NO_THROW(s3 = d->sign(signer3.get()));
335+
BOOST_CHECK_NO_THROW(s3 = d->sign(&signer3));
335336
BOOST_CHECK_EQUAL(d->signatures().size(), 2U);
336337
if(s3)
337338
{
338339
BOOST_CHECK_EQUAL(s3->signatureMethod(), URI_ECDSA_SHA256);
339-
BOOST_CHECK_EQUAL(s3->signingCertificate(), signer3->cert());
340+
BOOST_CHECK_EQUAL(s3->signingCertificate(), signer3.cert());
340341
BOOST_CHECK_NO_THROW(s3->validate());
341342
}
342343
BOOST_CHECK_NO_THROW(d->save());
343344

344345
// Reload from file and validate
345346
d = Container::openPtr(Doc::EXT + ".tmp");
346347
BOOST_CHECK_EQUAL(d->signatures().size(), 2U);
347-
if((s3 = d->signatures().back()))
348+
if(s3 = d->signatures().back(); s3)
348349
{
349-
BOOST_CHECK_EQUAL(s3->signingCertificate(), signer3->cert());
350+
BOOST_CHECK_EQUAL(s3->signingCertificate(), signer3.cert());
350351
BOOST_CHECK_NO_THROW(s3->validate());
351352
}
352353

@@ -355,43 +356,43 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(signature, Doc, DocTypes)
355356
BOOST_CHECK_EQUAL(d->signatures().size(), 1U);
356357

357358
// TSA signature
358-
signer2->setProfile("time-stamp-archive");
359-
BOOST_CHECK_NO_THROW(s3 = d->sign(signer2.get()));
360-
//BOOST_CHECK_EQUAL(s3->TSCertificate(), signer2->cert());
359+
signer2.setProfile("time-stamp-archive");
360+
BOOST_CHECK_NO_THROW(s3 = d->sign(&signer2));
361+
//BOOST_CHECK_EQUAL(s3->TSCertificate(), signer2.cert());
361362
//BOOST_CHECK_NO_THROW(s3->validate());
362363
BOOST_CHECK_NO_THROW(d->save(Doc::EXT + "-TSA.tmp"));
363364
BOOST_CHECK_NO_THROW(d->removeSignature(1U));
364365
BOOST_CHECK_EQUAL(d->signatures().size(), 1U);
365366

366367
// Save with no SignatureValue and later add signautre value
367-
signer2->setProfile("time-stamp");
368+
signer2.setProfile("time-stamp");
368369
d = Container::createPtr(Doc::EXT + ".tmp");
369370
BOOST_CHECK_NO_THROW(d->addDataFile("test1.txt", "text/plain"));
370371
Signature *s = nullptr;
371-
BOOST_CHECK_NO_THROW(s = d->prepareSignature(signer2.get()));
372+
BOOST_CHECK_NO_THROW(s = d->prepareSignature(&signer2));
372373
vector<unsigned char> signatureValue;
373-
BOOST_CHECK_NO_THROW(signatureValue = signer2->sign(s->signatureMethod(), s->dataToSign()));
374+
BOOST_CHECK_NO_THROW(signatureValue = signer2.sign(s->signatureMethod(), s->dataToSign()));
374375
BOOST_CHECK_NO_THROW(d->save());
375376
d = Container::openPtr(Doc::EXT + ".tmp");
376377
s = d->signatures().back();
377378
BOOST_CHECK_NO_THROW(s->setSignatureValue(signatureValue));
378-
BOOST_CHECK_NO_THROW(s->extendSignatureProfile(signer2->profile()));
379+
BOOST_CHECK_NO_THROW(s->extendSignatureProfile(signer2.profile()));
379380
BOOST_CHECK_NO_THROW(d->save());
380381
BOOST_CHECK_NO_THROW(s->validate());
381382

382383
// RSA PSS tests
383384
d = Container::createPtr(Doc::EXT + ".tmp");
384385
BOOST_CHECK_NO_THROW(d->addDataFile("test1.txt", "text/plain"));
385-
signer1->setMethod(URI_RSA_PSS_SHA256);
386-
BOOST_CHECK_NO_THROW(s = d->sign(signer1.get()));
386+
signer1.setMethod(URI_RSA_PSS_SHA256);
387+
BOOST_CHECK_NO_THROW(s = d->sign(&signer1));
387388
BOOST_CHECK_NO_THROW(s->validate());
388-
BOOST_CHECK_EQUAL(s->signatureMethod(), signer1->method());
389-
auto signer4 = make_unique<PKCS12Signer>("signerEC384.p12", "signerEC");
390-
signer4->setProfile("BES"); // Not signed with same Issuer
389+
BOOST_CHECK_EQUAL(s->signatureMethod(), signer1.method());
390+
PKCS12Signer signer4("signerEC384.p12", "signerEC");
391+
signer4.setProfile("BES"); // Not signed with same Issuer
391392
d = Container::createPtr(Doc::EXT + ".tmp");
392393
BOOST_CHECK_NO_THROW(d->addDataFile("test1.txt", "text/plain"));
393394
Signature *s4 = nullptr;
394-
BOOST_CHECK_NO_THROW(s4 = d->sign(signer4.get()));
395+
BOOST_CHECK_NO_THROW(s4 = d->sign(&signer4));
395396
BOOST_CHECK_EQUAL(s4->signatureMethod(), URI_ECDSA_SHA384);
396397
}
397398

@@ -402,13 +403,13 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(signature, Doc, DocTypes)
402403

403404
BOOST_AUTO_TEST_CASE_TEMPLATE(files, Doc, DocTypes)
404405
{
405-
auto signer1 = make_unique<PKCS12Signer>("signer1.p12", "signer1");
406+
PKCS12Signer signer1("signer1.p12", "signer1");
406407
for(const string &data : {"0123456789~#%&()=`@{[]}'", "öäüõ"})
407408
{
408409
auto d = Container::createPtr("test." + Doc::EXT);
409410
const Signature *s1 = nullptr;
410411
BOOST_CHECK_NO_THROW(d->addDataFile(data + ".txt", "text/plain"));
411-
BOOST_CHECK_NO_THROW(s1 = d->sign(signer1.get()));
412+
BOOST_CHECK_NO_THROW(s1 = d->sign(&signer1));
412413
if(s1)
413414
s1->validate();
414415
d->save(data + Doc::EXT + ".tmp");
@@ -422,23 +423,23 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(files, Doc, DocTypes)
422423
BOOST_AUTO_TEST_CASE_TEMPLATE(signatureParameters, Doc, DocTypes)
423424
{
424425
auto d = Container::createPtr("test." + Doc::EXT);
425-
auto signer1 = make_unique<PKCS12Signer>("signer1.p12", "signer1");
426+
PKCS12Signer signer1("signer1.p12", "signer1");
426427

427-
signer1->setSignatureProductionPlace("Tartu", "Tartumaa", "12345", "Estonia");
428+
signer1.setSignatureProductionPlace("Tartu", "Tartumaa", "12345", "Estonia");
428429

429430
vector<string> roles{"Role1"};
430-
signer1->setSignerRoles( roles );
431+
signer1.setSignerRoles( roles );
431432

432433
const Signature *s1 = nullptr;
433434
BOOST_CHECK_NO_THROW(d->addDataFile("test1.txt", "text/plain"));
434435
BOOST_CHECK_NO_THROW(d->addDataFile("test2.bin", "text/plain"));
435-
BOOST_CHECK_NO_THROW(s1 = d->sign(signer1.get()));
436+
BOOST_CHECK_NO_THROW(s1 = d->sign(&signer1));
436437
BOOST_CHECK_EQUAL(d->signatures().size(), 1U);
437438
if(s1)
438439
{
439440
BOOST_CHECK_NO_THROW(s1->validate());
440441
BOOST_CHECK_EQUAL(s1->id(), "S0");
441-
BOOST_CHECK_EQUAL(s1->signingCertificate(), signer1->cert());
442+
BOOST_CHECK_EQUAL(s1->signingCertificate(), signer1.cert());
442443
BOOST_CHECK_EQUAL(s1->signerRoles(), roles);
443444
BOOST_CHECK_EQUAL(s1->city(), "Tartu");
444445
BOOST_CHECK_EQUAL(s1->stateOrProvince(), "Tartumaa");
@@ -455,8 +456,8 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(signatureParameters, Doc, DocTypes)
455456
if(d->signatures().size() == 1U)
456457
BOOST_CHECK_NO_THROW(d->signatures().front()->validate());
457458

458-
auto signer3 = make_unique<PKCS12Signer>("signer3.p12", "signer3");
459-
BOOST_CHECK_THROW(d->sign(signer3.get()), Exception); // OCSP UNKNOWN
459+
PKCS12Signer signer3("signer3.p12", "signer3");
460+
BOOST_CHECK_THROW(d->sign(&signer3), Exception); // OCSP UNKNOWN
460461
}
461462
BOOST_AUTO_TEST_SUITE_END()
462463

test/test.h

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,9 @@
2727
#include <crypto/X509Cert.h>
2828
#include <util/File.h>
2929

30-
#ifdef _WIN32
31-
#include <direct.h>
32-
#define chdir _chdir
33-
#else
34-
#include <unistd.h>
35-
#endif
36-
3730
using namespace digidoc;
3831
using namespace std;
32+
namespace fs = filesystem;
3933

4034
namespace std
4135
{
@@ -102,7 +96,6 @@ class TestConfig: public ConfCurrent
10296
profiles.emplace("1.3.6.1.4.1.10015.3.1.1");
10397
return profiles;
10498
}
105-
bool PKCS12Disable() const override { return true; }
10699
string TSUrl() const override { return "http://demo.sk.ee/tsa/"; }
107100
bool TSLAutoUpdate() const override { return false; }
108101
string TSLCache() const override { return path; }
@@ -128,10 +121,7 @@ class DigiDocPPFixture
128121
if(argc > 1)
129122
{
130123
//BOOST_MESSAGE("Data path " + string(boost::unit_test::framework::master_test_suite().argv[argc-1]));
131-
DIGIDOCPP_WARNING_PUSH
132-
DIGIDOCPP_WARNING_DISABLE_GCC("-Wunused-result")
133-
chdir(boost::unit_test::framework::master_test_suite().argv[argc-1]);
134-
DIGIDOCPP_WARNING_POP
124+
fs::current_path(boost::unit_test::framework::master_test_suite().argv[argc-1]);
135125
path = conf->path = boost::unit_test::framework::master_test_suite().argv[argc-1];
136126
}
137127
boost::unit_test::unit_test_monitor.register_exception_translator<Exception>(&translate_exception);
@@ -155,11 +145,8 @@ DIGIDOCPP_WARNING_POP
155145

156146
void copyTSL(const string &from)
157147
{
158-
ifstream i(util::File::encodeName(from).c_str(), ofstream::binary);
159-
ofstream o(util::File::encodeName(path + "/EE_T.xml").c_str(), ifstream::binary);
160-
o << i.rdbuf();
161-
o.close();
162-
i.close();
148+
ofstream(util::File::encodeName(path + "/EE_T.xml"), ifstream::binary)
149+
<< ifstream(util::File::encodeName(from), ofstream::binary).rdbuf();
163150
}
164151

165152
string path = ".";

0 commit comments

Comments
 (0)