|
1 | 1 | import base64 |
2 | 2 | import json |
3 | 3 | import os |
4 | | -import pyelliptic |
5 | 4 | import struct |
6 | 5 | import unittest |
| 6 | +from cryptography.hazmat.backends import default_backend |
| 7 | +from cryptography.hazmat.primitives.asymmetric import ec |
7 | 8 |
|
8 | 9 | from nose.tools import eq_, assert_raises |
9 | 10 |
|
10 | | - |
11 | 11 | import http_ece as ece |
12 | 12 | from http_ece import ECEException |
13 | 13 |
|
@@ -43,11 +43,14 @@ def b64d(arg): |
43 | 43 | return None |
44 | 44 | return base64.urlsafe_b64decode(str(arg) + '===='[:len(arg) % 4:]) |
45 | 45 |
|
| 46 | +def make_key(): |
| 47 | + return ec.generate_private_key(ec.SECP256R1(), default_backend()) |
| 48 | + |
46 | 49 |
|
47 | 50 | class TestEce(unittest.TestCase): |
48 | 51 |
|
49 | 52 | def setUp(self): |
50 | | - self.keymap = {'valid': pyelliptic.ECC(curve="prime256v1")} |
| 53 | + self.keymap = {'valid': make_key()} |
51 | 54 | self.keylabels = {'valid': 'P-256'} |
52 | 55 | self.m_key = os.urandom(16) |
53 | 56 | self.m_salt = os.urandom(16) |
@@ -396,34 +399,47 @@ def use_key_id(self, version): |
396 | 399 | decrypt_params, version=version) |
397 | 400 |
|
398 | 401 | def use_dh(self, version): |
| 402 | + def pubbytes(k): |
| 403 | + return k.public_key().public_numbers().encode_point() |
| 404 | + |
| 405 | + def privbytes(k): |
| 406 | + d = k.private_numbers().private_value |
| 407 | + b = b'' |
| 408 | + for i in range(0, k.private_numbers().public_numbers.curve.key_size, 32): |
| 409 | + b = struct.pack("!L", (d >> i) & 0xffffffff) + b |
| 410 | + return b |
| 411 | + |
| 412 | + def logec(s, k): |
| 413 | + logbuf(s + " private", privbytes(k)) |
| 414 | + logbuf(s + " public", pubbytes(k)) |
| 415 | + |
399 | 416 | def is_uncompressed(k): |
400 | | - b1 = k.get_pubkey()[0:1] |
| 417 | + b1 = pubbytes(k)[0:1] |
401 | 418 | assert struct.unpack("B", b1)[0] == 4, "is an uncompressed point" |
402 | 419 |
|
403 | 420 | # the static key is used by the receiver |
404 | | - static_key = pyelliptic.ECC(curve="prime256v1") |
| 421 | + static_key = make_key() |
405 | 422 | is_uncompressed(static_key) |
406 | 423 |
|
407 | | - logbuf("Receiver private", static_key.get_privkey()) |
408 | | - logbuf("Receiver public", static_key.get_pubkey()) |
| 424 | + |
| 425 | + logec("receiver", static_key) |
409 | 426 |
|
410 | 427 | # the ephemeral key is used by the sender |
411 | | - ephemeral_key = pyelliptic.ECC(curve="prime256v1") |
| 428 | + ephemeral_key = make_key() |
412 | 429 | is_uncompressed(ephemeral_key) |
413 | 430 |
|
414 | | - logbuf("Sender private", ephemeral_key.get_privkey()) |
415 | | - logbuf("Sender public", ephemeral_key.get_pubkey()) |
| 431 | + logec("sender", ephemeral_key) |
416 | 432 |
|
417 | 433 | auth_secret = os.urandom(16) |
418 | 434 |
|
419 | 435 | if version != "aes128gcm": |
420 | | - decrypt_dh = ephemeral_key.get_pubkey() |
| 436 | + decrypt_dh = pubbytes(ephemeral_key) |
421 | 437 | else: |
422 | 438 | decrypt_dh = None |
423 | 439 |
|
424 | 440 | encrypt_params = { |
425 | 441 | "private_key": ephemeral_key, |
426 | | - "dh": static_key.get_pubkey(), |
| 442 | + "dh": pubbytes(static_key), |
427 | 443 | "auth_secret": auth_secret, |
428 | 444 | } |
429 | 445 | decrypt_params = { |
@@ -484,11 +500,14 @@ def _run(self, mode): |
484 | 500 |
|
485 | 501 | if 'keys' in data: |
486 | 502 | key = None |
487 | | - private_key = pyelliptic.ECC( |
488 | | - curve='prime256v1', |
489 | | - pubkey=b64d(data['keys'][local]['public']), |
490 | | - privkey=b64d(data['keys'][local]['private']), |
491 | | - ) |
| 503 | + decode_pub = ec.EllipticCurvePublicNumbers.from_encoded_point |
| 504 | + pubnum = decode_pub(ec.SECP256R1(), b64d(data['keys'][local]['public'])) |
| 505 | + d = 0 |
| 506 | + dbin = b64d(data['keys'][local]['private']) |
| 507 | + for i in range(0, len(dbin), 4): |
| 508 | + d = (d << 32) + struct.unpack('!L', dbin[i:i + 4])[0] |
| 509 | + privnum = ec.EllipticCurvePrivateNumbers(d, pubnum) |
| 510 | + private_key = privnum.private_key(default_backend()) |
492 | 511 | else: |
493 | 512 | key = b64d(p['key']) |
494 | 513 | private_key = None |
|
0 commit comments