1515
1616from cryptojwt .jwk .ec import NIST2SEC
1717from cryptojwt .jwk .hmac import new_sym_key
18+ from cryptojwt .jwk .okp import OKP_CRV2PUBLIC
1819from cryptojwt .jwk .x509 import import_private_key_from_pem_file
1920
2021from .exception import JWKException
2728from .jwk .hmac import SYMKey
2829from .jwk .jwk import dump_jwk
2930from .jwk .jwk import import_jwk
31+ from .jwk .okp import OKPKey
32+ from .jwk .okp import new_okp_key
3033from .jwk .rsa import RSAKey
3134from .jwk .rsa import new_rsa_key
3235from .utils import as_unicode
4649# raise excep(_err, 'application/json')
4750
4851# Make sure the keys are all uppercase
49- K2C = {"RSA" : RSAKey , "EC" : ECKey , "oct" : SYMKey }
52+ K2C = {"RSA" : RSAKey , "EC" : ECKey , "oct" : SYMKey , "OKP" : OKPKey }
5053
5154MAP = {"dec" : "enc" , "enc" : "enc" , "ver" : "sig" , "sig" : "sig" }
5255
@@ -154,6 +157,29 @@ def ec_init(spec):
154157 return _kb
155158
156159
160+ def okp_init (spec ):
161+ """
162+ Initiate a key bundle with an Octet Key Pair.
163+
164+ :param spec: Key specifics of the form::
165+ {"type": "OKP", "crv": "Ed25519", "use": ["sig"]}
166+
167+ :return: A KeyBundle instance
168+ """
169+ curve = spec .get ("crv" , "Ed25519" )
170+
171+ _kb = KeyBundle (keytype = "OKP" )
172+ if "use" in spec :
173+ for use in spec ["use" ]:
174+ eck = new_okp_key (crv = curve , use = use )
175+ _kb .append (eck )
176+ else :
177+ eck = new_okp_key (crv = curve )
178+ _kb .append (eck )
179+
180+ return _kb
181+
182+
157183def keys_writer (func ):
158184 def wrapper (self , * args , ** kwargs ):
159185 with self ._lock_writer :
@@ -1003,6 +1029,17 @@ def build_key_bundle(key_conf, kid_template=""):
10031029 )
10041030 else :
10051031 _bundle = ec_init (spec )
1032+ elif typ == "OKP" :
1033+ if "key" in spec and spec ["key" ]:
1034+ if os .path .isfile (spec ["key" ]):
1035+ _bundle = KeyBundle (
1036+ source = "file://%s" % spec ["key" ],
1037+ fileformat = "der" ,
1038+ keytype = typ ,
1039+ keyusage = spec ["use" ],
1040+ )
1041+ else :
1042+ _bundle = okp_init (spec )
10061043 elif typ .lower () == "oct" :
10071044 _bundle = sym_init (spec )
10081045 else :
@@ -1047,7 +1084,7 @@ def type_order(kd1, kd2):
10471084 if _l :
10481085 return _l
10491086
1050- if kd1 ["type" ] == "EC" :
1087+ if kd1 ["type" ] in [ "EC" , "OKP" ] :
10511088 _l = _cmp (kd1 ["crv" ], kd2 ["crv" ])
10521089 if _l :
10531090 return _l
@@ -1155,8 +1192,8 @@ def key_diff(key_bundle, key_defs):
11551192 if key .kty != key_def ["type" ]:
11561193 continue
11571194
1158- if key .kty == "EC" :
1159- # special test only for EC keys
1195+ if key .kty in [ "EC" , "OKP" ] :
1196+ # special test only for EC and OKP keys
11601197 if key .crv != key_def ["crv" ]:
11611198 continue
11621199
@@ -1230,7 +1267,7 @@ def key_rollover(bundle):
12301267 key_spec = []
12311268 for key in bundle .get ():
12321269 _spec = {"type" : key .kty , "use" : [key .use ]}
1233- if key .kty == "EC" :
1270+ if key .kty in [ "EC" , "OKP" ) :
12341271 _spec ["crv" ] = key .crv
12351272
12361273 key_spec .append (_spec )
@@ -1264,6 +1301,7 @@ def unique_keys(keys):
12641301DEFAULT_RSA_KEYSIZE = 2048
12651302DEFAULT_RSA_EXP = 65537
12661303DEFAULT_EC_CURVE = "P-256"
1304+ DEFAULT_OKP_CURVE = "Ed25519"
12671305
12681306
12691307def key_gen (type , ** kwargs ):
@@ -1290,6 +1328,12 @@ def key_gen(type, **kwargs):
12901328 logging .error ("Unknown curve: %s" , crv )
12911329 raise ValueError ("Unknown curve: {}" .format (crv ))
12921330 _key = new_ec_key (crv = crv , ** kargs )
1331+ elif type .upper () == "OKP" :
1332+ crv = kwargs .get ("crv" , DEFAULT_OKP_CURVE )
1333+ if crv not in OKP_CRV2PUBLIC :
1334+ logging .error ("Unknown curve: %s" , crv )
1335+ raise ValueError ("Unknown curve: {}" .format (crv ))
1336+ _key = new_okp_key (crv = crv , ** kargs )
12931337 elif type .lower () in ["sym" , "oct" ]:
12941338 keysize = kwargs .get ("bytes" , 24 )
12951339 randomkey = os .urandom (keysize )
@@ -1324,6 +1368,8 @@ def key_by_alg(alg: str):
13241368 return key_gen ("EC" , crv = "P-384" )
13251369 elif alg == "ES512" :
13261370 return key_gen ("EC" , crv = "P-521" )
1371+ elif alg == "EdDSA" :
1372+ return key_gen ("OKP" , crv = DEFAULT_OKP_CURVE )
13271373 elif alg .startswith ("HS" ):
13281374 return key_gen ("sym" )
13291375
0 commit comments