From 0f461710d805f0a44ce47303136d59845aafcf96 Mon Sep 17 00:00:00 2001 From: Rich Wareham Date: Fri, 17 Sep 2010 16:02:16 +0100 Subject: [PATCH] add a simple Google appengine implementation Add a really simple Google app engine implementation. --- app.yaml | 12 +++++++++++ appengine.py | 51 ++++++++++++++++++++++++++++++++++++++++++++ appengine_index.html | 27 +++++++++++++++++++++++ generate_key.py | 9 +++++++- 4 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 app.yaml create mode 100644 appengine.py create mode 100644 appengine_index.html diff --git a/app.yaml b/app.yaml new file mode 100644 index 0000000..9a1c13a --- /dev/null +++ b/app.yaml @@ -0,0 +1,12 @@ +application: hdcpgen +version: 1 +runtime: python +api_version: 1 + +handlers: +- url: /keys/.* + script: appengine.py + +- url: /(index\.html)? + static_files: appengine_index.html + upload: appengine_index.html diff --git a/appengine.py b/appengine.py new file mode 100644 index 0000000..d04af68 --- /dev/null +++ b/appengine.py @@ -0,0 +1,51 @@ +from google.appengine.ext import webapp +from google.appengine.ext.webapp.util import run_wsgi_app +from django.utils import simplejson as json + +from generate_key import * + +class KeysHandler(webapp.RequestHandler): + def __init__(self): + self._key_matrix = read_key_file(open('master-key.txt')) + + def _gen_json(self, ksv, key, is_sink): + return json.dumps( { + 'ksv': ('%010x' % ksv), + 'key': map(lambda x: '%014x' % x, key), + 'type': 'sink' if is_sink else 'source' }, + sort_keys=True, indent=False) + + + def get(self, key_type, ksv_string = None): + self.response.headers['Content-Type'] = 'application/json' + + if ksv_string is not None: + ksv = int(ksv_string, 16) + else: + ksv = gen_ksv() + + if key_type == 'source': + key = gen_source_key(ksv, self._key_matrix) + elif key_type == 'sink': + key = gen_sink_key(ksv, self._key_matrix) + else: + raise RuntimeError('Unknown key type: %s' % key_type) + + self.response.out.write(self._gen_json(ksv, key, True if key_type == 'sink' else False)) + +class KsvHandler(webapp.RequestHandler): + def get(self): + self.response.headers['Content-Type'] = 'text/plain' + self.response.out.write('%010x' % gen_ksv()) + +application = webapp.WSGIApplication([ + ('/keys/(sink|source)/([0-9a-f]{10})', KeysHandler), + ('/keys/(sink|source)', KeysHandler), + ('/keys/random_ksv', KsvHandler), + ], debug=True) + +def main(): + run_wsgi_app(application) + +if __name__ == "__main__": + main() diff --git a/appengine_index.html b/appengine_index.html new file mode 100644 index 0000000..2c2aeb5 --- /dev/null +++ b/appengine_index.html @@ -0,0 +1,27 @@ + + + + + + + HDCP Key Generator + + + +

HDCP key generator

+ +

The following links generate a random HDCP source or sink key + as a machine-readable JSON object.

+ + + +

Source code + available from github.

+ + diff --git a/generate_key.py b/generate_key.py index 8115e68..20c0449 100755 --- a/generate_key.py +++ b/generate_key.py @@ -25,7 +25,14 @@ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import string, random, json +import string, random + +# Magic required for google app engine +try: + from django.utils import simplejson as json +except: + import json + from optparse import OptionParser MASTER_KEY_SRC = 'master-key.txt'