Projekt

Obecné

Profil

« Předchozí | Další » 

Revize 19e5260d

Přidáno uživatelem Stanislav Král před asi 4 roky(ů)

Re #8573 - Implemented extract_public_key_from_certificate

Zobrazit rozdíly:

src/services/cryptography.py
231 231
            # the process failed because of some other reason (incorrect cert format)
232 232
            raise CryptographyException(OPENSSL_EXECUTABLE, args, err.decode())
233 233

  
234
    def extract_public_key(self, private_key_pem: str, passphrase=None) -> str:
234
    def extract_public_key_from_private_key(self, private_key_pem: str, passphrase=None) -> str:
235 235
        """
236 236
        Extracts a public key from the given private key passed in PEM format
237 237
        :param private_key_pem: PEM data representing the private key from which a public key should be extracted
......
243 243
            args.extend(["-passin", f"pass:{passphrase}"])
244 244
        return self.__run_for_output(args, proc_input=bytes(private_key_pem, encoding="utf-8")).decode()
245 245

  
246
    def extract_public_key_from_certificate(self, cert_pem: str) -> str:
247
        """
248
        Extracts a public key from the given certificate passed in PEM format
249
        :param cert_pem: PEM data representing a certificate from which a public key should be extracted
250
        :return: a string containing the extracted public key in PEM format
251
        """
252
        # extracting public key from a certificate does not seem to require a passphrase even when
253
        # signed using an encrypted PK
254
        args = ["x509", "-in", "-", "-noout", "-pubkey"]
255
        return self.__run_for_output(args, proc_input=bytes(cert_pem, encoding="utf-8")).decode()
256

  
246 257
    def parse_cert_pem(self, cert_pem):
247 258
        """
248 259
        Parses the given certificate in PEM format and returns the subject of the certificate and it's NOT_BEFORE
src/services/key_service.py
68 68
        :param private_key: private key from which a public key should be extracted
69 69
        :return: a string containing the extracted public key in PEM format
70 70
        """
71
        return self.cryptography_service.extract_public_key(private_key.private_key, private_key.password)
71
        return self.cryptography_service.extract_public_key_from_private_key(private_key.private_key, private_key.password)
tests/unit_tests/services/cryptography/conftest.py
76 76
qRz7WctkmA9/SOxoF6EPaEhIyXNjjFOQbjsXVc+i0Bnw2DjY3s5SYJg6yycwdaHz
77 77
-----END RSA PRIVATE KEY-----
78 78
    """, "pass"
79

  
80

  
81
@pytest.fixture
82
def certificate_pem():
83
    return """
84
-----BEGIN CERTIFICATE-----
85
MIIDazCCAlOgAwIBAgIUTQwIafNfZdJmqZ+TvhtWT3dKLbMwDQYJKoZIhvcNAQEL
86
BQAwRTELMAkGA1UEBhMCQ1oxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
87
GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yMTA0MTIyMjIxNTJaFw0yMTA1
88
MTIyMjIxNTJaMEUxCzAJBgNVBAYTAkNaMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw
89
HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEB
90
AQUAA4IBDwAwggEKAoIBAQDh/OuanZE7Vg2CxvJUSAY+W3lDHCOJULqEaxcDRNfr
91
3xd32yIv6BnwqO1qlchex2KeMN2PWuLQNFI0SQ7CfY0SihibPqrAKUW2XwNT2lqM
92
B4OnOD0JGDe+WRAJEmVbabnAfYthPZ0g2BbCirC5cXpL5NTDr5czj5d2H/1XK8ue
93
zNbHRrEd6W+P0X262ghKGebjD3mq5i92eZMjE8XranuTPtVn9G+lGjLW9MxgNC0Q
94
OX71rMDkTIEVaj6r0kIVigu8dSIL3APX5rqdOiPEPDYf9k1AZ8mh313P3Ef1/4/W
95
Fp2qqIaKfzjAdEZG3SuzQtE3XKuTevAm4Pf8jKXrScN1AgMBAAGjUzBRMB0GA1Ud
96
DgQWBBS1TwdmMBbo2YBc1NY3bre+fkJUfzAfBgNVHSMEGDAWgBS1TwdmMBbo2YBc
97
1NY3bre+fkJUfzAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQCv
98
684u4MRxN/h5yzxlYj4V0LfbifCLscrZIMquH7gavtmGZTSRlkVMcV+Lqt3Gr2x9
99
1DdZ6+Uvewt1nmuWvKJSCRgc67Kj1JvYeFzctYR2J/xHPGmXTm6orEW3MPSQdTvh
100
Fe1UXz7MF0HipLprIwxkH8DsGT5djSQ4jCLGnLL2h5DHW/9HY23OgAMSkpJbIo6k
101
4sx+fjOtUhxkItDN8RY2LzlENRroW2bZA3cqVH5KO1ubj5Jy+Yrd8LvD0KxW37zi
102
NyJXVOPghVAqaFbgaeBsXkL3QQYVR5wQl7delo0dn36crlckUPi+13INDhnLYgq7
103
GO9Jbty2Qeomxyf+i+SB
104
-----END CERTIFICATE-----
105
    """
