diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/tests.pro | 4 | ||||
-rw-r--r-- | tests/tst_crypto/testdata/FECA2AF719090DD594C02C27F9CB3F8ED7EDAB31.key | bin | 0 -> 1158 bytes | |||
-rw-r--r-- | tests/tst_crypto/testdata/QMFtest.pem | 19 | ||||
-rw-r--r-- | tests/tst_crypto/testdata/aftersig | 26 | ||||
-rw-r--r-- | tests/tst_crypto/testdata/aftersmime | 26 | ||||
-rw-r--r-- | tests/tst_crypto/testdata/badsigdata | 30 | ||||
-rw-r--r-- | tests/tst_crypto/testdata/caliste.asc | 17 | ||||
-rw-r--r-- | tests/tst_crypto/testdata/nokey | 135 | ||||
-rw-r--r-- | tests/tst_crypto/testdata/nosig | 11 | ||||
-rw-r--r-- | tests/tst_crypto/testdata/secret.asc | 18 | ||||
-rw-r--r-- | tests/tst_crypto/testdata/smimesig | 107 | ||||
-rw-r--r-- | tests/tst_crypto/testdata/validsig | 30 | ||||
-rw-r--r-- | tests/tst_crypto/tst_crypto.cpp | 435 | ||||
-rw-r--r-- | tests/tst_crypto/tst_crypto.pro | 9 |
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 Binary files differnew file mode 100644 index 00000000..41bf033f --- /dev/null +++ b/tests/tst_crypto/testdata/FECA2AF719090DD594C02C27F9CB3F8ED7EDAB31.key 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) |