Skip to content

Commit bfff3c1

Browse files
committed
feat: support import key from a certificate pem file
1 parent e31aaf6 commit bfff3c1

File tree

3 files changed

+30
-0
lines changed

3 files changed

+30
-0
lines changed

src/joserfc/rfc7517/pem.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from __future__ import annotations
22
from typing import Any, Literal, cast
33
from abc import ABCMeta, abstractmethod
4+
from cryptography.x509 import load_pem_x509_certificate
45
from cryptography.hazmat.primitives.serialization import (
56
load_pem_private_key,
67
load_pem_public_key,
@@ -38,6 +39,10 @@ def load_pem_key(
3839
elif b"PRIVATE" in raw:
3940
key = load_pem_private_key(raw, password=password, backend=default_backend())
4041

42+
elif b"CERTIFICATE" in raw:
43+
cert = load_pem_x509_certificate(raw, backend=default_backend())
44+
return cert.public_key()
45+
4146
else:
4247
try:
4348
key = load_der_private_key(raw, password=password, backend=default_backend())

tests/jwk/test_rsa_key.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,12 @@ def test_import_from_der_bytes(self):
133133
key1 = RSAKey.import_key(value1)
134134
self.assertEqual(value1, key1.as_der())
135135

136+
def test_import_from_certificate(self):
137+
firebase_cert = read_key("firebase-cert.pem")
138+
key: RSAKey = RSAKey.import_key(firebase_cert)
139+
data = key.as_dict()
140+
self.assertEqual(data['kty'], 'RSA')
141+
136142
def test_output_with_password(self):
137143
private_pem = read_key("rsa-openssl-private.pem")
138144
key: RSAKey = RSAKey.import_key(private_pem)

tests/keys/firebase-cert.pem

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDHTCCAgWgAwIBAgIJANuivDoSiT/NMA0GCSqGSIb3DQEBBQUAMDExLzAtBgNV
3+
BAMMJnNlY3VyZXRva2VuLnN5c3RlbS5nc2VydmljZWFjY291bnQuY29tMB4XDTI0
4+
MTIxMDA3MzI0OVoXDTI0MTIyNjE5NDc0OVowMTEvMC0GA1UEAwwmc2VjdXJldG9r
5+
ZW4uc3lzdGVtLmdzZXJ2aWNlYWNjb3VudC5jb20wggEiMA0GCSqGSIb3DQEBAQUA
6+
A4IBDwAwggEKAoIBAQDhywhKx2L+GZJLjmGcOVMCc+x09hrYpCVk3K/LxgJtZZ34
7+
vHeFUjGexazZiSc9LHd03fNmATFcdtqpVW4Qz+xsP5mQXEqbwPQu2qWZhb5VY8Z6
8+
Oh02uFFxRCdegupuzggdqEhc/QlkrKb2Y/undxcIyRcXKWcDaEn+5dqQA2NhjMp5
9+
ir1YsKRanZIJ69wR65Ok8e0YlHHGsP+7uJaW0b1yr0RyilyluEsb7DmpMV/7j7pr
10+
cnNnOnL7jhpLW2gjbVzjB1FR5ScNy5gKp72htFkxdGxS58/AQoT06kBu80OI2VMb
11+
mijU6JD4b3tIYtHZp9FOiCNhiQS1e/GTDyGT1ZT1AgMBAAGjODA2MAwGA1UdEwEB
12+
/wQCMAAwDgYDVR0PAQH/BAQDAgeAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMCMA0G
13+
CSqGSIb3DQEBBQUAA4IBAQDOf4MfPzEesqqm50J0gVW1geCiukD6MrH1nPGuUhm8
14+
FUYy/4W6Rx69XnKKRxb1rEQwrqmi8WNiELRrpXugY5ieowuRwlcrPk450bB1IwK5
15+
Jxcqgf4fxwbvqeoADzl0Z0+JxoiYDpH2FMG1HRpdl/YCzB7W0ftv3q1uUqTDLQ+r
16+
K6Cm1rHyznsOio9oJknkQ8mPbvE7qSRdCYir806gGurzyhO1RacbR97B8M/vujyc
17+
sNxCxxSphHCgCBW1mz4XqgOF4Sd/XYPrO8/2qhoSjqaqta+gmg644afx82NqsW+Z
18+
NJrR9cZxaLNEfwzv+fX9s70xT1nSa9U4avINE58o3Dsk
19+
-----END CERTIFICATE-----

0 commit comments

Comments
 (0)