summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/tests.pro4
-rw-r--r--tests/tst_crypto/testdata/FECA2AF719090DD594C02C27F9CB3F8ED7EDAB31.keybin0 -> 1158 bytes
-rw-r--r--tests/tst_crypto/testdata/QMFtest.pem19
-rw-r--r--tests/tst_crypto/testdata/aftersig26
-rw-r--r--tests/tst_crypto/testdata/aftersmime26
-rw-r--r--tests/tst_crypto/testdata/badsigdata30
-rw-r--r--tests/tst_crypto/testdata/caliste.asc17
-rw-r--r--tests/tst_crypto/testdata/nokey135
-rw-r--r--tests/tst_crypto/testdata/nosig11
-rw-r--r--tests/tst_crypto/testdata/secret.asc18
-rw-r--r--tests/tst_crypto/testdata/smimesig107
-rw-r--r--tests/tst_crypto/testdata/validsig30
-rw-r--r--tests/tst_crypto/tst_crypto.cpp435
-rw-r--r--tests/tst_crypto/tst_crypto.pro9
14 files changed, 867 insertions, 0 deletions
diff --git a/tests/tests.pro b/tests/tests.pro
index 383d8419..cac44948 100644
--- a/tests/tests.pro
+++ b/tests/tests.pro
@@ -23,6 +23,10 @@ SUBDIRS = \
tst_locks \
tst_qmailthread
+exists(/usr/bin/gpgme-config) {
+ SUBDIRS += tst_crypto
+}
+
# these tests fail to build/pass on windows.
# longer term, we should remove this stuff entirely in favour of Qt's
# categorised logging.
diff --git a/tests/tst_crypto/testdata/FECA2AF719090DD594C02C27F9CB3F8ED7EDAB31.key b/tests/tst_crypto/testdata/FECA2AF719090DD594C02C27F9CB3F8ED7EDAB31.key
new file mode 100644
index 00000000..41bf033f
--- /dev/null
+++ b/tests/tst_crypto/testdata/FECA2AF719090DD594C02C27F9CB3F8ED7EDAB31.key
Binary files differ
diff --git a/tests/tst_crypto/testdata/QMFtest.pem b/tests/tst_crypto/testdata/QMFtest.pem
new file mode 100644
index 00000000..4dcefe88
--- /dev/null
+++ b/tests/tst_crypto/testdata/QMFtest.pem
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIC4DCCAcigAwIBAgIIAuQvPKDVZBEwDQYJKoZIhvcNAQELBQAwEzERMA8GA1UE
+AxMIUU1GIHRlc3QwIBcNMTgwMzEzMTM1OTQ2WhgPMjA2MzA0MDUxNzAwMDBaMBMx
+ETAPBgNVBAMTCFFNRiB0ZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEA4vVixMCC+OuPRLEu/dRB/P7JM76yMCeXpLAdSlNIF0Sh23tbQJ7HodTA3LlV
+gEJR9XYfEzhfR808KGALrqtBXgrq1e37ALurFlSfdORRoUvtX2hzU7cCIUKC+4H9
+pGKlqshnFveFSGfS75OOhX+g6ChdG+X7IK034oODrXM0Ct8/T8d5a582vyga7dT7
+uKBnk7OUtAewGqMFS7/fb4FN7IKZoQaO5INWZIyMXtYfoTwAspZAeIuZoiepxkhJ
+ick7u/wj5t612hRG3deuI0pWHjSIdMwP95ugkJR636j2Pki3wXsE/68wzKkXxxXv
+m39KEtXedKDoAtmHNjraBI6TewIDAQABozYwNDARBgorBgEEAdpHAgIBBAMBAf8w
+DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCBPAwDQYJKoZIhvcNAQELBQAD
+ggEBAHr7yGjCrXutyjH7CkuifAEgsI27rXaR1EAUcD0okNHQpEOsJnVBgwzBQIZC
+SWk/vfCEmIGrJG32taqDP73xbbzipgCSb5eQeGRAi+HNl+ym8um/Mhe+FdqWanvr
+we4PPH4wEcR5P0t1xYDrIRAF1NfPizRRuIzDfGHg/ZBcz7fo1kmzgJAAm+ehMb9M
+WrX86oFrvh94BqOL4r9+n/M1z9rzcXGxbzViSC18Pb8DXu9k7ifmH8Ms6ShBC8d/
+UvH9X+NJHvykZZsGreUbSxlS7aaH1PS1kdfk6i45ZeAIPCj1CnTZ3hFIBjfjhN/F
+cIu+OPA850z9af3SWRvOVRcnZHs=
+-----END CERTIFICATE-----
+
diff --git a/tests/tst_crypto/testdata/aftersig b/tests/tst_crypto/testdata/aftersig
new file mode 100644
index 00000000..f8106f11
--- /dev/null
+++ b/tests/tst_crypto/testdata/aftersig
@@ -0,0 +1,26 @@
+Received: from [127.0.0.1]
+To: <test2@free.fr>
+From: <test@free.fr>
+Subject: Test signature
+Content-Type: multipart/signed; charset=utf-8; micalg=pgp-md5;
+ protocol=application/pgp-signature;
+ boundary="[)}<testingtestingtesting)}<]"
+Date: Fri, 27 Jan 2017 15:36:23 +0000
+Message-ID: <uibjfc.okg3d7.rv1pky-qmf@smtp1-g21.free.fr>
+MIME-Version: 1.0
+
+This is a multipart message in Mime 1.0 format
+
+--[)}<testingtestingtesting)}<]
+Content-Type: text/plain; charset=utf-8
+Content-Transfer-Encoding: base64
+
+SGVsbG8gc2lnbmF0dXJlICEg
+
+--[)}<testingtestingtesting)}<]
+Content-Type: application/pgp-signature
+Content-Transfer-Encoding: 7bit
+Content-Description: OpenPGP digital signature
+
+0133d5663d1abd6878852b31506a2526
+--[)}<testingtestingtesting)}<]--
diff --git a/tests/tst_crypto/testdata/aftersmime b/tests/tst_crypto/testdata/aftersmime
new file mode 100644
index 00000000..988aa7a9
--- /dev/null
+++ b/tests/tst_crypto/testdata/aftersmime
@@ -0,0 +1,26 @@
+Received: from [127.0.0.1]
+To: <test2@free.fr>
+From: <test@free.fr>
+Subject: Test signature
+Content-Type: multipart/signed; charset=utf-8; micalg=pgp-md5;
+ protocol=application/pkcs7-signature;
+ boundary="[)}<testingtestingtesting)}<]"
+Date: Fri, 27 Jan 2017 15:36:23 +0000
+Message-ID: <uibjfc.okg3d7.rv1pky-qmf@smtp1-g21.free.fr>
+MIME-Version: 1.0
+
+This is a multipart message in Mime 1.0 format
+
+--[)}<testingtestingtesting)}<]
+Content-Type: text/plain; charset=utf-8
+Content-Transfer-Encoding: base64
+
+SGVsbG8gc2lnbmF0dXJlICEg
+
+--[)}<testingtestingtesting)}<]
+Content-Disposition: attachment; filename=smime.p7s
+Content-Type: application/pkcs7-signature
+Content-Transfer-Encoding: base64
+
+MDEzM2Q1NjYzZDFhYmQ2ODc4ODUyYjMxNTA2YTI1MjY=
+--[)}<testingtestingtesting)}<]--
diff --git a/tests/tst_crypto/testdata/badsigdata b/tests/tst_crypto/testdata/badsigdata
new file mode 100644
index 00000000..d98f1ab9
--- /dev/null
+++ b/tests/tst_crypto/testdata/badsigdata
@@ -0,0 +1,30 @@
+Received: from [127.0.0.1]
+To: <test2@free.fr>
+From: <test@free.fr>
+Subject: Test smtp 2
+Content-Type: multipart/signed; micalg=pgp-sha1;
+ protocol="application/pgp-signature";
+ boundary="_9f4ae8ae-f82b-4bec-96c9-21446eb2b26e_"
+Date: Mon, 30 Jan 2017 08:21:32 +0000
+Message-ID: <mioo44.okl38b.2u4q0f-qmf@smtp6-g21.free.fr>
+MIME-Version: 1.0
+
+--_9f4ae8ae-f82b-4bec-96c9-21446eb2b26e_
+Content-Type: text/plain; charset=utf-8
+Content-Transfer-Encoding: base64
+
+TWVzc2FnZS4g
+--_9f4ae8ae-f82b-4bec-96c9-21446eb2b26e_
+Content-Type: application/pgp-signature
+Content-Transfer-Encoding: 7bit
+Content-Description: OpenPGP digital signature
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v2
+
+iEYEARECAAYFAliO95IACgkQstd9FoOveexeRwCfQoHGOnKgGL0Dov85lHY0XwJg
+xUIAoKXStBTLk4ZtzdX3m5RNrQPRHHvv
+=1pW2
+-----END PGP SIGNATURE-----
+
+--_9f4ae8ae-f82b-4bec-96c9-21446eb2b26e_--
diff --git a/tests/tst_crypto/testdata/caliste.asc b/tests/tst_crypto/testdata/caliste.asc
new file mode 100644
index 00000000..2f0f5a5e
--- /dev/null
+++ b/tests/tst_crypto/testdata/caliste.asc
@@ -0,0 +1,17 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.17 (GNU/Linux)
+
+mQGiBFiHatARBACq3BSWZQygEOiAGPnmnUkXbsNtGXd8I1PJ3gwYDW/kEmZHVyu8
+fRLXUooE7Z7XY2gINZdQB2oHZSDm89ayJTZluQfOLVXtyTNAR/472Y/t04EaykAb
+CRcDtBneMM0RukyPO/scXS01piHmcMQaDgTuNYXe/saUjict+q7BmHYkVwCg+5XE
+vP8diCpIfhOS19kxJwwzIC0D/1b9OU2yOUfBXSPM3WJRdvT3VhUh7Qz05cBmFuFf
+1MRoz1a3VYl55hMsqV9j5eqt0U8NJi+BFegPEyhcMq7nERtrViP6ccAYhorJ2to6
+92GxbirRPcfeXkAFlkcn80gttTKX8E6rIisegNj2j7+n+TowPRgzRN97kEvp8n/I
+ZI/KBACqyNmU7l47f6FBW2LrLxyNMXpKOWtae7JPSVpcyPjOx604rjxrObNQ5Kwy
+sHiiXEv2PSnFPqFzcdJsbnyh54lOs4UV5oXQmAeMlQd1cAlyJpXG9v+0n2nowh8x
+9M90ZPwdqfR2ksllc47fiEtfLto/u+6deuK8yAXiWEcCdQXDKbQhRGFtaWVuIENh
+bGlzdGUgPGRjYWxpc3RlQGZyZWUuZnI+iGEEExECACEFAliHatACGwMHCwkIBwMC
+AQQVAggDBBYCAwECHgECF4AACgkQstd9FoOveeyX0wCgq44kV7LoxCZb1/avluGG
+bnr7BKwAnRdacFUMPslDAC3VNFR3i5hwa3aa
+=/H/i
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/tests/tst_crypto/testdata/nokey b/tests/tst_crypto/testdata/nokey
new file mode 100644
index 00000000..388825c3
--- /dev/null
+++ b/tests/tst_crypto/testdata/nokey
@@ -0,0 +1,135 @@
+Date: Thu, 2 Feb 2017 01:39:18 +0100
+Subject: Debian Installer Stretch RC 2 release
+Message-ID: <20170202003918.GR2786@mraw.org>
+Content-Type: multipart/signed; micalg=pgp-sha1;
+ protocol="application/pgp-signature"; boundary="vvRocJ6whMXXNc9q"
+Content-Disposition: inline
+Organization: Debian
+User-Agent: Mutt/1.5.23 (2014-03-12)
+List-Archive: https://lists.debian.org/msgid-search/20170202003918.GR2786@mraw.org
+Resent-Date: Thu, 2 Feb 2017 00:39:36 +0000
+MIME-Version: 1.0
+
+--vvRocJ6whMXXNc9q
+Content-Type: text/plain; charset=us-ascii
+Content-Disposition: inline
+Content-Transfer-Encoding: quoted-printable
+
+The Debian Installer team[1] is pleased to announce the second release
+candidate of the installer for Debian 9 "Stretch".
+
+
+Important change in this release of the installer
+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
+
+ * A major update of os-prober was included in this release. This
+ component is responsible for finding other operating systems so
+ that entries can be added to the bootloader's menu. This update
+ should fix serious bugs, some of which leading to file system
+ corruption, but might also trigger some regressions. As usual,
+ running "reportbug os-prober" from the installed system lets you
+ report any issues.
+
+
+Improvements in this release
+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
+=3D=3D=3D
+
+ * debian-installer:
+ - Bump Linux kernel version from 4.8.0-2 to 4.9.0-1.
+ - Adjust *.so files handling (#851790).
+ * os-prober:
+ - Improve logging of mounting and setting partitions to ro/rw.
+ - Use a read-only device-mapper entry when appropriate.
+ - Skip partition when FS type is LVM2_member (#853277).
+ - Make os-prober-udeb depend on grub-mount-udeb, and make
+ os-prober depend on grub-common, so that grub-mount is
+ consistently available (#776275).
+ - Fix detection of /usr partition as a GNU/Linux root partition
+ when /lib* directories are moved to /usr completely (#698733).
+ - Make the yaboot parser more tolerant (#674561).
+ - Call dmraid only once.
+ - Add os-release support (#794409).
+ - Work harder to avoid trying to mount extended partitions
+ (#784709).
+ - Drop " (loader)" suffixes on Microsoft operating systems
+ (#787418).
+ - For more improvements, see: #698598, #694668, #803155, #801631,
+ #851983.
+
+
+Hardware support changes
+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
+
+ * debian-installer:
+ - Drop armel/versatile flavour since kernel support was removed.
+ - mips*: install all NIC modules in the netbood initrd.
+ * flash-kernel:
+ - Add machine db entry for Pine64+.
+ * linux:
+ - udeb: Add switch (DSA) drivers to nic-modules (#845075).
+
+
+Localization status
+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
+
+ * 75 languages are supported in this release.
+ * Full translation for 12 of them.
+
+
+Known bugs in this release
+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
+=3D
+
+ * There seems to be no known major bug as of yet.
+
+See the errata[2] for details and a full list of known issues.
+
+
+Feedback for this release
+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
+
+We need your help to find bugs and further improve the installer,
+so please try it. Installer CDs, other media and everything else you
+will need are available at our web site[3].
+
+
+Thanks
+=3D=3D=3D=3D=3D=3D
+
+The Debian Installer team thanks everybody who has contributed to this
+release.
+
+
+ 1. http://wiki.debian.org/DebianInstaller/Team
+ 2. http://www.debian.org/devel/debian-installer/errata
+ 3. http://www.debian.org/devel/debian-installer
+
+--=20
+Cyril Brulebois
+on behalf of the Debian Installer Team
+
+--vvRocJ6whMXXNc9q
+Content-Type: application/pgp-signature; name="signature.asc"
+Content-Description: Digital signature
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1
+
+iQIcBAEBAgAGBQJYkn+2AAoJEP+RSvDCs1UgPaoP/R1XJxj88WU7IpK2u9QL51EV
+hz6jvduLXAPtOJxxfCKrjdZmtda3nKrQJ8QVuDFGFjdQA9IQz/MMQ00/3yLCNNqj
+hAYkYn4Wtx77XLYWpWNGgKd6Ym1vNJyF6yKsIeY/60YI4gfbOhKC+GwIZAXXOaPK
+kIf2cJGNnN69wjh7cIx8JpkU00wYoHjHRmRVLWPMt0npvOsCaN0IDe3BJQyIN+CQ
+6hu8PfpaHZIXJTapQUEqkjWEIdTmgsna0XRR41viWhv+ZXHsz8K9p03F/nbT6JsO
+xitV6ouaPT76bHB+7xZWdV1Z2HXGAqALtFY8qPEkE+AWIQsro5aeJGABsLxMLCSp
+R5j80bVyTi+OLZ8jXJ25k+MKsr+xPDZZoz1aBxTw6BUcu47CnpABzPj4n0H6h7HX
+fKiofAAkM6t+FbPuMm/qTTbrTArZFF6/UeAqRGVBo78AnmBaQkEh5vP45lwBgcFS
+zy7LW362vFPkrZ0gUys+mtEUArgotFL6ecW492tAfE4r1mVg9LfCK/BuPmGmXbcH
+OyyiVfeYW9MzbbORJBs+yQ+iz6ouhhNA9L8p7eqH7i2LbjlED0A6cGOKEhRjzRew
+uNJeIrjUg/VtsdBZh+i/WlTDQB160/MEDwvUltY6tapCpLY6M1nWdQnLbYDNOnhF
+dsx8ZHidRBGlQacy5rwa
+=nvWo
+-----END PGP SIGNATURE-----
+
+--vvRocJ6whMXXNc9q--
diff --git a/tests/tst_crypto/testdata/nosig b/tests/tst_crypto/testdata/nosig
new file mode 100644
index 00000000..c05188a8
--- /dev/null
+++ b/tests/tst_crypto/testdata/nosig
@@ -0,0 +1,11 @@
+Received: from [127.0.0.1]
+To: <test2@free.fr>
+From: <test@free.fr>
+Subject: Test signature
+Content-Type: text/plain; charset="utf-8"
+Content-Transfer-Encoding: base64
+Date: Fri, 27 Jan 2017 15:36:23 +0000
+Message-ID: <uibjfc.okg3d7.rv1pky-qmf@smtp1-g21.free.fr>
+MIME-Version: 1.0
+
+SGVsbG8gc2lnbmF0dXJlICEg
diff --git a/tests/tst_crypto/testdata/secret.asc b/tests/tst_crypto/testdata/secret.asc
new file mode 100644
index 00000000..02f55e0e
--- /dev/null
+++ b/tests/tst_crypto/testdata/secret.asc
@@ -0,0 +1,18 @@
+-----BEGIN PGP PRIVATE KEY BLOCK-----
+Version: GnuPG v2
+
+lQHhBFiHatARBACq3BSWZQygEOiAGPnmnUkXbsNtGXd8I1PJ3gwYDW/kEmZHVyu8
+fRLXUooE7Z7XY2gINZdQB2oHZSDm89ayJTZluQfOLVXtyTNAR/472Y/t04EaykAb
+CRcDtBneMM0RukyPO/scXS01piHmcMQaDgTuNYXe/saUjict+q7BmHYkVwCg+5XE
+vP8diCpIfhOS19kxJwwzIC0D/1b9OU2yOUfBXSPM3WJRdvT3VhUh7Qz05cBmFuFf
+1MRoz1a3VYl55hMsqV9j5eqt0U8NJi+BFegPEyhcMq7nERtrViP6ccAYhorJ2to6
+92GxbirRPcfeXkAFlkcn80gttTKX8E6rIisegNj2j7+n+TowPRgzRN97kEvp8n/I
+ZI/KBACqyNmU7l47f6FBW2LrLxyNMXpKOWtae7JPSVpcyPjOx604rjxrObNQ5Kwy
+sHiiXEv2PSnFPqFzcdJsbnyh54lOs4UV5oXQmAeMlQd1cAlyJpXG9v+0n2nowh8x
+9M90ZPwdqfR2ksllc47fiEtfLto/u+6deuK8yAXiWEcCdQXDKf4DAwIOKkm3433l
+tGDjrxW0tyAG+jaQJ94aciUu41tRmiobARuuHlkmc9EWi9qszBKnxg1/tqp6eqyb
+RIm1/7QhRGFtaWVuIENhbGlzdGUgPGRjYWxpc3RlQGZyZWUuZnI+iGEEExECACEF
+AliHatACGwMHCwkIBwMCAQQVAggDBBYCAwECHgECF4AACgkQstd9FoOveeyX0wCg
+q44kV7LoxCZb1/avluGGbnr7BKwAnRdacFUMPslDAC3VNFR3i5hwa3aa
+=tYVF
+-----END PGP PRIVATE KEY BLOCK-----
diff --git a/tests/tst_crypto/testdata/smimesig b/tests/tst_crypto/testdata/smimesig
new file mode 100644
index 00000000..3bac72e4
--- /dev/null
+++ b/tests/tst_crypto/testdata/smimesig
@@ -0,0 +1,107 @@
+Date: Mon, 12 Mar 2018 16:31:06 +0100
+To: <test2@free.fr>
+From: <test@free.fr>
+Subject: =?UTF-8?B?UsOpdW5pb24=?= du COMUT du CCRT
+Message-ID: <20180312163106.45103ed9@myrte>
+Organization: CEA - recherche fondamentale
+X-Mailer: Claws Mail 3.13.2 (GTK+ 2.24.30; x86_64-pc-linux-gnu)
+Content-Type: multipart/signed; micalg=SHA256;
+ boundary="Sig_/T.jUFbQJlRBlM5bhdX7jryO";
+ protocol="application/pkcs7-signature"
+MIME-Version: 1.0
+
+--Sig_/T.jUFbQJlRBlM5bhdX7jryO
+Content-Type: text/plain; charset=US-ASCII
+Content-Transfer-Encoding: quoted-printable
+
+Bonjour,
+
+ There will be the March 15th, the regular meeting of the CCRT
+user representatives. Take this occasion to send me any question you
+may have on the CCRT (and also Genci) so I can pass them to the CCRT
+people on this date.
+
+Have a nice day,
+
+Damien.
+
+--Sig_/T.jUFbQJlRBlM5bhdX7jryO
+Content-Type: application/pkcs7-signature; name="smime.p7s"
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment; filename="smime.p7s"
+
+MIAGCSqGSIb3DQEHAqCAMIACAQExDzANBglghkgBZQMEAgEFADCABgkqhkiG9w0B
+BwEAAKCCC08wggXWMIIDvqADAgECAgEJMA0GCSqGSIb3DQEBCwUAMF4xCzAJBgNV
+BAYTAkZSMQwwCgYDVQQKDANDRUExFzAVBgNVBAsMDjAwMDIgNzc1Njg1MDE5MQsw
+CQYDVQQLDAJBQzEbMBkGA1UEAwwSQ0VBIEFDIFJhY2luZSAyMDQxMB4XDTE2MDQx
+OTA3MzQ1M1oXDTMxMDQxNjA3MzQ1M1owPTELMAkGA1UEBhMCRlIxDDAKBgNVBAoM
+A0NFQTEgMB4GA1UEAwwXQ0VBIEFDIFV0aWxpc2F0ZXVyIDIwMzEwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9YMWLEzvUov2nfxhItNiBdFNx5lYAPRFK
+Ds3KUEY9c0dhtx64YoOFEh5fnwUiL4mJUUV6MUjqOkSKambcyCxdDk7TxyWJ4ssE
+0KNXOkAw9M7mVe7PSPbx7LkBU/CETDueBQK2YdpaHy/V5jrGstUL+misWMfJwVt3
+iiPpAt/KCGij9FdaCVg82OKWQIGtF76MrEzdBhhUPqui68asXnxKWkYJ/BcUDzw5
+xgLbiQfxg45i+Hwt3+n63LtBSIOrndiZVnmINRzem3ev2k3rXMnzcU8SFlsLz4oc
+NNsPRNdqi3Y2ji7zCTSzSMGmJxU3iHF9L4uIVxOwWayisNbovsYjAgMBAAGjggG+
+MIIBujAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBThHGyaHW3oG7LxT/3GdCwn
+VwWIczAfBgNVHSMEGDAWgBSgEYn4mr+mhLEpBzdTQe2XlUJ7HTCByAYDVR0gBIHA
+MIG9MIG6BgorBgEEAeBgAQYHMIGrMCUGCCsGAQUFBwIBFhlodHRwOi8vd3d3LWln
+Yy5jZWEuZnIvcGMvMIGBBggrBgEFBQcCAjB1MA0WA0NFQTAGAgECAgEAGmRWb3Vz
+IGRldmV6IGFjY2VwdGVyIGxhIHBvbGl0aXF1ZSBkZSBjZXJ0aWZpY2F0aW9uIGF2
+YW50IGQndXRpbGlzZXIgY2UgY2VydGlmaWNhdCwgY2YuIHd3dy1pZ2MuY2VhLmZy
+MA4GA1UdDwEB/wQEAwIBBjBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsLWFj
+LXJhY2luZS5jZWEuZnIvY3JsL2FjLXJhY2luZS0yMDQxLmNybDBHBggrBgEFBQcB
+AQQ7MDkwNwYIKwYBBQUHMAKGK2h0dHA6Ly93d3ctaWdjLmNlYS5mci9hYy9hYy1y
+YWNpbmUtMjA0MS5jZXIwDQYJKoZIhvcNAQELBQADggIBAAu1SqtkR+iX+gS0g6Uz
+dJocI8duVW3xN1jzwgHeoKmDmUnytZTuDyMCxzSahhiivSGu9vXteNcQJgvvow4k
+EJBgQp9aeRNioDIxOwp576QrxfDk/zDM8+NcDe1S9GbygcQZhxJ8sTN2P5RP4X4T
+gyeRXWdQ4IQmrYqvH6W7UglAlEJuNRAX4RIgLBMNATsUfMYYpWwY4SORtiENL/7i
+vkY9tz3zfLl33hLQhJiYzWSU5J5E0Z6VyeXR8lsfTOzXLz5glaDeBYvWPto2j6xB
+AKs+thCea58CbcdCvjb67QBsW85flcrAXVgDHtekla5QZ5eSOrHzEhaKxKERz9L4
+abiZ0pxSDKbkLuCQDSfNuYEgkjeJItGqT+bZF7tHm8Ld8Xe7J9P2YZ4Cc1oT1vtm
+QHOGtJ8VOjKVu+qcBi/FVxgUITVeFUwfEq9GKJb0v+728e4BtNFpcEXM5utcXpSi
+EtFc2okopo9iREuCtWbpvfTc6CnnS7oOJKC8jgOHvH0r0iqkn/5yyp1emhV2FCOF
+wDkllE2u/erTNV/9D3cZPdUc6Bp4yQRr1KffTHgaZl+42if/NJqAlmQs7vYrfBrp
+dBsZ/wxk/9C1IwY/Os15VSCngfqX2FxAg1UeaKZOtxlrv/bYrQUPnp6lj86oBfAh
+Y5v2L6N0Mihblzmlb78EMNqxMIIFcTCCBFmgAwIBAgICEdwwDQYJKoZIhvcNAQEL
+BQAwPTELMAkGA1UEBhMCRlIxDDAKBgNVBAoMA0NFQTEgMB4GA1UEAwwXQ0VBIEFD
+IFV0aWxpc2F0ZXVyIDIwMzEwHhcNMTcwNTI5MTIwMzQ4WhcNMjAwNTI5MTIwMzQ4
+WjBKMQswCQYDVQQGEwJGUjEMMAoGA1UECgwDY2VhMRQwEgYDVQQLDAtVdGlsaXNh
+dGV1cjEXMBUGA1UEAwwOQ0FMSVNURSBEYW1pZW4wggEiMA0GCSqGSIb3DQEBAQUA
+A4IBDwAwggEKAoIBAQDB4dh47uj+Mm8oPY0NYtNDVKsCbtJlSe/+Fr+ieISZvx6d
+eMjjZpsbXoAG8HyNBA1cduANFFQl/bZmHe1dq/O+YIgYDJU/67RlI68WbzAHeL0b
+peN76zwb8bHFkQSvuSsGD5eXZAyusBcfnlBG0CQbQgnwmQ7hSIQrwheu01+jG5Ef
+B0dqJUFtzihZt2DKg/3I5A0PIqzpFYk9pQJ8rvz5Q2CuDUtmr/p/U0XtO5un+rqW
+3a2DnaaRVWOAuU6X4or5LHAfv0PIjI4BGZhpmORMUMsA5gnnufLs0SswsyLAGrrH
++fNd+ja+KsLFSXrLTlrNiPBTPQeMi1pH9cki7UiJAgMBAAGjggJsMIICaDAdBgNV
+HQ4EFgQU0CDoL7GFa1idkipJhAZb1G2dN7gwHwYDVR0jBBgwFoAU4Rxsmh1t6Buy
+8U/9xnQsJ1cFiHMwgccGA1UdIASBvzCBvDCBuQYKKwYBBAHgYAEGBzCBqjAlBggr
+BgEFBQcCARYZaHR0cDovL3d3dy1pZ2MuY2VhLmZyL3BjLzCBgAYIKwYBBQUHAgIw
+dDANFgNDRUEwBgIBAgIBABpjVm91cyBkZXZleiBhY2VwdGVyIGxhIHBvbGl0aXF1
+ZSBkZSBjZXJ0aWZpY2F0aW9uIGF2YW50IGQndXRpbGlzZXIgY2UgY2VydGlmaWNh
+dCwgY2YuIHd3dy1pZ2MuY2VhLmZyMBEGCWCGSAGG+EIBAQQEAwIFoDAOBgNVHQ8B
+Af8EBAMCBLAwIAYDVR0RBBkwF4EVZGFtaWVuLmNhbGlzdGVAY2VhLmZyMFEGA1Ud
+HwRKMEgwRqBEoEKGQGh0dHA6Ly9jcmwtYWMtdXRpbGlzYXRldXIuY2VhLmZyL2Ny
+bC9jZWFfYWNfdXRpbGlzYXRldXJfMjAzMS5jcmwwcgYJYIZIAYb4QgENBGUWY1Zv
+dXMgZGV2ZXogYWNlcHRlciBsYSBwb2xpdGlxdWUgZGUgY2VydGlmaWNhdGlvbiBh
+dmFudCBkJ3V0aWxpc2VyIGNlIGNlcnRpZmljYXQsIGNmLiB3d3ctaWdjLmNlYS5m
+cjBQBggrBgEFBQcBAQREMEIwQAYIKwYBBQUHMAKGNGh0dHA6Ly93d3ctaWdjLmNl
+YS5mci9hYy9jZWFfYWNfdXRpbGlzYXRldXJfMjAzMS5jcmwwDQYJKoZIhvcNAQEL
+BQADggEBABulNl4FgwuzcEcoCVW1UG+ie6vBTyAmGn0F4RuFU9T8j7ibkKkKsLj2
+xcD//+HuIX5GoIDJJ4GwAXsg2bBR9q6ft74AISVRBsXIxEIrN2UhSCoZ7jUb6cAA
+Gw+p8wMe6g5oOe7O9+ksZOoBrQItWFTfVlskM9w0RIdU/H+2xUMGh/j6ucTC3mG+
+YTv8xOIvV4Altwv/4y+EZh1AOWctmp4IFmJZ4365bSJBKfOQN9ZIDtaDMBrcbYuF
+kmOXEp0JJKjr/e5luCHYZ8RgQXadI4/Deat7aPRQpsPVRZIoUQO/j9QdAQGOWLFC
++x3moQ9NiTVFGwpfU1MTLCvWeNbsGXkxggIEMIICAAIBATBDMD0xCzAJBgNVBAYT
+AkZSMQwwCgYDVQQKDANDRUExIDAeBgNVBAMMF0NFQSBBQyBVdGlsaXNhdGV1ciAy
+MDMxAgIR3DANBglghkgBZQMEAgEFAKCBkzAYBgkqhkiG9w0BCQMxCwYJKoZIhvcN
+AQcBMBwGCSqGSIb3DQEJBTEPFw0xODAzMTIxNTMxMDdaMCgGCSqGSIb3DQEJDzEb
+MBkwCwYJYIZIAWUDBAECMAoGCCqGSIb3DQMHMC8GCSqGSIb3DQEJBDEiBCC516FM
+uBZKZSYxjb8qxYuhARoWaIWyp2xM7+j6K6piPjANBgkqhkiG9w0BAQEFAASCAQBV
+y/qZRy5lIprTJJAo5L+ghTe4K2uRDCWwi0DA9q0W7dibE11jGPWB5Bcw/wWd5mk2
++vsOktQuaYOdLiinGCzxunXdK/mLSHPW69tspn5M4qLgbc+WLrHE6ZudMMJFwax8
+io3JyDIcG7KAs3Wzs+0Oq7dyfYlA2d2PE4LLZ5KWoMXMDRR3m9mGrIsTydzLJ5jy
+KRcCLw4u8L+McAyeXE+uEnBR7ifyQ8EyeZfmE2dVgYoRYYnPl2luZvnAKGca23t5
+x6uRG+ahqOpTCPV8zEZixdGo30+w0AAOdqzjZWQrSyutzWxbfqXvDJYs94HNqQMr
+WiFeHifIK9J83nawFOP8AAAAAAAA
+
+--Sig_/T.jUFbQJlRBlM5bhdX7jryO--
diff --git a/tests/tst_crypto/testdata/validsig b/tests/tst_crypto/testdata/validsig
new file mode 100644
index 00000000..2c720a69
--- /dev/null
+++ b/tests/tst_crypto/testdata/validsig
@@ -0,0 +1,30 @@
+Received: from [127.0.0.1]
+To: <test2@free.fr>
+From: <test@free.fr>
+Subject: Testing signing
+Content-Type: multipart/signed; micalg=pgp-sha1;
+ protocol="application/pgp-signature";
+ boundary="_d69d3a43-654c-46a3-ae21-a1fd4e0036a1_"
+Date: Mon, 30 Jan 2017 13:58:56 +0000
+Message-ID: <s0bsge.oklivc.rusfpt-qmf@smtp6-g21.free.fr>
+MIME-Version: 1.0
+
+--_d69d3a43-654c-46a3-ae21-a1fd4e0036a1_
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: base64
+
+SSdtIHN1cmUgdGhlIHRleHQgaXMgcHJpc3RpbmUuIA==
+--_d69d3a43-654c-46a3-ae21-a1fd4e0036a1_
+Content-Type: application/pgp-signature
+Content-Transfer-Encoding: 7bit
+Content-Description: OpenPGP digital signature
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v2
+
+iEYEARECAAYFAliPRr0ACgkQstd9FoOveezW6wCfSgpQHIlAJUreDwwrLvZ8xeV+
+354AoOfjU17Fn6x1XRvdJzSMF35PYUo6
+=msRa
+-----END PGP SIGNATURE-----
+
+--_d69d3a43-654c-46a3-ae21-a1fd4e0036a1_--
diff --git a/tests/tst_crypto/tst_crypto.cpp b/tests/tst_crypto/tst_crypto.cpp
new file mode 100644
index 00000000..a57b7159
--- /dev/null
+++ b/tests/tst_crypto/tst_crypto.cpp
@@ -0,0 +1,435 @@
+/* -*- c-basic-offset: 4 -*- */
+/****************************************************************************
+**
+** Copyright (C) 2018 Caliste Damien.
+** Contact: Damien Caliste <dcaliste@free.fr>
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Messaging Framework.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtTest>
+#include <QObject>
+#include <QFile>
+
+#ifndef _FILE_OFFSET_BITS
+#define _FILE_OFFSET_BITS 64
+#endif
+#include <gpgme.h>
+
+#include <qmailmessage.h>
+#include <qmailcontentmanager.h>
+#include <qmailcrypto.h>
+
+Q_DECLARE_METATYPE(QMailCryptoFwd::SignatureResult)
+
+class tst_Crypto : public QObject
+{
+ Q_OBJECT
+
+public:
+ tst_Crypto();
+ virtual ~tst_Crypto();
+
+public slots:
+ void initTestCase();
+ void cleanupTestCase();
+ void init();
+ void cleanup();
+
+private slots:
+ void extractUndecodedData_data();
+ void extractUndecodedData();
+ void verify_data();
+ void verify();
+ void sign_data();
+ void sign();
+ void storage_data();
+ void storage();
+
+private:
+ void importKey(const QString &path, gpgme_protocol_t protocol, QString *storing);
+ QString m_pKey, m_smimeKey;
+};
+
+tst_Crypto::tst_Crypto()
+{
+ gpgme_error_t err;
+
+ gpgme_check_version(NULL);
+ err = gpgme_engine_check_version(GPGME_PROTOCOL_OpenPGP);
+ if (gpgme_err_code(err) != GPG_ERR_NO_ERROR) {
+ qWarning() << "cannot use OpenPGP engine" << gpgme_strerror(err);
+
+ gpgme_engine_info_t info;
+ err = gpgme_get_engine_info(&info);
+ if (!err) {
+ while (info) {
+ qWarning() << "protocol:" << gpgme_get_protocol_name(info->protocol);
+ if (info->file_name && !info->version)
+ qWarning() << "engine " << info->file_name << " not installed properly";
+ else if (info->file_name && info->version && info->req_version)
+ qWarning() << "engine " << info->file_name
+ << " version " << info->version
+ << " installed, but at least version "
+ << info->req_version << " required";
+ else
+ qWarning() << "unknown issue";
+ info = info->next;
+ }
+ } else {
+ qWarning() << "cannot get engine info:" << gpgme_strerror(err);
+ }
+ }
+}
+
+tst_Crypto::~tst_Crypto()
+{
+}
+
+void tst_Crypto::importKey(const QString &path, gpgme_protocol_t protocol,
+ QString *storing)
+{
+ gpgme_error_t err;
+ gpgme_ctx_t ctx;
+ gpgme_data_t key;
+
+ QFile f(path);
+ if (!f.open(QIODevice::ReadOnly)) {
+ QFAIL("Key file does not exist or cannot be opened for reading!");
+ }
+
+ err = gpgme_new(&ctx);
+ if (gpgme_err_code(err) != GPG_ERR_NO_ERROR) {
+ qWarning() << "cannot create context" << gpgme_strerror(err);
+ f.close();
+ return;
+ }
+
+ err = gpgme_set_protocol(ctx, protocol);
+ if (gpgme_err_code(err) != GPG_ERR_NO_ERROR) {
+ qWarning() << QStringLiteral("cannot use %1 engine.").arg(gpgme_get_protocol_name(protocol));
+ f.close();
+ gpgme_release(ctx);
+ return;
+ }
+
+ err = gpgme_data_new_from_fd(&key, f.handle());
+ if (gpgme_err_code(err) != GPG_ERR_NO_ERROR) {
+ qWarning() << "cannot create key data" << gpgme_strerror(err);
+ f.close();
+ gpgme_release(ctx);
+ return;
+ }
+
+ err = gpgme_op_import(ctx, key);
+ if (gpgme_err_code(err) != GPG_ERR_NO_ERROR) {
+ qWarning() << "cannot import key data" << gpgme_strerror(err);
+ }
+
+ gpgme_import_result_t result;
+ result = gpgme_op_import_result(ctx);
+ if (result->imports && storing)
+ *storing = result->imports->fpr;
+
+ gpgme_data_release(key);
+ f.close();
+ gpgme_release(ctx);
+}
+
+static QString passphrase(const QString &info)
+{
+ Q_UNUSED(info);
+
+ return QString("test");
+}
+
+void tst_Crypto::initTestCase()
+{
+ importKey(QStringLiteral("%1/testdata/caliste.asc").arg(QCoreApplication::applicationDirPath()), GPGME_PROTOCOL_OpenPGP, &m_pKey);
+ importKey(QStringLiteral("%1/testdata/secret.asc").arg(QCoreApplication::applicationDirPath()), GPGME_PROTOCOL_OpenPGP, 0);
+ importKey(QStringLiteral("%1/testdata/QMFtest.pem").arg(QCoreApplication::applicationDirPath()), GPGME_PROTOCOL_CMS, &m_smimeKey); // pass for it is QMFtest2018
+ QFile::copy(QStringLiteral("%1/testdata/FECA2AF719090DD594C02C27F9CB3F8ED7EDAB31.key").arg(QCoreApplication::applicationDirPath()),
+ QDir::homePath() + QDir::separator() + ".gnupg/private-keys-v1.d/FECA2AF719090DD594C02C27F9CB3F8ED7EDAB31.key");
+
+ QMailAccount account;
+ account.setName("Account 1");
+ account.setMessageType(QMailMessage::Email);
+ account.setCustomField("verified", "true");
+ QMailAccountConfiguration config;
+ QMailStore::instance()->addAccount(&account, &config);
+}
+
+void tst_Crypto::cleanupTestCase()
+{
+ gpgme_error_t err;
+ gpgme_ctx_t ctx;
+ gpgme_key_t key;
+
+ if (m_pKey.isEmpty())
+ return;
+
+ err = gpgme_new(&ctx);
+ if (gpgme_err_code(err) != GPG_ERR_NO_ERROR) {
+ qWarning() << "cannot create context" << gpgme_strerror(err);
+ return;
+ }
+
+ err = gpgme_get_key(ctx, m_pKey.toLocal8Bit().data(), &key, 1);
+ if (gpgme_err_code(err) != GPG_ERR_NO_ERROR) {
+ qWarning() << "cannot retrieve key" << m_pKey;
+ gpgme_release(ctx);
+ return;
+ }
+
+ err = gpgme_op_delete(ctx, key, 1);
+ if (gpgme_err_code(err) != GPG_ERR_NO_ERROR) {
+ qWarning() << "cannot delete key" << gpgme_strerror(err);
+ }
+
+ gpgme_key_unref(key);
+ gpgme_release(ctx);
+
+ QMailStore::instance()->removeAccounts(QMailAccountKey::customField("verified"));
+}
+
+void tst_Crypto::init()
+{
+}
+
+void tst_Crypto::cleanup()
+{
+}
+
+// RFC 2822 messages use CRLF as the newline indicator
+#define CRLF "\015\012"
+#define CR "\015"
+#define LF "\012"
+
+void tst_Crypto::extractUndecodedData_data()
+{
+ QTest::addColumn<QByteArray>("boundary");
+ QTest::addColumn<QByteArray>("body");
+
+ QTest::newRow("empty part")
+ << QByteArray(CRLF "--_d69d3a43-654c-46a3-ae21-a1fd4e0036a1_" CRLF)
+ << QByteArray(CRLF);
+
+ QTest::newRow("part with LF")
+ << QByteArray(LF "--_d69d3a43-654c-46a3-ae21-a1fd4e0036a1_" LF)
+ << QByteArray("Content-Type: text/plain; charset=UTF-8" LF
+ "Content-Transfer-Encoding: base64" LF
+ LF
+ "SSdtIHN1cmUgdGhlIHRleHQgaXMgcHJpc3RpbmUuIA==");
+
+ QTest::newRow("part with CRLF")
+ << QByteArray(CRLF "--_d69d3a43-654c-46a3-ae21-a1fd4e0036a1_" CRLF)
+ << QByteArray("Content-Type: text/plain; charset=UTF-8" CRLF
+ "Content-Transfer-Encoding: base64" CRLF
+ CRLF
+ "SSdtIHN1cmUgdGhlIHRleHQgaXMgcHJpc3RpbmUuIA==");
+}
+
+void tst_Crypto::extractUndecodedData()
+{
+ QByteArray headers("Subject: Testing signing" CRLF
+ "Content-Type: multipart/signed; micalg=pgp-sha1;" CRLF
+ " protocol=application/pgp-signature;" CRLF
+ " boundary=_d69d3a43-654c-46a3-ae21-a1fd4e0036a1_" CRLF
+ "MIME-Version: 1.0" CRLF);
+ QByteArray footer("Content-Type: application/pgp-signature" CRLF
+ "Content-Transfer-Encoding: 7bit" CRLF
+ "Content-Description: OpenPGP digital signature" CRLF
+ CRLF
+ "abc" CRLF
+ "--_d69d3a43-654c-46a3-ae21-a1fd4e0036a1_--");
+
+ QFETCH(QByteArray, boundary);
+ QFETCH(QByteArray, body);
+
+ QMailMessage mail(QMailMessage::fromRfc2822(headers + boundary + body + boundary + footer));
+ QCOMPARE(int(mail.partCount()), 2);
+ const QMailMessagePart part = mail.partAt(0);
+ QCOMPARE(part.undecodedData(), body);
+}
+
+void tst_Crypto::verify_data()
+{
+ QTest::addColumn<QString>("rfc2822Filename");
+ QTest::addColumn<QMailCryptoFwd::SignatureResult>("expectedStatus");
+ QTest::addColumn<QString>("expectedKeyId");
+
+ QTest::newRow("no multipart/signed mail")
+ << QStringLiteral("testdata/nosig")
+ << QMailCryptoFwd::MissingSignature
+ << QString();
+ QTest::newRow("missing key")
+ << QStringLiteral("testdata/nokey")
+ << QMailCryptoFwd::MissingKey
+ << QStringLiteral("FF914AF0C2B35520");
+ QTest::newRow("wrong signature data")
+ << QStringLiteral("testdata/badsigdata")
+ << QMailCryptoFwd::BadSignature
+ << QStringLiteral("B2D77D1683AF79EC");
+ QTest::newRow("valid signature mail")
+ << QStringLiteral("testdata/validsig")
+ << QMailCryptoFwd::SignatureValid
+ << QStringLiteral("A1B8EF3A16C0B81ECF216C33B2D77D1683AF79EC");
+ QTest::newRow("valid S/MIME mail")
+ << QStringLiteral("testdata/smimesig")
+ << QMailCryptoFwd::SignatureValid
+ << QStringLiteral("8ECF3CB1EBE13E05407F11231FC6DFAC3A126948");
+}
+
+void tst_Crypto::verify()
+{
+ QFETCH(QString, rfc2822Filename);
+ QFETCH(QMailCryptoFwd::SignatureResult, expectedStatus);
+ QFETCH(QString, expectedKeyId);
+
+ QFile f(QStringLiteral("%1/%2").arg(QCoreApplication::applicationDirPath(),
+ rfc2822Filename));
+ if (!f.open(QIODevice::ReadOnly)) {
+ QFAIL("Mail file does not exist or cannot be opened for reading!");
+ }
+
+ QMailMessage msg = QMailMessage::fromRfc2822File(QStringLiteral("%1/%2").arg(QCoreApplication::applicationDirPath(),
+ rfc2822Filename));
+
+ QMailCryptoFwd::VerificationResult result = QMailCryptographicServiceFactory::verifySignature(msg);
+ QCOMPARE(result.summary, expectedStatus);
+ if (expectedStatus == QMailCryptoFwd::MissingSignature
+ || expectedStatus == QMailCryptoFwd::UnknownError)
+ return;
+ QCOMPARE(result.keyResults.length(), 1);
+ QCOMPARE(result.keyResults.at(0).key, expectedKeyId);
+ QCOMPARE(result.keyResults.at(0).status, expectedStatus);
+}
+
+void tst_Crypto::sign_data()
+{
+ QTest::addColumn<QString>("rfc2822Filename");
+ QTest::addColumn<QString>("plugin");
+ QTest::addColumn<QString>("fingerprint");
+ QTest::addColumn<QMailCryptoFwd::SignatureResult>("expectedStatus");
+ QTest::addColumn<QString>("signedFilename");
+
+ QTest::newRow("sign multipart/none mail with OpenPGP")
+ << QStringLiteral("testdata/nosig")
+ << QStringLiteral("libgpgme.so")
+ << m_pKey
+ << QMailCryptoFwd::SignatureValid
+ << QStringLiteral("testdata/aftersig");
+
+ QTest::newRow("sign multipart/none mail with S/MIME")
+ << QStringLiteral("testdata/nosig")
+ << QStringLiteral("libsmime.so")
+ << m_smimeKey
+ << QMailCryptoFwd::SignatureValid
+ << QStringLiteral("testdata/aftersmime");
+}
+
+void tst_Crypto::sign()
+{
+ QFETCH(QString, rfc2822Filename);
+ QFETCH(QString, plugin);
+ QFETCH(QString, fingerprint);
+ QFETCH(QMailCryptoFwd::SignatureResult, expectedStatus);
+ QFETCH(QString, signedFilename);
+
+ QFile f(QStringLiteral("%1/%2").arg(QCoreApplication::applicationDirPath(),
+ rfc2822Filename));
+ if (!f.open(QIODevice::ReadOnly)) {
+ QFAIL("Mail file does not exist or cannot be opened for reading!");
+ }
+
+ // Check message signing.
+ QMailMessage msg = QMailMessage::fromRfc2822File(QStringLiteral("%1/%2").arg(QCoreApplication::applicationDirPath(),
+ rfc2822Filename));
+ QCOMPARE(QMailCryptographicServiceFactory::sign(msg, plugin, QStringList(fingerprint), passphrase), expectedStatus);
+
+ // Check signed message output.
+ // Replace the random boundary strings with a fixed one for comparison.
+ QRegExp rx("qmf:[^=]+==");
+ QString signedMsg = QString(msg.toRfc2822());
+ signedMsg.replace(rx, "testingtestingtesting");
+ QFile f2(QStringLiteral("%1/%2").arg(QCoreApplication::applicationDirPath(),
+ signedFilename));
+ if (!f2.open(QIODevice::ReadOnly)) {
+ QFAIL("Mail file does not exist or cannot be opened for reading!");
+ }
+ QCOMPARE(signedMsg, QString(f2.readAll()));
+
+ // Check that signature is valid.
+ // To be activated later when the passphrase callback will be working
+ // with gnupg >= 2.1
+ // QCOMPARE(QMailCryptographicServiceFactory::verifySignature(msg), expectedStatus);
+}
+
+void tst_Crypto::storage_data()
+{
+ QTest::addColumn<QString>("rfc2822Filename");
+ QTest::addColumn<QString>("plugin");
+
+ QTest::newRow("multipart/signed mail")
+ << QStringLiteral("testdata/validsig")
+ << QStringLiteral("qmfstoragemanager");
+}
+
+void tst_Crypto::storage()
+{
+ QFETCH(QString, rfc2822Filename);
+ QFETCH(QString, plugin);
+
+ QFile f(QStringLiteral("%1/%2").arg(QCoreApplication::applicationDirPath(),
+ rfc2822Filename));
+ if (!f.open(QIODevice::ReadOnly)) {
+ QFAIL("Mail file does not exist or cannot be opened for reading!");
+ }
+
+ // Store message.
+ QMailMessage msg = QMailMessage::fromRfc2822File(QStringLiteral("%1/%2").arg(QCoreApplication::applicationDirPath(),
+ rfc2822Filename));
+ QCOMPARE(msg.partCount(), uint(2));
+ QVERIFY(!msg.partAt(0).undecodedData().isEmpty());
+
+ QMailContentManager *store = QMailContentManagerFactory::create(plugin);
+ QVERIFY(store);
+ QCOMPARE(store->add(&msg, QMailContentManager::EnsureDurability),
+ QMailStore::NoError);
+ QVERIFY(QFile(msg.contentIdentifier() + "-parts/1-raw").exists());
+
+ QMailMessage msg2;
+ QCOMPARE(store->load(msg.contentIdentifier(), &msg2), QMailStore::NoError);
+ QCOMPARE(msg.partAt(0).undecodedData(), msg2.partAt(0).undecodedData());
+}
+
+#include "tst_crypto.moc"
+QTEST_MAIN(tst_Crypto)
diff --git a/tests/tst_crypto/tst_crypto.pro b/tests/tst_crypto/tst_crypto.pro
new file mode 100644
index 00000000..c3e7724b
--- /dev/null
+++ b/tests/tst_crypto/tst_crypto.pro
@@ -0,0 +1,9 @@
+TEMPLATE = app
+CONFIG += qmfclient
+TARGET = tst_crypto
+
+SOURCES += tst_crypto.cpp
+
+LIBS += $$system(gpgme-config --libs)
+
+include(../tests.pri)