From 8a5a29242ddc5c73c415b84e6d9ac9c892495ff4 Mon Sep 17 00:00:00 2001
From: Donald Stufft <donald@stufft.io>
Date: Sun, 17 Mar 2013 18:16:21 -0400
Subject: [PATCH] Make Box Encodable to bytes

---
 nacl/public.py | 37 +++++++++++++++++++++++++------------
 1 file changed, 25 insertions(+), 12 deletions(-)

diff --git a/nacl/public.py b/nacl/public.py
index 6e4c08c4..93dfd0e9 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):
         """
-- 
GitLab