66from cryptojwt import jwe
77from cryptojwt import jws
88from cryptojwt .jwe import JWE
9- from cryptojwt .jws import alg2keytype
109from cryptojwt .jws import JWS
1110from cryptojwt .jws import NoSuitableSigningKeys
1211
@@ -20,6 +19,15 @@ def utc_time_sans_frac():
2019
2120
2221def pick_key (keys , use , alg = '' , key_type = '' , kid = '' ):
22+ """
23+
24+ :param keys: List of keys
25+ :param use: What the key is going to be used for
26+ :param alg: crypto algorithm
27+ :param key_type: Type of key
28+ :param kid: Ley ID
29+ :return: list of keys that match the pattern
30+ """
2331 res = []
2432 if not key_type :
2533 if use == 'sig' :
@@ -51,14 +59,17 @@ def get_jwt_keys(jwt, keys, use):
5159 except KeyError :
5260 _kid = ''
5361
62+ # Pick issuers keys
63+
5464 return pick_key (keys , use , key_type = _key_type , kid = _kid )
5565
5666
5767class JWT (object ):
58- def __init__ (self , keys , iss = '' , lifetime = 0 , sign_alg = 'RS256' ,
59- encrypt = False , enc_enc = "A128CBC-HS256" ,
68+ def __init__ (self , own_keys , iss = '' , rec_keys = None , lifetime = 0 ,
69+ sign_alg = 'RS256' , encrypt = False , enc_enc = "A128CBC-HS256" ,
6070 enc_alg = "RSA1_5" ):
61- self .keys = keys
71+ self .own_keys = own_keys
72+ self .rec_keys = rec_keys or {}
6273 self .iss = iss
6374 self .lifetime = lifetime
6475 self .sign_alg = sign_alg
@@ -67,15 +78,15 @@ def __init__(self, keys, iss='', lifetime=0, sign_alg='RS256',
6778 self .enc_enc = enc_enc
6879 self .with_jti = False
6980
70- def _encrypt (self , payload , cty = 'JWT' ):
81+ def _encrypt (self , payload , recv , cty = 'JWT' ):
7182 kwargs = {"alg" : self .enc_alg , "enc" : self .enc_enc }
7283
7384 if cty :
7485 kwargs ["cty" ] = cty
7586
7687 # use the clients public key for encryption
7788 _jwe = JWE (payload , ** kwargs )
78- return _jwe .encrypt (self .keys , context = "public" )
89+ return _jwe .encrypt (self .rec_keys [ recv ] , context = "public" )
7990
8091 def pack_init (self ):
8192 """
@@ -96,21 +107,20 @@ def pack_key(self, owner='', kid=''):
96107 :param kid: Key ID
97108 :return: One key
98109 """
99- keys = pick_key (self .keys , 'sig' , alg = self .sign_alg , kid = kid )
110+ keys = pick_key (self .own_keys , 'sig' , alg = self .sign_alg , kid = kid )
100111
101112 if not keys :
102113 raise NoSuitableSigningKeys ('kid={}' .format (kid ))
103114
104115 return keys [0 ] # Might be more then one if kid == ''
105116
106- def pack (self , payload = None , kid = '' , owner = '' , cls_instance = None , ** kwargs ):
117+ def pack (self , payload = None , kid = '' , owner = '' , recv = '' , ** kwargs ):
107118 """
108119
109120 :param payload: Information to be carried as payload in the JWT
110121 :param kid: Key ID
111122 :param owner: The owner of the the keys that are to be used for signing
112- :param cls_instance: This might be a instance of a class already
113- prepared with information
123+ :param recv: The intended receiver
114124 :param kwargs: Extra keyword arguments
115125 :return: A signed or signed and encrypted JsonWebtoken
116126 """
@@ -144,12 +154,12 @@ def pack(self, payload=None, kid='', owner='', cls_instance=None, **kwargs):
144154 _sjwt = _jws .sign_compact ([_key ])
145155 #_jws = _jwt.to_jwt([_key], self.sign_alg)
146156 if _encrypt :
147- return self ._encrypt (_sjwt )
157+ return self ._encrypt (_sjwt , recv )
148158 else :
149159 return _sjwt
150160
151161 def _verify (self , rj , token ):
152- keys = get_jwt_keys (rj .jwt , self .keys , 'sig' )
162+ keys = get_jwt_keys (rj .jwt , self .rec_keys , 'sig' )
153163 return rj .verify_compact (token , keys )
154164
155165 def _decrypt (self , rj , token ):
@@ -160,7 +170,7 @@ def _decrypt(self, rj, token):
160170 :param token: The encrypted JsonWebToken
161171 :return:
162172 """
163- keys = get_jwt_keys (rj .jwt , self .keys , 'enc' )
173+ keys = get_jwt_keys (rj .jwt , self .own_keys , 'enc' )
164174 return rj .decrypt (token , keys = keys )
165175
166176 def unpack (self , token ):
0 commit comments