1import os 2 3import infra.basetest 4 5 6class TestGnupg2(infra.basetest.BRTest): 7 config = infra.basetest.BASIC_TOOLCHAIN_CONFIG + \ 8 """ 9 BR2_PACKAGE_GNUPG2=y 10 BR2_TARGET_ROOTFS_CPIO=y 11 # BR2_TARGET_ROOTFS_TAR is not set 12 """ 13 14 def test_run(self): 15 cpio_file = os.path.join(self.builddir, "images", "rootfs.cpio") 16 self.emulator.boot(arch="armv5", 17 kernel="builtin", 18 options=["-initrd", cpio_file]) 19 self.emulator.login() 20 21 # Some common data for all the tests 22 plain_data = "Some plain text data" 23 plain_file = "file.txt" 24 gpg_file = plain_file + ".gpg" 25 asc_file = plain_file + ".asc" 26 sig_file = plain_file + ".sig" 27 good_passphrase = "Good Passphrase" 28 gpg_userid = "br-test@buildroot" 29 30 # Test the program can execute 31 self.assertRunOk("gpg --version") 32 33 # Generate plain text data 34 cmd = "echo '{}' > {}".format(plain_data, plain_file) 35 self.assertRunOk(cmd) 36 37 # Test symmetric encrypt 38 cmd = "gpg --batch --symmetric" 39 cmd += " --passphrase '{}' {}".format(good_passphrase, plain_file) 40 self.assertRunOk(cmd, timeout=10) 41 42 # Test symmetric decrypt 43 cmd = "gpg --batch --decrypt" 44 cmd += " --passphrase '{}' {}".format(good_passphrase, gpg_file) 45 output, exit_code = self.emulator.run(cmd) 46 self.assertEqual(exit_code, 0) 47 self.assertIn(plain_data, output) 48 49 # Test a failed decrypt with a bad password 50 cmd = "gpg --batch --decrypt" 51 cmd += " --passphrase 'A-Bad-Password' {}".format(gpg_file) 52 _, exit_code = self.emulator.run(cmd) 53 self.assertNotEqual(exit_code, 0) 54 55 # Test the generation of an asymmetric key 56 cmd = "gpg --batch --passphrase ''" 57 cmd += " --quick-generate-key {} default default".format(gpg_userid) 58 self.assertRunOk(cmd) 59 60 # Test asymmetric encrypt+sign 61 cmd = "gpg --batch --yes --encrypt --sign" 62 cmd += " --recipient {} {}".format(gpg_userid, plain_file) 63 self.assertRunOk(cmd) 64 65 # Test asymmetric decrypt+verify 66 cmd = "gpg --decrypt {}".format(gpg_file) 67 output, exit_code = self.emulator.run(cmd) 68 self.assertEqual(exit_code, 0) 69 self.assertIn(plain_data, output) 70 self.assertRegex("\n".join(output), r'gpg: Good signature') 71 72 # Test asymmetric armored encrypt+sign 73 cmd = "gpg --batch --yes --armor --encrypt --sign" 74 cmd += " --recipient {} {}".format(gpg_userid, plain_file) 75 self.assertRunOk(cmd) 76 77 # Test asymmetric armored decrypt+verify 78 cmd = "gpg --armor --decrypt {}".format(asc_file) 79 output, exit_code = self.emulator.run(cmd) 80 self.assertEqual(exit_code, 0) 81 self.assertIn(plain_data, output) 82 self.assertRegex("\n".join(output), r'gpg: Good signature') 83 84 # Test detached signature 85 cmd = "gpg --batch --yes --detach-sign {}".format(plain_file) 86 self.assertRunOk(cmd) 87 88 # Test detached signature verification 89 cmd = "gpg --verify {}".format(sig_file) 90 output, exit_code = self.emulator.run(cmd) 91 self.assertEqual(exit_code, 0) 92 self.assertRegex("\n".join(output), r'gpg: Good signature') 93 94 # Test detached armored signature 95 cmd = "gpg --batch --yes --armor --detach-sign {}".format(plain_file) 96 self.assertRunOk(cmd) 97 98 # Test detached armored signature verification 99 cmd = "gpg --armor --verify {}".format(asc_file) 100 output, exit_code = self.emulator.run(cmd) 101 self.assertEqual(exit_code, 0) 102 self.assertRegex("\n".join(output), r'gpg: Good signature') 103 104 # Test the signature verification of a corrupted file actually fails 105 cmd = "echo 'CORRUPTED' >> {}".format(plain_file) 106 self.assertRunOk(cmd) 107 108 cmd = "gpg --verify {}".format(sig_file) 109 _, exit_code = self.emulator.run(cmd) 110 self.assertNotEqual(exit_code, 0) 111 112 cmd = "gpg --armor --verify {}".format(asc_file) 113 _, exit_code = self.emulator.run(cmd) 114 self.assertNotEqual(exit_code, 0) 115