summaryrefslogtreecommitdiff
path: root/jwt
diff options
context:
space:
mode:
authorLeon Smith <email@leonmarksmith.com>2022-05-23 14:07:28 +0100
committerGitHub <noreply@github.com>2022-05-23 09:07:28 -0400
commit9d4c06e07f6fb67f5fa486879c291018deb462e9 (patch)
treef1de64cdddf7c995015a40b0d107726c254fc799 /jwt
parent0bf1a35ac15740abf6290f6b4a5759d2f8d44f4f (diff)
downloadpyjwt-9d4c06e07f6fb67f5fa486879c291018deb462e9.tar.gz
Add to_jwk static method to ECAlgorithm (#732)
* Add to_jwk static method to ECAlgorithm * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Add in tests for ECAlgorithm.to_jwk * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Add to_jwk pull request to changelog Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Diffstat (limited to 'jwt')
-rw-r--r--jwt/algorithms.py35
1 files changed, 35 insertions, 0 deletions
diff --git a/jwt/algorithms.py b/jwt/algorithms.py
index 46a1a53..4c178a3 100644
--- a/jwt/algorithms.py
+++ b/jwt/algorithms.py
@@ -440,6 +440,41 @@ if has_crypto:
return False
@staticmethod
+ def to_jwk(key_obj):
+
+ if isinstance(key_obj, EllipticCurvePrivateKey):
+ public_numbers = key_obj.public_key().public_numbers()
+ elif isinstance(key_obj, EllipticCurvePublicKey):
+ public_numbers = key_obj.public_numbers()
+ else:
+ raise InvalidKeyError("Not a public or private key")
+
+ if isinstance(key_obj.curve, ec.SECP256R1):
+ crv = "P-256"
+ elif isinstance(key_obj.curve, ec.SECP384R1):
+ crv = "P-384"
+ elif isinstance(key_obj.curve, ec.SECP521R1):
+ crv = "P-521"
+ elif isinstance(key_obj.curve, ec.SECP256K1):
+ crv = "secp256k1"
+ else:
+ raise InvalidKeyError(f"Invalid curve: {key_obj.curve}")
+
+ obj = {
+ "kty": "EC",
+ "crv": crv,
+ "x": to_base64url_uint(public_numbers.x).decode(),
+ "y": to_base64url_uint(public_numbers.y).decode(),
+ }
+
+ if isinstance(key_obj, EllipticCurvePrivateKey):
+ obj["d"] = to_base64url_uint(
+ key_obj.private_numbers().private_value
+ ).decode()
+
+ return json.dumps(obj)
+
+ @staticmethod
def from_jwk(jwk):
try:
if isinstance(jwk, str):