@@ -1083,11 +1083,9 @@ def refresh(self, unsafely_update_root_if_necessary=True):
10831083 # require strict checks on its required length.
10841084 self ._update_metadata ('timestamp' , DEFAULT_TIMESTAMP_UPPERLENGTH )
10851085
1086- try :
1086+ if 'merkle_root' not in self . metadata [ 'current' ][ 'timestamp' ] :
10871087 # If merkle root is set, do not update snapshot metadata. Instead,
10881088 # download the relevant merkle path when downloading a target.
1089- self .metadata ['current' ]['timestamp' ]['merkle_root' ]
1090- except KeyError :
10911089 self ._update_metadata_if_changed ('snapshot' ,
10921090 referenced_metadata = 'timestamp' )
10931091 self ._update_metadata_if_changed ('targets' )
@@ -1846,6 +1844,7 @@ def _update_metadata(self, metadata_role, upperbound_filelength, version=None,
18461844 # 'current_metadata_object' set to 'None' if there is not an object
18471845 # stored for 'metadata_role'.
18481846 if snapshot_merkle :
1847+ # Snaphot merkle files are not signed
18491848 updated_metadata_object = metadata_signable
18501849 else :
18511850 updated_metadata_object = metadata_signable ['signed' ]
@@ -1865,9 +1864,16 @@ def _update_metadata(self, metadata_role, upperbound_filelength, version=None,
18651864
18661865
18671866
1868- def _verify_merkle_path (self , metadata_role , referenced_metadata = 'snapshot' ):
1867+ def _verify_merkle_path (self , metadata_role ):
18691868 """
1870- Download the merkle path associated with metadata_role and verify the hashes.
1869+ <Purpose>
1870+ Download the merkle path associated with metadata_role and verify the hashes.
1871+ <Arguments>
1872+ metadata_role:
1873+ The name of the metadata role. This should not include a file extension.
1874+ <Exceptions>
1875+ tuf.exceptions.RepositoryError:
1876+ If the snapshot merkle file is invalid or the verification fails
18711877 Returns the snapshot information about metadata role.
18721878 """
18731879 merkle_root = self .metadata ['current' ]['timestamp' ]['merkle_root' ]
@@ -1910,30 +1916,33 @@ def _verify_merkle_path(self, metadata_role, referenced_metadata='snapshot'):
19101916 # If merkle_path and path_directions have different lengths,
19111917 # the verification will not be possible
19121918 if len (merkle_path ) != len (path_directions ):
1913- # error
1914- return
1919+ raise tuf . exceptions . RepositoryError ( 'Invalid merkle path for ' +
1920+ metadata_role )
19151921
19161922 for index in range (len (merkle_path )):
19171923 i = str (index )
19181924 if path_directions [i ] < 0 :
1925+ # The current node is a left node
19191926 digest_object = securesystemslib .hash .digest ()
19201927 digest_object .update ((node_hash + merkle_path [i ]).encode ('utf-8' ))
19211928 else :
1929+ # The current node is a right node
19221930 digest_object = securesystemslib .hash .digest ()
19231931 digest_object .update ((merkle_path [i ] + node_hash ).encode ('utf-8' ))
19241932 node_hash = digest_object .hexdigest ()
19251933
19261934 # Does the result match the merkle root?
19271935 if node_hash != merkle_root :
1928- # error
1929- return 1
1936+ raise tuf . exceptions . RepositoryError ( 'The merkle root does not match ' +
1937+ 'the hash for ' + metadata_role )
19301938
19311939 # return the verified snapshot contents
19321940 return contents
19331941
19341942 else :
1935- # No merkle path found, error?
1936- return 2
1943+ # No merkle path found
1944+ raise tuf .exceptions .RepositoryError ('No snapshot merkle file for ' +
1945+ metadata_role )
19371946
19381947
19391948
@@ -2017,10 +2026,9 @@ def _update_metadata_if_changed(self, metadata_role,
20172026 repr (referenced_metadata )+ '. ' + repr (metadata_role ) +
20182027 ' may be updated.' )
20192028
2020- if 'merkle_root' in self .metadata ['current' ][referenced_metadata ]:
2029+ if 'merkle_root' in self .metadata ['current' ]['timestamp' ]:
20212030 # Download version information from merkle tree
2022- contents = self ._verify_merkle_path (metadata_filename ,
2023- referenced_metadata = referenced_metadata )
2031+ contents = self ._verify_merkle_path (metadata_role )
20242032 expected_versioninfo = contents
20252033
20262034 else :
0 commit comments