Revize 19e5260d
Přidáno uživatelem Stanislav Král před asi 4 roky(ů)
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
Re #8573 - Implemented extract_public_key_from_certificate