4
4
5
5
from cryptography .hazmat import backends
6
6
from cryptography .hazmat .primitives .asymmetric import ec
7
+ from cryptography .hazmat .primitives .asymmetric import ed448
8
+ from cryptography .hazmat .primitives .asymmetric import ed25519
7
9
from cryptography .hazmat .primitives .asymmetric import rsa
8
10
from cryptography .hazmat .primitives .asymmetric .rsa import rsa_crt_dmp1
9
11
from cryptography .hazmat .primitives .asymmetric .rsa import rsa_crt_dmq1
17
19
from .ec import NIST2SEC
18
20
from .ec import ECKey
19
21
from .hmac import SYMKey
22
+ from .okp import OKPKey
20
23
from .rsa import RSAKey
21
24
22
25
EC_PUBLIC_REQUIRED = frozenset (["crv" , "x" , "y" ])
25
28
EC_PRIVATE_OPTIONAL = frozenset ()
26
29
EC_PRIVATE = EC_PRIVATE_REQUIRED | EC_PRIVATE_OPTIONAL
27
30
31
+ OKP_PUBLIC_REQUIRED = frozenset (["crv" , "x" ])
32
+ OKP_PUBLIC = OKP_PUBLIC_REQUIRED
33
+ OKP_PRIVATE_REQUIRED = frozenset (["d" ])
34
+ OKP_PRIVATE_OPTIONAL = frozenset ()
35
+ OKP_PRIVATE = OKP_PRIVATE_REQUIRED | OKP_PRIVATE_OPTIONAL
36
+
28
37
RSA_PUBLIC_REQUIRED = frozenset (["e" , "n" ])
29
38
RSA_PUBLIC = RSA_PUBLIC_REQUIRED
30
39
RSA_PRIVATE_REQUIRED = frozenset (["p" , "q" , "d" ])
@@ -42,6 +51,16 @@ def ensure_ec_params(jwk_dict, private):
42
51
return ensure_params ("EC" , provided , required )
43
52
44
53
54
+ def ensure_okp_params (jwk_dict , private ):
55
+ """Ensure all required OKP parameters are present in dictionary"""
56
+ provided = frozenset (jwk_dict .keys ())
57
+ if private is not None and private :
58
+ required = OKP_PUBLIC_REQUIRED | OKP_PRIVATE_REQUIRED
59
+ else :
60
+ required = OKP_PUBLIC_REQUIRED
61
+ return ensure_params ("OKP" , provided , required )
62
+
63
+
45
64
def ensure_rsa_params (jwk_dict , private ):
46
65
"""Ensure all required RSA parameters are present in dictionary"""
47
66
provided = frozenset (jwk_dict .keys ())
@@ -140,6 +159,15 @@ def key_from_jwk_dict(jwk_dict, private=None):
140
159
if _jwk_dict ["kty" ] != "RSA" :
141
160
raise WrongKeyType ('"{}" should have been "RSA"' .format (_jwk_dict ["kty" ]))
142
161
return RSAKey (** _jwk_dict )
162
+ elif _jwk_dict ["kty" ] == "OKP" :
163
+ ensure_okp_params (_jwk_dict , private )
164
+
165
+ if private is not None and not private :
166
+ # remove private components
167
+ for v in OKP_PRIVATE :
168
+ _jwk_dict .pop (v , None )
169
+
170
+ return OKPKey (** _jwk_dict )
143
171
elif _jwk_dict ["kty" ] == "oct" :
144
172
if "key" not in _jwk_dict and "k" not in _jwk_dict :
145
173
raise MissingValue ('There has to be one of "k" or "key" in a symmetric key' )
@@ -164,6 +192,8 @@ def jwk_wrap(key, use="", kid=""):
164
192
kspec = SYMKey (key = key , use = use , kid = kid )
165
193
elif isinstance (key , ec .EllipticCurvePublicKey ):
166
194
kspec = ECKey (use = use , kid = kid ).load_key (key )
195
+ elif isinstance (key , (ed25519 .Ed25519PublicKey , ed448 .Ed448PublicKey )):
196
+ kspec = OKPKey (use = use , kid = kid ).load_key (key )
167
197
else :
168
198
raise Exception ("Unknown key type:key=" + str (type (key )))
169
199
0 commit comments