15
15
16
16
from cryptojwt .jwk .ec import NIST2SEC
17
17
from cryptojwt .jwk .hmac import new_sym_key
18
+ from cryptojwt .jwk .okp import OKP_CRV2PUBLIC
18
19
from cryptojwt .jwk .x509 import import_private_key_from_pem_file
19
20
20
21
from .exception import JWKException
27
28
from .jwk .hmac import SYMKey
28
29
from .jwk .jwk import dump_jwk
29
30
from .jwk .jwk import import_jwk
31
+ from .jwk .okp import OKPKey
32
+ from .jwk .okp import new_okp_key
30
33
from .jwk .rsa import RSAKey
31
34
from .jwk .rsa import new_rsa_key
32
35
from .utils import as_unicode
46
49
# raise excep(_err, 'application/json')
47
50
48
51
# 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 }
50
53
51
54
MAP = {"dec" : "enc" , "enc" : "enc" , "ver" : "sig" , "sig" : "sig" }
52
55
@@ -154,6 +157,29 @@ def ec_init(spec):
154
157
return _kb
155
158
156
159
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
+
157
183
def keys_writer (func ):
158
184
def wrapper (self , * args , ** kwargs ):
159
185
with self ._lock_writer :
@@ -1003,6 +1029,17 @@ def build_key_bundle(key_conf, kid_template=""):
1003
1029
)
1004
1030
else :
1005
1031
_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 )
1006
1043
elif typ .lower () == "oct" :
1007
1044
_bundle = sym_init (spec )
1008
1045
else :
@@ -1047,7 +1084,7 @@ def type_order(kd1, kd2):
1047
1084
if _l :
1048
1085
return _l
1049
1086
1050
- if kd1 ["type" ] == "EC" :
1087
+ if kd1 ["type" ] in [ "EC" , "OKP" ] :
1051
1088
_l = _cmp (kd1 ["crv" ], kd2 ["crv" ])
1052
1089
if _l :
1053
1090
return _l
@@ -1155,8 +1192,8 @@ def key_diff(key_bundle, key_defs):
1155
1192
if key .kty != key_def ["type" ]:
1156
1193
continue
1157
1194
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
1160
1197
if key .crv != key_def ["crv" ]:
1161
1198
continue
1162
1199
@@ -1230,7 +1267,7 @@ def key_rollover(bundle):
1230
1267
key_spec = []
1231
1268
for key in bundle .get ():
1232
1269
_spec = {"type" : key .kty , "use" : [key .use ]}
1233
- if key .kty == "EC" :
1270
+ if key .kty in [ "EC" , "OKP" ) :
1234
1271
_spec ["crv" ] = key .crv
1235
1272
1236
1273
key_spec .append (_spec )
@@ -1264,6 +1301,7 @@ def unique_keys(keys):
1264
1301
DEFAULT_RSA_KEYSIZE = 2048
1265
1302
DEFAULT_RSA_EXP = 65537
1266
1303
DEFAULT_EC_CURVE = "P-256"
1304
+ DEFAULT_OKP_CURVE = "Ed25519"
1267
1305
1268
1306
1269
1307
def key_gen (type , ** kwargs ):
@@ -1290,6 +1328,12 @@ def key_gen(type, **kwargs):
1290
1328
logging .error ("Unknown curve: %s" , crv )
1291
1329
raise ValueError ("Unknown curve: {}" .format (crv ))
1292
1330
_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 )
1293
1337
elif type .lower () in ["sym" , "oct" ]:
1294
1338
keysize = kwargs .get ("bytes" , 24 )
1295
1339
randomkey = os .urandom (keysize )
@@ -1324,6 +1368,8 @@ def key_by_alg(alg: str):
1324
1368
return key_gen ("EC" , crv = "P-384" )
1325
1369
elif alg == "ES512" :
1326
1370
return key_gen ("EC" , crv = "P-521" )
1371
+ elif alg == "EdDSA" :
1372
+ return key_gen ("OKP" , crv = DEFAULT_OKP_CURVE )
1327
1373
elif alg .startswith ("HS" ):
1328
1374
return key_gen ("sym" )
1329
1375
0 commit comments