Skip to content

Commit 311f188

Browse files
authored
Merge pull request #62 from techguy613/master
Fix epk reversal in original ECDH-ES implementation
2 parents 43bde57 + e7e99c9 commit 311f188

File tree

2 files changed

+17
-21
lines changed

2 files changed

+17
-21
lines changed

src/jwkest/jwe.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -582,8 +582,7 @@ def enc_setup(self, msg, auth_data, key=None, **kwargs):
582582
# Generate an ephemeral key pair if none is given
583583
curve = NISTEllipticCurve.by_name(key.crv)
584584
if "epk" in kwargs:
585-
epk = kwargs["epk"] if isinstance(kwargs["epk"], ECKey) else ECKey(
586-
kwargs["epk"])
585+
epk = kwargs["epk"] if isinstance(kwargs["epk"], ECKey) else ECKey(kwargs["epk"])
587586
else:
588587
raise Exception(
589588
"Ephemeral Public Key (EPK) Required for ECDH-ES JWE "
@@ -592,7 +591,7 @@ def enc_setup(self, msg, auth_data, key=None, **kwargs):
592591
params = {
593592
"apu": b64e(apu),
594593
"apv": b64e(apv),
595-
"epk": key.serialize(False)
594+
"epk": epk.serialize(False)
596595
}
597596

598597
cek = iv = None
@@ -602,19 +601,20 @@ def enc_setup(self, msg, auth_data, key=None, **kwargs):
602601
iv = kwargs['iv']
603602

604603
cek, iv = self._generate_key_and_iv(self.enc, cek=cek, iv=iv)
604+
605605
if self.alg == "ECDH-ES":
606606
try:
607607
dk_len = KEYLEN[self.enc]
608608
except KeyError:
609609
raise Exception(
610610
"Unknown key length for algorithm %s" % self.enc)
611611

612-
cek = ecdh_derive_key(curve, key.d, (epk.x, epk.y), apu, apv,
612+
cek = ecdh_derive_key(curve, epk.d, (key.x, key.y), apu, apv,
613613
str(self.enc).encode(), dk_len)
614614
elif self.alg in ["ECDH-ES+A128KW", "ECDH-ES+A192KW", "ECDH-ES+A256KW"]:
615615
_pre, _post = self.alg.split("+")
616616
klen = int(_post[1:4])
617-
kek = ecdh_derive_key(curve, key.d, (epk.x, epk.y), apu, apv,
617+
kek = ecdh_derive_key(curve, epk.d, (key.x, key.y), apu, apv,
618618
str(_post).encode(), klen)
619619
encrypted_key = aes_wrap_key(kek, cek)
620620
else:
@@ -631,8 +631,7 @@ def dec_setup(self, token, key=None, **kwargs):
631631

632632
# Handle EPK / Curve
633633
if "epk" not in self.headers or "crv" not in self.headers["epk"]:
634-
raise Exception(
635-
"Ephemeral Public Key Missing in ECDH-ES Computation")
634+
raise Exception("Ephemeral Public Key Missing in ECDH-ES Computation")
636635

637636
epubkey = ECKey(**self.headers["epk"])
638637
apu = apv = ""
@@ -759,8 +758,7 @@ def encrypt(self, keys=None, cek="", iv="", **kwargs):
759758

760759
if not keys:
761760
logger.error(
762-
"Could not find any suitable encryption key for alg='{"
763-
"}'".format(_alg))
761+
"Could not find any suitable encryption key for alg='{}'".format(_alg))
764762
raise NoSuitableEncryptionKey(_alg)
765763

766764
# Determine Encryption Class by Algorithm

tests/test_4_jwe.py

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -235,20 +235,18 @@ def test_rsa_with_kid():
235235

236236
# Test ECDH-ES
237237
curve = NISTEllipticCurve.by_name('P-256')
238-
epriv, epub = curve.key_pair()
238+
remotepriv, remotepub = curve.key_pair()
239239
localpriv, localpub = curve.key_pair()
240240

241-
epk = ECKey(crv=curve.name(), d=epriv, x=epub[0], y=epub[1])
242241
localkey = ECKey(crv=curve.name(), d=localpriv, x=localpub[0], y=localpub[1])
243-
242+
remotekey = ECKey(crv=curve.name(), d=remotepriv, x=remotepub[0], y=remotepub[1])
244243

245244
def test_ecdh_encrypt_decrypt_direct_key():
246-
global epk
247245

248246
jwenc = JWE_EC(plain, alg="ECDH-ES", enc="A128GCM")
249247
cek, encrypted_key, iv, params, ret_epk = jwenc.enc_setup(plain, '',
250-
key=localkey,
251-
epk=epk)
248+
key=remotekey,
249+
epk=localkey)
252250

253251
kwargs = {}
254252
kwargs['params'] = params
@@ -263,8 +261,8 @@ def test_ecdh_encrypt_decrypt_direct_key():
263261

264262
ret_jwe = factory(jwt)
265263
jwdec = JWE_EC()
266-
jwdec.dec_setup(ret_jwe.jwt, key=epk)
267-
msg = jwdec.decrypt(ret_jwe.jwt, key=epk)
264+
jwdec.dec_setup(ret_jwe.jwt, key=remotekey)
265+
msg = jwdec.decrypt(ret_jwe.jwt, key=remotekey)
268266

269267
assert msg == plain
270268

@@ -274,8 +272,8 @@ def test_ecdh_encrypt_decrypt_keywrapped_key():
274272

275273
jwenc = JWE_EC(plain, alg="ECDH-ES+A128KW", enc="A128GCM")
276274
cek, encrypted_key, iv, params, ret_epk = jwenc.enc_setup(plain, '',
277-
key=localkey,
278-
epk=epk)
275+
key=remotekey,
276+
epk=localkey)
279277

280278
kwargs = {}
281279
kwargs['params'] = params
@@ -290,8 +288,8 @@ def test_ecdh_encrypt_decrypt_keywrapped_key():
290288

291289
ret_jwe = factory(jwt)
292290
jwdec = JWE_EC()
293-
jwdec.dec_setup(ret_jwe.jwt, key=epk)
294-
msg = jwdec.decrypt(ret_jwe.jwt, key=epk)
291+
jwdec.dec_setup(ret_jwe.jwt, key=remotekey)
292+
msg = jwdec.decrypt(ret_jwe.jwt, key=remotekey)
295293

296294
assert msg == plain
297295

0 commit comments

Comments
 (0)