Commit graph

3813 commits

Author SHA1 Message Date
dependabot-preview[bot]
549222a414
build(deps): bump cffi from 1.14.2 to 1.14.3
Bumps [cffi](https://github.com/python-cffi/release-doc) from 1.14.2 to 1.14.3.
- [Release notes](https://github.com/python-cffi/release-doc/releases)
- [Commits](https://github.com/python-cffi/release-doc/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-09-15 10:42:28 +00:00
Joshua Lock
74dd43bac8
Merge pull request #1144 from theupdateframework/dependabot/pip/iso8601-0.1.13
build(deps): bump iso8601 from 0.1.12 to 0.1.13
2020-09-15 11:36:01 +01:00
dependabot-preview[bot]
ccfee2cf50
build(deps): bump iso8601 from 0.1.12 to 0.1.13
Bumps [iso8601](https://github.com/micktwomey/pyiso8601) from 0.1.12 to 0.1.13.
- [Release notes](https://github.com/micktwomey/pyiso8601/releases)
- [Commits](https://github.com/micktwomey/pyiso8601/compare/0.1.12...0.1.13)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-09-14 10:22:36 +00:00
lukpueh
eda46e11da
Merge pull request #1112 from lukpueh/simple-tuf-api
Add simple TUF role metadata model
2020-09-10 17:07:35 +02:00
Lukas Puehringer
f106435aa5 Remove iso8601 dependency from simple metadata api
Use builtin datetime instead of external iso6801 for simple
datetime string parsing. Also see
https://github.com/theupdateframework/tuf/issues/1065

Signed-off-by: Lukas Puehringer <lukas.puehringer@nyu.edu>
2020-09-10 16:18:28 +02:00
Lukas Puehringer
228a4c72e0 Ticketize doc header todo items
See:
Add root metadata class to new TUF metadata model #1137
Add classes for complex metadata fields #1139
Add input validation to simple metadata api #1140

Signed-off-by: Lukas Puehringer <lukas.puehringer@nyu.edu>
2020-09-10 16:18:28 +02:00
Lukas Puehringer
73dd72d54d Raise on bad signature count in Metadata.verify
Change Metadata.verify(key) behavior to raise an exception if
none or multiple signatures for the passed key are found on the
Metadata object.

Signed-off-by: Lukas Puehringer <lukas.puehringer@nyu.edu>
2020-09-10 16:18:28 +02:00
Lukas Puehringer
f9a4ebe1ea Re-order metadata methods logically and add vspace
Signed-off-by: Lukas Puehringer <lukas.puehringer@nyu.edu>
2020-09-10 16:18:28 +02:00
Lukas Puehringer
387169fc11 Add from_json metadata convenience wrapper
Add convenience wrapper that takes a json string and passes it
to from_dict to create a Metadata object.

Signed-off-by: Lukas Puehringer <lukas.puehringer@nyu.edu>
2020-09-10 16:18:28 +02:00
Lukas Puehringer
f63dce6ddd Refactor metadata constructors and add factory
This commit better separates the Metadata class model from the
Metadata wireline format, by tailoring the constructors
towards class-based parameters and adding an additional
factory classmethod that creates Metadata objects based on the
wireline json/dictionary metadata representation. (pythonic
way of constructor overloading).

This 'from_dict' factory method recurses into the 'from_dict'
methods of each contained complex field/attribute that is also
represented by a class. Currently 'signed' is the only such
attribute.

This commit further:
- Changes optional constructor keyword arguments to mandatory
positional arguments: Reduces code and simplifies usage by
restricting it. For now, users are unlikely to call
constructor directly anyway, but the 'from_dict' factory (or
its 'from_json_file' wrapper) instead.

- Removes Signed.__expiration (datetime) vs. Signed.expires
(datestring) dichotomy: Keeping only one representation of the
same attribute in memory makes the interface simpler and less
ambiguous. We choose the datetime object, because it is more
convenient to modify. Transformation from and to the string
format required by the tuf wireline format is performed in the
corresponding metadata de/serialization methods, i.e.
('to_dict' and 'from_dict').

Signed-off-by: Lukas Puehringer <lukas.puehringer@nyu.edu>
2020-09-10 16:18:28 +02:00
Lukas Puehringer
f738ea0273 Rename tuf metadata interface methods
Consistenly rename de/serialization interface methods, using
a 'from_' and 'to_' prefix.

read_from_json -> from_json_file
write_to_json  -> to_json_file
as_json        -> to_json
as_dict        -> to_dict
signed_bytes   -> to_canonical_bytes

The latter is also changed from a property to a method for
consistency with the other serialization methods.

Signed-off-by: Lukas Puehringer <lukas.puehringer@nyu.edu>
2020-09-10 16:18:28 +02:00
Lukas Puehringer
e61ae1bea3 Remove Signed.read_from_json metadata method
Remove metadata factory on Signed class, for the sake of API
simplicity/non-ambiguity, i.e. it's enough to have one
way of loading any Metadata, that is:
Metadata.read_from_json

Signed-off-by: Lukas Puehringer <lukas.puehringer@nyu.edu>
2020-09-10 16:18:28 +02:00
Lukas Puehringer
21de660b66 Remove comments and unify quotes in api tests
Signed-off-by: Lukas Puehringer <lukas.puehringer@nyu.edu>
2020-09-10 16:18:28 +02:00
Lukas Puehringer
08bdc171e4 Add simple sign + verify Metadata methods (+tests)
Add simple methods to create or verify signatures of the
canonical_signed property of a Metadata object.

See corresponding docstrings for behavior and design
considerations.

The commit also adds tests and updates the test setup to load
some test keys into memory.

Signed-off-by: Lukas Puehringer <lukas.puehringer@nyu.edu>
2020-09-10 16:18:19 +02:00
Lukas Puehringer
5cc73353fa Add metadata model class and method docstrings
Signed-off-by: Lukas Puehringer <lukas.puehringer@nyu.edu>
2020-09-10 16:09:22 +02:00
Lukas Puehringer
0d7e2680f2 Simplifies Timestamp.update method
Signed-off-by: Lukas Puehringer <lukas.puehringer@nyu.edu>
2020-09-10 15:59:10 +02:00
Lukas Puehringer
088e94055f Replace _get_written_metadata with as_json method.
Add simple as_json Metadata method and use it instead of repository
lib's internal _get_written_metadata function in write_to_json.

This commit further adds code documentation and the possibility to
write compact json by excluding whitespace to write_to_json, and
also removes a call to the sign method from write_to_json.

The commit also adds tests.

Signed-off-by: Lukas Puehringer <lukas.puehringer@nyu.edu>
2020-09-10 15:59:10 +02:00
Lukas Puehringer
e997097d1c Add generic Metadata.read_from_json class method
Add generic read from json class method that returns a Metadata
object with a signed field that contains the appropriate Signed
subclass, based on the signed._type field of the read metadata.

Signed-off-by: Lukas Puehringer <lukas.puehringer@nyu.edu>
2020-09-10 15:59:10 +02:00
Lukas Puehringer
b1dd3d6787 Skip api tests on Python < 3.6
The new metadata module uses constructs that are only available
on Python >= 3.6 (typing, f-format strings, etc.).

Signed-off-by: Lukas Puehringer <lukas.puehringer@nyu.edu>
2020-09-10 15:59:01 +02:00
Joshua Lock
7cc41c6fee
Merge pull request #1122 from joshuagl/joshuagl/release-0.14.0
Prepare 0.14.0 release
2020-09-10 09:51:37 +01:00
Joshua Lock
37b5d404c8
Merge pull request #1121 from joshuagl/joshuagl/rm-keyid-hash-algorithms
Remove accidentally introduced uses of keyid_hash_algorithms
2020-09-10 09:51:15 +01:00
Joshua Lock
3e68b3a07e Prepare 0.14.0 release
Signed-off-by: Joshua Lock <jlock@vmware.com>
2020-09-09 11:11:48 +01:00
Joshua Lock
fcc6841247 More consistent formatting in RELEASE.md
Consistently enclose filenames referred to througout the release process in
backticks to ensure they are rendered in the code style.

Signed-off-by: Joshua Lock <jlock@vmware.com>
2020-09-09 11:07:25 +01:00
Joshua Lock
7c18cbbbfb Remove uses of keyid_hash_algorithms
PR #1014 removed uses of keyid_hash_algorithms in favour of using the calculated
keyid values from the metadata. A few instances of this removal were
unintentionally reintroduced in PR #1016, when changing to explicitly passing
a list of hash algorithms rather than changing securesystemslib settings
values.

This change removes uneccessary uses of keyid_hash_algorithms.

Signed-off-by: Joshua Lock <jlock@vmware.com>
2020-09-09 10:51:46 +01:00
Joshua Lock
c4617ff55f
Merge pull request #1102 from MVrachev/1080
Add a way to disable hash prefix when using consistent_snapshot
2020-09-02 16:28:31 +01:00
lukpueh
11a743c7fa
Merge pull request #1117 from theupdateframework/dependabot/pip/cryptography-3.1
build(deps): bump cryptography from 3.0 to 3.1
2020-09-02 13:11:13 +02:00
dependabot-preview[bot]
598e7a181b
build(deps): bump cryptography from 3.0 to 3.1
Bumps [cryptography](https://github.com/pyca/cryptography) from 3.0 to 3.1.
- [Release notes](https://github.com/pyca/cryptography/releases)
- [Changelog](https://github.com/pyca/cryptography/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/3.0...3.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-08-27 10:26:19 +00:00
Joshua Lock
7b7a14ab42
Merge pull request #1074 from sechkova/delegations-update
Update targets delegations in generate_targets_metadata
2020-08-26 15:54:45 +01:00
Joshua Lock
28f0b676a1
Merge pull request #1016 from MVrachev/refactor-format-metadata-to-key
Refactor to use changed format metadata to key
2020-08-26 15:05:36 +01:00
Teodora Sechkova
b6307ddf6d
Fix typo in comment section
Signed-off-by: Teodora Sechkova <tsechkova@vmware.com>
2020-08-26 13:53:52 +03:00
Teodora Sechkova
b3b0c041fe
Add test for delegations update
Add a new test case in test_generate_targets_metadata
to check if targets metadata is up-to-date with its delegated
roles.

Signed-off-by: Teodora Sechkova <tsechkova@vmware.com>
2020-08-26 13:53:51 +03:00
Teodora Sechkova
05a70085b2
Update failing tests for generate_targets_metadata
Tests logic is modified to accommodate for the update of the
delegations during generate_targets_metadata().

Signed-off-by: Teodora Sechkova <tsechkova@vmware.com>
2020-08-26 13:53:51 +03:00
Teodora Sechkova
8f05420e68
Load delegated roles 'keyids' and 'threshold'
Use the delegation graph traversal during load_repository()
to load delegated roles' 'keyids' and 'threshold' by reading it
from the delegating role metadata.

If more than one delegation to the same role exists, only the first
one is loaded in roledb for this role.

Signed-off-by: Teodora Sechkova <tsechkova@vmware.com>
2020-08-26 13:53:50 +03:00
Teodora Sechkova
f7c9fcb460
Update delegations in generate_targets_metadata()
Collect keys and threshold of delegated roles and update
delegations in generate_targets_metadata in a similar manner
as generate_root_metadata() does for top-level roles.

Signed-off-by: Teodora Sechkova <tsechkova@vmware.com>
2020-08-26 13:53:50 +03:00
Teodora Sechkova
8f396a70eb
Move _keys_to_keydict() to repository_lib
Use _keys_to_keydict() for the  key dictionary generation in
generate_root_metadata().
Rename it as a public function keys_to_keydict().

Signed-off-by: Teodora Sechkova <tsechkova@vmware.com>
2020-08-26 13:53:46 +03:00
lukpueh
f54bbf5bd0
Merge pull request #1116 from sechkova/raise-missing-from
Re-raise exceptions explicitly using the 'from' keyword
2020-08-24 14:49:45 +02:00
Teodora Sechkova
0ebe226fb6
Re-raise exceptions explicitly using the 'from' keyword
Versions 2.6.0 and later of pylint adhere to PEP 3134
and trigger a 'raise-missing-from' warning (W0707) when
chained exceptions are raised implicitly.

The 'from' keyword is a Python3.x feature, that is why
six.raise_from is used for Python2.x compatibility.

Signed-off-by: Teodora Sechkova <tsechkova@vmware.com>
2020-08-24 13:44:09 +03:00
Lukas Puehringer
17f08ad200 Add simple TUF role metadata model (WIP)
Add metadata module with container classes for TUF role metadata, including
methods to read/serialize/write from and to JSON, perform TUF-compliant
metadata updates, and create and verify signatures.

The 'Metadata' class provides a container for inner TUF metadata objects (Root,
Timestamp, Snapshot, Targets) (i.e. OOP composition)

The 'Signed' class provides a base class to aggregate common attributes (i.e.
version, expires, spec_version) of the inner metadata classes. (i.e. OOP
inheritance). The name of the class also aligns with the 'signed' field of
the outer metadata container.

Based on prior observations in TUF's sister project in-toto, this architecture
seems to well represent the metadata model as it is defined in the
specification (see in-toto/in-toto#98 and in-toto/in-toto#142 for related
discussions).

This commits also adds tests.

**TODO: See doc header TODO list**

**Additional design considerations**
(also in regards to prior sketches of this module)

 - Aims at simplicity, brevity and recognizability of the wireline metadata
   format.

 - All attributes that correspond to fields in TUF JSON metadata are public.
   There doesn't seem to be a good reason to protect them with leading
   underscores and use setters/getters instead, it just adds more code, and
   impedes recognizability of the wireline metadata format.

 - Although, it might be convenient to have short-cuts on the Metadata class
   that point to methods and attributes that are common to all subclasses of
   the contained Signed class (e.g. Metadata.version instead of
   Metadata.signed.version, etc.), this also conflicts with goal of
   recognizability of the wireline metadata. Thus we won't add such short-cuts
   for now. See:
   https://github.com/theupdateframework/tuf/pull/1060#discussion_r452906629

 - Signing keys and a 'consistent_snapshot' boolean are not on the targets
   metadata class. They are a better fit for management code. See:
   https://github.com/theupdateframework/tuf/pull/1060#issuecomment-660056376,
   and #660.

 - Does not use sslib schema checks (see TODO notes about validation in
   doc header)

 - Does not use existing tuf utils, such as make_metadata_fileinfo,
   build_dict_conforming_to_schema, if it is easy and more explicit to
   just re-implement the desired behavior on the metadata classes.

 - All datetime's are treated as UTC. Since timezone info is not captured in
   the wireline metadata format it should not be captured in the internal
   representation either.

 - Does not use 3rd-party dateutil package, in order to minimize dependency
   footprint, which is especially important for update clients which often have
   to vendor their dependencies.
   However, compatibility between the more advanced dateutil.relativedelta (e.g
   handles leap years automatically) and timedelta is tested.

 - Uses PEP8 indentation (4 space) and Google-style doc string instead of
   sslab-style. See
   https://github.com/secure-systems-lab/code-style-guidelines/issues/20

 - Does not support Python =< 3.5

Co-authored-by: Trishank Karthik Kuppusamy <trishank.kuppusamy@datadoghq.com>
Co-authored-by: Joshua Lock <jlock@vmware.com>
Co-authored-by: Teodora Sechkova <tsechkova@vmware.com>
Signed-off-by: Lukas Puehringer <lukas.puehringer@nyu.edu>
2020-08-20 12:14:40 +02:00
Joshua Lock
e3ff011575
Merge pull request #1101 from joshuagl/joshuagl/updater-verify-root
Fix updater workflow
2020-08-18 23:02:07 +01:00
Joshua Lock
2fc25adfad updater: verify newly downloaded root metadata with its signatures
Per the detailed client workflow in the specification step 1.2

"Version N+1 of the root metadata file MUST have been signed by:
(1) a threshold of keys specified in the trusted root metadata file
(version N), and
(2) a threshold of keys specified in the new root metadata file being
validated (version N+1)."

Number 2 is implemented here as this step was not being performed by the
Updater. Unfortunately we can't use existing signature verification
methods in tuf.sig, because tuf.sig.signature_status() does not verify
signatures for keys which are not listed in keydb (and tuf.sig.verify
uses tuf.sig.signature_status)

Therefore this patch introduces a method for verifying signatures with
root keys listed in the signable being verified.

Signed-off-by: Joshua Lock <jlock@vmware.com>
2020-08-18 21:50:46 +01:00
Joshua Lock
902a025918 updater: remove redundant __verify_root_chain_link method
This method is duplicating verification steps which have already been
completed before the file was written to disk.

Signed-off-by: Joshua Lock <jlock@vmware.com>
2020-08-18 21:50:46 +01:00
Joshua Lock
9332e8209c updater: rename _verify_uncompressed_metadata_file
We no longer handle compressed metadata files, so rename this method to be
shorter and less confusing:
_verify_uncompressed_metadata_file -> _verify_metadata_file

Signed-off-by: Joshua Lock <jlock@vmware.com>
2020-08-18 21:50:46 +01:00
Teodora Sechkova
efea88e337 Add updater tests for root signed with current keys
Co-authored-by: Joshua Lock <jlock@vmware.com>
Signed-off-by: Teodora Sechkova <tsechkova@vmware.com>
Signed-off-by: Joshua Lock <jlock@vmware.com>
2020-08-18 21:48:39 +01:00
Martin Vrachev
060d41e114 Test way to disable hash prefixes when download
Signed-off-by: Martin Vrachev <mvrachev@vmware.com>
2020-08-18 17:52:17 +03:00
Martin Vrachev
7a828ea716 Bump securesyslib to 0.16.0 in setup.py
Signed-off-by: Martin Vrachev <mvrachev@vmware.com>
2020-08-18 17:42:30 +03:00
Martin Vrachev
71016d7d74 Refactor to use changed format metadata to key
In commit b7a15fdee7dee899c098b01fe64d604635b2b132
or pr https://github.com/secure-systems-lab/securesystemslib/pull/227
in securesystemslib I change the function arguments of the
format_metadata_to_key function in securesystemslib/keys.py
to add the opportunity to use custom keyid hash algorithms without
chainging the securesystemslib.settings.HASH_ALGORITHMS variable.

With this commit, I make use of the above changes in tuf.

Signed-off-by: Martin Vrachev <mvrachev@vmware.com>
2020-08-18 17:40:49 +03:00
Joshua Lock
be9944ba8e
Merge pull request #1097 from MVrachev/optimize-length-hashes
Optimize the calculation of length and hashes
2020-08-18 14:35:15 +01:00
Joshua Lock
7b4ffe3d07
Merge pull request #1014 from mnm678/remove-keyid_hash_algorithms
Remove uses of keyid_hash_algorithms
2020-08-18 14:00:22 +01:00
Martin Vrachev
dc1168d0cb Way to disable hash prefix for consistent_snapshot
Currently, if the repository is consistent_snapshot,
Updater will prefix the target filename with the hash
when constructing the download URL.
For some adopters of TUF (like Warehouse) this is not wanted
(warehouse target file paths are "consistent",
even if the filenames are not).

For example, Warehouse doesn't follow what tuf
(the reference implementation and specification) advice for naming
consistent filenames, which is to prefix the filename with the hash
of the files contents.
However, the target filenames it does use are consistent,
only the hash is part of the target's file path
not the target's file name.

Signed-off-by: Martin Vrachev <mvrachev@vmware.com>
2020-08-17 19:07:19 +03:00
lukpueh
328e8e758d
Merge pull request #1110 from theupdateframework/dependabot/pip/cffi-1.14.2
build(deps): bump cffi from 1.14.1 to 1.14.2
2020-08-17 15:11:53 +02:00