Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1035)

Unified Diff: mojo/public/tools/bindings/mojom_bindings_generator.py

Issue 2794743002: Add a mechanism to scramble Mojo message IDs. (Closed)
Patch Set: Add a mechanism to scramble Mojo message IDs. Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: mojo/public/tools/bindings/mojom_bindings_generator.py
diff --git a/mojo/public/tools/bindings/mojom_bindings_generator.py b/mojo/public/tools/bindings/mojom_bindings_generator.py
index a9650d77640776f4fa9e0814236fee5b22a7e98b..6d1c260e56b428b822eaf09ff16e3d18977365bb 100755
--- a/mojo/public/tools/bindings/mojom_bindings_generator.py
+++ b/mojo/public/tools/bindings/mojom_bindings_generator.py
@@ -7,11 +7,13 @@
import argparse
+import hashlib
import imp
import json
import os
import pprint
import re
+import struct
import sys
# Disable lint check for finding modules:
@@ -100,6 +102,38 @@ def FindImportFile(rel_dir, file_name, search_rel_dirs):
rel_dir.source_root)
+def ScrambleMethodOrdinals(interfaces, salt):
+ already_generated = set()
+ for interface in interfaces:
+ i = 0
+ already_generated.clear()
+ for method in interface.methods:
+ while True:
+ i = i + 1
+ if i == 1000000:
+ raise Exception("Could not generate %d method ordinals for %s" %
+ (len(interface.methods), interface.name))
+ # Generate a scrambled method.ordinal value. The algorithm doesn't have
+ # to be very strong, cryptographically. It just needs to be non-trivial
+ # to guess the results without the secret salt, in order to make it
+ # harder for a compromised process to send fake Mojo messages.
+ sha256 = hashlib.sha256(salt)
+ sha256.update(interface.name)
+ sha256.update(str(i))
+ # Take the first 4 bytes as a little-endian uint32.
+ ordinal = struct.unpack('<L', sha256.digest()[:4])[0]
+ # Trim to 31 bits, so it always fits into a Java (signed) int.
+ ordinal = ordinal & 0x7fffffff
+ if ordinal in already_generated:
+ continue
+ already_generated.add(ordinal)
+ method.ordinal = ordinal
+ method.ordinal_comment = (
+ 'The %s value is based on sha256(salt + "%s%d").' %
+ (ordinal, interface.name, i))
+ break
+
+
class MojomProcessor(object):
"""Parses mojom files and creates ASTs for them.
@@ -154,6 +188,9 @@ class MojomProcessor(object):
module = translate.OrderedModule(tree, name, imports)
+ if args.scrambled_message_id_salt:
+ ScrambleMethodOrdinals(module.interfaces, args.scrambled_message_id_salt)
+
# Set the path as relative to the source root.
module.path = rel_filename.relative_path()
@@ -319,6 +356,9 @@ def main():
generate_parser.add_argument(
"--depfile_target", type=str,
help="The target name to use in the depfile.")
+ generate_parser.add_argument(
+ "--scrambled_message_id_salt",
+ help="If non-empty, the salt for generating scrambled message IDs.")
generate_parser.set_defaults(func=_Generate)
precompile_parser = subparsers.add_parser("precompile",

Powered by Google App Engine
This is Rietveld 408576698