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