|
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