106

  
107

  
108
@pytest.fixture
109
def certificate_with_encrypted_pk_pem():
110
    return """
111
-----BEGIN CERTIFICATE-----
112
MIIDazCCAlOgAwIBAgIUAWW0ebo18+AtvjzxLvIPEa4lIUkwDQYJKoZIhvcNAQEL
113
BQAwRTELMAkGA1UEBhMCcGExEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
114
GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yMTA0MTIyMjMxMDRaFw0yMTA1
115
MTIyMjMxMDRaMEUxCzAJBgNVBAYTAnBhMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw
116
HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEB
117
AQUAA4IBDwAwggEKAoIBAQDRPcW6WGeMSvsW+p2xeuKXG5gfzf7b7i2r5hcac222
118
hTxwV5nkwnCID/7rDG0JrnL0XoMwCtXKD8Noa6lAnxXs+1ENjdIbpufAIUYHkuBg
119
jbqCRBs32ue87Tr6lK9DPgjbrs5f6/r08fJ2ZMX+g92Lq0bgn/Dej6+gtIN31n1M
120
o72W3NpfrRl+PWMlwrTXzDM6tu3PLtK/8TCmrUrg2WgoTbUsRTFy9oUG5xm+qFfQ
121
c+6o9gYk+5jO3FI7UP4z7C9n+5O6p25CYblTaENdJb/wjHLeLnY9f1iRkGZT4Lel
122
6iQEC4iuiBvKL46txYl2r4hbNO5U7hDQ11nWp47GZJ8fAgMBAAGjUzBRMB0GA1Ud
123
DgQWBBSCbDHOKEnOU27evnxYKxyF/gQzBTAfBgNVHSMEGDAWgBSCbDHOKEnOU27e
124
vnxYKxyF/gQzBTAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAe
125
z8xDdKj/hmIozRxiOFEjjBW9HFQicmisD/lHH3XWQtW3coNXqa/6UOXor6JNCmYB
126
MKV/N4BAHve/rRkMZ7ohInsanMBsR5Nl2lrYMYWcMNJ8vZm1FbeEqxL/VxQLWwlH
127
Q2seDbNkrGPuCJzVPskqzV0x373IYKC1faTLpdPd7DChkKmUv1SWoYo3yQ+G4tUb
128
IeHGOq+4gEYzF0YsGu2QaAPR3hRMcRtc7LDtuy+eRz4BqvRm3jF3W26Ha8cSojs7
129
c2xJmcA3t2cFCHYKXDmlBJJ5Kvkuak9U+TZLl7+Y7+SmyJIv9nRN2THwDKpaRtff
130
94wl65n2IoG1YP4XyjyX
131
-----END CERTIFICATE-----
132
    """, "pass"
tests/unit_tests/services/cryptography/extract_public_key_from_certificate_test.py
1

  
2
def test_extract_public_key_encrypted(service, certificate_with_encrypted_pk_pem):
3
    public_key = service.extract_public_key_from_certificate(certificate_with_encrypted_pk_pem[0])
4

  
5
    assert "-----BEGIN PUBLIC KEY-----" in public_key
6

  
7

  
8
def test_extract_public_key(service, certificate_pem):
9
    public_key = service.extract_public_key_from_certificate(certificate_pem)
10

  
11
    # TODO test whether public key matches a private key
12
    assert "-----BEGIN PUBLIC KEY-----" in public_key
13

  
tests/unit_tests/services/cryptography/extract_public_key_test.py
4 4

  
5 5

  
6 6
def test_extract_public_key_encrypted(service, private_key_encrypted_pem):
7
    public_key = service.extract_public_key(private_key_encrypted_pem[0], passphrase=private_key_encrypted_pem[1])
7
    public_key = service.extract_public_key_from_private_key(private_key_encrypted_pem[0],
8
                                                             passphrase=private_key_encrypted_pem[1])
8 9

  
9 10
    assert "-----BEGIN PUBLIC KEY-----" in public_key
10 11

  
11 12

  
12
def test_extract_public_key_2(service, private_key_pem):
13
    public_key = service.extract_public_key(private_key_pem)
13
def test_extract_public_key(service, private_key_pem):
14
    public_key = service.extract_public_key_from_private_key(private_key_pem)
14 15

  
15 16
    # TODO test whether public key matches a private key
16 17
    assert "-----BEGIN PUBLIC KEY-----" in public_key
......
19 20
def test_extract_public_key_encrypted_fails(service, private_key_encrypted_pem):
20 21
    # try to extract it using no passphrase
21 22
    with pytest.raises(CryptographyException) as e:
22
        service.extract_public_key(private_key_encrypted_pem[0])
23
        service.extract_public_key_from_private_key(private_key_encrypted_pem[0])
23 24

  
24 25
    assert "bad decrypt" in e.value.message
25 26

  
26 27
    # try to extract it using an empty passphrase
27 28
    with pytest.raises(CryptographyException) as e:
28
        service.extract_public_key(private_key_encrypted_pem[0], passphrase="")
29
        service.extract_public_key_from_private_key(private_key_encrypted_pem[0], passphrase="")
29 30

  
30 31
    assert "bad decrypt" in e.value.message
31 32

  
32 33
    # try to extract it using a wrong passphrase
33 34
    with pytest.raises(CryptographyException) as e:
34
        service.extract_public_key(private_key_encrypted_pem[0], passphrase="foo")
35
        service.extract_public_key_from_private_key(private_key_encrypted_pem[0], passphrase="foo")
35 36

  
36 37
    assert "bad decrypt" in e.value.message

Také k dispozici: Unified diff