22import logging
33
44import requests
5+
6+ from cryptojwt .jwk import JWK
57from cryptojwt .key_bundle import KeyBundle
68
79from .jwk .jwk import key_from_jwk_dict
@@ -67,28 +69,36 @@ def __init__(self, msg=None, with_digest=False, httpc=None, **kwargs):
6769 continue
6870
6971 if key == "jwk" :
72+ # value MUST be a string
7073 if isinstance (_val , dict ):
71- self ._dict ["jwk" ] = key_from_jwk_dict (_val )
74+ _k = key_from_jwk_dict (_val )
75+ self ._dict ["jwk" ] = _val
7276 elif isinstance (_val , str ):
73- self ._dict ["jwk" ] = key_from_jwk_dict (json .loads (_val ))
77+ # verify that it's a real JWK
78+ _val = json .loads (_val )
79+ _j = key_from_jwk_dict (_val )
80+ self ._dict ["jwk" ] = _val
81+ elif isinstance (_val , JWK ):
82+ self ._dict ['jwk' ] = _val .to_dict ()
7483 else :
7584 raise ValueError (
76- 'JWK must be a string or a JSON object' )
85+ 'JWK must be a string a JSON object or a JWK '
86+ 'instance' )
7787 self ._jwk = self ._dict ['jwk' ]
7888 elif key == "x5c" :
7989 self ._dict ["x5c" ] = _val
8090 _pub_key = import_rsa_key (_val )
81- self ._jwk = RSAKey (_pub_key )
91+ self ._jwk = RSAKey (pub_key = _pub_key ). to_dict ( )
8292 elif key == "jku" :
8393 self ._jwks = KeyBundle (source = _val , httpc = self .httpc )
8494 self ._dict ['jku' ] = _val
8595 elif "x5u" in self :
8696 try :
8797 _spec = load_x509_cert (self ["x5u" ], self .httpc , {})
88- self ._jwk = RSAKey (pub_key = _spec ['rsa' ])
98+ self ._jwk = RSAKey (pub_key = _spec ['rsa' ]). to_dict ()
8999 except Exception :
90100 # ca_chain = load_x509_cert_chain(self["x5u"])
91- pass
101+ raise ValueError ( 'x5u' )
92102 else :
93103 self ._dict [key ] = _val
94104
@@ -110,12 +120,11 @@ def __getattr__(self, item):
110120 def keys (self ):
111121 return list (self ._dict .keys ())
112122
113- def headers (self , extra = None ):
114- _extra = extra or {}
123+ def headers (self , ** kwargs ):
115124 _header = self ._header .copy ()
116125 for param in self .args :
117126 try :
118- _header [param ] = _extra [param ]
127+ _header [param ] = kwargs [param ]
119128 except KeyError :
120129 try :
121130 if self ._dict [param ]:
@@ -124,9 +133,27 @@ def headers(self, extra=None):
124133 pass
125134
126135 if "jwk" in self :
127- _header ["jwk" ] = self ["jwk" ].serialize ()
128- elif "jwk" in _extra :
129- _header ["jwk" ] = extra ["jwk" ].serialize ()
136+ _header ["jwk" ] = self ["jwk" ]
137+ else :
138+ try :
139+ _jwk = kwargs ['jwk' ]
140+ except KeyError :
141+ pass
142+ else :
143+ try :
144+ _header ["jwk" ] = _jwk .serialize () # JWK instance
145+ except AttributeError :
146+ if isinstance (_jwk , dict ):
147+ _header ['jwk' ] = _jwk # dictionary
148+ else :
149+ try :
150+ _d = json .loads (_jwk ) # JSON
151+ # Verify that it's a valid JWK
152+ _k = key_from_jwk_dict (_d )
153+ except Exception :
154+ raise
155+ else :
156+ _header ['jwk' ] = _d
130157
131158 if "kid" in self :
132159 if not isinstance (self ["kid" ], str ):
@@ -135,12 +162,9 @@ def headers(self, extra=None):
135162 return _header
136163
137164 def _get_keys (self ):
138- logger .debug ("_get_keys(): self._dict.keys={0}" .format (
139- self ._dict .keys ()))
140-
141165 _keys = []
142166 if self ._jwk :
143- _keys .append (self ._jwk )
167+ _keys .append (key_from_jwk_dict ( self ._jwk ) )
144168 if self ._jwks is not None :
145169 _keys .extend (self ._jwks .keys ())
146170 return _keys
@@ -153,8 +177,8 @@ def pick_keys(self, keys, use="", alg=""):
153177 The assumption is that upper layer has made certain you only get
154178 keys you can use.
155179
156- :param alg:
157- :param use:
180+ :param alg: The crypto algorithm
181+ :param use: What the key should be used for
158182 :param keys: A list of JWK instances
159183 :return: A list of JWK instances that fulfill the requirements
160184 """
0 commit comments