def test_verify_sign_from_file_method(self): with NamedTemporaryFile() as sign_file: message = 'Some message' sign = 4, 6 dsa_key = DSAKey() dsa_key.verify = Mock(side_effect=lambda m, r, s: m == message and r == sign[0] and s == sign[1]) sign_file.write('({0},{1})\n{2}\n'.format(sign[0], sign[1], message)) sign_file.seek(0) verify_result = DSASignIO.verify_sign_from_file( dsa_key, sign_file.name) self.assertTrue(verify_result) with NamedTemporaryFile() as sign_file: message = 'Another piece of message' sign = 1, 2 sign_file.write('({0},{1})\n{2}\n'.format(sign[0] + 1, sign[1] - 1, message)) sign_file.seek(0) verify_result = DSASignIO.verify_sign_from_file( dsa_key, sign_file.name) self.assertFalse(verify_result)
def export_key(private_key_filename, public_key_filename): dsa_key = DSAKey.generate_instance(2048) private_key = dsa_key.get_private_key() public_key = dsa_key.get_public_key() DSAKeyIO.export_key(private_key, private_key_filename) DSAKeyIO.export_key(public_key, public_key_filename)
def test_export_sign_to_file_method(self): with NamedTemporaryFile() as sign_file: message = 'This\nis\njust\na\ntest\nmessage' dsa_key = DSAKey() dsa_key.sign = Mock(return_value=(1, 2)) DSASignIO.export_sign_to_file(dsa_key, message, sign_file.name) sign_file.seek(0) file_contents = sign_file.readlines() self.assertEqual(7, len(file_contents)) self.assertEqual('(1,2)', file_contents[0].strip()) self.assertEqual('This', file_contents[1].strip()) self.assertEqual('is', file_contents[2].strip()) self.assertEqual('just', file_contents[3].strip()) self.assertEqual('a', file_contents[4].strip()) self.assertEqual('test', file_contents[5].strip()) self.assertEqual('message', file_contents[6].strip())
def test_positive_workflow(self): dsa_key = DSAKey.generate_instance(2048) private_key = dsa_key.get_private_key() public_key = dsa_key.get_public_key() r, s = private_key.sign('Test message') validity = public_key.verify('Test message', r, s) self.assertTrue(validity)
def test_changed_length_message(self): dsa_key = DSAKey.generate_instance(2048) private_key = dsa_key.get_private_key() public_key = dsa_key.get_public_key() r, s = private_key.sign('Test message') validity = public_key.verify('message', r, s) self.assertFalse(validity)
def test_random_keys(self): dsa_key = DSAKey.generate_instance(2048) private_key = dsa_key.get_private_key() public_key = dsa_key.get_public_key() r, s = private_key.sign('Test message') random_r, random_s = getrandbits(r.bit_length()), getrandbits(s.bit_length()) validity = public_key.verify('Test message', random_r, random_s) self.assertEqual(random_r == r and random_s == s, validity)
def test_random_s_key(self): dsa_key = DSAKey.generate_instance(2048) private_key = dsa_key.get_private_key() public_key = dsa_key.get_public_key() r, s = private_key.sign('Test message') random_s = getrandbits(s.bit_length()) validity = public_key.verify('Test message', r, random_s) self.assertEqual(random_s == s, validity)
def test_verify_sign_from_file_method(self): with NamedTemporaryFile() as sign_file: message = 'Some message' sign = 4, 6 dsa_key = DSAKey() dsa_key.verify = Mock(side_effect=lambda m, r, s: m == message and r == sign[0] and s == sign[1]) sign_file.write('({0},{1})\n{2}\n'.format(sign[0], sign[1], message)) sign_file.seek(0) verify_result = DSASignIO.verify_sign_from_file(dsa_key, sign_file.name) self.assertTrue(verify_result) with NamedTemporaryFile() as sign_file: message = 'Another piece of message' sign = 1, 2 sign_file.write('({0},{1})\n{2}\n'.format(sign[0] + 1, sign[1] - 1, message)) sign_file.seek(0) verify_result = DSASignIO.verify_sign_from_file(dsa_key, sign_file.name) self.assertFalse(verify_result)
def import_key(filename): with open(filename, 'r') as import_file: import_file_contents = import_file.readlines() if len(import_file_contents) < 5: raise IOError('Invalid file contents') dsa_key = DSAKey() try: dsa_key.p = long(import_file_contents[1].strip()) dsa_key.q = long(import_file_contents[2].strip()) dsa_key.g = long(import_file_contents[3].strip()) dsa_key.y = long(import_file_contents[4].strip()) if len(import_file_contents) >= 6: dsa_key.x = long(import_file_contents[5].strip()) except: raise IOError('Invalid file contents') return dsa_key
def test_export_private_key_method(self): with NamedTemporaryFile() as key_file: dsa_key = DSAKey() dsa_key.p = 1 dsa_key.q = 3 dsa_key.g = 5 dsa_key.y = 6 dsa_key.x = 7 DSAKeyIO.export_key(dsa_key, key_file.name) key_file.seek(0) key_file_contents = key_file.readlines() self.assertEqual(6, len(key_file_contents)) self.assertEqual('# private key', key_file_contents[0].strip()) self.assertEqual('1', key_file_contents[1].strip()) self.assertEqual('3', key_file_contents[2].strip()) self.assertEqual('5', key_file_contents[3].strip()) self.assertEqual('6', key_file_contents[4].strip()) self.assertEqual('7', key_file_contents[5].strip())
def test_export_public_key_method(self): with NamedTemporaryFile() as key_file: dsa_key = DSAKey() dsa_key.p = 6 dsa_key.q = 0 dsa_key.g = 9 dsa_key.y = 6 DSAKeyIO.export_key(dsa_key, key_file.name) key_file.seek(0) key_file_contents = key_file.readlines() self.assertEqual(5, len(key_file_contents)) self.assertEqual('# public key', key_file_contents[0].strip()) self.assertEqual('6', key_file_contents[1].strip()) self.assertEqual('0', key_file_contents[2].strip()) self.assertEqual('9', key_file_contents[3].strip()) self.assertEqual('6', key_file_contents[4].strip())