summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorDamien Caliste <dcaliste@free.fr>2018-09-19 10:00:45 +0200
committerChristopher Adams <chris.adams@jollamobile.com>2018-10-24 06:26:40 +0000
commit51b9a8bb06dcbebabce29ee5892563c2a2bb01c8 (patch)
tree110b40976172d97fa9e2dce9f804d008a4dbccea /tests
parentd22dca1bbc17ebc86cb7d7316aacf4b773c3150c (diff)
Add an interface for cryptographic operations
Create a new interface for cryptographic operations like digital signatures. Also implement two plug-ins based on GPGme implementing the OpenPGP and S/MIME protocols. To allow digital signature checking to work, pristine data as received from the server need to be stored. This patch is adding such "undecodedData()" information to the content manager. The IMAP implementation has been updated also to ensure that pristine data can be retrieved and saved. Change-Id: Ic801b0de84b42c16f6c64fffdd67dc51c2b8b9b9 Reviewed-by: Christopher Adams <chris.adams@jollamobile.com>
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)