diff --git a/nacl/public.py b/nacl/public.py index 6e4c08c48660d486a9d0541842355b2f31b9f339..93dfd0e9d0107db0cb3ee77ebbee731785f4eeeb 100644 --- a/nacl/public.py +++ b/nacl/public.py @@ -82,7 +82,7 @@ class PrivateKey(encoding.Encodable, six.StringFixer, object): ) -class Box(object): +class Box(encoding.Encodable, six.StringFixer, object): """ The Box class boxes and unboxes messages between a pair of keys @@ -105,20 +105,33 @@ class Box(object): NONCE_SIZE = nacl.lib.crypto_box_NONCEBYTES def __init__(self, public_key, private_key): - self._public_key = public_key - self._private_key = private_key + if public_key and private_key: + _shared_key_size = nacl.lib.crypto_box_BEFORENMBYTES + _shared_key = nacl.ffi.new("unsigned char[]", _shared_key_size) - _shared_key_size = nacl.lib.crypto_box_BEFORENMBYTES - _shared_key = nacl.ffi.new("unsigned char[]", _shared_key_size) + if not nacl.lib.crypto_box_beforenm( + _shared_key, + public_key.encode(encoder=encoding.RawEncoder), + private_key.encode(encoder=encoding.RawEncoder), + ): + raise CryptoError("Failed to derive shared key") - if not nacl.lib.crypto_box_beforenm( - _shared_key, - self._public_key.encode(encoder=encoding.RawEncoder), - self._private_key.encode(encoder=encoding.RawEncoder), - ): - raise CryptoError("Failed to derive shared key") + self._shared_key = nacl.ffi.buffer(_shared_key, _shared_key_size)[:] + else: + self._shared_key = None + + def __bytes__(self): + return self._shared_key + + @classmethod + def decode(cls, encoded, encoder=encoding.RawEncoder): + # Create an empty box + box = cls(None, None) + + # Assign our decoded value to the shared key of the box + box._shared_key = encoder.decode(encoded) - self._shared_key = nacl.ffi.buffer(_shared_key, _shared_key_size)[:] + return box def encrypt(self, plaintext, nonce, encoder=encoding.RawEncoder): """