Add a testing mode to GPG.gen_key_input() which uses insecure PRNG.

* This should only be used in the unittests, as the PRNG it uses in GnuPG does
   not create strong keypairs (though it's faster, thus why we're using it for
   testing).
testing/mmn/mktime_takes_localtime_not_gmtime
Isis Lovecruft 2013-05-11 08:43:33 +00:00
parent f95c3c7c1e
commit a7afce0394
No known key found for this signature in database
GPG Key ID: A3ADB67A2CDB8B35
2 changed files with 21 additions and 6 deletions

View File

@ -660,7 +660,7 @@ class GPG(object):
f.close() f.close()
return key return key
def gen_key_input(self, **kwargs): def gen_key_input(self, testing=False, **kwargs):
"""Generate a batch file for input to :meth:`GPG.gen_key()`. """Generate a batch file for input to :meth:`GPG.gen_key()`.
The GnuPG batch file key generation feature allows unattended key The GnuPG batch file key generation feature allows unattended key
@ -720,27 +720,43 @@ class GPG(object):
""" """
parms = {} parms = {}
for key, val in list(kwargs.items()): for key, val in list(kwargs.items()):
key = key.replace('_','-').title() key = key.replace('_','-').title()
if str(val).strip(): # skip empty strings if str(val).strip(): # skip empty strings
parms[key] = val parms[key] = val
parms.setdefault('Key-Type', 'RSA') parms.setdefault('Key-Type', 'RSA')
parms.setdefault('Key-Length', 4096) parms.setdefault('Key-Length', 4096)
parms.setdefault('Name-Real', "Autogenerated Key") parms.setdefault('Name-Real', "Autogenerated Key")
parms.setdefault('Expire-Date', _util._next_year()) parms.setdefault('Expire-Date', _util._next_year())
try: try:
logname = os.environ['LOGNAME'] logname = os.environ['LOGNAME']
except KeyError: except KeyError:
logname = os.environ['USERNAME'] logname = os.environ['USERNAME']
hostname = socket.gethostname() hostname = socket.gethostname()
parms.setdefault('Name-Email', "%s@%s"
% (logname.replace(' ', '_'), hostname)) parms.setdefault('Name-Email', "%s@%s" % (logname.replace(' ', '_'),
hostname))
if testing:
## This specific comment string is required by (some? all?)
## versions of GnuPG to use the insecure PRNG:
parms.setdefault('Name-Comment', 'insecure!')
out = "Key-Type: %s\n" % parms.pop('Key-Type') out = "Key-Type: %s\n" % parms.pop('Key-Type')
for key, val in list(parms.items()): for key, val in list(parms.items()):
out += "%s: %s\n" % (key, val) out += "%s: %s\n" % (key, val)
out += "%%pubring %s\n" % self.pubring out += "%%pubring %s\n" % self.pubring
out += "%%secring %s\n" % self.secring out += "%%secring %s\n" % self.secring
if testing:
out += "%no-protection\n"
out += "%transient-key\n"
out += "%commit\n" out += "%commit\n"
return out return out

View File

@ -265,7 +265,6 @@ class GPGTestCase(unittest.TestCase):
batch = {'Key-Type': key_type, batch = {'Key-Type': key_type,
'Key-Length': key_length, 'Key-Length': key_length,
'Name-Comment': 'python-gnupg tester',
'Expire-Date': 1, 'Expire-Date': 1,
'Name-Real': '%s' % real_name, 'Name-Real': '%s' % real_name,
'Name-Email': ("%s@%s" % (name, email_domain))} 'Name-Email': ("%s@%s" % (name, email_domain))}
@ -276,7 +275,7 @@ class GPGTestCase(unittest.TestCase):
batch['Subkey-Type'] = subkey_type batch['Subkey-Type'] = subkey_type
batch['Subkey-Length'] = key_length batch['Subkey-Length'] = key_length
key_input = self.gpg.gen_key_input(**batch) key_input = self.gpg.gen_key_input(testing=True, **batch)
return key_input return key_input
def generate_key(self, real_name, email_domain, **kwargs): def generate_key(self, real_name, email_domain, **kwargs):
@ -568,7 +567,7 @@ class GPGTestCase(unittest.TestCase):
self.assertAlmostEqual(int(now), int(verified.timestamp), delta=1000) self.assertAlmostEqual(int(now), int(verified.timestamp), delta=1000)
self.assertEqual( self.assertEqual(
verified.username, verified.username,
u'Bruce Schneier (python-gnupg tester) <bruceschneier@schneier.com>') u'Bruce Schneier (insecure!) <bruceschneier@schneier.com>')
def test_signature_verification_clearsign(self): def test_signature_verification_clearsign(self):
"""Test verfication of an embedded signature.""" """Test verfication of an embedded signature."""