Skip to content

Commit a54ddbf

Browse files
author
Rebecka Gulliksson
committed
Verify the thumbprint of the X.509 cert.
1 parent 79f498e commit a54ddbf

File tree

2 files changed

+32
-4
lines changed

2 files changed

+32
-4
lines changed

src/jwkest/jwk.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -376,10 +376,13 @@ def deserialize(self):
376376
except ValueError as err:
377377
raise DeSerializationNotPossible("%s" % err)
378378
elif self.x5c:
379+
der_cert = base64.b64decode(self.x5c[0].encode("ascii"))
380+
379381
if self.x5t: # verify the cert
380-
pass
382+
if not b64d(self.x5t.encode("ascii")) == hashlib.sha1(der_cert).digest():
383+
raise DeSerializationNotPossible("The thumbprint ('x5t') does not match the certificate.")
381384

382-
self.key = der2rsa(base64.b64decode(self.x5c[0].encode("ascii")))
385+
self.key = der2rsa(der_cert)
383386
self._split()
384387
if len(self.x5c) > 1: # verify chain
385388
pass

tests/test_2_jwk.py

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import six
99
from jwkest.ecc import P256
1010
from jwkest import long2intarr
11-
from jwkest.jwk import jwk_wrap
11+
from jwkest.jwk import jwk_wrap, DeSerializationNotPossible
1212
from jwkest.jwk import import_rsa_key_from_file
1313
from jwkest.jwk import rsa_eq
1414
from jwkest.jwk import keyrep
@@ -169,7 +169,8 @@ def test_import_rsa_key():
169169
djwk = jwk_wrap(_ckey).to_dict()
170170
print(djwk)
171171
assert _eq(djwk.keys(), ["kty", "e", "n", "p", "q", "d"])
172-
assert djwk["n"] == '5zbNbHIYIkGGJ3RGdRKkYmF4gOorv5eDuUKTVtuu3VvxrpOWvwnFV-NY0LgqkQSMMyVzodJE3SUuwQTUHPXXY5784vnkFqzPRx6bHgPxKz7XfwQjEBTafQTMmOeYI8wFIOIHY5i0RWR-gxDbh_D5TXuUqScOOqR47vSpIbUH-nc'
172+
assert djwk[
173+
"n"] == '5zbNbHIYIkGGJ3RGdRKkYmF4gOorv5eDuUKTVtuu3VvxrpOWvwnFV-NY0LgqkQSMMyVzodJE3SUuwQTUHPXXY5784vnkFqzPRx6bHgPxKz7XfwQjEBTafQTMmOeYI8wFIOIHY5i0RWR-gxDbh_D5TXuUqScOOqR47vSpIbUH-nc'
173174
assert djwk['e'] == 'AQAB'
174175

175176

@@ -331,5 +332,29 @@ def test_rsa_pubkey_from_x509_cert_chain():
331332
assert rsa_key.key
332333

333334

335+
def test_rsa_pubkey_verify_x509_thumbprint():
336+
cert = "MIID0jCCArqgAwIBAgIBSTANBgkqhkiG9w0BAQQFADCBiDELMAkGA1UEBhMCREUxEDAOBgNVBAgTB0JhdmF" \
337+
"yaWExEzARBgNVBAoTCkJpb0lEIEdtYkgxLzAtBgNVBAMTJkJpb0lEIENsaWVudCBDZXJ0aWZpY2F0aW9uIE" \
338+
"F1dGhvcml0eSAyMSEwHwYJKoZIhvcNAQkBFhJzZWN1cml0eUBiaW9pZC5jb20wHhcNMTUwNDE1MTQ1NjM4W" \
339+
"hcNMTYwNDE0MTQ1NjM4WjBfMQswCQYDVQQGEwJERTETMBEGA1UEChMKQmlvSUQgR21iSDE7MDkGA1UEAxMy" \
340+
"QmlvSUQgT3BlbklEIENvbm5lY3QgSWRlbnRpdHkgUHJvdmlkZXIgQ2VydGlmaWNhdGUwggEiMA0GCSqGSIb" \
341+
"3DQEBAQUAA4IBDwAwggEKAoIBAQC9aFETmU6kDfMBPKM2OfI5eedO3XP12Ci0hDC99bdzUUIhDZG34PQqcH" \
342+
"89gVWGthJv5w3kqpdSrxfPCFMsBdnyk1VCuXmLgXS8s4oBtt1c9iM0J8X6Z+5subS3Xje8fu55Csh0JXNfo" \
343+
"y29rCY/O6y0fNignegg0KS4PHv5T+agFmaG4rxCQV9/kd8tlo/HTyVPsuSPDgsXxisIVqur9aujYwdCoAZU" \
344+
"8OU+5ccMLNIhpWJn+xNjgDRr4L9nxAYKc9vy+f7EoH3LT24B71zazZsQ78vpocz98UT/7vdgS/IYXFniPuU" \
345+
"fblja7cq31bUoySDx6FYrtfCSUxNhaZSX8mppAgMBAAGjbzBtMAkGA1UdEwQCMAAwHQYDVR0OBBYEFOfg3f" \
346+
"/ewBLK5SkcBEXusD62OlzaMB8GA1UdIwQYMBaAFCQmdD+nVcVLaKt3vu73XyNgpPEpMAsGA1UdDwQEAwIDi" \
347+
"DATBgNVHSUEDDAKBggrBgEFBQcDAjANBgkqhkiG9w0BAQQFAAOCAQEAKQjhcL/iGhy0549hEHRQArJXs1im" \
348+
"7W244yE+TSChdMWKe2eWvEhc9wX1aVV2mNJM1ZNeYSgfoK6jjuXaHiSaIJEUcW1wVM3rDywi2a9GKzOFgrW" \
349+
"pVbpXQ05LSE7qEEWRmSpIMyKTitUalNpNA6cOML5hiuUTfZbw7OvPwbnbSYYL674gEA2sW5AhPiCr9dVnMn" \
350+
"/UK2II40802zdXUOvIxWeXpcsCxxZMjp/Ir2jIZWOEjlAXQVGr2oBfL/be/o5WXpaqWSfPRBZV8htRIf0vT" \
351+
"lGx7xR8FPWDYmcj4o/tKoNC1AchjOnCwwE/mj4hgtoAsHNmYXF0oZXk7cozqYDqKQ=="
352+
rsa_key = RSAKey(x5c=[cert], x5t="KvHXVspLmjWC6cPDIIVMHlJjN-c")
353+
assert rsa_key.key
354+
355+
with pytest.raises(DeSerializationNotPossible):
356+
RSAKey(x5c=[cert], x5t="abcdefgh") # incorrect thumbprint
357+
358+
334359
if __name__ == "__main__":
335360
test_private_key_from_jwk()

0 commit comments

Comments
 (0)