# You should have received a copy of the GNU General Public License
# along with SecureMail. If not, see <https://www.gnu.org/licenses/>.
+from nacl import __version__ as NACL_VERSION
from nacl.secret import SecretBox
from nacl.public import PrivateKey, Box
-from nacl.utils import random
+from nacl.utils import random, EncryptedMessage
from nacl.encoding import HexEncoder
import nacl.hash
def symmetric_encrypt(self, key, plain):
skey = self.sanitize_key(key)
box = SecretBox(skey)
- cipher = box.encrypt(plain)
- box = None
+ if NACL_VERSION < "1.1.0":
+ nonce = random(SecretBox.NONCE_SIZE)
+ cipher = box.encrypt(plain, nonce)
+ else:
+ cipher = box.encrypt(plain)
+ box = skey = None
return cipher
skey = self.sanitize_key(key)
box = SecretBox(skey)
plain = box.decrypt(cipher)
- box = None
+ box = skey = None
return plain
def asymmetric_encrypt(self, privkey, pubkey, plain):
+ if not isinstance(plain, bytes):
+ plain = plain.encode('utf-8')
box = Box(privkey, pubkey)
- cipher = box.encrypt(plain)
+ if NACL_VERSION < "1.1.0":
+ nonce = random(Box.NONCE_SIZE)
+ cipher = box.encrypt(plain, nonce)
+ else:
+ cipher = box.encrypt(plain)
box = None
return cipher
def asymmetric_decrypt(self, privkey, pubkey, cipher):
+ if not isinstance(cipher, bytes):
+ cipher = cipher.encode('utf-8')
box = Box(privkey, pubkey)
plain = box.decrypt(cipher)
box = None
key = key.encode('utf-8')
size = len(key)
if size < SecretBox.KEY_SIZE:
- """We must pad"""
- pad = None
- for i in range(SecretBox.KEY_SIZE - size):
- if pad is None:
- pad = b'\0'
- else:
- pad += b'\0'
- newkey = key + pad
+ """ We must pad """
+ newkey = key + bytes(SecretBox.KEY_SIZE - size)
+ elif size > SecretBox.KEY_SIZE:
+ newkey = key[:SecretBox.KEY_SIZE]
else:
newkey = key
return digest.decode()
+ def create_EncryptedMessage(self, payload):
+ nonce = payload[:SecretBox.NONCE_SIZE]
+ ciphertext = payload[SecretBox.NONCE_SIZE:]
+ return EncryptedMessage._from_parts(
+ nonce, ciphertext, nonce + ciphertext)