diff options
Diffstat (limited to 'src/leap/soledad/backends/leap_backend.py')
| -rw-r--r-- | src/leap/soledad/backends/leap_backend.py | 85 | 
1 files changed, 40 insertions, 45 deletions
| diff --git a/src/leap/soledad/backends/leap_backend.py b/src/leap/soledad/backends/leap_backend.py index 2585379a..6f1f9546 100644 --- a/src/leap/soledad/backends/leap_backend.py +++ b/src/leap/soledad/backends/leap_backend.py @@ -48,7 +48,7 @@ class DocumentNotEncrypted(Exception):      pass -class UnknownEncryptionSchemes(Exception): +class UnknownEncryptionScheme(Exception):      """      Raised when trying to decrypt from unknown encryption schemes.      """ @@ -74,54 +74,56 @@ class EncryptionSchemes(object):  ENC_JSON_KEY = '_enc_json'  ENC_SCHEME_KEY = '_enc_scheme' -MAC_KEY = '_mac' -def encrypt_doc_json(crypto, doc_id, doc_json): +def encrypt_doc(crypto, doc):      """ -    Return a valid JSON string containing the C{doc} content encrypted to -    a symmetric key and the encryption scheme. +    Encrypt C{doc}'s content. -    The returned JSON string is the serialization of the following dictionary: +    Return a valid JSON string representing the following:          { -            '_enc_json': encrypt_sym(doc_content), -            '_enc_scheme': 'symkey', -            '_mac': <mac> [Not implemented yet] +            ENC_JSON_KEY: '<encrypted doc JSON string>', +            ENC_SCHEME_KEY: 'symkey',          } -    @param crypto: A SoledadCryto instance to perform the encryption. +    @param crypto: A SoledadCryto instance used to perform the encryption.      @type crypto: leap.soledad.crypto.SoledadCrypto -    @param doc_id: The unique id of the document. -    @type doc_id: str -    @param doc_json: The JSON serialization of the document's contents. -    @type doc_json: str +    @param doc: The document with contents to be encrypted. +    @type doc: LeapDocument -    @return: The JSON serialization representing the encrypted content. +    @return: The JSON serialization of the dict representing the encrypted +        content.      @rtype: str      """ +    leap_assert(doc.is_tombstone() is False) +    # encrypt content      ciphertext = crypto.encrypt_sym( -        doc_json, -        crypto.passphrase_hash(doc_id)) +        doc.get_json(), +        crypto.passphrase_hash(doc.doc_id)) +    # verify it is indeed encrypted      if not crypto.is_encrypted_sym(ciphertext):          raise DocumentNotEncrypted('Failed encrypting document.') +    # calculate hmac +    #mac = hmac.new(doc_id,, doc_json,  +    # update doc's content with encrypted version      return json.dumps({          ENC_JSON_KEY: ciphertext,          ENC_SCHEME_KEY: EncryptionSchemes.SYMKEY,      }) -def decrypt_doc_json(crypto, doc_id, doc_json): +def decrypt_doc(crypto, doc):      """ -    Return a JSON serialization of the decrypted content contained in -    C{encrypted_json}. +    Decrypt C{doc}'s content. + +    Return the JSON string representation of the document's decrypted content. -    The C{encrypted_json} parameter is the JSON serialization of the -    following dictionary: +    The content of the document should have the following structure:          { -            ENC_JSON_KEY: enc_blob, -            ENC_SCHEME_KEY: enc_scheme, +            ENC_JSON_KEY: '<enc_blob>', +            ENC_SCHEME_KEY: '<enc_scheme>',          }      C{enc_blob} is the encryption of the JSON serialization of the document's @@ -130,22 +132,18 @@ def decrypt_doc_json(crypto, doc_id, doc_json):      @param crypto: A SoledadCryto instance to perform the encryption.      @type crypto: leap.soledad.crypto.SoledadCrypto -    @param doc_id: The unique id of the document. -    @type doc_id: str -    @param doc_json: The JSON serialization representation of the encrypted -        document's contents. -    @type doc_json: str +    @param doc: The document to be decrypted. +    @type doc: LeapDocument      @return: The JSON serialization of the decrypted content.      @rtype: str      """ -    leap_assert(isinstance(doc_id, str), 'Document id is not a string.') -    leap_assert(doc_id != '', 'Received empty document id.') -    leap_assert(isinstance(doc_json, str), 'Document JSON is not a string.') -    leap_assert(doc_json != '', 'Received empty document JSON.') -    content = json.loads(doc_json) -    ciphertext = content[ENC_JSON_KEY] -    enc_scheme = content[ENC_SCHEME_KEY] +    leap_assert(doc.is_tombstone() is False) +    leap_assert(ENC_JSON_KEY in doc.content) +    leap_assert(ENC_SCHEME_KEY in doc.content) +    # decrypt doc's content +    ciphertext = doc.content[ENC_JSON_KEY] +    enc_scheme = doc.content[ENC_SCHEME_KEY]      plainjson = None      if enc_scheme == EncryptionSchemes.SYMKEY:          if not crypto.is_encrypted_sym(ciphertext): @@ -155,9 +153,9 @@ def decrypt_doc_json(crypto, doc_id, doc_json):                  'symmetric key.')          plainjson = crypto.decrypt_sym(              ciphertext, -            crypto.passphrase_hash(doc_id)) +            crypto.passphrase_hash(doc.doc_id))      else: -        raise UnknownEncryptionSchemes(enc_scheme) +        raise UnknownEncryptionScheme(enc_scheme)      return plainjson @@ -354,9 +352,7 @@ class LeapSyncTarget(HTTPSyncTarget, TokenBasedAuth):                  if doc.content and ENC_SCHEME_KEY in doc.content:                      if doc.content[ENC_SCHEME_KEY] == \                              EncryptionSchemes.SYMKEY: -                        doc.set_json( -                            decrypt_doc_json( -                                self._crypto, doc.doc_id, entry['content'])) +                        doc.set_json(decrypt_doc(self._crypto, doc))                  #-------------------------------------------------------------                  # end of symmetric decryption                  #------------------------------------------------------------- @@ -433,15 +429,14 @@ class LeapSyncTarget(HTTPSyncTarget, TokenBasedAuth):              #-------------------------------------------------------------              # symmetric encryption of document's contents              #------------------------------------------------------------- -            enc_json = doc.get_json() +            doc_json = doc.get_json()              if not doc.is_tombstone(): -                enc_json = encrypt_doc_json( -                    self._crypto, doc.doc_id, doc.get_json()) +                doc_json = encrypt_doc(self._crypto, doc)              #-------------------------------------------------------------              # end of symmetric encryption              #-------------------------------------------------------------              size += prepare(id=doc.doc_id, rev=doc.rev, -                            content=enc_json, +                            content=doc_json,                              gen=gen, trans_id=trans_id)          entries.append('\r\n]')          size += len(entries[-1]) | 
