From 274e21920d28168d0c5b6acb6a763e88d5366f6f Mon Sep 17 00:00:00 2001 From: Donald Stufft <donald@stufft.io> Date: Sun, 17 Mar 2013 17:59:32 -0400 Subject: [PATCH] Generate the shared key upfront --- nacl/public.py | 34 +++++++++++++--------------------- 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/nacl/public.py b/nacl/public.py index d9e45f70..36a590d8 100644 --- a/nacl/public.py +++ b/nacl/public.py @@ -108,7 +108,17 @@ class Box(object): self._public_key = public_key self._private_key = private_key - self._shared_key = None + _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, + 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)[:] def encrypt(self, plaintext, nonce, encoder=encoding.RawEncoder): """ @@ -136,7 +146,7 @@ class Box(object): padded, len(padded), nonce, - self._beforenm() + self._shared_key, ): raise CryptoError("Encryption failed") @@ -170,7 +180,7 @@ class Box(object): padded, len(padded), nonce, - self._beforenm() + self._shared_key, ): raise CryptoError( "Decryption failed. Ciphertext failed verification") @@ -179,21 +189,3 @@ class Box(object): plaintext = nacl.ffi.buffer(plaintext, len(padded))[box_zeros:] return plaintext - - def _beforenm(self): - if self._shared_key is not None: - return self._shared_key - - sharedkey_size = nacl.lib.crypto_box_BEFORENMBYTES - - k = nacl.ffi.new("unsigned char[]", sharedkey_size) - - if not nacl.lib.crypto_box_beforenm( - k, - 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(k, sharedkey_size)[:] - return self._shared_key -- GitLab