diff --git a/util/signer/build.mk b/util/signer/build.mk index 07db0ea7ea..88fea91bce 100644 --- a/util/signer/build.mk +++ b/util/signer/build.mk @@ -10,7 +10,14 @@ signer_INC := $(addprefix common/, aes.h ecdh.h gnubby.h \ signer_SRC := codesigner.cc publickey.cc image.cc gnubby.cc aes.cc ecdh.cc SIGNER_DEPS := $(addprefix $(signer_ROOT)/, $(signer_SRC) $(signer_INC)) -HOST_CXXFLAGS += -I/usr/include/libxml2 -$(out)/util/signer: $(SIGNER_DEPS) +HOST_CXXFLAGS += -I/usr/include/libxml2 -I $(out) +$(out)/util/signer: $(SIGNER_DEPS) $(out)/pmjp.h $(call quiet,cxx_to_host,HOSTCXX) +# When building self signed Cr50 images we still want the epoch/major/minor +# fields come from the dev manifest. Since a full blown JSON parser for C is +# not readily available, this rule generates a small .h file with only the +# fields of interest retrieved from the dev JSON file. +$(out)/pmjp.h: util/signer/pmjp.py util/signer/ec_RW-manifest-dev.json + @echo " PMJP $@" + $(Q)./util/signer/pmjp.py ./util/signer/ec_RW-manifest-dev.json > $@ diff --git a/util/signer/codesigner.cc b/util/signer/codesigner.cc index f489851ee0..89b23eccd2 100644 --- a/util/signer/codesigner.cc +++ b/util/signer/codesigner.cc @@ -17,6 +17,8 @@ #include #ifdef HAVE_JSON #include +#else +#include #endif #include @@ -433,7 +435,9 @@ int main(int argc, char* argv[]) { if (jsonFilename.empty()) { // Defaults, in case no JSON values.insert(make_pair("keyid", key.n0inv())); - values.insert(make_pair("epoch", 0x1337)); + values.insert(make_pair("epoch", MANIFEST_EPOCH)); + values.insert(make_pair("major", MANIFEST_MAJOR)); + values.insert(make_pair("minor", MANIFEST_MINOR)); } // Hardcoded expectation. Can be overwritten in JSON w/ new explicit value. diff --git a/util/signer/pmjp.py b/util/signer/pmjp.py new file mode 100755 index 0000000000..92e3db035c --- /dev/null +++ b/util/signer/pmjp.py @@ -0,0 +1,53 @@ +#!/usr/bin/python +# Copyright 2017 The Chromium OS Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +"""Poor man's JSON parser. + +This module reads the input JSON file, retrieves from it some name/value pairs +and generates a .h file to allow a C code use the definitions. + +The JSON file name is required to be passed in in the command line, the nodes +this script pays attention to are included in required_keys tuple below. +""" + +import json +import sys + +required_keys = ('epoch', 'major', 'minor') + + +def main(json_file_name): + # get rid of the comments + json_text = [] + h_file_text = [''' +/* + * Copyright %d The Chromium OS Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +/* This file was autogenerated, do not edit. */ +''',] + + json_file = open(json_file_name, 'r') + for line in json_file.read().splitlines(): + json_text.append(line.split('//')[0]) + + j = json.loads('\n'.join(json_text)) + + for key in required_keys: + if key in j.keys(): + value = j[key] + else: + value = '0' + + h_file_text.append('#define MANIFEST_%s %s' % (key.upper(), value)) + + h_file_text.append('') + return '\n'.join(h_file_text) + + +if __name__ == '__main__': + print main(sys.argv[1])