]>
git.datanom.net - securemail.git/blob - cryptonize.py
1 # -*- coding: utf-8 -*-
3 # Copyright (c) 2018 Michael Rasmussen <mir@datanom.net>
5 # This file is part of SecureMail.
7 # SecureMail is free software: you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
12 # SecureMail is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
17 # You should have received a copy of the GNU General Public License
18 # along with SecureMail. If not, see <https://www.gnu.org/licenses/>.
20 from nacl
import __version__
as NACL_VERSION
21 from nacl
.secret
import SecretBox
22 from nacl
.public
import PrivateKey
, Box
23 from nacl
.utils
import random
, EncryptedMessage
24 from nacl
.encoding
import HexEncoder
29 Encrypt and decrypt objects
32 def symmetric_encrypt(self
, key
, plain
):
33 skey
= self
.sanitize_key(key
)
35 if NACL_VERSION
< "1.1.0":
36 from nacl
.utils
import random
37 from nacl
.public
import SecretBox
38 nonce
= random(SecretBox
.NONCE_SIZE
)
39 cipher
= box
.encrypt(plain
, nonce
)
41 cipher
= box
.encrypt(plain
)
46 def symmetric_decrypt(self
, key
, cipher
):
47 skey
= self
.sanitize_key(key
)
49 plain
= box
.decrypt(cipher
)
54 def asymmetric_encrypt(self
, privkey
, pubkey
, plain
):
55 box
= Box(privkey
, pubkey
)
56 cipher
= box
.encrypt(plain
)
61 def asymmetric_decrypt(self
, privkey
, pubkey
, cipher
):
62 box
= Box(privkey
, pubkey
)
63 plain
= box
.decrypt(cipher
)
68 def get_random_key(self
):
69 return random(SecretBox
.KEY_SIZE
)
71 def sanitize_key(self
, key
):
72 if not isinstance(key
, bytes
):
73 key
= key
.encode('utf-8')
75 if size
< SecretBox
.KEY_SIZE
:
77 newkey
= key
+ bytes(SecretBox
.KEY_SIZE
- size
)
78 elif size
> SecretBox
.KEY_SIZE
:
79 newkey
= key
[:SecretBox
.KEY_SIZE
]
86 def get_key_pair(self
):
87 privkey
= PrivateKey
.generate()
88 pubkey
= privkey
.public_key
90 return (privkey
, pubkey
)
92 def generate_hash(self
, key
):
93 if not isinstance(key
, bytes
):
94 key
= key
.encode('utf-8')
95 HASHER
= nacl
.hash.sha512
96 digest
= HASHER(key
, encoder
=HexEncoder
)
98 return digest
.decode()
100 def create_EncryptedMessage(self
, payload
):
101 nonce
= payload
[:SecretBox
.NONCE_SIZE
]
102 ciphertext
= payload
[SecretBox
.NONCE_SIZE
:]
104 return EncryptedMessage
._from
_parts
(
105 nonce
, ciphertext
, nonce
+ ciphertext
)
This page took 0.106351 seconds and 6 git commands to generate.