diff options
author | Victor Shyba <victor1984@riseup.net> | 2016-12-07 02:03:58 -0300 |
---|---|---|
committer | drebs <drebs@leap.se> | 2016-12-12 09:17:52 -0200 |
commit | 7877527fe64eaee1f7f107913a4a3dc78767a338 (patch) | |
tree | dfbf4de67d091469f50fedbe3d1a74be9fde154a /client | |
parent | b3fcc5c5bddc73475596c4fe74e3402f0d5c021a (diff) |
[feature] Change CTR to GCM on secrets.py
Current implementation can allow tampering and the CTR->GCM exchange can
help to avoid it.
This commits also alters a behaviour where we moved ahead after failing
to decrypt a recovery document. IMHO we can't move ahead as this is a
fatal error.
Signed-off-by: Victor Shyba <victor1984@riseup.net>
Diffstat (limited to 'client')
-rw-r--r-- | client/src/leap/soledad/client/secrets.py | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/client/src/leap/soledad/client/secrets.py b/client/src/leap/soledad/client/secrets.py index 06488f74..3fe98c64 100644 --- a/client/src/leap/soledad/client/secrets.py +++ b/client/src/leap/soledad/client/secrets.py @@ -142,7 +142,7 @@ class SoledadSecrets(object): KDF_SALT_KEY = 'kdf_salt' KDF_LENGTH_KEY = 'kdf_length' KDF_SCRYPT = 'scrypt' - CIPHER_AES256 = 'aes256' # deprecated, AES-GCM + CIPHER_AES256 = 'aes256' # deprecated, AES-CTR CIPHER_AES256_GCM = _crypto.ENC_METHOD.aes_256_gcm RECOVERY_DOC_VERSION_KEY = 'version' RECOVERY_DOC_VERSION = 1 @@ -451,6 +451,7 @@ class SoledadSecrets(object): except SecretsException as e: logger.error("failed to decrypt storage secret: %s" % str(e)) + raise e return secret_count, active_secret def _get_secrets_from_shared_db(self): @@ -549,7 +550,12 @@ class SoledadSecrets(object): iv, ciphertext = encrypted_secret_dict[self.SECRET_KEY].split( self.SEPARATOR, 1) ciphertext = binascii.a2b_base64(ciphertext) - decrypted_secret = _crypto.decrypt_sym(ciphertext, key, iv, doc_cipher) + try: + decrypted_secret = _crypto.decrypt_sym( + ciphertext, key, iv, doc_cipher) + except Exception as e: + logger.error(e) + raise SecretsException("Unable to decrypt secret.") if encrypted_secret_dict[self.LENGTH_KEY] != len(decrypted_secret): raise SecretsException("Wrong length of decrypted secret.") return decrypted_secret @@ -583,7 +589,7 @@ class SoledadSecrets(object): salt = os.urandom(self.SALT_LENGTH) # get a 256-bit key key = scrypt.hash(self._passphrase_as_string(), salt, buflen=32) - doc_cipher = doc_cipher or self.CIPHER_AES256 + doc_cipher = doc_cipher or self.CIPHER_AES256_GCM iv, ciphertext = _crypto.encrypt_sym(decrypted_secret, key, doc_cipher) ciphertext = binascii.b2a_base64(ciphertext) encrypted_secret_dict = { |