Ver código fonte

Merge pull request #2476 from enkore/f/pkgstruct

Create borg.algorithms and borg.crypto packages
enkore 8 anos atrás
pai
commit
d8b7aef15c

+ 7 - 7
.gitignore

@@ -4,23 +4,23 @@ build
 dist
 dist
 borg-env
 borg-env
 .tox
 .tox
-hashindex.c
-chunker.c
-compress.c
-crypto.c
-item.c
-src/borg/crc32.c
+src/borg/compress.c
+src/borg/crypto/low_level.c
+src/borg/hashindex.c
+src/borg/item.c
+src/borg/algorithms/chunker.c
+src/borg/algorithms/crc32.c
 src/borg/platform/darwin.c
 src/borg/platform/darwin.c
 src/borg/platform/freebsd.c
 src/borg/platform/freebsd.c
 src/borg/platform/linux.c
 src/borg/platform/linux.c
 src/borg/platform/posix.c
 src/borg/platform/posix.c
+src/borg/_version.py
 *.egg-info
 *.egg-info
 *.pyc
 *.pyc
 *.pyo
 *.pyo
 *.so
 *.so
 .idea/
 .idea/
 .cache/
 .cache/
-src/borg/_version.py
 borg.build/
 borg.build/
 borg.dist/
 borg.dist/
 borg.exe
 borg.exe

+ 14 - 13
setup.py

@@ -50,11 +50,11 @@ from setuptools import setup, find_packages, Extension
 from setuptools.command.sdist import sdist
 from setuptools.command.sdist import sdist
 
 
 compress_source = 'src/borg/compress.pyx'
 compress_source = 'src/borg/compress.pyx'
-crypto_source = 'src/borg/crypto.pyx'
-chunker_source = 'src/borg/chunker.pyx'
+crypto_ll_source = 'src/borg/crypto/low_level.pyx'
+chunker_source = 'src/borg/algorithms/chunker.pyx'
 hashindex_source = 'src/borg/hashindex.pyx'
 hashindex_source = 'src/borg/hashindex.pyx'
 item_source = 'src/borg/item.pyx'
 item_source = 'src/borg/item.pyx'
-crc32_source = 'src/borg/crc32.pyx'
+crc32_source = 'src/borg/algorithms/crc32.pyx'
 platform_posix_source = 'src/borg/platform/posix.pyx'
 platform_posix_source = 'src/borg/platform/posix.pyx'
 platform_linux_source = 'src/borg/platform/linux.pyx'
 platform_linux_source = 'src/borg/platform/linux.pyx'
 platform_darwin_source = 'src/borg/platform/darwin.pyx'
 platform_darwin_source = 'src/borg/platform/darwin.pyx'
