From eb000dac7a66ea249adb8c9b7d154101b897311c Mon Sep 17 00:00:00 2001 From: Victor Shyba Date: Sat, 8 Jul 2017 05:44:31 -0300 Subject: [refactor] creates a common.blobs with preamble Refactor suggested from !105 review. --- src/leap/soledad/client/_crypto.py | 10 ++-- src/leap/soledad/common/blobs/__init__.py | 0 src/leap/soledad/common/blobs/preamble.py | 88 +++++++++++++++++++++++++++++++ src/leap/soledad/common/preamble.py | 88 ------------------------------- src/leap/soledad/server/_incoming.py | 2 +- 5 files changed, 94 insertions(+), 94 deletions(-) create mode 100644 src/leap/soledad/common/blobs/__init__.py create mode 100644 src/leap/soledad/common/blobs/preamble.py delete mode 100644 src/leap/soledad/common/preamble.py (limited to 'src/leap') diff --git a/src/leap/soledad/client/_crypto.py b/src/leap/soledad/client/_crypto.py index c0d9dde9..a0ec343c 100644 --- a/src/leap/soledad/client/_crypto.py +++ b/src/leap/soledad/client/_crypto.py @@ -86,11 +86,11 @@ from cryptography.hazmat.backends import default_backend from zope.interface import implementer -from leap.soledad.common.preamble import InvalidPreambleException -from leap.soledad.common.preamble import decode_preamble -from leap.soledad.common.preamble import Preamble -from leap.soledad.common.preamble import ENC_SCHEME, ENC_METHOD -from leap.soledad.common.preamble import MAGIC +from leap.soledad.common.blobs.preamble import InvalidPreambleException +from leap.soledad.common.blobs.preamble import decode_preamble +from leap.soledad.common.blobs.preamble import Preamble +from leap.soledad.common.blobs.preamble import ENC_SCHEME, ENC_METHOD +from leap.soledad.common.blobs.preamble import MAGIC SECRET_LENGTH = 64 diff --git a/src/leap/soledad/common/blobs/__init__.py b/src/leap/soledad/common/blobs/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/leap/soledad/common/blobs/preamble.py b/src/leap/soledad/common/blobs/preamble.py new file mode 100644 index 00000000..d4065c38 --- /dev/null +++ b/src/leap/soledad/common/blobs/preamble.py @@ -0,0 +1,88 @@ +# -*- coding: utf-8 -*- +# preamble.py +# Copyright (C) 2017 LEAP Encryption Access Project +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +""" +Preamble is a binary packed metadata payload present on encrypted documents. It +holds data about encryption scheme, iv, document id and sync related data. + MAGIC, -> used to differentiate from other data formats + ENC_SCHEME, -> cryptographic scheme (symmetric or asymmetric) + ENC_METHOD, -> cipher used, such as AES-GCM or AES-CTR or GPG + current_time, -> time.time() + self.iv, -> initialization vector if any, or 0 when not applicable + str(self.doc_id), -> document id + str(self.rev), -> current revision + self._content_size) -> size, rounded to ceiling +""" +import warnings +import struct +import time +from collections import namedtuple +PACMAN = struct.Struct('2sbbQ16s255p255pQ') +LEGACY_PACMAN = struct.Struct('2sbbQ16s255p255p') # DEPRECATED +MAGIC = '\x13\x37' +ENC_SCHEME = namedtuple('SCHEME', 'symkey external')(1, 2) +ENC_METHOD = namedtuple('METHOD', 'aes_256_ctr aes_256_gcm pgp')(1, 2, 3) + + +class InvalidPreambleException(Exception): + pass + + +class Preamble(object): + + def __init__(self, doc_id, rev, scheme, method, + timestamp=0, iv='', magic=None, content_size=0): + self.doc_id = doc_id + self.rev = rev + self.scheme = scheme + self.method = method + self.iv = iv + self.timestamp = int(timestamp) or int(time.time()) + self.magic = magic or MAGIC + self.content_size = int(content_size) + + def encode(self): + preamble = PACMAN.pack( + self.magic, + self.scheme, + self.method, + self.timestamp, + self.iv, + str(self.doc_id), + str(self.rev), + self.content_size) + return preamble + + +def decode_preamble(encoded_preamble): + preamble_size = len(encoded_preamble) + try: + if preamble_size == LEGACY_PACMAN.size: + unpacked_data = LEGACY_PACMAN.unpack(encoded_preamble) + magic, sch, meth, ts, iv, doc_id, rev = unpacked_data + warnings.warn("Decoding a legacy preamble without size. " + + "This will be deprecated in 0.12. Doc was: " + + "doc_id: %s rev: %s" % (doc_id, rev), Warning) + return Preamble(doc_id, rev, sch, meth, ts, iv, magic) + elif preamble_size == PACMAN.size: + unpacked_data = PACMAN.unpack(encoded_preamble) + magic, sch, meth, ts, iv, doc_id, rev, size = unpacked_data + return Preamble(doc_id, rev, sch, meth, ts, iv, magic, int(size)) + else: + raise InvalidPreambleException("Unexpected preamble size %d", + preamble_size) + except struct.error as e: + raise InvalidPreambleException(e) diff --git a/src/leap/soledad/common/preamble.py b/src/leap/soledad/common/preamble.py deleted file mode 100644 index d4065c38..00000000 --- a/src/leap/soledad/common/preamble.py +++ /dev/null @@ -1,88 +0,0 @@ -# -*- coding: utf-8 -*- -# preamble.py -# Copyright (C) 2017 LEAP Encryption Access Project -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -""" -Preamble is a binary packed metadata payload present on encrypted documents. It -holds data about encryption scheme, iv, document id and sync related data. - MAGIC, -> used to differentiate from other data formats - ENC_SCHEME, -> cryptographic scheme (symmetric or asymmetric) - ENC_METHOD, -> cipher used, such as AES-GCM or AES-CTR or GPG - current_time, -> time.time() - self.iv, -> initialization vector if any, or 0 when not applicable - str(self.doc_id), -> document id - str(self.rev), -> current revision - self._content_size) -> size, rounded to ceiling -""" -import warnings -import struct -import time -from collections import namedtuple -PACMAN = struct.Struct('2sbbQ16s255p255pQ') -LEGACY_PACMAN = struct.Struct('2sbbQ16s255p255p') # DEPRECATED -MAGIC = '\x13\x37' -ENC_SCHEME = namedtuple('SCHEME', 'symkey external')(1, 2) -ENC_METHOD = namedtuple('METHOD', 'aes_256_ctr aes_256_gcm pgp')(1, 2, 3) - - -class InvalidPreambleException(Exception): - pass - - -class Preamble(object): - - def __init__(self, doc_id, rev, scheme, method, - timestamp=0, iv='', magic=None, content_size=0): - self.doc_id = doc_id - self.rev = rev - self.scheme = scheme - self.method = method - self.iv = iv - self.timestamp = int(timestamp) or int(time.time()) - self.magic = magic or MAGIC - self.content_size = int(content_size) - - def encode(self): - preamble = PACMAN.pack( - self.magic, - self.scheme, - self.method, - self.timestamp, - self.iv, - str(self.doc_id), - str(self.rev), - self.content_size) - return preamble - - -def decode_preamble(encoded_preamble): - preamble_size = len(encoded_preamble) - try: - if preamble_size == LEGACY_PACMAN.size: - unpacked_data = LEGACY_PACMAN.unpack(encoded_preamble) - magic, sch, meth, ts, iv, doc_id, rev = unpacked_data - warnings.warn("Decoding a legacy preamble without size. " + - "This will be deprecated in 0.12. Doc was: " + - "doc_id: %s rev: %s" % (doc_id, rev), Warning) - return Preamble(doc_id, rev, sch, meth, ts, iv, magic) - elif preamble_size == PACMAN.size: - unpacked_data = PACMAN.unpack(encoded_preamble) - magic, sch, meth, ts, iv, doc_id, rev, size = unpacked_data - return Preamble(doc_id, rev, sch, meth, ts, iv, magic, int(size)) - else: - raise InvalidPreambleException("Unexpected preamble size %d", - preamble_size) - except struct.error as e: - raise InvalidPreambleException(e) diff --git a/src/leap/soledad/server/_incoming.py b/src/leap/soledad/server/_incoming.py index 71e71d7f..187b6973 100644 --- a/src/leap/soledad/server/_incoming.py +++ b/src/leap/soledad/server/_incoming.py @@ -27,7 +27,7 @@ from leap.soledad.common.document import ServerDocument from leap.soledad.common.crypto import ENC_JSON_KEY from leap.soledad.common.crypto import ENC_SCHEME_KEY from leap.soledad.common.crypto import EncryptionSchemes -from leap.soledad.common import preamble +from leap.soledad.common.blobs import preamble __all__ = ['IncomingResource'] -- cgit v1.2.3