18
18
"""Tests for signing and verifying blobs of data via gpg."""
20
20
# import system imports here
24
from bzrlib import errors, ui
25
import bzrlib.gpg as gpg
26
from bzrlib.tests import TestCase, TestCaseInTempDir
28
class FakeConfig(object):
30
def gpg_signing_command(self):
34
class TestCommandLine(TestCase):
36
def test_signing_command_line(self):
37
my_gpg = gpg.GPGStrategy(FakeConfig())
38
self.assertEqual(['false', '--clearsign'],
39
my_gpg._command_line())
41
def test_checks_return_code(self):
42
# This test needs a unix like platform - one with 'false' to run.
43
# if you have one, please make this work :)
44
my_gpg = gpg.GPGStrategy(FakeConfig())
45
self.assertRaises(errors.SigningFailed, my_gpg.sign, 'content')
47
def assertProduces(self, content):
48
# This needs a 'cat' command or similar to work.
49
my_gpg = gpg.GPGStrategy(FakeConfig())
50
if sys.platform == 'win32':
51
# Windows doesn't come with cat, and we don't require it
52
# so lets try using python instead.
53
# But stupid windows and line-ending conversions.
54
# It is too much work to make sys.stdout be in binary mode.
55
# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/65443
56
my_gpg._command_line = lambda:[sys.executable, '-c',
57
'import sys; sys.stdout.write(sys.stdin.read())']
58
new_content = content.replace('\n', '\r\n')
60
self.assertEqual(new_content, my_gpg.sign(content))
62
my_gpg._command_line = lambda:['cat', '-']
63
self.assertEqual(content, my_gpg.sign(content))
65
def test_returns_output(self):
66
content = "some content\nwith newlines\n"
67
self.assertProduces(content)
69
def test_clears_progress(self):
70
content = "some content\nwith newlines\n"
71
old_clear_term = ui.ui_factory.clear_term
72
clear_term_called = []
75
clear_term_called.append(True)
76
ui.ui_factory.clear_term = clear_term
78
self.assertProduces(content)
80
ui.ui_factory.clear_term = old_clear_term
81
self.assertEqual([True], clear_term_called)
83
def test_aborts_on_unicode(self):
84
"""You can't sign Unicode text; it must be encoded first."""
85
self.assertRaises(errors.BzrBadParameterUnicode,
86
self.assertProduces, u'foo')
31
from ..sixish import (
40
class FakeConfig(config.MemoryStack):
42
def __init__(self, content=None):
45
gpg_signing_key=amy@example.com
47
super(FakeConfig, self).__init__(content)
50
class TestVerify(TestCase):
52
def import_keys(self):
54
context = gpg.Context()
56
key = gpg.Data(b"""-----BEGIN PGP PUBLIC KEY BLOCK-----
57
Version: GnuPG v1.4.11 (GNU/Linux)
59
mQENBE343IgBCADwzPW7kmKb2bjB+UU+1ER/ABMZspvtoZMPusUw7bk6coXHF/0W
60
u1K/hSYeX9xaGOfOQw41r/g13MoR9dsL6L84RLiisf38rRoBZt+d5bCbZA5Xo801
61
2PeoBoGo6u5oOYKAFLMvrUitPiiE0IT/oQTfC4YUrLN4A+9W0QZruPGIpIXwmZXr
62
L0zsqYfNqIN0ompeJenVpKpvm3loJ/zfK7R3EJ3hsv6nkUmWCFsP1Pw3UV1YuCmw
63
Mkdn1U7DaOql1WjXgj9ABQDJrun2TGsqrSRzBODtHKA/uOX0K3VfKBU8VZo3dXUm
64
1Q4ZeZC39L9qJGTH8TQYlwBLe1yAOp+vx7QJABEBAAG0JEJhemFhciBUZXN0IEtl
65
eSA8YmF6YWFyQGV4YW1wbGUuY29tPokBOAQTAQIAIgUCTfjciAIbAwYLCQgHAwIG
66
FQgCCQoLBBYCAwECHgECF4AACgkQh2gbHuMIDkWJUggAwj537fH6WW+GGLA5onys
67
2hZmXUq/tU+L92bjQoRY4fmsQpk/FUVPUf+NQ0v1gkxx4BTfyYewaj5G6L8cvqW2
68
jj7UiJd8z9gTRxWTnYwfR/w5PGmxfJsBfEUKWsccrPQdOXAhwu0fjYIVk4nqgswa
69
IOAZIwe5Vsfs36uSS7p8RQHAZXLXtTOn3KcXHaxu83w6nc4zkWRovGJ9isBN3haO
70
2qEa0mYiAfDpz40CGtb8N/TQHF3Xcw8rJcxpg6RF3jMtWQnzbVJFp13it00R3LqW
71
o/r3RII3Ii3z2yARlg6D+5hVOrFBV8jFLkff1R2ZnVu+7WOrnbpmt3OiMkSeZrtB
72
OrkBDQRN+NyIAQgArRZ2YGzUj5dXOVIWgZ1/QFpyfx/cG/293WjRE4Wt2e4SxMf2
73
V0dcVCqWwT0+a79Wbausv4bStD4SkwDmu0Jf3z5ERzrr7oZwP0PMsIlM5zT6XSsr
74
6UUneB3UXX7MrEqVogVhRM0ORIaK/oRwMXr7K6xVT+bCBP3/p66kHtY1ZpfEzTEX
75
imBsN3GqoewBHYIneJKBtHE7uzdzw3O5p5dXqoj5foxGi9R1J15vAmt5pI68HJeX
76
P6ktvXbX2Iu7VDNoCvRXM9+ntyJtsXCjNXg4pTGHS/XO4nm2db4FUZOBcVMb1vCc
77
VtFjLTcbCqJqpoJWUtsLcNqDqMHOQDpe6KTNTQARAQABiQEfBBgBAgAJBQJN+NyI
78
AhsMAAoJEIdoGx7jCA5FrR8IANnOF3PUj1TbRcwV6RoWmHsFQHrPmM8ogXia1Lsv
79
jE1iEWoC+muvKh6Oydf90k6ZslS7rdDnp2qzYY8W/TiDkxP+fvsZ4mMi1Y0F+3ty
80
1jzWhcsnB2VrJSiavxEXk0tKPrNv4EUGWG6wHsC9TBj37If+nrMyim94VHvI0eHm
81
X8yMlN4O3HfmgD9CbJdUxueP3e31OIYuwh/6F7GII8TNEVHU/8vh/mQcCxppNbc+
82
boff+kIsoa/TAMLwtJoSrX1nXm0K3vZePRLnIgmwVzdkOIkaRJUG2tSQFvkfhvtE
83
LhnkL5l4MO0wrUds0UWRwa3d7j/P2ExrqXdlLmEzrifWyEQ=
85
-----END PGP PUBLIC KEY BLOCK-----
88
secret_key = gpg.Data(b"""-----BEGIN PGP PRIVATE KEY BLOCK-----
89
Version: GnuPG v1.4.11 (GNU/Linux)
91
lQOYBE343IgBCADwzPW7kmKb2bjB+UU+1ER/ABMZspvtoZMPusUw7bk6coXHF/0W
92
u1K/hSYeX9xaGOfOQw41r/g13MoR9dsL6L84RLiisf38rRoBZt+d5bCbZA5Xo801
93
2PeoBoGo6u5oOYKAFLMvrUitPiiE0IT/oQTfC4YUrLN4A+9W0QZruPGIpIXwmZXr
94
L0zsqYfNqIN0ompeJenVpKpvm3loJ/zfK7R3EJ3hsv6nkUmWCFsP1Pw3UV1YuCmw
95
Mkdn1U7DaOql1WjXgj9ABQDJrun2TGsqrSRzBODtHKA/uOX0K3VfKBU8VZo3dXUm
96
1Q4ZeZC39L9qJGTH8TQYlwBLe1yAOp+vx7QJABEBAAEAB/0RJTbV991SOtVfPQVu
97
LM+tD0SiOXJwIBIINlngsFHWVIiBSDb6uF8dneMR70IRnuEFHFyAUXA7PZDxvcSu
98
phAqIdKCWxQPkAULAS0o4U2K3ZFGh4uOqvfZ8eSnh1rETFv7Yf3u23K89cZiy99n
99
EtWgSqzC/2z5PaZ7/alsYCBqhHuyd4Phaud7qv7FTz8mFrCf+CCY+D08wbnZBu4g
100
N9tBwoxT/UKRfv3nghIh9v+3qWfBEFGhrYbt92XKFbHOQeATZz8AGIv1eqN/+ZQY
101
oYmvVfO3GkrWaRoPeJNLqSDEn/45O1Uh9MJ4mQclXqB0QzMShle8uusHxIeJSQsR
102
z//VBAD11WS7qSgCeiHR+4jDzrrlb2snnA2bfDToEomDxd/n8xm7nJWdkNfJ2BCw
103
KvnxYVxjFNAwkKJGRajzALBLzRVO+K9NtSLiddv5zv+UNdgsKuE8tD7Jqxd/IbWw
104
AimCtL8osnJ+r9dvL+NyjkAT6l/NdEbLXGrBaMeTfSgl2cBOOwQA+sJIh1R5PiCK
105
nLIs9pm3PSy3w92Peelq/x/+0aebTZaJUk2ou3oCvB3druDqrUeaopuuCc0drV7C
106
Ldoey8x/T2ZGzmT2af9qNaD6ScTimDodXcJdwlpobhZTKpsE4EyywpLXtlWte1x0
107
1Mq3llQsIdRdf3GLS+L207hWgKDiDosD/0SyOBO/IBDteeEzeN2hNE3A8oeVbvRS
108
XrS/3uj6oKmlWUBORYP8ptUrXPoVPmNz2y4GO+OysFtfct3Yqb+Sb/52SXMOHTox
109
2oLW08tkzfkDArU5aauMEPmyutGyJ+hGo7fsuLXzXR8OPw4yZJdzG1tRlP2TTKmq
110
Fx8G/Ik6bN4zTYK0JEJhemFhciBUZXN0IEtleSA8YmF6YWFyQGV4YW1wbGUuY29t
111
PokBOAQTAQIAIgUCTfjciAIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQ
112
h2gbHuMIDkWJUggAwj537fH6WW+GGLA5onys2hZmXUq/tU+L92bjQoRY4fmsQpk/
113
FUVPUf+NQ0v1gkxx4BTfyYewaj5G6L8cvqW2jj7UiJd8z9gTRxWTnYwfR/w5PGmx
114
fJsBfEUKWsccrPQdOXAhwu0fjYIVk4nqgswaIOAZIwe5Vsfs36uSS7p8RQHAZXLX
115
tTOn3KcXHaxu83w6nc4zkWRovGJ9isBN3haO2qEa0mYiAfDpz40CGtb8N/TQHF3X
116
cw8rJcxpg6RF3jMtWQnzbVJFp13it00R3LqWo/r3RII3Ii3z2yARlg6D+5hVOrFB
117
V8jFLkff1R2ZnVu+7WOrnbpmt3OiMkSeZrtBOp0DlwRN+NyIAQgArRZ2YGzUj5dX
118
OVIWgZ1/QFpyfx/cG/293WjRE4Wt2e4SxMf2V0dcVCqWwT0+a79Wbausv4bStD4S
119
kwDmu0Jf3z5ERzrr7oZwP0PMsIlM5zT6XSsr6UUneB3UXX7MrEqVogVhRM0ORIaK
120
/oRwMXr7K6xVT+bCBP3/p66kHtY1ZpfEzTEXimBsN3GqoewBHYIneJKBtHE7uzdz
121
w3O5p5dXqoj5foxGi9R1J15vAmt5pI68HJeXP6ktvXbX2Iu7VDNoCvRXM9+ntyJt
122
sXCjNXg4pTGHS/XO4nm2db4FUZOBcVMb1vCcVtFjLTcbCqJqpoJWUtsLcNqDqMHO
123
QDpe6KTNTQARAQABAAf1EfceUlGLvoA/+yDTNTMjuPfzfKwbB/FOVfX44g3Za1eT
124
v7RvSuj4rFYIdE9UvZEei/pqPOSc+hhSsKZCulGXD5TUpf3AyG7ipWU/kID46Csp
125
0V08DPpFHnuw/N6+qNo5iSnhN9U1XMLjYT5d1HvKur26r2vWbmUTSJ1qIluHL2fT
126
R1pKYYLuoff4MIjZ01Hawq72jjor+dLBmMWveHpq4XNp+vQ4x8aFnY9ozufon0nM
127
uRSJRlQjDNB274tvUbmDFP+nzNbqF1nBTZ6FTdH/iKVNbytiYF7Hbat8GWVZqY1u
128
CZr7BklpIVWlk62ll0psMIPVyANi7YT332LLqYmBBADJKTx2dariG/kWU2W/9VEO
129
2VZpqsqazAxOoFEIOpcOlByhhyw5g0IKu0UyzHkhoCje0cWxpdSBFG432b8zL0AT
130
Z0RycfUG7Sgp9CpY1h8Cc/HbBa8xo1fSM7zplPQrHBqUzlVVBq6HOkUq+7qsPFWc
131
RRie95VsDmIMKQKPJHeYHQQA3EYGit+QHV0dccAInghEsf/mq8Gfnvo6HPYhWcDC
132
DTM39NhNlnl1WkTFCd2TWc+TWQ4KlRsh6bMjUpNa2qjrUl90fLekbogcxxMhcwa6
133
xgzEANZfwqdY0u3aB/CyZ6odfThwcAoeqoMpw34CfeKEroubpi2n8wKByrN2MQXJ
134
4vEEAJbXZOqgAcFAFBUVb5mVT0s2lJMagZFPdhRJz2bttz01s/B8aca6CrDpFRjT
135
03zRFUZjwDYqZDWBC181dCE9yla4OkWd5QyRKSS2EE02KEYqRzT0RngQn7s4AW2r
136
326up3Jhleln3hgD4Kk3V3KHmyK8zqZA0qWzry4Vl2jjkbnAPB2JAR8EGAECAAkF
137
Ak343IgCGwwACgkQh2gbHuMIDkWtHwgA2c4Xc9SPVNtFzBXpGhaYewVAes+YzyiB
138
eJrUuy+MTWIRagL6a68qHo7J1/3STpmyVLut0OenarNhjxb9OIOTE/5++xniYyLV
139
jQX7e3LWPNaFyycHZWslKJq/EReTS0o+s2/gRQZYbrAewL1MGPfsh/6eszKKb3hU
140
e8jR4eZfzIyU3g7cd+aAP0Jsl1TG54/d7fU4hi7CH/oXsYgjxM0RUdT/y+H+ZBwL
141
Gmk1tz5uh9/6Qiyhr9MAwvC0mhKtfWdebQre9l49EuciCbBXN2Q4iRpElQba1JAW
142
+R+G+0QuGeQvmXgw7TCtR2zRRZHBrd3uP8/YTGupd2UuYTOuJ9bIRA==
144
-----END PGP PRIVATE KEY BLOCK-----
147
revoked_key = gpg.Data(b"""-----BEGIN PGP PUBLIC KEY BLOCK-----
148
Version: GnuPG v1.4.11 (GNU/Linux)
150
mI0ETjlW5gEEAOb/6P+TVM59E897wRtatxys2BhsHCXM4T7xjIiANfDwejDdifqh
151
tluTfSJLLxPembtrrEjux1C0AJgc+f0MIfsc3Pr3eFJzKB2ot/1IVG1/1KnA0zt3
152
W2xPT3lRib27WJ9Fag+dMtQaIzgJ7/n2DFxsFZ33FD2kxrEXB2exGg6FABEBAAGI
153
pgQgAQIAEAUCTjlXkAkdAHJldm9rZWQACgkQjs6dvEpb0cQPHAP/Wi9rbx0e+1Sf
154
ziGgyVdr3m3A6uvze5oXKVgFRbGRUYSH4/I8GW0W9x4TcRg9h+YaQ8NUdADr9kNE
155
tKAljLqYA5qdqSfYuaij1M++Xj+KUZ359R74sHuQqwnRy1XXQNfRs/QpXA7vLdds
156
rjg+pbWuXO92TZJUdnqtWW+VEyZBsPy0G3Rlc3Qga2V5IDx0ZXN0QGV4YW1wbGUu
157
Y29tPoi4BBMBAgAiBQJOOVbmAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAK
158
CRCOzp28SlvRxNWzA/42WVmI0b+6mF/imEOlY1TiyvrcpK250rkSDsCtL4lOwy7G
159
antZhpgNfnXRd/ySfsS3EB6dpOWgOSxGRvWQhA+vxBT9BYNk49qd3JIrSaSWpR12
160
rET8qO1rEQQFWsw03CxTGujxGlmEO+a1yguRXp2UWaY7FngcQmD+8q7BUIVm7riN
161
BE45VuYBBADTEH2jHTjNCc5CMOhea6EJTrkx3upcEqB2oyhWeSWJiBGOxlcddsjo
162
3J3/EmBB8kK1hM9TidD3SG64x1N287lg8ELJBlKv+pQVyxohGJ1u/THgpTDMMQcL
163
luG5rAHQGSfyzKTiOnaTyBYg3M/nzgUOU9dKEFB0EA3tjUXFOT+r3wARAQABiJ8E
164
GAECAAkFAk45VuYCGwwACgkQjs6dvEpb0cRSLQP/fzCWX2lXwlwWiVF8BOPF7o9z
165
icHErc7/X17RGb4qj1kVf+UkRdUWJrbEVh4h6MncBIuA70WsYogiw+Kz/0LCtQAR
166
YUJsPy/EL++OKPH1aFasOdTxwkTka85+RdYqhP1+z/aYLFMWq6mRFI+o6x2k5mGi
169
-----END PGP PUBLIC KEY BLOCK-----
172
expired_key = gpg.Data(b"""-----BEGIN PGP PUBLIC KEY BLOCK-----
173
Version: GnuPG v1.4.11 (GNU/Linux)
175
mI0ETjZ6PAEEALkR4GcFQidCCxV7pgQwQd5MZua0YO2l92fVqHX+PhnZ6egCLKdD
176
2bWlMUd6MLPF3FlRL7BBAxvW/DazkBOp7ljsnpMpptEzY49Uem1irYLYiVb9zK96
177
0sQZzFxFkfEYetQEXC68mIck8tbySOX5NAOw++3jFm3J7dsU1R3XtYzRABEBAAG0
178
G3Rlc3Qga2V5IDx0ZXN0QGV4YW1wbGUuY29tPoi+BBMBAgAoBQJONno8AhsDBQkA
179
AVGABgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRAc4m97T40VEz+DA/9PBphG
180
Yp9cHVaHSfTUKGTGgIbvRe60sFNpDCYZeAGDrygOMuI8MNzbVpwefRBFHVPx7jWd
181
rrYMsLkcsNUS9D0baU+0D/qp7JVg7ZSQtG0O6IG4eTZhibteY1fu0+unlXmg9NHx
182
5VvhwzBiJDYji00M2p/CZEMiYFUuy76CsxUpN7iNBE42ejwBBACkv2/mX7IPQg0C
183
A3KSrJsJv+sdvKm4b4xuI4OwagwTIVz4KlTqV4IBrVjSBfwyMXucXz0bTW85qjgA
184
+n67td8vyjYYZUEz1uY9lSquQQDnAN0txL3cLHZXWiWOkmzZVddQtlflK2a/J9o0
185
QkHPVUm+hc4l64dIzStrNl2S66fAvQARAQABiKUEGAECAA8FAk42ejwCGwwFCQAB
186
UYAACgkQHOJve0+NFROEYQP/epg+o8iBs31hkSERyZjrRR66LpywezWj30Rn/3mX
187
Fzi9HkF4xLemWOzdNt9C5PYrOep85PQg8haEjknxVjZFS0ikT1h3OWk/TF1ZrLVm
188
WzyX8DaHQEjKpLJJjXcAbTiZBNMk0QaVC9RvIeHpCf3n3DC49DdjsPJRMKOn8KDi
191
-----END PGP PUBLIC KEY BLOCK-----
193
context.op_import(key)
194
context.op_import(secret_key)
195
context.op_import(revoked_key)
196
context.op_import(expired_key)
198
def test_verify_untrusted_but_accepted(self):
199
#untrusted by gpg but listed as acceptable_keys by user
200
self.requireFeature(features.gpg)
203
content = """-----BEGIN PGP SIGNED MESSAGE-----
206
bazaar-ng testament short form 1
207
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
208
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
209
-----BEGIN PGP SIGNATURE-----
210
Version: GnuPG v1.4.11 (GNU/Linux)
212
iQEcBAEBAgAGBQJN+ekFAAoJEIdoGx7jCA5FGtEH/i+XxJRvqU6wdBtLVrGBMAGk
213
FZ5VP+KyXYtymSbgSstj/vM12NeMIeFs3xGnNnYuX1MIcY6We5TKtCH0epY6ym5+
214
6g2Q2QpQ5/sT2d0mWzR0K4uVngmxVQaXTdk5PdZ40O7ULeDLW6CxzxMHyUL1rsIx
215
7UBUTBh1O/1n3ZfD99hUkm3hVcnsN90uTKH59zV9NWwArU0cug60+5eDKJhSJDbG
216
rIwlqbFAjDZ7L/48e+IaYIJwBZFzMBpJKdCxzALLtauMf+KK8hGiL2hrRbWm7ty6
217
NgxfkMYOB4rDPdSstT35N+5uBG3n/UzjxHssi0svMfVETYYX40y57dm2eZQXFp8=
219
-----END PGP SIGNATURE-----
221
plain = """bazaar-ng testament short form 1
222
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
223
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
225
my_gpg = gpg.GPGStrategy(FakeConfig())
226
my_gpg.set_acceptable_keys("bazaar@example.com")
227
self.assertEqual((gpg.SIGNATURE_VALID, None), my_gpg.verify(content,
230
def test_verify_unacceptable_key(self):
231
self.requireFeature(features.gpg)
234
content = """-----BEGIN PGP SIGNED MESSAGE-----
237
bazaar-ng testament short form 1
238
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
239
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
240
-----BEGIN PGP SIGNATURE-----
241
Version: GnuPG v1.4.11 (GNU/Linux)
243
iQEcBAEBAgAGBQJN+ekFAAoJEIdoGx7jCA5FGtEH/i+XxJRvqU6wdBtLVrGBMAGk
244
FZ5VP+KyXYtymSbgSstj/vM12NeMIeFs3xGnNnYuX1MIcY6We5TKtCH0epY6ym5+
245
6g2Q2QpQ5/sT2d0mWzR0K4uVngmxVQaXTdk5PdZ40O7ULeDLW6CxzxMHyUL1rsIx
246
7UBUTBh1O/1n3ZfD99hUkm3hVcnsN90uTKH59zV9NWwArU0cug60+5eDKJhSJDbG
247
rIwlqbFAjDZ7L/48e+IaYIJwBZFzMBpJKdCxzALLtauMf+KK8hGiL2hrRbWm7ty6
248
NgxfkMYOB4rDPdSstT35N+5uBG3n/UzjxHssi0svMfVETYYX40y57dm2eZQXFp8=
250
-----END PGP SIGNATURE-----
252
plain = """bazaar-ng testament short form 1
253
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
254
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
256
my_gpg = gpg.GPGStrategy(FakeConfig())
257
my_gpg.set_acceptable_keys("foo@example.com")
258
self.assertEqual((gpg.SIGNATURE_KEY_MISSING, u'E3080E45'),
259
my_gpg.verify(content, plain))
261
def test_verify_valid_but_untrusted(self):
262
self.requireFeature(features.gpg)
265
content = """-----BEGIN PGP SIGNED MESSAGE-----
268
bazaar-ng testament short form 1
269
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
270
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
271
-----BEGIN PGP SIGNATURE-----
272
Version: GnuPG v1.4.11 (GNU/Linux)
274
iQEcBAEBAgAGBQJN+ekFAAoJEIdoGx7jCA5FGtEH/i+XxJRvqU6wdBtLVrGBMAGk
275
FZ5VP+KyXYtymSbgSstj/vM12NeMIeFs3xGnNnYuX1MIcY6We5TKtCH0epY6ym5+
276
6g2Q2QpQ5/sT2d0mWzR0K4uVngmxVQaXTdk5PdZ40O7ULeDLW6CxzxMHyUL1rsIx
277
7UBUTBh1O/1n3ZfD99hUkm3hVcnsN90uTKH59zV9NWwArU0cug60+5eDKJhSJDbG
278
rIwlqbFAjDZ7L/48e+IaYIJwBZFzMBpJKdCxzALLtauMf+KK8hGiL2hrRbWm7ty6
279
NgxfkMYOB4rDPdSstT35N+5uBG3n/UzjxHssi0svMfVETYYX40y57dm2eZQXFp8=
281
-----END PGP SIGNATURE-----
283
plain = """bazaar-ng testament short form 1
284
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
285
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
287
my_gpg = gpg.GPGStrategy(FakeConfig())
288
self.assertEqual((gpg.SIGNATURE_NOT_VALID, None), my_gpg.verify(content,
291
def test_verify_bad_testament(self):
292
self.requireFeature(features.gpg)
295
content = """-----BEGIN PGP SIGNED MESSAGE-----
298
bazaar-ng testament short form 1
299
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
300
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
301
-----BEGIN PGP SIGNATURE-----
302
Version: GnuPG v1.4.11 (GNU/Linux)
304
iQEcBAEBAgAGBQJN+ekFAAoJEIdoGx7jCA5FGtEH/i+XxJRvqU6wdBtLVrGBMAGk
305
FZ5VP+KyXYtymSbgSstj/vM12NeMIeFs3xGnNnYuX1MIcY6We5TKtCH0epY6ym5+
306
6g2Q2QpQ5/sT2d0mWzR0K4uVngmxVQaXTdk5PdZ40O7ULeDLW6CxzxMHyUL1rsIx
307
7UBUTBh1O/1n3ZfD99hUkm3hVcnsN90uTKH59zV9NWwArU0cug60+5eDKJhSJDbG
308
rIwlqbFAjDZ7L/48e+IaYIJwBZFzMBpJKdCxzALLtauMf+KK8hGiL2hrRbWm7ty6
309
NgxfkMYOB4rDPdSstT35N+5uBG3n/UzjxHssi0svMfVETYYX40y57dm2eZQXFp8=
311
-----END PGP SIGNATURE-----
313
plain = """bazaar-ng testament short form 1
314
revision-id: doctor@example.com-20110527185938-hluafawphszb8dl1
315
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
317
my_gpg = gpg.GPGStrategy(FakeConfig())
318
my_gpg.set_acceptable_keys("bazaar@example.com")
319
self.assertEqual((gpg.SIGNATURE_NOT_VALID, None), my_gpg.verify(content,
323
def test_verify_revoked_signature(self):
324
self.requireFeature(features.gpg)
327
content = """-----BEGIN PGP SIGNED MESSAGE-----
331
-----BEGIN PGP SIGNATURE-----
332
Version: GnuPG v1.4.11 (GNU/Linux)
334
iJwEAQECAAYFAk45V18ACgkQjs6dvEpb0cSIZQP/eOGTXGPlrNwvDkcX2d8O///I
335
ecB4sUIUEpv1XAk1MkNu58lsjjK72lRaLusEGqd7HwrFmpxVeVs0oWLg23PNPCFs
336
yJBID9ma+VxFVPtkEFnrc1R72sBJLfBcTxMkwVTC8eeznjdtn+cg+aLkxbPdrGnr
339
-----END PGP SIGNATURE-----
342
my_gpg = gpg.GPGStrategy(FakeConfig())
343
my_gpg.set_acceptable_keys("test@example.com")
344
self.assertEqual((gpg.SIGNATURE_NOT_VALID, None), my_gpg.verify(content,
347
def test_verify_invalid(self):
348
self.requireFeature(features.gpg)
350
content = """-----BEGIN PGP SIGNED MESSAGE-----
353
bazaar-ng testament short form 1
354
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
355
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
356
-----BEGIN PGP SIGNATURE-----
357
Version: GnuPG v1.4.11 (GNU/Linux)
359
iEYEARECAAYFAk33gYsACgkQpQbm1N1NUIhiDACglOuQDlnSF4NxfHSkN/zrmFy8
360
nswAoNGXAVuR9ONasAKIGBNUE0b+lols
362
-----END PGP SIGNATURE-----
364
plain = """bazaar-ng testament short form 1
365
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
366
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
368
my_gpg = gpg.GPGStrategy(FakeConfig())
369
self.assertEqual((gpg.SIGNATURE_NOT_VALID, None),
370
my_gpg.verify(content, plain))
372
def test_verify_expired_but_valid(self):
373
self.requireFeature(features.gpg)
375
content = """-----BEGIN PGP SIGNED MESSAGE-----
378
bazaar-ng testament short form 1
379
revision-id: test@example.com-20110801100657-f1dr1nompeex723z
380
sha1: 59ab434be4c2d5d646dee84f514aa09e1b72feeb
381
-----BEGIN PGP SIGNATURE-----
382
Version: GnuPG v1.4.10 (GNU/Linux)
384
iJwEAQECAAYFAk42esUACgkQHOJve0+NFRPc5wP7BoZkzBU8JaHMLv/LmqLr0sUz
385
zuE51ofZZ19L7KVtQWsOi4jFy0fi4A5TFwO8u9SOfoREGvkw292Uty9subSouK5/
386
mFmDOYPQ+O83zWgYZsBmMJWYDZ+X9I6XXZSbPtV/7XyTjaxtl5uRnDVJjg+AzKvD
389
-----END PGP SIGNATURE-----
391
plain = """bazaar-ng testament short form 1
392
revision-id: test@example.com-20110801100657-f1dr1nompeex723z
393
sha1: 59ab434be4c2d5d646dee84f514aa09e1b72feeb
395
my_gpg = gpg.GPGStrategy(FakeConfig())
396
self.assertEqual((gpg.SIGNATURE_EXPIRED, u'4F8D1513'),
397
my_gpg.verify(content, plain))
399
def test_verify_unknown_key(self):
400
self.requireFeature(features.gpg)
402
content = """-----BEGIN PGP SIGNED MESSAGE-----
406
-----BEGIN PGP SIGNATURE-----
407
Version: GnuPG v1.4.11 (GNU/Linux)
409
iQEcBAEBAgAGBQJOORKwAAoJENf6AkFdUeVvJDYH/1Cz+AJn1Jvy5n64o+0fZ5Ow
410
Y7UQb4QQTIOV7jI7n4hv/yBzuHrtImFzYvQl/o2Ezzi8B8L5gZtQy+xCUF+Q8iWs
411
gytZ5JUtSze7hDZo1NUl4etjoRGYqRfrUcvE2LkVH2dFbDGyyQfVmoeSHa5akuuP
412
QZmyg2F983rACVIpGvsqTH6RcBdvE9vx68lugeKQA8ArDn39/74FBFipFzrXSPij
413
eKFpl+yZmIb3g6HkPIC8o4j/tMvc37xF1OG5sBu8FT0+FC+VgY7vAblneDftAbyP
414
sIODx4WcfJtjLG/qkRYqJ4gDHo0eMpTJSk2CWebajdm4b+JBrM1F9mgKuZFLruE=
416
-----END PGP SIGNATURE-----
419
my_gpg = gpg.GPGStrategy(FakeConfig())
420
self.assertEqual((gpg.SIGNATURE_KEY_MISSING, u'5D51E56F'),
421
my_gpg.verify(content, plain))
423
def test_set_acceptable_keys(self):
424
self.requireFeature(features.gpg)
426
my_gpg = gpg.GPGStrategy(FakeConfig())
427
my_gpg.set_acceptable_keys("bazaar@example.com")
428
self.assertEqual(my_gpg.acceptable_keys,
429
[u'B5DEED5FCB15DAE6ECEF919587681B1EE3080E45'])
431
def test_set_acceptable_keys_from_config(self):
432
self.requireFeature(features.gpg)
434
my_gpg = gpg.GPGStrategy(FakeConfig(
435
'acceptable_keys=bazaar@example.com'))
436
my_gpg.set_acceptable_keys(None)
437
self.assertEqual(my_gpg.acceptable_keys,
438
[u'B5DEED5FCB15DAE6ECEF919587681B1EE3080E45'])
440
def test_set_acceptable_keys_unknown(self):
441
self.requireFeature(features.gpg)
442
my_gpg = gpg.GPGStrategy(FakeConfig())
445
self.notes.append(args[0] % args[1:])
446
self.overrideAttr(trace, 'note', note)
447
my_gpg.set_acceptable_keys("unknown")
448
self.assertEqual(my_gpg.acceptable_keys, [])
449
self.assertEqual(self.notes,
450
['No GnuPG key results for pattern: unknown'])
89
453
class TestDisabled(TestCase):
91
455
def test_sign(self):
92
self.assertRaises(errors.SigningFailed,
456
self.assertRaises(gpg.SigningFailed,
93
457
gpg.DisabledGPGStrategy(None).sign, 'content')
459
def test_verify(self):
460
self.assertRaises(gpg.SignatureVerificationFailed,
461
gpg.DisabledGPGStrategy(None).verify, 'content',