@@ -62,7 +62,7 @@ platform_freebsd_source = 'src/borg/platform/freebsd.pyx'
 
 
 cython_sources = [
 cython_sources = [
     compress_source,
     compress_source,
-    crypto_source,
+    crypto_ll_source,
     chunker_source,
     chunker_source,
     hashindex_source,
     hashindex_source,
     item_source,
     item_source,
@@ -87,12 +87,12 @@ try:
         def make_distribution(self):
         def make_distribution(self):
             self.filelist.extend([
             self.filelist.extend([
                 'src/borg/compress.c',
                 'src/borg/compress.c',
-                'src/borg/crypto.c',
-                'src/borg/chunker.c', 'src/borg/_chunker.c',
+                'src/borg/crypto/low_level.c',
+                'src/borg/algorithms/chunker.c', 'src/borg/algorithms/buzhash.c',
                 'src/borg/hashindex.c', 'src/borg/_hashindex.c',
                 'src/borg/hashindex.c', 'src/borg/_hashindex.c',
                 'src/borg/item.c',
                 'src/borg/item.c',
-                'src/borg/crc32.c',
-                'src/borg/_crc32/crc32.c', 'src/borg/_crc32/clmul.c', 'src/borg/_crc32/slice_by_8.c',
+                'src/borg/algorithms/crc32.c',
+                'src/borg/algorithms/crc32_dispatch.c', 'src/borg/algorithms/crc32_clmul.c', 'src/borg/algorithms/crc32_slice_by_8.c',
                 'src/borg/platform/posix.c',
                 'src/borg/platform/posix.c',
                 'src/borg/platform/linux.c',
                 'src/borg/platform/linux.c',
                 'src/borg/platform/freebsd.c',
                 'src/borg/platform/freebsd.c',
@@ -106,7 +106,7 @@ except ImportError:
             raise Exception('Cython is required to run sdist')
             raise Exception('Cython is required to run sdist')
 
 
     compress_source = compress_source.replace('.pyx', '.c')
     compress_source = compress_source.replace('.pyx', '.c')
-    crypto_source = crypto_source.replace('.pyx', '.c')
+    crypto_ll_source = crypto_ll_source.replace('.pyx', '.c')
     chunker_source = chunker_source.replace('.pyx', '.c')
     chunker_source = chunker_source.replace('.pyx', '.c')
     hashindex_source = hashindex_source.replace('.pyx', '.c')
     hashindex_source = hashindex_source.replace('.pyx', '.c')
     item_source = item_source.replace('.pyx', '.c')
     item_source = item_source.replace('.pyx', '.c')
@@ -117,7 +117,7 @@ except ImportError:
     platform_darwin_source = platform_darwin_source.replace('.pyx', '.c')
     platform_darwin_source = platform_darwin_source.replace('.pyx', '.c')
     from distutils.command.build_ext import build_ext
     from distutils.command.build_ext import build_ext
     if not on_rtd and not all(os.path.exists(path) for path in [
     if not on_rtd and not all(os.path.exists(path) for path in [
-        compress_source, crypto_source, chunker_source, hashindex_source, item_source, crc32_source,
+        compress_source, crypto_ll_source, chunker_source, hashindex_source, item_source, crc32_source,
         platform_posix_source, platform_linux_source, platform_freebsd_source, platform_darwin_source]):
         platform_posix_source, platform_linux_source, platform_freebsd_source, platform_darwin_source]):
         raise ImportError('The GIT version of Borg needs Cython. Install Cython or use a released version.')
         raise ImportError('The GIT version of Borg needs Cython. Install Cython or use a released version.')
 
 
@@ -578,11 +578,12 @@ ext_modules = []
 if not on_rtd:
 if not on_rtd:
     ext_modules += [
     ext_modules += [
     Extension('borg.compress', [compress_source], libraries=['lz4'], include_dirs=include_dirs, library_dirs=library_dirs, define_macros=define_macros),
     Extension('borg.compress', [compress_source], libraries=['lz4'], include_dirs=include_dirs, library_dirs=library_dirs, define_macros=define_macros),
-    Extension('borg.crypto', [crypto_source], libraries=crypto_libraries, include_dirs=include_dirs, library_dirs=library_dirs, define_macros=define_macros),
-    Extension('borg.chunker', [chunker_source]),
+    Extension('borg.crypto', [crypto_ll_source], libraries=crypto_libraries, include_dirs=include_dirs, library_dirs=library_dirs, define_macros=define_macros),
+    Extension('borg.crypto.low_level', [crypto_ll_source], libraries=crypto_libraries, include_dirs=include_dirs, library_dirs=library_dirs, define_macros=define_macros),
     Extension('borg.hashindex', [hashindex_source]),
     Extension('borg.hashindex', [hashindex_source]),
     Extension('borg.item', [item_source]),
     Extension('borg.item', [item_source]),
-    Extension('borg.crc32', [crc32_source]),
+    Extension('borg.algorithms.chunker', [chunker_source]),
+    Extension('borg.algorithms.crc32', [crc32_source]),
 ]
 ]
     if not sys.platform.startswith(('win32', )):
     if not sys.platform.startswith(('win32', )):
         ext_modules.append(Extension('borg.platform.posix', [platform_posix_source]))
         ext_modules.append(Extension('borg.platform.posix', [platform_posix_source]))

+ 0 - 0
src/borg/algorithms/__init__.py


+ 0 - 0
src/borg/blake2-libselect.h → src/borg/algorithms/blake2-libselect.h


+ 0 - 0
src/borg/blake2/COPYING → src/borg/algorithms/blake2/COPYING


+ 0 - 0
src/borg/blake2/README.md → src/borg/algorithms/blake2/README.md


+ 0 - 0
src/borg/blake2/blake2-impl.h → src/borg/algorithms/blake2/blake2-impl.h


+ 0 - 0
src/borg/blake2/blake2.h → src/borg/algorithms/blake2/blake2.h


+ 0 - 0
src/borg/blake2/blake2b-ref.c → src/borg/algorithms/blake2/blake2b-ref.c


+ 0 - 0
src/borg/_chunker.c → src/borg/algorithms/buzhash.c


+ 1 - 1
src/borg/chunker.pyx → src/borg/algorithms/chunker.pyx

@@ -4,7 +4,7 @@ API_VERSION = '1.1_01'
 
 
 from libc.stdlib cimport free
 from libc.stdlib cimport free
 
 
-cdef extern from "_chunker.c":
+cdef extern from "buzhash.c":
     ctypedef int uint32_t
     ctypedef int uint32_t
     ctypedef struct _Chunker "Chunker":
     ctypedef struct _Chunker "Chunker":
         pass
         pass

+ 1 - 1
src/borg/crc32.pyx → src/borg/algorithms/crc32.pyx

@@ -3,7 +3,7 @@ from libc.stdint cimport uint32_t
 from cpython.buffer cimport PyBUF_SIMPLE, PyObject_GetBuffer, PyBuffer_Release
 from cpython.buffer cimport PyBUF_SIMPLE, PyObject_GetBuffer, PyBuffer_Release
 
 
 
 
-cdef extern from "_crc32/crc32.c":
+cdef extern from "crc32_dispatch.c":
     uint32_t _crc32_slice_by_8 "crc32_slice_by_8"(const void* data, size_t length, uint32_t initial_crc)
     uint32_t _crc32_slice_by_8 "crc32_slice_by_8"(const void* data, size_t length, uint32_t initial_crc)
     uint32_t _crc32_clmul "crc32_clmul"(const void* data, size_t length, uint32_t initial_crc)
     uint32_t _crc32_clmul "crc32_clmul"(const void* data, size_t length, uint32_t initial_crc)
 
 

+ 0 - 0
src/borg/_crc32/clmul.c → src/borg/algorithms/crc32_clmul.c


+ 2 - 2
src/borg/_crc32/crc32.c → src/borg/algorithms/crc32_dispatch.c

@@ -1,6 +1,6 @@
 
 
 /* always compile slice by 8 as a runtime fallback */
 /* always compile slice by 8 as a runtime fallback */
-#include "slice_by_8.c"
+#include "crc32_slice_by_8.c"
 
 
 #ifdef __GNUC__
 #ifdef __GNUC__
 /*
 /*
@@ -69,7 +69,7 @@
 #endif /* ifdef __GNUC__ */
 #endif /* ifdef __GNUC__ */
 
 
 #ifdef FOLDING_CRC
 #ifdef FOLDING_CRC
-#include "clmul.c"
+#include "crc32_clmul.c"
 #else
 #else
 
 
 static uint32_t
 static uint32_t

+ 0 - 0
src/borg/_crc32/slice_by_8.c → src/borg/algorithms/crc32_slice_by_8.c


+ 3 - 2
src/borg/archive.py

@@ -16,11 +16,13 @@ from shutil import get_terminal_size
 import msgpack
 import msgpack
 
 
 from .logger import create_logger
 from .logger import create_logger
+
 logger = create_logger()
 logger = create_logger()
 
 
 from . import xattr
 from . import xattr
+from .algorithms.chunker import Chunker
 from .cache import ChunkListEntry
 from .cache import ChunkListEntry
-from .chunker import Chunker
+from .crypto.key import key_factory
 from .compress import Compressor, CompressionSpec
 from .compress import Compressor, CompressionSpec
 from .constants import *  # NOQA
 from .constants import *  # NOQA
 from .hashindex import ChunkIndex, ChunkIndexEntry
 from .hashindex import ChunkIndex, ChunkIndexEntry
@@ -38,7 +40,6 @@ from .helpers import safe_ns
 from .helpers import ellipsis_truncate, ProgressIndicatorPercent, log_multi
 from .helpers import ellipsis_truncate, ProgressIndicatorPercent, log_multi
 from .patterns import PathPrefixPattern, FnmatchPattern, IECommand
 from .patterns import PathPrefixPattern, FnmatchPattern, IECommand
 from .item import Item, ArchiveItem
 from .item import Item, ArchiveItem
-from .key import key_factory
 from .platform import acl_get, acl_set, set_flags, get_flags, swidth
 from .platform import acl_get, acl_set, set_flags, get_flags, swidth
 from .remote import cache_if_remote
 from .remote import cache_if_remote
 from .repository import Repository, LIST_SCAN_LIMIT
 from .repository import Repository, LIST_SCAN_LIMIT

+ 6 - 5
src/borg/archiver.py

@@ -24,6 +24,7 @@ from datetime import datetime, timedelta
 from itertools import zip_longest
 from itertools import zip_longest
 
 
 from .logger import create_logger, setup_logging
 from .logger import create_logger, setup_logging
+
 logger = create_logger()
 logger = create_logger()
 
 
 import msgpack
 import msgpack
@@ -31,21 +32,23 @@ import msgpack
 import borg
 import borg
 from . import __version__
 from . import __version__
 from . import helpers
 from . import helpers
+from .algorithms.crc32 import crc32
 from .archive import Archive, ArchiveChecker, ArchiveRecreater, Statistics, is_special
 from .archive import Archive, ArchiveChecker, ArchiveRecreater, Statistics, is_special
 from .archive import BackupOSError, backup_io
 from .archive import BackupOSError, backup_io
 from .cache import Cache
 from .cache import Cache
 from .constants import *  # NOQA
 from .constants import *  # NOQA
 from .compress import CompressionSpec
 from .compress import CompressionSpec
-from .crc32 import crc32
+from .crypto.key import key_creator, tam_required_file, tam_required, RepoKey, PassphraseKey
+from .crypto.keymanager import KeyManager
 from .helpers import EXIT_SUCCESS, EXIT_WARNING, EXIT_ERROR
 from .helpers import EXIT_SUCCESS, EXIT_WARNING, EXIT_ERROR
 from .helpers import Error, NoManifestError, set_ec
 from .helpers import Error, NoManifestError, set_ec
 from .helpers import location_validator, archivename_validator, ChunkerParams
 from .helpers import location_validator, archivename_validator, ChunkerParams
 from .helpers import PrefixSpec, SortBySpec, HUMAN_SORT_KEYS
 from .helpers import PrefixSpec, SortBySpec, HUMAN_SORT_KEYS
 from .helpers import BaseFormatter, ItemFormatter, ArchiveFormatter
 from .helpers import BaseFormatter, ItemFormatter, ArchiveFormatter
-from .helpers import format_time, format_timedelta, format_file_size, format_archive
+from .helpers import format_timedelta, format_file_size, format_archive
 from .helpers import safe_encode, remove_surrogates, bin_to_hex, prepare_dump_dict
 from .helpers import safe_encode, remove_surrogates, bin_to_hex, prepare_dump_dict
 from .helpers import prune_within, prune_split
 from .helpers import prune_within, prune_split
-from .helpers import to_localtime, timestamp
+from .helpers import timestamp
 from .helpers import get_cache_dir
 from .helpers import get_cache_dir
 from .helpers import Manifest
 from .helpers import Manifest
 from .helpers import hardlinkable
 from .helpers import hardlinkable
@@ -61,8 +64,6 @@ from .helpers import replace_placeholders
 from .patterns import ArgparsePatternAction, ArgparseExcludeFileAction, ArgparsePatternFileAction, parse_exclude_pattern
 from .patterns import ArgparsePatternAction, ArgparseExcludeFileAction, ArgparsePatternFileAction, parse_exclude_pattern
 from .patterns import PatternMatcher
 from .patterns import PatternMatcher
 from .item import Item
 from .item import Item
-from .key import key_creator, tam_required_file, tam_required, RepoKey, PassphraseKey
-from .keymanager import KeyManager
 from .platform import get_flags, umount, get_process_id, SyncFile
 from .platform import get_flags, umount, get_process_id, SyncFile
 from .remote import RepositoryServer, RemoteRepository, cache_if_remote
 from .remote import RepositoryServer, RemoteRepository, cache_if_remote
 from .repository import Repository, LIST_SCAN_LIMIT
 from .repository import Repository, LIST_SCAN_LIMIT

+ 4 - 3
src/borg/cache.py

@@ -1,13 +1,14 @@
 import configparser
 import configparser
 import os
 import os
-import stat
 import shutil
 import shutil
+import stat
 from binascii import unhexlify
 from binascii import unhexlify
 from collections import namedtuple
 from collections import namedtuple
 
 
 import msgpack
 import msgpack
 
 
 from .logger import create_logger
 from .logger import create_logger
+
 logger = create_logger()
 logger = create_logger()
 
 
 from .constants import CACHE_README
 from .constants import CACHE_README
@@ -21,8 +22,8 @@ from .helpers import safe_ns
 from .helpers import yes, hostname_is_unique
 from .helpers import yes, hostname_is_unique
 from .helpers import remove_surrogates
 from .helpers import remove_surrogates
 from .helpers import ProgressIndicatorPercent, ProgressIndicatorMessage
 from .helpers import ProgressIndicatorPercent, ProgressIndicatorMessage
-from .item import Item, ArchiveItem, ChunkListEntry
-from .key import PlaintextKey
+from .item import ArchiveItem, ChunkListEntry
+from .crypto.key import PlaintextKey
 from .locking import Lock
 from .locking import Lock
 from .platform import SaveFile
 from .platform import SaveFile
 from .remote import cache_if_remote
 from .remote import cache_if_remote

+ 0 - 0
src/borg/crypto/__init__.py


+ 13 - 13
src/borg/key.py → src/borg/crypto/key.py

@@ -3,27 +3,27 @@ import getpass
 import os
 import os
 import sys
 import sys
 import textwrap
 import textwrap
-from binascii import a2b_base64, b2a_base64, hexlify, unhexlify
+from binascii import a2b_base64, b2a_base64, hexlify
 from hashlib import sha256, sha512, pbkdf2_hmac
 from hashlib import sha256, sha512, pbkdf2_hmac
 from hmac import HMAC, compare_digest
 from hmac import HMAC, compare_digest
 
 
 import msgpack
 import msgpack
 
 
-from .logger import create_logger
+from borg.logger import create_logger
+
 logger = create_logger()
 logger = create_logger()
 
 
-from .constants import *  # NOQA
-from .compress import Compressor
-from .crypto import AES, bytes_to_long, bytes_to_int, num_aes_blocks, hmac_sha256, blake2b_256, hkdf_hmac_sha512
-from .helpers import StableDict
-from .helpers import Error, IntegrityError
-from .helpers import yes
-from .helpers import get_keys_dir, get_security_dir
-from .helpers import bin_to_hex
-from .item import Key, EncryptedKey
-from .platform import SaveFile
+from ..constants import *  # NOQA
+from ..compress import Compressor
+from ..helpers import StableDict
+from ..helpers import Error, IntegrityError
+from ..helpers import yes
+from ..helpers import get_keys_dir, get_security_dir
+from ..helpers import bin_to_hex
+from ..item import Key, EncryptedKey
+from ..platform import SaveFile
 from .nonces import NonceManager
 from .nonces import NonceManager
-
+from .low_level import AES, bytes_to_long, bytes_to_int, num_aes_blocks, hmac_sha256, blake2b_256, hkdf_hmac_sha512
 
 
 PREFIX = b'\0' * 8
 PREFIX = b'\0' * 8
 
 

+ 5 - 4
src/borg/keymanager.py → src/borg/crypto/keymanager.py

@@ -1,12 +1,13 @@
-from binascii import unhexlify, a2b_base64, b2a_base64
 import binascii
 import binascii
+import pkgutil
 import textwrap
 import textwrap
+from binascii import unhexlify, a2b_base64, b2a_base64
 from hashlib import sha256
 from hashlib import sha256
-import pkgutil
+
+from ..helpers import Manifest, NoManifestError, Error, yes, bin_to_hex
+from ..repository import Repository
 
 
 from .key import KeyfileKey, KeyfileNotFoundError, KeyBlobStorage, identify_key
 from .key import KeyfileKey, KeyfileNotFoundError, KeyBlobStorage, identify_key
-from .helpers import Manifest, NoManifestError, Error, yes, bin_to_hex
-from .repository import Repository
 
 
 
 
 class UnencryptedRepo(Error):
 class UnencryptedRepo(Error):

+ 1 - 1
src/borg/crypto.pyx → src/borg/crypto/low_level.pyx

@@ -10,7 +10,7 @@ from cpython.buffer cimport PyBUF_SIMPLE, PyObject_GetBuffer, PyBuffer_Release
 API_VERSION = '1.1_01'
 API_VERSION = '1.1_01'
 
 
 
 
-cdef extern from "blake2-libselect.h":
+cdef extern from "../algorithms/blake2-libselect.h":
     ctypedef struct blake2b_state:
     ctypedef struct blake2b_state:
         pass
         pass
 
 

+ 5 - 5
src/borg/nonces.py → src/borg/crypto/nonces.py

@@ -2,12 +2,12 @@ import os
 import sys
 import sys
 from binascii import unhexlify
 from binascii import unhexlify
 
 
-from .crypto import bytes_to_long, long_to_bytes
-from .helpers import get_security_dir
-from .helpers import bin_to_hex
-from .platform import SaveFile
-from .remote import InvalidRPCMethod
+from ..helpers import get_security_dir
+from ..helpers import bin_to_hex
+from ..platform import SaveFile
+from ..remote import InvalidRPCMethod
 
 
+from .low_level import bytes_to_long, long_to_bytes
 
 
 MAX_REPRESENTABLE_NONCE = 2**64 - 1
 MAX_REPRESENTABLE_NONCE = 2**64 - 1
 NONCE_SPACE_RESERVATION = 2**28  # This in units of AES blocksize (16 bytes)
 NONCE_SPACE_RESERVATION = 2**28  # This in units of AES blocksize (16 bytes)

+ 8 - 7
src/borg/helpers.py

@@ -1,11 +1,11 @@
 import argparse
 import argparse
-import contextlib
 import collections
 import collections
+import contextlib
 import grp
 import grp
 import hashlib
 import hashlib
-import logging
 import io
 import io
 import json
 import json
+import logging
 import os
 import os
 import os.path
 import os.path
 import platform
 import platform
@@ -25,20 +25,21 @@ from datetime import datetime, timezone, timedelta
 from functools import partial, lru_cache
 from functools import partial, lru_cache
 from itertools import islice
 from itertools import islice
 from operator import attrgetter
 from operator import attrgetter
-from string import Formatter
 from shutil import get_terminal_size
 from shutil import get_terminal_size
+from string import Formatter
 
 
 import msgpack
 import msgpack
 import msgpack.fallback
 import msgpack.fallback
 
 
 from .logger import create_logger
 from .logger import create_logger
+
 logger = create_logger()
 logger = create_logger()
 
 
+import borg.crypto.low_level
 from . import __version__ as borg_version
 from . import __version__ as borg_version
 from . import __version_tuple__ as borg_version_tuple
 from . import __version_tuple__ as borg_version_tuple
-from . import chunker
-from . import crypto
 from . import hashindex
 from . import hashindex
+from .algorithms import chunker
 from .constants import *  # NOQA
 from .constants import *  # NOQA
 
 
 
 
@@ -119,7 +120,7 @@ def check_extension_modules():
         raise ExtensionModuleError
         raise ExtensionModuleError
     if compress.API_VERSION != '1.1_03':
     if compress.API_VERSION != '1.1_03':
         raise ExtensionModuleError
         raise ExtensionModuleError
-    if crypto.API_VERSION != '1.1_01':
+    if borg.crypto.low_level.API_VERSION != '1.1_01':
         raise ExtensionModuleError
         raise ExtensionModuleError
     if platform.API_VERSION != platform.OS_API_VERSION != '1.1_01':
     if platform.API_VERSION != platform.OS_API_VERSION != '1.1_01':
         raise ExtensionModuleError
         raise ExtensionModuleError
@@ -232,7 +233,7 @@ class Manifest:
     @classmethod
     @classmethod
     def load(cls, repository, key=None, force_tam_not_required=False):
     def load(cls, repository, key=None, force_tam_not_required=False):
         from .item import ManifestItem
         from .item import ManifestItem
-        from .key import key_factory, tam_required_file, tam_required
+        from .crypto.key import key_factory, tam_required_file, tam_required
         from .repository import Repository
         from .repository import Repository
         try:
         try:
             cdata = repository.get(cls.MANIFEST_ID)
             cdata = repository.get(cls.MANIFEST_ID)

+ 1 - 1
src/borg/repository.py

@@ -23,7 +23,7 @@ from .locking import Lock, LockError, LockErrorT
 from .logger import create_logger
 from .logger import create_logger
 from .lrucache import LRUCache
 from .lrucache import LRUCache
 from .platform import SaveFile, SyncFile, sync_dir, safe_fadvise
 from .platform import SaveFile, SyncFile, sync_dir, safe_fadvise
-from .crc32 import crc32
+from .algorithms.crc32 import crc32
 
 
 logger = create_logger(__name__)
 logger = create_logger(__name__)
 
 

+ 4 - 5
src/borg/testsuite/archive.py

@@ -1,18 +1,17 @@
-import os
 from collections import OrderedDict
 from collections import OrderedDict
 from datetime import datetime, timezone
 from datetime import datetime, timezone
 from io import StringIO
 from io import StringIO
 from unittest.mock import Mock
 from unittest.mock import Mock
 
 
-import pytest
 import msgpack
 import msgpack
+import pytest
 
 
+from . import BaseTestCase
+from ..crypto.key import PlaintextKey
 from ..archive import Archive, CacheChunkBuffer, RobustUnpacker, valid_msgpacked_dict, ITEM_KEYS, Statistics
 from ..archive import Archive, CacheChunkBuffer, RobustUnpacker, valid_msgpacked_dict, ITEM_KEYS, Statistics
 from ..archive import BackupOSError, backup_io, backup_io_iter
 from ..archive import BackupOSError, backup_io, backup_io_iter
-from ..item import Item, ArchiveItem
-from ..key import PlaintextKey
 from ..helpers import Manifest
 from ..helpers import Manifest
-from . import BaseTestCase
+from ..item import Item, ArchiveItem
 
 
 
 
 @pytest.fixture()
 @pytest.fixture()

+ 13 - 13
src/borg/testsuite/archiver.py

@@ -1,38 +1,40 @@
-from binascii import unhexlify, b2a_base64
-from configparser import ConfigParser
 import errno
 import errno
-import os
-import inspect
 import json
 import json
-from datetime import datetime
-from datetime import timedelta
-from io import StringIO
 import logging
 import logging
+import os
 import random
 import random
+import shutil
 import socket
 import socket
 import stat
 import stat
 import subprocess
 import subprocess
 import sys
 import sys
-import shutil
 import tempfile
 import tempfile
 import time
 import time
 import unittest
 import unittest
-from unittest.mock import patch
+from binascii import unhexlify, b2a_base64
+from configparser import ConfigParser
+from datetime import datetime
+from datetime import timedelta
 from hashlib import sha256
 from hashlib import sha256
+from io import StringIO
+from unittest.mock import patch
 
 
 import msgpack
 import msgpack
 import pytest
 import pytest
+
 try:
 try:
     import llfuse
     import llfuse
 except ImportError:
 except ImportError:
     pass
     pass
 
 
 from .. import xattr, helpers, platform
 from .. import xattr, helpers, platform
-from ..archive import Archive, ChunkBuffer, ArchiveRecreater, flags_noatime, flags_normal
+from ..archive import Archive, ChunkBuffer, flags_noatime, flags_normal
 from ..archiver import Archiver
 from ..archiver import Archiver
 from ..cache import Cache
 from ..cache import Cache
 from ..constants import *  # NOQA
 from ..constants import *  # NOQA
-from ..crypto import bytes_to_long, num_aes_blocks
+from ..crypto.low_level import bytes_to_long, num_aes_blocks
+from ..crypto.key import KeyfileKeyBase, RepoKey, KeyfileKey, Passphrase, TAMRequiredError
+from ..crypto.keymanager import RepoIdMismatch, NotABorgKeyFile
 from ..helpers import Location, get_security_dir
 from ..helpers import Location, get_security_dir
 from ..helpers import Manifest
 from ..helpers import Manifest
 from ..helpers import EXIT_SUCCESS, EXIT_WARNING, EXIT_ERROR
 from ..helpers import EXIT_SUCCESS, EXIT_WARNING, EXIT_ERROR
@@ -40,8 +42,6 @@ from ..helpers import bin_to_hex
 from ..helpers import MAX_S
 from ..helpers import MAX_S
 from ..patterns import IECommand, PatternMatcher, parse_pattern
 from ..patterns import IECommand, PatternMatcher, parse_pattern
 from ..item import Item
 from ..item import Item
-from ..key import KeyfileKeyBase, RepoKey, KeyfileKey, Passphrase, TAMRequiredError
-from ..keymanager import RepoIdMismatch, NotABorgKeyFile
 from ..remote import RemoteRepository, PathNotAllowed
 from ..remote import RemoteRepository, PathNotAllowed
 from ..repository import Repository
 from ..repository import Repository
 from . import has_lchflags, has_llfuse
 from . import has_lchflags, has_llfuse

+ 1 - 1
src/borg/testsuite/chunker.py

@@ -1,6 +1,6 @@
 from io import BytesIO
 from io import BytesIO
 
 
-from ..chunker import Chunker, buzhash, buzhash_update
+from ..algorithms.chunker import Chunker, buzhash, buzhash_update
 from ..constants import *  # NOQA
 from ..constants import *  # NOQA
 from . import BaseTestCase
 from . import BaseTestCase
 
 

+ 1 - 1
src/borg/testsuite/crc32.py

@@ -3,7 +3,7 @@ import zlib
 
 
 import pytest
 import pytest
 
 
-from .. import crc32
+from ..algorithms import crc32
 
 
 crc32_implementations = [crc32.crc32_slice_by_8]
 crc32_implementations = [crc32.crc32_slice_by_8]
 if crc32.have_clmul:
 if crc32.have_clmul:

+ 3 - 3
src/borg/testsuite/crypto.py

@@ -1,8 +1,8 @@
 from binascii import hexlify, unhexlify
 from binascii import hexlify, unhexlify
 
 
-from ..crypto import AES, bytes_to_long, bytes_to_int, long_to_bytes, hmac_sha256, blake2b_256
-from ..crypto import increment_iv, bytes16_to_int, int_to_bytes16
-from ..crypto import hkdf_hmac_sha512
+from ..crypto.low_level import AES, bytes_to_long, bytes_to_int, long_to_bytes, hmac_sha256, blake2b_256
+from ..crypto.low_level import increment_iv, bytes16_to_int, int_to_bytes16
+from ..crypto.low_level import hkdf_hmac_sha512
 from . import BaseTestCase
 from . import BaseTestCase
 
 
 # Note: these tests are part of the self test, do not use or import py.test functionality here.
 # Note: these tests are part of the self test, do not use or import py.test functionality here.

+ 8 - 7
src/borg/testsuite/key.py

@@ -1,20 +1,21 @@
 import getpass
 import getpass
+import os.path
 import re
 import re
 import tempfile
 import tempfile
-import os.path
 from binascii import hexlify, unhexlify
 from binascii import hexlify, unhexlify
 
 
-import pytest
 import msgpack
 import msgpack
+import pytest
 
 
-from ..crypto import bytes_to_long, num_aes_blocks
+from ..crypto.key import Passphrase, PasswordRetriesExceeded, bin_to_hex
+from ..crypto.key import PlaintextKey, PassphraseKey, KeyfileKey, RepoKey, Blake2KeyfileKey, Blake2RepoKey, \
+    AuthenticatedKey
+from ..crypto.key import TAMRequiredError, TAMInvalid, TAMUnsupportedSuiteError, UnsupportedManifestError
+from ..crypto.low_level import bytes_to_long, num_aes_blocks
+from ..helpers import IntegrityError
 from ..helpers import Location
 from ..helpers import Location
 from ..helpers import StableDict
 from ..helpers import StableDict
-from ..helpers import IntegrityError
 from ..helpers import get_security_dir
 from ..helpers import get_security_dir
-from ..key import PlaintextKey, PassphraseKey, KeyfileKey, RepoKey, Blake2KeyfileKey, Blake2RepoKey, AuthenticatedKey
-from ..key import Passphrase, PasswordRetriesExceeded, bin_to_hex
-from ..key import TAMRequiredError, TAMInvalid, TAMUnsupportedSuiteError, UnsupportedManifestError
 
 
 
 
 class TestKey:
 class TestKey:

+ 3 - 4
src/borg/testsuite/nonces.py

@@ -2,13 +2,12 @@ import os.path
 
 
 import pytest
 import pytest
 
 
+from ..crypto import nonces
+from ..crypto.nonces import NonceManager
+from ..crypto.key import bin_to_hex
 from ..helpers import get_security_dir
 from ..helpers import get_security_dir
-from ..key import bin_to_hex
-from ..nonces import NonceManager
 from ..remote import InvalidRPCMethod
 from ..remote import InvalidRPCMethod
 
 
-from .. import nonces  # for monkey patching NONCE_SPACE_RESERVATION
-
 
 
 class TestNonceManager:
 class TestNonceManager:
 
 

+ 1 - 1
src/borg/testsuite/upgrader.py

@@ -10,9 +10,9 @@ except ImportError:
     attic = None
     attic = None
 
 
 from ..constants import *  # NOQA
 from ..constants import *  # NOQA
+from ..crypto.key import KeyfileKey
 from ..upgrader import AtticRepositoryUpgrader, AtticKeyfileKey
 from ..upgrader import AtticRepositoryUpgrader, AtticKeyfileKey
 from ..helpers import get_keys_dir
 from ..helpers import get_keys_dir
-from ..key import KeyfileKey
 from ..repository import Repository
 from ..repository import Repository
 from . import are_hardlinks_supported
 from . import are_hardlinks_supported
 
 

+ 3 - 3
src/borg/upgrader.py

@@ -3,13 +3,13 @@ import os
 import shutil
 import shutil
 import time
 import time
 
 
+from .crypto.key import KeyfileKey, KeyfileNotFoundError
 from .constants import REPOSITORY_README
 from .constants import REPOSITORY_README
-from .helpers import get_home_dir, get_keys_dir, get_cache_dir
 from .helpers import ProgressIndicatorPercent
 from .helpers import ProgressIndicatorPercent
-from .key import KeyfileKey, KeyfileNotFoundError
+from .helpers import get_home_dir, get_keys_dir, get_cache_dir
 from .locking import Lock
 from .locking import Lock
-from .repository import Repository, MAGIC
 from .logger import create_logger
 from .logger import create_logger
+from .repository import Repository, MAGIC
 
 
 logger = create_logger(__name__)
 logger = create_logger(__name__)