Файл Python читается только после провала модульного теста

1

Я пытаюсь создать unit тест для проверки следующей функции:

    def decrypt_keys(self, enc_password):
        with open ('id_rsa','r') as privkeyfile:
            pem_key = privkeyfile.read()
            print(pem_key)
            priv = rsa.PrivateKey.load_pkcs1(pem_key)
        return rsa.decrypt(base64.b64decode(bytes(enc_password, 'utf-8')),priv).decode('utf-8')

Тем не менее, unit тест не проходит со следующей ошибкой:

ValueError: No PEM start marker "b'-----BEGIN RSA PRIVATE KEY-----'" found

----------------------------------------------------------------------
Ran 1 test in 0.012s

FAILED (errors=1)
b'-----BEGIN RSA PRIVATE KEY-----
 ... rest of private key here ...
-----END RSA PRIVATE KEY-----'

Сразу после этого, как видно, содержимое файла печатается так, как ожидается библиотекой. Как я могу убедиться, что файл полностью прочитан до того, как функция попытается загрузить его как ключ rsa?

  • 0
    Я не совсем понимаю. Ошибка говорит о том, что он видит неправильный стартовый маркер для ключевого файла, а не о неправильном чтении полного файла, о чем вы, похоже, спрашиваете. Вы уверены, что ваш файл содержит то, что вы ожидаете? Сообщение об ошибке показывает b' в начале строки, так что, возможно, вы неправильно написали файл ключа из какого-то другого кода?
  • 0
    @Blckknght Я обновил вопрос, чтобы отразить, что файл / то, что читается из файла, является тем, что ожидает библиотека
Теги:
python-unittest

1 ответ

0

Похоже, ваш файл содержит двоичные кавычки Python, которые нарушают код чтения RSA, поскольку он не знает, как интерпретировать b'...' вокруг вашего закрытого ключа.

Я предлагаю открыть файл закрытого ключа в текстовом редакторе и удалить эти отметки. Возможно, вы также захотите выяснить, откуда был записан файл, и исправить его, если это какая-то другая часть вашего кода. Вы, наверное, называя str на bytes объекта, когда вы должны быть вызовом decode метод (например, binary_key_text.decode()). Или, в качестве альтернативы, вы можете открыть файл в двоичном режиме ('wb'), когда вы пишете его, а затем написать объект bytes напрямую.

Возможно, вы могли бы решить эту проблему в своем чтении кода Python (с помощью чего-то вроде pem_key = pem_key[2:-1], обрезав первые два символа и последний). Но если вы добавите это в свой код, то он будет работать только для неправильно написанных файлов, а не для обычных. Вот как ошибки закрепляются в программном обеспечении, поэтому они не могут быть исправлены в будущем! (Полагаю, вы могли бы защитить операцию нарезки с помощью if pem_key.startswith("b'") and pem_key.endswith("'"), но я бы побеспокоился, если бы код ошибки записи файлов был опубликован широко, и вы действительно нужно гарантировать обратную совместимость.)

  • 0
    Открытие файла в двоичном режиме при записи объекта байтов решило проблему. Хороший улов!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню