def setUp(self):
     self.sdk = CryptoProSDK()
Exemple #2
0
class TestCryptoProSDK(unittest.TestCase):
    def setUp(self):
        self.sdk = CryptoProSDK()

    def _get_content(self, file_name):
        with open(file_name, 'rb') as f:
            return f.read()

    def _get_content_b64(self, filename):
        return b64encode(self._get_content(filename))

    def test_verify_detached(self):
        with open(os.path.join(files_dir, 'signatures', 'doc.txt'), 'rb') as f:
            content = b64encode(f.read())

        with open(os.path.join(files_dir, 'signatures', 'doc.txt.sgn'),
                  'rb') as f:
            signature = f.read()

        res = self.sdk.verify_detached(content, signature)

        self.assertEqual(res.verification_status, 0)
        self.assertIsNotNone(res.cert)

    def test_bad_signature(self):
        with open(os.path.join(files_dir, 'signatures', 'doc.txt'), 'rb') as f:
            content = b64encode(f.read())

        res = self.sdk.verify_detached(content, 'signature')

        self.assertEqual(res.verification_status, -1)
        self.assertIsNone(res.cert)
        self.assertEqual(res.error, CRYPT_E_INVALID_MSG_TYPE)

    def test_hash(self):
        with open(os.path.join(files_dir, 'signatures', 'doc.txt'), 'rb') as f:
            content = f.read()

        self.assertEqual(
            self.sdk.create_hash(content),
            '445888F2DEA25B3AD0187186CC18BD74D79CEF78498EF308755459AFE4552EBA')

        with open(os.path.join(files_dir, 'img.png'), 'rb') as f:
            content = f.read()

        self.assertEqual(
            self.sdk.create_hash(content),
            '799025F048414BD20681D41EDFEE3158D7D5B14DDCB17912E38DE0B620C353B7')

    def test_get_cert_by_thumbprint(self):
        cert = self.sdk.get_cert_by_thumbprint(
            'ROOT', '046255290b0eb1cdd1797d9ab8c81f699e3687f3')
        self.assertIsNotNone(cert)
        self.assertEqual(
            cert.subject.as_string(),
            '[email protected], C=RU, L=Moscow, O=CRYPTO-PRO LLC, CN=CRYPTO-PRO Test Center 2'
        )
        self.assertEqual(
            cert.issuer.as_string(),
            '[email protected], C=RU, L=Moscow, O=CRYPTO-PRO LLC, CN=CRYPTO-PRO Test Center 2'
        )
        self.assertEqual(cert.valid_from, datetime(2014, 8, 5, 13, 44, 24))
        self.assertEqual(cert.valid_to, datetime(2019, 8, 5, 13, 54, 3))
        self.assertEqual(cert.thumbprint.lower(),
                         '046255290b0eb1cdd1797d9ab8c81f699e3687f3')

    def test_get_cert_by_subject(self):
        cert = self.sdk.get_cert_by_subject('ROOT', 'CRYPTO-PRO Test Center 2')
        self.assertIsNotNone(cert)

        cert = self.sdk.get_cert_by_subject('ROOT', '*****@*****.**')
        self.assertIsNotNone(cert)

    def test_subject_data(self):
        cert = self.sdk.get_cert_by_thumbprint(
            'ROOT', '046255290b0eb1cdd1797d9ab8c81f699e3687f3')
        subject_data = cert.subject.as_dict()
        self.assertIn('CN', subject_data)
        self.assertEqual(subject_data['CN'], 'CRYPTO-PRO Test Center 2')

    def test_install_and_delete_certificate(self):
        with open(os.path.join(files_dir, 'certs', 'uc_1_is_guc.cer'),
                  'rb') as f:
            cert_str = f.read()

        self.sdk.install_certificate('CA', b64encode(cert_str).decode('utf-8'))

        cert = self.sdk.get_cert_by_thumbprint(
            'CA', '9e78a331020e528c046ffd57704a21b7d2241cb3')
        self.assertIsNotNone(cert)
        self.assertTrue(
            self.sdk.delete_certificate(
                'CA', '9e78a331020e528c046ffd57704a21b7d2241cb3'))

    def test_get_signer_certificate_from_signature(self):
        signature_content = self._get_content(
            os.path.join(files_dir, 'signatures', 'doc.txt.sgn'))
        cert = self.sdk.get_signer_cert_from_signature(signature_content)
        self.assertIsNotNone(cert)
        self.assertEqual(
            cert.issuer.as_string(),
            '[email protected], C=RU, L=Moscow, O=CRYPTO-PRO LLC, CN=CRYPTO-PRO Test Center 2'
        )
        self.assertEqual(
            cert.subject.as_string(),
            'CN=Иванов Иван Иванович, INN=123456789047, OGRN=1123300000053, SNILS=12345678901, STREET="Улица, дом", L=Город'
        )
        subject_dict = cert.subject.as_dict()
        self.assertEqual(subject_dict['CN'], 'Иванов Иван Иванович')
        self.assertEqual(subject_dict['INN'], '123456789047')
        self.assertEqual(subject_dict['OGRN'], '1123300000053')
        self.assertEqual(subject_dict['SNILS'], '12345678901')
        self.assertEqual(subject_dict['STREET'], '"Улица, дом"')
        self.assertEqual(subject_dict['L'], 'Город')
class TestCryptoProSDK(unittest.TestCase):
    def setUp(self):
        self.sdk = CryptoProSDK()

    def _get_content(self, file_name, mode='rb'):
        with open(file_name, mode) as f:
            return f.read()

    def _get_content_b64(self, filename, mode='rb'):
        return b64encode(self._get_content(filename, mode))

    def test_sign_and_verify(self):
        cert = self.sdk.get_cert_by_subject('MY', 'pycryptoprosdk')
        message = 'qwerty'
        signature = self.sdk.sign(message, cert.thumbprint, 'MY')
        res = self.sdk.verify(signature)
        self.assertEqual(res.verification_status, 0)
        self.assertIsNotNone(res.cert)
        self.assertEqual(res.message, message.encode('utf-8'))

    def test_sign_and_verify_detached(self):
        content = b'test content'
        cert = self.sdk.get_cert_by_subject('MY', 'pycryptoprosdk')
        signature = self.sdk.sign(content,
                                  cert.thumbprint,
                                  'MY',
                                  detached=True)

        res = self.sdk.verify_detached(content, signature)

        self.assertEqual(0, res.verification_status)
        self.assertIsNotNone(res.cert)

        cert = self.sdk.get_signer_cert_from_signature(signature)

        self.assertIsNone(cert.alt_name)

        self.assertEqual(
            cert.issuer.as_string(),
            '[email protected], C=RU, L=Moscow, O=CRYPTO-PRO LLC, CN=CRYPTO-PRO Test Center 2'
        )
        self.assertEqual(
            cert.subject.as_string(),
            'CN=pycryptoprosdk, INN=123456789047, OGRN=1123300000053, SNILS=12345678901, STREET="Улица, дом", L=Город'
        )
        subject_dict = cert.subject.as_dict()
        self.assertEqual(subject_dict['CN'], 'pycryptoprosdk')
        self.assertEqual(subject_dict['INN'], '123456789047')
        self.assertEqual(subject_dict['OGRN'], '1123300000053')
        self.assertEqual(subject_dict['SNILS'], '12345678901')
        self.assertEqual(subject_dict['STREET'], '"Улица, дом"')
        self.assertEqual(subject_dict['L'], 'Город')

        self.assertEqual(cert.subject.personal_info, subject_dict)
        self.assertEqual(cert.subject.cn, 'pycryptoprosdk')
        self.assertEqual(cert.subject.inn, '123456789047')
        self.assertEqual(cert.subject.snils, '12345678901')
        self.assertEqual(cert.subject.street, '"Улица, дом"')
        self.assertEqual(cert.subject.city, 'Город')

    def test_bad_signature_verify_detached(self):
        content = '12345'

        res = self.sdk.verify_detached(content, b64encode(b'signature'))

        self.assertEqual(res.verification_status, -1)
        self.assertIsNone(res.cert)
        self.assertEqual(CRYPT_E_INVALID_MSG_TYPE, res.error)

    def test_bad_signature_verify(self):
        res = self.sdk.verify(b64encode(b'signature'))

        self.assertEqual(res.verification_status, -1)
        self.assertIsNone(res.cert)
        self.assertIsNone(res.message)
        self.assertEqual(CRYPT_E_INVALID_MSG_TYPE, res.error)

    def test_hash_CALG_GR3411(self):
        content = 'Данные для подписи\n'

        self.assertEqual(
            self.sdk.create_hash(content, 'CALG_GR3411'),
            '445888F2DEA25B3AD0187186CC18BD74D79CEF78498EF308755459AFE4552EBA')

        content = self._get_content(os.path.join(files_dir, 'img.png'))

        self.assertEqual(
            self.sdk.create_hash(content, 'CALG_GR3411'),
            '799025F048414BD20681D41EDFEE3158D7D5B14DDCB17912E38DE0B620C353B7')

    def test_hash_CALG_GR3411_2012_256(self):
        content = 'Данные для подписи\n'

        self.assertEqual(
            self.sdk.create_hash(content, 'CALG_GR3411_2012_256'),
            'AE943FBB2751DB601DEB5D90740CEA221B2EE0CD9A2A0D16E0F3A13DB78A02B5')

    def test_hash_CALG_GR3411_2012_512(self):
        content = 'Данные для подписи\n'

        self.assertEqual(
            self.sdk.create_hash(content, 'CALG_GR3411_2012_512'),
            '32C1304E914F0616063D7765EBA5C81F907AB8CD684C0787ED9445DD74B8CD95A5C286B249EE338CFAA3F446057B6107E151596BC0240474BC342160F2440089'
        )

    def test_get_cert_by_thumbprint(self):
        cert = self.sdk.get_cert_by_thumbprint(
            'ROOT', '046255290b0eb1cdd1797d9ab8c81f699e3687f3')
        self.assertIsNotNone(cert)
        self.assertEqual(
            cert.subject.as_string(),
            '[email protected], C=RU, L=Moscow, O=CRYPTO-PRO LLC, CN=CRYPTO-PRO Test Center 2'
        )
        self.assertEqual(
            cert.issuer.as_string(),
            '[email protected], C=RU, L=Moscow, O=CRYPTO-PRO LLC, CN=CRYPTO-PRO Test Center 2'
        )
        self.assertEqual(cert.valid_from, datetime(2014, 8, 5, 13, 44, 24))
        self.assertEqual(cert.valid_to, datetime(2019, 8, 5, 13, 54, 3))
        self.assertEqual(cert.thumbprint.lower(),
                         '046255290b0eb1cdd1797d9ab8c81f699e3687f3')

    def test_get_cert_by_subject(self):
        cert = self.sdk.get_cert_by_subject('ROOT', 'CRYPTO-PRO Test Center 2')
        self.assertIsNotNone(cert)

        self.assertEqual(
            cert.issuer.as_string(),
            '[email protected], C=RU, L=Moscow, O=CRYPTO-PRO LLC, CN=CRYPTO-PRO Test Center 2'
        )

    def test_subject_data(self):
        cert = self.sdk.get_cert_by_thumbprint(
            'ROOT', '046255290b0eb1cdd1797d9ab8c81f699e3687f3')
        subject_data = cert.subject.as_dict()
        self.assertIn('CN', subject_data)
        self.assertEqual(subject_data['CN'], 'CRYPTO-PRO Test Center 2')

    def test_install_and_delete_certificate(self):
        store = 'MY'
        thumbprint = '9e78a331020e528c046ffd57704a21b7d2241cb3'

        with self.assertRaises(CertDoesNotExist) as context:
            self.sdk.get_cert_by_thumbprint(store, thumbprint)
        self.assertTrue('Could not find the desired certificate.' in str(
            context.exception))

        cert_str = self._get_content_b64(
            os.path.join(files_dir, 'certs', 'uc_1_is_guc.cer'))
        self.sdk.install_certificate('MY', cert_str.decode('utf-8'))

        cert = self.sdk.get_cert_by_thumbprint(store, thumbprint)
        self.assertIsNotNone(cert)
        self.sdk.delete_certificate(store, thumbprint)

        with self.assertRaises(CertDoesNotExist) as context:
            self.sdk.get_cert_by_thumbprint(store, thumbprint)
        self.assertTrue('Could not find the desired certificate.' in str(
            context.exception))

    def test_inn_original(self):
        subject_string = '\r\n'.join(['INN=003456789047'])
        subject = Subject(subject_string)
        self.assertEqual(subject.inn_original, '003456789047')
        self.assertEqual(subject.inn, '3456789047')

    def test_sign_file_content(self):
        content = self._get_content(os.path.join(files_dir, 'img.png'))
        cert = self.sdk.get_cert_by_subject('MY', 'pycryptoprosdk')
        signature = self.sdk.sign(content,
                                  cert.thumbprint,
                                  'MY',
                                  detached=False)
        self.assertTrue(len(signature) > 0)

    def test_sign_message_as_string(self):
        cert = self.sdk.get_cert_by_subject('MY', 'pycryptoprosdk')
        signature = self.sdk.sign('qwerty',
                                  cert.thumbprint,
                                  'MY',
                                  detached=False)
        self.assertTrue(len(signature) > 0)

    def test_sign_message_as_binary(self):
        cert = self.sdk.get_cert_by_subject('MY', 'pycryptoprosdk')
        signature = self.sdk.sign(b'qwerty',
                                  cert.thumbprint,
                                  'MY',
                                  detached=False)
        self.assertTrue(len(signature) > 0)
Exemple #4
0
class TestCryptoProSDK(unittest.TestCase):
    def setUp(self):
        self.sdk = CryptoProSDK()

    def _get_content(self, file_name):
        with open(file_name, 'rb') as f:
            return f.read()

    def _get_content_b64(self, filename):
        return b64encode(self._get_content(filename))

    def test_verify_detached(self):
        with open(os.path.join(files_dir, 'signatures', 'doc.txt'), 'rb') as f:
            content = b64encode(f.read())

        with open(os.path.join(files_dir, 'signatures', 'doc.txt.sgn'),
                  'rb') as f:
            signature = f.read()

        res = self.sdk.verify_detached(content, signature)

        self.assertEqual(res.verification_status, 0)
        self.assertIsNotNone(res.cert)

    def test_bad_signature(self):
        with open(os.path.join(files_dir, 'signatures', 'doc.txt'), 'rb') as f:
            content = b64encode(f.read())

        res = self.sdk.verify_detached(content, 'signature')

        self.assertEqual(res.verification_status, -1)
        self.assertIsNone(res.cert)
        self.assertEqual(res.error, CRYPT_E_INVALID_MSG_TYPE)

    def test_hash_CALG_GR3411(self):
        with open(os.path.join(files_dir, 'signatures', 'doc.txt'), 'rb') as f:
            content = f.read()

        self.assertEqual(
            self.sdk.create_hash(content, 'CALG_GR3411'),
            '445888F2DEA25B3AD0187186CC18BD74D79CEF78498EF308755459AFE4552EBA')

        with open(os.path.join(files_dir, 'img.png'), 'rb') as f:
            content = f.read()

        self.assertEqual(
            self.sdk.create_hash(content, 'CALG_GR3411'),
            '799025F048414BD20681D41EDFEE3158D7D5B14DDCB17912E38DE0B620C353B7')

    def test_hash_CALG_GR3411_2012_256(self):
        with open(os.path.join(files_dir, 'signatures', 'doc.txt'), 'rb') as f:
            content = f.read()

        self.assertEqual(
            self.sdk.create_hash(content, 'CALG_GR3411_2012_256'),
            'AE943FBB2751DB601DEB5D90740CEA221B2EE0CD9A2A0D16E0F3A13DB78A02B5')

    def test_hash_CALG_GR3411_2012_512(self):
        with open(os.path.join(files_dir, 'signatures', 'doc.txt'), 'rb') as f:
            content = f.read()

        self.assertEqual(
            self.sdk.create_hash(content, 'CALG_GR3411_2012_512'),
            '32C1304E914F0616063D7765EBA5C81F907AB8CD684C0787ED9445DD74B8CD95A5C286B249EE338CFAA3F446057B6107E151596BC0240474BC342160F2440089'
        )

    def test_get_cert_by_thumbprint(self):
        cert = self.sdk.get_cert_by_thumbprint(
            'ROOT', '046255290b0eb1cdd1797d9ab8c81f699e3687f3')
        self.assertIsNotNone(cert)
        self.assertEqual(
            cert.subject.as_string(),
            '[email protected], C=RU, L=Moscow, O=CRYPTO-PRO LLC, CN=CRYPTO-PRO Test Center 2'
        )
        self.assertEqual(
            cert.issuer.as_string(),
            '[email protected], C=RU, L=Moscow, O=CRYPTO-PRO LLC, CN=CRYPTO-PRO Test Center 2'
        )
        self.assertEqual(cert.valid_from, datetime(2014, 8, 5, 13, 44, 24))
        self.assertEqual(cert.valid_to, datetime(2019, 8, 5, 13, 54, 3))
        self.assertEqual(cert.thumbprint.lower(),
                         '046255290b0eb1cdd1797d9ab8c81f699e3687f3')

    def test_get_cert_by_subject(self):
        cert = self.sdk.get_cert_by_subject('ROOT', 'CRYPTO-PRO Test Center 2')
        self.assertIsNotNone(cert)

        cert = self.sdk.get_cert_by_subject('ROOT', '*****@*****.**')
        self.assertIsNotNone(cert)

    def test_subject_data(self):
        cert = self.sdk.get_cert_by_thumbprint(
            'ROOT', '046255290b0eb1cdd1797d9ab8c81f699e3687f3')
        subject_data = cert.subject.as_dict()
        self.assertIn('CN', subject_data)
        self.assertEqual(subject_data['CN'], 'CRYPTO-PRO Test Center 2')

    def test_install_and_delete_certificate(self):
        with open(os.path.join(files_dir, 'certs', 'uc_1_is_guc.cer'),
                  'rb') as f:
            cert_str = f.read()

        self.sdk.install_certificate('CA', b64encode(cert_str).decode('utf-8'))

        cert = self.sdk.get_cert_by_thumbprint(
            'CA', '9e78a331020e528c046ffd57704a21b7d2241cb3')
        self.assertIsNotNone(cert)
        self.assertTrue(
            self.sdk.delete_certificate(
                'CA', '9e78a331020e528c046ffd57704a21b7d2241cb3'))

    def test_get_signer_certificate_from_signature(self):
        signature_content = self._get_content(
            os.path.join(files_dir, 'signatures', 'doc.txt.sgn'))
        cert = self.sdk.get_signer_cert_from_signature(signature_content)
        self.assertIsNotNone(cert)
        self.assertEqual(
            cert.issuer.as_string(),
            '[email protected], C=RU, L=Moscow, O=CRYPTO-PRO LLC, CN=CRYPTO-PRO Test Center 2'
        )
        self.assertEqual(
            cert.subject.as_string(),
            'CN=Иванов Иван Иванович, INN=123456789047, OGRN=1123300000053, SNILS=12345678901, STREET="Улица, дом", '
            'L=Город')
        subject_dict = cert.subject.as_dict()
        self.assertEqual(subject_dict['CN'], 'Иванов Иван Иванович')
        self.assertEqual(subject_dict['INN'], '123456789047')
        self.assertEqual(subject_dict['OGRN'], '1123300000053')
        self.assertEqual(subject_dict['SNILS'], '12345678901')
        self.assertEqual(subject_dict['STREET'], '"Улица, дом"')
        self.assertEqual(subject_dict['L'], 'Город')

        self.assertEqual(cert.subject.personal_info, subject_dict)
        self.assertEqual(cert.subject.cn, 'Иванов Иван Иванович')
        self.assertEqual(cert.subject.inn, '123456789047')
        self.assertEqual(cert.subject.snils, '12345678901')
        self.assertEqual(cert.subject.street, '"Улица, дом"')
        self.assertEqual(cert.subject.city, 'Город')

    def test_inn_shortcut(self):
        signature_content = self._get_content(
            os.path.join(files_dir, 'signatures', 'doc.txt.sgn'))
        cert = self.sdk.get_signer_cert_from_signature(signature_content)
        subject_list = cert.subject.subject_string.split(', ')
        subject_list[1] = 'INN=003456789047'
        subject_string = ', '.join(subject_list)
        subject = Subject(subject_string)
        self.assertEqual(subject.inn, '003456789047')
        self.assertEqual(subject.inn_shortcut, '3456789047')