diff options
Diffstat (limited to 'tools')
-rwxr-xr-x | tools/merge.py | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/tools/merge.py b/tools/merge.py index 5ceb245..a016b35 100755 --- a/tools/merge.py +++ b/tools/merge.py @@ -17,9 +17,10 @@ import urlparse import os import yaml import select +import struct from certtools import build_merkle_tree, create_sth_signature, \ check_sth_signature, get_eckey_from_file, timing_point, http_request, \ - get_public_key_from_file + get_public_key_from_file, get_leaf_hash, decode_certificate_chain parser = argparse.ArgumentParser(description="") parser.add_argument('--config', help="System configuration", required=True) @@ -207,6 +208,29 @@ for storagenode in storagenodes: new_entries.update(new_entries_per_node[storagenode["name"]]) entries_to_fetch[storagenode["name"]] = [] +def unpack_entry(entry): + pieces = [] + while len(entry): + (length,) = struct.unpack(">I", entry[0:4]) + data = entry[4:4+length] + entry = entry[4+length:] + pieces.append(data) + return pieces + +import subprocess + +def verify_entry(entry, hash): + unpacked = unpack_entry(entry) + mtl = unpacked[0] + assert hash == get_leaf_hash(mtl) + p = subprocess.Popen( + ["../verifycert.erl"], + stdin=subprocess.PIPE, stdout=subprocess.PIPE) + (verify_result, _) = p.communicate(entry) + if verify_result != "ok\n": + print >>sys.stderr, verify_result + sys.exit(1) + timing_point(timing, "get new entries") new_entries -= certsinlog @@ -230,6 +254,7 @@ for storagenode in storagenodes: entries = get_entries(storagenode["name"], "https://%s/" % storagenode["address"], chunk) for hash in chunk: entry = entries[hash] + verify_entry(entry, hash) write_chain(hash, entry) add_to_logorder(hash) logorder.append(hash) |